ZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyNGY0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjJmZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQUNURiBEb21CeUNvbSBGbGFzaCBGcmFnbWVudCAoSW5jdWJhdGlvbikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMC4xCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207YnVuZGxlLXZlcnNpb249IjAuMC4xIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmFjdGYuYWNjc2VydmljZS5zd3RicmlkZ2UsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY4MWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgZnJhZ21lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL2ZyYWdtZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2MwMTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvZnJhZ21lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxmcmFnbWVudD4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5lbGVtZW50RmFjdG9yeSI+Ci0gICAgICA8b2JqZWN0RWxlbWVudEZhY3RvcnkKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaC5GbGFzaEVsZW1lbnRGYWN0b3J5Ij4KLSAgICAgIDwvb2JqZWN0RWxlbWVudEZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hFbGVtZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaEVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzRiOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaEVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmZsYXNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU9iamVjdEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci0KLXB1YmxpYyBjbGFzcyBGbGFzaEVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgSU9iamVjdEVsZW1lbnRGYWN0b3J5IHsKLQotCXB1YmxpYyBGbGFzaEVsZW1lbnRGYWN0b3J5KCkgewotCX0KLQkKLQlwdWJsaWMgTm9kZUltcGwgY3JlYXRlVG9wTm9kZShOb2RlSW1wbCBiYXNlLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLQkJcmV0dXJuIEZsYXNoVG9wTm9kZUltcGwubmV3Rmxhc2hOb2RlKGJhc2UsIGlub2RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmMyZGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuYWkua2V5LmtleWhvb2sud2luMzIuSVNlbmRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLmFpLmtleS5rZXlob29rLndpbjMyLktleUhvb2tXaW4zMlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5BbmFseXplZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRmxhc2hOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklNU0FBTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuRW1wdHlOb2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC51dGlsLkFTT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0KLWNsYXNzIEZsYXNoTm9kZUltcGwgaW1wbGVtZW50cyBJRmxhc2hOb2RlIHsKLSAgICBmaW5hbCBBU09iamVjdCBub2RlQVNPYmo7Ci0gICAgZmluYWwgQVNPYmplY3QgYWNjSW5mbzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YXJnZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJRmxhc2hOb2RlIHBhcmVudDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzQ2hpbGRyZW47Ci0gICAgcHJpdmF0ZSBGbGFzaFRvcE5vZGVJbXBsIHN3ZjsKLSAgICBwcml2YXRlIERvY3VtZW50SW1wbCBkb2M7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpewotICAgICAgICByZXR1cm4gdGhpcy50YXJnZXQuaW50ZXJuKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKXsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGbGFzaE5vZGVJbXBsKXsKLSAgICAgICAgICAgIEZsYXNoTm9kZUltcGwgZiA9IChGbGFzaE5vZGVJbXBsKSBvOwotICAgICAgICAgICAgcmV0dXJuIHN3Zi5lcXVhbHMoZi5zd2YpICYmIHRoaXMudGFyZ2V0LmVxdWFscyhmLnRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgRmxhc2hOb2RlSW1wbChBU09iamVjdCBub2RlQVNPYmosIElGbGFzaE5vZGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMubm9kZUFTT2JqID0gbm9kZUFTT2JqOwotICAgICAgICB0aGlzLnRhcmdldCA9IChTdHJpbmcpIG5vZGVBU09iai5nZXQoInRhcmdldCIpOwotICAgICAgICB0aGlzLmFjY0luZm8gPSAoQVNPYmplY3QpIG5vZGVBU09iai5nZXQoImFjY0luZm8iKTsKLSAgICAgICAgT2JqZWN0IG8gPSBub2RlQVNPYmouZ2V0KCJpc09wYXF1ZU9iamVjdCIpOwotICAgICAgICBpZiAoKG8gaW5zdGFuY2VvZiBCb29sZWFuKSAmJiAoKEJvb2xlYW4pIG8pLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICB0aGlzLmhhc0NoaWxkcmVuID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmhhc0NoaWxkcmVuID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICBGbGFzaE5vZGVJbXBsKEZsYXNoTm9kZUltcGwgYmFzZU5vZGUsIEFTT2JqZWN0IG5vZGVBU09iaikgewotICAgICAgICB0aGlzKG5vZGVBU09iaiwgYmFzZU5vZGUpOwotICAgICAgICB0aGlzLnN3ZiA9IGJhc2VOb2RlLnN3ZjsKLSAgICAgICAgdGhpcy5kb2MgPSBiYXNlTm9kZS5kb2M7Ci0gICAgfQotCi0gICAgRmxhc2hOb2RlSW1wbChGbGFzaFRvcE5vZGVJbXBsIGJhc2VOb2RlLCBBU09iamVjdCBub2RlQVNPYmopIHsKLSAgICAgICAgdGhpcyhub2RlQVNPYmosIGJhc2VOb2RlKTsKLSAgICAgICAgdGhpcy5zd2YgPSBiYXNlTm9kZTsKLSAgICAgICAgdGhpcy5kb2MgPSAoRG9jdW1lbnRJbXBsKSBiYXNlTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3ApIHsKLSAgICAgICAgcmV0dXJuIHN3Zi5nZXRQcm9wZXJ0eShnZXRUYXJnZXQoKSwgcHJvcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3dmLnNldFByb3BlcnR5KGdldFRhcmdldCgpLCBwcm9wLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVNlbmRFdmVudCBzZW5kRXZlbnQ7Ci0gICAgcHJpdmF0ZSBJU2VuZEV2ZW50IGdldFNlbmRFdmVudCgpIHsKLSAgICAgICAgaWYgKHNlbmRFdmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZW5kRXZlbnQgPSBLZXlIb29rV2luMzJQbHVnaW4uZ2V0RGVmYXVsdCgpLm5ld1NlbmRFdmVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZW5kRXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICIjZmxhc2hOb2RlOiIgKyBnZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLSAgICAgICAgLy8gcmV0dXJuIEZMQVNIX05PREU7Ci0gICAgICAgIHJldHVybiBOb2RlLkVMRU1FTlRfTk9ERTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJRmxhc2hOb2RlW10gbm9kZXM7Ci0KLSAgICAgICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gbm9kZXMubGVuZ3RoKSkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZXNbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZXMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZUxpc3RJbXBsKElGbGFzaE5vZGVbXSBub2RlcykgewotICAgICAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0gICAgICAgIGlmICghaGFzQ2hpbGRyZW4pIHJldHVybiBFbXB0eU5vZGVMaXN0SW1wbC5JTlNUQU5DRTsKLSAgICAgICAgSUZsYXNoTm9kZVtdIHIgPSBnZXRTV0ZDaGlsZE5vZGVzKCk7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RJbXBsKHIpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0gICAgICAgIGlmICghaGFzQ2hpbGRyZW4pIHJldHVybiBudWxsOwotICAgICAgICBJRmxhc2hOb2RlW10gciA9IGdldFNXRkNoaWxkTm9kZXMoKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmIChyLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotICAgICAgICBpZiAoIWhhc0NoaWxkcmVuKSByZXR1cm4gbnVsbDsKLSAgICAgICAgSUZsYXNoTm9kZVtdIHIgPSBnZXRTV0ZDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGlmIChyID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICBpZiAoci5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiByW3IubGVuZ3RoIC0gMV07Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotICAgICAgICAvLyBJRmxhc2hOb2RlW10gciA9IGdldElubmVyTm9kZXMoKTsKLSAgICAgICAgaWYgKCFoYXNDaGlsZHJlbikgcmV0dXJuIGZhbHNlOwotICAgICAgICBJRmxhc2hOb2RlW10gciA9IGdldFNXRkNoaWxkTm9kZXMoKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoci5sZW5ndGggPT0gMCkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldCA9IGdldFRhcmdldCgpOwotICAgICAgICBpbnQgaWR4ID0gdGFyZ2V0Lmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gdGFyZ2V0OwotICAgICAgICByZXR1cm4gdGFyZ2V0LnN1YnN0cmluZyhpZHggKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRlbnQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXRVc2VyRGF0YShTdHJpbmcga2V5LCBPYmplY3QgZGF0YSwgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBJTm9kZUV4IGludGVyZmFjZQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgU3RyaW5nIGRlY29kZVN0cmluZyhTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHJldHVybiAiIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBVUkxEZWNvZGVyLmRlY29kZShpbnB1dCwgIlVURi04Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyByID0gbnVsbDsKLSAgICAgICAgaWYgKGFjY0luZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBhY2NJbmZvLmdldCgibmFtZSIpOwotICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHIgPSAiIiArIG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgPT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBub2RlQVNPYmouZ2V0KCJ0ZXh0Iik7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgciA9ICIiICsgbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAociA9PSBudWxsKSByZXR1cm4gIiI7Ci0gICAgICAgIC8vcmV0dXJuIGRlY29kZVN0cmluZyhyKTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGdldEhlYWRpbmdMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rVVJJKCkgewotICAgICAgICAvLyBUT0RPCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgc2V0UHJvcGVydHkoInRleHQiLCB0ZXh0KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBPYmplY3QgbyA9IGdldFByb3BlcnR5KCJ0ZXh0Iik7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSByZXR1cm4gKFN0cmluZykgbzsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldE9iak51bWJlcihPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIG8pLmludFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoRG91YmxlKSBvKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb0hhcmR3YXJlQ2xpY2soKSB7Ci0gICAgICAgIGxvbmcgaHduZCA9IHN3Zi5nZXRIV05EKCk7Ci0gICAgICAgIGludCBpeCA9IGdldE9iak51bWJlcihnZXRYKCkpOwotICAgICAgICBpbnQgaXkgPSBnZXRPYmpOdW1iZXIoZ2V0WSgpKTsKLSAgICAgICAgaW50IGl3ID0gZ2V0T2JqTnVtYmVyKGdldFcoKSk7Ci0gICAgICAgIGludCBpaCA9IGdldE9iak51bWJlcihnZXRIKCkpOwotICAgICAgICBpbnQgeCA9IGl4ICsgaXcgLyA0OwotICAgICAgICBpbnQgeSA9IGl5ICsgaWggLyA0OwotCi0gICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpY2sgdG86IiArIHggKyAiLCIgKyB5KTsKLQotICAgICAgICAvL2dldFNlbmRFdmVudCgpLnBvc3RNb3VzZSh4LCB5LCBmYWxzZSk7Ci0gICAgICAgIGdldFNlbmRFdmVudCgpLmZvY3VzV2luZG93KGh3bmQpOwotICAgICAgICBzZXRGb2N1cygpOwotICAgICAgICBnZXRTZW5kRXZlbnQoKS5wb3N0TW91c2UoeCwgeSwgZmFsc2UpOwotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGdldFNlbmRFdmVudCgpLnBvc3RNb3VzZSh4LCB5LCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0Q2xpY2thYmxlVGFyZ2V0KFN0cmluZyBjdXJyZW50KSB7Ci0gICAgICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIHRyeU9uUmVsZWFzZSA9IGN1cnJlbnQgKyAiLm9uUmVsZWFzZSI7Ci0gICAgICAgICAgICBpZiAoc3dmLmdldE5vZGVGcm9tUGF0aCh0cnlPblJlbGVhc2UpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB0cnlPblByZXNzID0gY3VycmVudCArICIub25QcmVzcyI7Ci0gICAgICAgICAgICBpZiAoc3dmLmdldE5vZGVGcm9tUGF0aCh0cnlPblByZXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaWR4ID0gY3VycmVudC5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKGlkeCA8PSAwKSBicmVhazsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnN1YnN0cmluZygwLCBpZHgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRvQ2xpY2soKSB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50ID0gZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIHRyeU9uUmVsZWFzZSA9IGN1cnJlbnQgKyAiLm9uUmVsZWFzZSI7Ci0gICAgICAgICAgICBpZiAoc3dmLmdldE5vZGVGcm9tUGF0aCh0cnlPblJlbGVhc2UpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzd2YuY2FsbE1ldGhvZChjdXJyZW50LCAib25SZWxlYXNlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdHJ5T25QcmVzcyA9IGN1cnJlbnQgKyAiLm9uUHJlc3MiOwotICAgICAgICAgICAgaWYgKHN3Zi5nZXROb2RlRnJvbVBhdGgodHJ5T25QcmVzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3Zi5jYWxsTWV0aG9kKGN1cnJlbnQsICJvblByZXNzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHJ1ZSkgYnJlYWs7Ci0gICAgICAgICAgICBpbnQgaWR4ID0gY3VycmVudC5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKGlkeCA8PSAwKSBicmVhazsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnN1YnN0cmluZygwLCBpZHgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb0hhcmR3YXJlQ2xpY2soKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoaWdobGlnaHQoKSB7Ci0gICAgICAgIHN3Zi5jYWxsTWV0aG9kKGdldFRhcmdldCgpLCAib25Sb2xsT3ZlciIpOwotICAgICAgICBib29sZWFuIHJldDEgPSBzd2YuaGlnaGxpZ2h0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0MiA9IHN3Zi5zZXRNYXJrZXIoZ2V0WCgpLCBnZXRZKCksIGdldFcoKSwgZ2V0SCgpKTsKLSAgICAgICAgcmV0dXJuIHJldDEgJiYgcmV0MjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB1bmhpZ2hsaWdodCgpIHsKLSAgICAgICAgc3dmLmNhbGxNZXRob2QoZ2V0VGFyZ2V0KCksICJvblJvbGxPdXQiKTsKLSAgICAgICAgYm9vbGVhbiByZXQxID0gc3dmLnVuaGlnaGxpZ2h0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0MiA9IHN3Zi51bnNldE1hcmtlcigpOwotICAgICAgICByZXR1cm4gcmV0MSAmJiByZXQyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLSAgICAgICAgaWYgKCFzd2Yuc2V0Rm9jdXMoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gc3dmLnNldEZvY3VzKGdldFRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE50aCgpIHsKLSAgICAgICAgLy8gVE9ETyEKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIElGbGFzaE5vZGUgaW50ZXJmYWNlCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIElGbGFzaE5vZGUgZ2V0Tm9kZUZyb21QYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBzd2YuZ2V0Tm9kZUZyb21QYXRoKHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmxhc2hOb2RlIGdldE5vZGVBdERlcHRoKGludCBkZXB0aCkgewotICAgICAgICByZXR1cm4gc3dmLmdldE5vZGVBdERlcHRoV2l0aFBhdGgoZ2V0VGFyZ2V0KCksIGRlcHRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZsYXNoTm9kZVtdIGdldElubmVyTm9kZXMoKSB7Ci0gICAgICAgIHJldHVybiBzd2YuZ2V0SW5uZXJOb2Rlc1dpdGhQYXRoKGdldFRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZsYXNoTm9kZVtdIGdldFNXRkNoaWxkTm9kZXMoKSB7Ci0gICAgICAgIHJldHVybiBzd2YuZ2V0U1dGQ2hpbGROb2Rlc1dpdGhQYXRoKGdldFRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoKCkgewotICAgICAgICBJbnRlZ2VyIHRhcmdldCA9IChJbnRlZ2VyKSBub2RlQVNPYmouZ2V0KCJkZXB0aCIpOwotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHJldHVybiB0YXJnZXQuaW50VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfREVQVEg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50RnJhbWUoKSB7Ci0gICAgICAgIEludGVnZXIgdGFyZ2V0ID0gKEludGVnZXIpIG5vZGVBU09iai5nZXQoImN1cnJlbnRGcmFtZSIpOwotICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHJldHVybiB0YXJnZXQuaW50VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmxhc2hOb2RlW10gdHJhbnNsYXRlKCkgewotICAgICAgICByZXR1cm4gc3dmLnRyYW5zbGF0ZVdpdGhQYXRoKGdldFRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5vZGVFeCBnZXRCYXNlTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHN3ZjsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZXh0ZW5zaW9ucy4KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBEb3VibGUgb3IgSW50ZWdlcgotICAgIHB1YmxpYyBPYmplY3QgZ2V0WCgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVBU09iai5nZXQoIngiKTsKLSAgICB9Ci0KLSAgICAvLyBEb3VibGUgb3IgSW50ZWdlcgotICAgIHB1YmxpYyBPYmplY3QgZ2V0WSgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVBU09iai5nZXQoInkiKTsKLSAgICB9Ci0KLSAgICAvLyBEb3VibGUgb3IgSW50ZWdlcgotICAgIHB1YmxpYyBPYmplY3QgZ2V0VygpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVBU09iai5nZXQoInciKTsKLSAgICB9Ci0KLSAgICAvLyBEb3VibGUgb3IgSW50ZWdlcgotICAgIHB1YmxpYyBPYmplY3QgZ2V0SCgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVBU09iai5nZXQoImgiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5hbHl6ZWRSZXN1bHQgYW5hbHl6ZShBbmFseXplZFJlc3VsdCBhcikgewotICAgICAgICByZXR1cm4gYXI7Ci0gICAgfQotCi0gICAgcHVibGljIEFic3RyYWN0VGVybXMgZ2V0VGVybXMoKSB7Ci0gICAgICAgIHJldHVybiBGbGFzaFRlcm1zLmdldEluc3RhbmNlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICAgICAgcmV0dXJuIHN3Zi5nZXRMb2NhdGlvbigpOwotICAgIH0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXkKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIElNU0FBTm9kZSBnZXRNU0FBKCl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcGFpckZsYXNoKCl7Ci0gICAgfQotCi0gICAgLy8gIUZOIQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdGlsbFBpY3R1cmVEYXRhKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1szXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhciBnZXRBY2Nlc3NLZXkoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoU291bmRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoU291bmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTM3YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFNvdW5kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhTb3VuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWwuQVNPYmplY3Q7Ci0KLQotY2xhc3MgRmxhc2hTb3VuZEltcGwgaW1wbGVtZW50cyBJTm9kZUV4U291bmQgewotICAgIHByaXZhdGUgaW50IHZvbEJlZm9yZU11dGVkID0gLTE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGbGFzaFRvcE5vZGVJbXBsIHN3ZjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YXJnZXQ7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgRmxhc2hTb3VuZEltcGwoRmxhc2hUb3BOb2RlSW1wbCBzd2YsIEFTT2JqZWN0IG5vZGVBU09iaikgewotICAgICAgICB0aGlzLnN3ZiA9IHN3ZjsKLSAgICAgICAgdGhpcy50YXJnZXQgPSAoU3RyaW5nKSBub2RlQVNPYmouZ2V0KCJ0YXJnZXQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtdXRlTWVkaWEoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIGlmIChmbGFnKSB7Ci0gICAgICAgICAgICBpZiAodm9sQmVmb3JlTXV0ZWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdm9sQmVmb3JlTXV0ZWQgPSBnZXRWb2x1bWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2V0Vm9sdW1lKDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHZvbEJlZm9yZU11dGVkID49IDApIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBzZXRWb2x1bWUodm9sQmVmb3JlTXV0ZWQpOwotICAgICAgICAgICAgICAgIHZvbEJlZm9yZU11dGVkID0gLTE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gc3dmLmNhbGxNZXRob2QobmV3IE9iamVjdFtdIHsgZ2V0VGFyZ2V0KCksICJnZXRWb2x1bWUiIH0pOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSBvKS5pbnRWYWx1ZSgpICogMTA7Ci0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIG8pLmludFZhbHVlKCkgKiAxMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Vm9sdW1lKGludCB2YWwpIHsKLSAgICAgICAgdmFsID0gdmFsIC8gMTA7Ci0gICAgICAgIHN3Zi5jYWxsTWV0aG9kKG5ldyBPYmplY3RbXSB7IGdldFRhcmdldCgpLCAic2V0Vm9sdW1lIiwgSW50ZWdlci52YWx1ZU9mKHZhbCkgfSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldE11dGVTdGF0ZSgpIHsKLSAgICAgICAgaWYgKHZvbEJlZm9yZU11dGVkIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoVGVybXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hUZXJtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjRkOGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hUZXJtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmZsYXNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbC5IVE1MVGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBGbGFzaFRlcm1zIGV4dGVuZHMgQWJzdHJhY3RUZXJtcyB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHRlcmFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBpc0NsaWNrYWJsZSh0YXJnZXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEZsYXNoVGVybXMgaW5zdGFuY2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZsYXNoVGVybXMgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBGbGFzaFRlcm1zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWROb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hOb2RlSW1wbCkgewotICAgICAgICAgICAgRmxhc2hOb2RlSW1wbCBmbGFzaCA9IChGbGFzaE5vZGVJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIGlmIChmbGFzaC5hY2NJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGIgPSAoQm9vbGVhbikgZmxhc2guYWNjSW5mby5nZXQoInNpbGVudCIpOwotICAgICAgICAgICAgICAgIGlmIChiICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAhYi5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTm9kZUltcGwpIHsKLSAgICAgICAgICAgIEZsYXNoTm9kZUltcGwgZmxhc2ggPSAoRmxhc2hOb2RlSW1wbCkgdGFyZ2V0OwotCi0gICAgICAgICAgICBCb29sZWFuIGIgPSAoQm9vbGVhbikgZmxhc2gubm9kZUFTT2JqLmdldCgiaXNJbnB1dGFibGUiKTsKLSAgICAgICAgICAgIGlmIChiID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2xpY2thYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hOb2RlSW1wbCkgewotICAgICAgICAgICAgRmxhc2hOb2RlSW1wbCBmbGFzaCA9IChGbGFzaE5vZGVJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGlja2FibGVUYXJnZXQgPSBmbGFzaC5nZXRDbGlja2FibGVUYXJnZXQoZmxhc2guZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgaWYgKGNsaWNrYWJsZVRhcmdldCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnV0dG9uKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hOb2RlSW1wbCkgewotICAgICAgICAgICAgRmxhc2hOb2RlSW1wbCBmbGFzaCA9IChGbGFzaE5vZGVJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGlja2FibGVUYXJnZXQgPSBmbGFzaC5nZXRDbGlja2FibGVUYXJnZXQoZmxhc2guZ2V0VGFyZ2V0KCkpOwotICAgICAgICAgICAgaWYgKGNsaWNrYWJsZVRhcmdldCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRmxhc2hUb3BOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTVNBQUZsYXNoKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkgewotICAgICAgICAgICAgcmV0dXJuICgoRmxhc2hUb3BOb2RlSW1wbCkgdGFyZ2V0KS5nZXRNU0FBKCkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZE9iamVjdChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgiRU1CRUQiLmVxdWFscyhuYW1lKSB8fCAiT0JKRUNUIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWNjZXNzS2V5KGNoYXIga2V5LCBJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoVG9wTm9kZUltcGwpCi0gICAgICAgICAgICByZXR1cm4gSFRNTFRlcm1zLmdldEluc3RhbmNlKCkuaXNBY2Nlc3NLZXkoa2V5LCB0YXJnZXQpOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNBY2Nlc3NLZXkoa2V5LCB0YXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQmxvY2tKdW1wUG9pbnRCKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkKLSAgICAgICAgICAgIHJldHVybiBIVE1MVGVybXMuZ2V0SW5zdGFuY2UoKS5pc0Jsb2NrSnVtcFBvaW50Qih0YXJnZXQpOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNCbG9ja0p1bXBQb2ludEIodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50RihJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoVG9wTm9kZUltcGwpCi0gICAgICAgICAgICByZXR1cm4gSFRNTFRlcm1zLmdldEluc3RhbmNlKCkuaXNCbG9ja0p1bXBQb2ludEYodGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzQmxvY2tKdW1wUG9pbnRGKHRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nKGludCBsZXZlbCwgSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGbGFzaFRvcE5vZGVJbXBsKQotICAgICAgICAgICAgcmV0dXJuIEhUTUxUZXJtcy5nZXRJbnN0YW5jZSgpLmlzSGVhZGluZyhsZXZlbCwgdGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzSGVhZGluZyhsZXZlbCwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmdKdW1wUG9pbnQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGbGFzaFRvcE5vZGVJbXBsKQotICAgICAgICAgICAgcmV0dXJuIEhUTUxUZXJtcy5nZXRJbnN0YW5jZSgpLmlzSGVhZGluZ0p1bXBQb2ludCh0YXJnZXQpOwotICAgICAgICByZXR1cm4gc3VwZXIuaXNIZWFkaW5nSnVtcFBvaW50KHRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbm9kZUxvY2F0aW9uKE5vZGUgcmVmTm9kZSwgYm9vbGVhbiBiYWNrd2FyZCwgSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGbGFzaFRvcE5vZGVJbXBsKQotICAgICAgICAgICAgcmV0dXJuIEhUTUxUZXJtcy5nZXRJbnN0YW5jZSgpLm5vZGVMb2NhdGlvbihyZWZOb2RlLCBiYWNrd2FyZCwgdGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLm5vZGVMb2NhdGlvbihyZWZOb2RlLCBiYWNrd2FyZCwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lZGlhKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkgewotICAgICAgICAgICAgRmxhc2hUb3BOb2RlSW1wbCBzd2YgPSAoRmxhc2hUb3BOb2RlSW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgcmV0dXJuIHN3Zi5oYXNNZWRpYSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzTWVkaWEodGFyZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChpc0ZsYXNoVG9wTm9kZSh0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGlzSW5wdXRhYmxlKHRhcmdldCkpIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoaXNMaXN0VG9wKHRhcmdldCkpIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gc3VwZXIuaGFzQ29udGVudCh0YXJnZXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hUb3BOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFRvcE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWIyMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFRvcE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5BbmFseXplZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRmxhc2hOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklNU0FBTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhTb3VuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4VmlkZW87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5MaXN0Tm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guRmxhc2hNb2RlbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5JV2FYY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudXRpbC5BU0Rlc2VyaWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWwuQVNPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC51dGlsLkFTU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC50aW1lci5ZaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotCi1jbGFzcyBGbGFzaFRvcE5vZGVJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJRmxhc2hOb2RlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xTSUQgPSAiQ0xTSUQ6RDI3Q0RCNkUtQUU2RC0xMUNGLTk2QjgtNDQ0NTUzNTQwMDAwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1RZUEUgPSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZsYXNoTm9kZVtdIGVtcHR5UmVzdWx0ID0gbmV3IElGbGFzaE5vZGVbMF07Ci0KLS8vICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RMRVZFTF9QQVRIID0gIl9sZXZlbDAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCUklER0VMRVZFTF9QQVRIID0gIl9sZXZlbDUzNTUzIjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJvb3RQYXRoOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlcXVlc3RBcmdzUGF0aDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNwb25zZVZhbHVlUGF0aDsKLSAgICBwcml2YXRlIE1TQUFOb2RlSW1wbCBjYWNoZWRNU0FBOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VjcmV0OwotCi0gICAgc3RhdGljIEZsYXNoVG9wTm9kZUltcGwgbmV3Rmxhc2hOb2RlKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAgICAgU3RyaW5nIGNsc2lkID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgImNsYXNzaWQiKTsKLSAgICAgICAgaWYgKENMU0lELmVxdWFsc0lnbm9yZUNhc2UoY2xzaWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZsYXNoVG9wTm9kZUltcGwoQlJJREdFTEVWRUxfUEFUSCwgYmFzZU5vZGUsIGlub2RlKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdHlwZSA9IChTdHJpbmcpIEhlbHBlci5nZXQoKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0QXR0cmlidXRlTm9kZSIsICJ0eXBlIiksICJ2YWx1ZSIpOwotICAgICAgICBpZiAoQVBQX1RZUEUuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGbGFzaFRvcE5vZGVJbXBsKEJSSURHRUxFVkVMX1BBVEgsIGJhc2VOb2RlLCBpbm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIGNvbXBsZXRlZFJlYWR5U3RhdGUgPSBJbnRlZ2VyLnZhbHVlT2YoNCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZHkoKSB7Ci0gICAgICAgIGlmIChpc1JlYWR5KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgT2JqZWN0IHIgPSBIZWxwZXIuZ2V0KGlub2RlLCAicmVhZHlTdGF0ZSIpOwotICAgICAgICBpZiAoY29tcGxldGVkUmVhZHlTdGF0ZS5lcXVhbHMocikpIHsKLSAgICAgICAgICAgIGlzUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghaXNSZWFkeSgpKSByZXR1cm47Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbm9kZS5pbnZva2UoIlNldFZhcmlhYmxlIiwgbmV3IE9iamVjdFtdIHsgbmFtZSwgdmFsdWUgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmICghaXNSZWFkeSgpKSByZXR1cm4gIiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgaW5vZGUuaW52b2tlMSgiR2V0VmFyaWFibGUiLCBuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUID0gMTAwOwotICAgIAotICAgIHByaXZhdGUgT2JqZWN0IGludm9rZUFTKE9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgaWYgKHNlY3JldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0U2VjcmV0KCk7Ci0gICAgICAgICAgICBpZiAoc2VjcmV0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0VmFyaWFibGUocmVzcG9uc2VWYWx1ZVBhdGgsICIiKTsKLSAgICAgICAgU3RyaW5nIGFyZ3NTdHIgPSBBU1NlcmlhbGl6ZXIuc2VyaWFsaXplKHNlY3JldCwgYXJncyk7Ci0gICAgICAgIHNldFZhcmlhYmxlKHJlcXVlc3RBcmdzUGF0aCwgYXJnc1N0cik7Ci0gICAgICAgIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgVElNRU9VVDsgCi0gICAgICAgIHdoaWxlIChlbmRUaW1lID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFZhcmlhYmxlKHJlc3BvbnNlVmFsdWVQYXRoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBBU0Rlc2VyaWFsaXplciBhc2QgPSBuZXcgQVNEZXNlcmlhbGl6ZXIodmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBhc2QuZGVzZXJpYWxpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFlpZWxkLm9uY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEludGVnZXIgbWFya2VyOwotCi0gICAgcHVibGljIEludGVnZXIgZ2V0TWFya2VyKCkgewotICAgICAgICByZXR1cm4gbWFya2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY2FsbE1ldGhvZChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VBUyhuZXcgT2JqZWN0W10geyAiY2FsbE1ldGhvZEEiLCB0YXJnZXQsIG1ldGhvZCB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNhbGxNZXRob2QoT2JqZWN0W10gYXJncykgewotICAgICAgICBPYmplY3RbXSBhID0gbmV3IE9iamVjdFthcmdzLmxlbmd0aCArIDFdOwotICAgICAgICBhWzBdID0gImNhbGxNZXRob2RBIjsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBhLCAxLCBhcmdzLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBpbnZva2VBUyhhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cyhTdHJpbmcgdGFyZ2V0KSB7Ci0gICAgICAgIEJvb2xlYW4gYiA9IChCb29sZWFuKSBpbnZva2VBUyhuZXcgT2JqZWN0W10geyAic2V0Rm9jdXMiLCB0YXJnZXQgfSk7Ci0gICAgICAgIGlmIChiID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldE1hcmtlcihPYmplY3QgeCwgT2JqZWN0IHksIE9iamVjdCB3LCBPYmplY3QgaCkgewotICAgICAgICBpbml0TWFya2VyKCk7Ci0gICAgICAgIGlmIChtYXJrZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCh4ICE9IG51bGwpICYmICh5ICE9IG51bGwpICYmICh3ICE9IG51bGwpICYmIChoICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpbnZva2VBUyhuZXcgT2JqZWN0W10geyAic2V0TWFya2VyIiwgbWFya2VyLCB4LCB5LCB3LCBoIH0pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB1bnNldE1hcmtlcigpIHsKLSAgICAgICAgaWYgKG1hcmtlciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbnZva2VBUyhuZXcgT2JqZWN0W10geyAidW5zZXRNYXJrZXIiLCBtYXJrZXIgfSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgSU5vZGVFeFZpZGVvW10gc2VhcmNoVmlkZW8oU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgLy8gSURpc3BhdGNoIGlkaXNwID0gKElEaXNwYXRjaCkgaW5vZGUubWV0aG9kKCJzZWFyY2hWaWRlbyIsIG5ldyBPYmplY3RbXSB7cGF0aH0pOwotICAgICAgICBPYmplY3RbXSB2aWRlb3MgPSAoT2JqZWN0W10pIGludm9rZUFTKG5ldyBPYmplY3RbXSB7ICJzZWFyY2hWaWRlbyIsICJfbGV2ZWwwIiwgIl9nbG9iYWwiIH0pOwotICAgICAgICBpZiAodmlkZW9zID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaW50IGxlbiA9IHZpZGVvcy5sZW5ndGg7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBJTm9kZUV4VmlkZW9bXSByZXN1bHQgPSBuZXcgSU5vZGVFeFZpZGVvW2xlbl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJTVk86IiArIHZpZGVvc1tpXSk7Ci0gICAgICAgICAgICBpZiAodmlkZW9zW2ldIGluc3RhbmNlb2YgQVNPYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgRmxhc2hWaWRlb0ltcGwodGhpcywgKEFTT2JqZWN0KSB2aWRlb3NbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJTm9kZUV4U291bmRbXSBzZWFyY2hTb3VuZChTdHJpbmcgcGF0aCkgewotICAgICAgICBPYmplY3RbXSBzb3VuZHMgPSAoT2JqZWN0W10pIGludm9rZUFTKG5ldyBPYmplY3RbXSB7ICJzZWFyY2hTb3VuZCIsICJfbGV2ZWwwIiwgIl9nbG9iYWwiIH0pOwotICAgICAgICBpZiAoc291bmRzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaW50IGxlbiA9IHNvdW5kcy5sZW5ndGg7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBJTm9kZUV4U291bmRbXSByZXN1bHQgPSBuZXcgSU5vZGVFeFNvdW5kW2xlbl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJTU086IiArIHNvdW5kc1tpXSk7Ci0gICAgICAgICAgICBpZiAoc291bmRzW2ldIGluc3RhbmNlb2YgQVNPYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgRmxhc2hTb3VuZEltcGwodGhpcywgKEFTT2JqZWN0KSBzb3VuZHNbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTZWNyZXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRWYXJpYWJsZShyb290UGF0aCArICIuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEIik7Ci0gICAgICAgICAgICBpZiAoKGlkID09IG51bGwpIHx8IChpZC5sZW5ndGgoKSA9PSAwKSkgcmV0dXJuOwotICAgICAgICAgICAgSVdhWGNvZGluZyB3YXhjb2RpbmcgPSBGbGFzaE1vZGVsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJV2FYY29kaW5nKCk7Ci0gICAgICAgICAgICB0aGlzLnNlY3JldCA9IHdheGNvZGluZy5nZXRTZWNyZXQoaWQsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGbGFzaFRvcE5vZGVJbXBsKFN0cmluZyByb290UGF0aCwgTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpZGlzcCkgewotICAgICAgICBzdXBlcihiYXNlTm9kZSwgaWRpc3ApOwotICAgICAgICB0aGlzLnJvb3RQYXRoID0gcm9vdFBhdGg7Ci0gICAgICAgIHRoaXMucmVxdWVzdEFyZ3NQYXRoID0gcm9vdFBhdGggKyAiLkVjbGlwc2VfQUNURl9yZXF1ZXN0X2FyZ3MiOwotICAgICAgICB0aGlzLnJlc3BvbnNlVmFsdWVQYXRoID0gcm9vdFBhdGggKyAiLkVjbGlwc2VfQUNURl9yZXNwb25zZV92YWx1ZSI7Ci0gICAgICAgIGluaXRNYXJrZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE1hcmtlcigpIHsKLSAgICAgICAgaWYgKHRoaXMubWFya2VyICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIGkgPSAoSW50ZWdlcikgaW52b2tlQVMobmV3IE9iamVjdFtdIHsgIm5ld01hcmtlciIgfSk7Ci0gICAgICAgICAgICB0aGlzLm1hcmtlciA9IGk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRoaXMubWFya2VyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIElGbGFzaE5vZGUgZ2V0Tm9kZUZyb21QYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIEFTT2JqZWN0IGFzT2JqID0gKEFTT2JqZWN0KSBpbnZva2VBUyhuZXcgT2JqZWN0W10geyAiZ2V0Tm9kZUZyb21QYXRoIiwgcGF0aCB9KTsKLSAgICAgICAgaWYgKGFzT2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBGbGFzaE5vZGVJbXBsKHRoaXMsIGFzT2JqKTsKLSAgICB9Ci0KLSAgICBJRmxhc2hOb2RlIGdldE5vZGVBdERlcHRoV2l0aFBhdGgoU3RyaW5nIHBhdGgsIGludCBkZXB0aCkgewotICAgICAgICBBU09iamVjdCBhc09iaiA9IChBU09iamVjdCkgaW52b2tlQVMobmV3IE9iamVjdFtdIHsgImdldE5vZGVBdERlcHRoIiwgcGF0aCwgSW50ZWdlci52YWx1ZU9mKGRlcHRoKSB9KTsKLSAgICAgICAgaWYgKGFzT2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBGbGFzaE5vZGVJbXBsKHRoaXMsIGFzT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZsYXNoTm9kZSBnZXROb2RlQXREZXB0aChpbnQgZGVwdGgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIElGbGFzaE5vZGVbXSBnZXRJbm5lck5vZGVzKCkgewotICAgICAgICByZXR1cm4gZW1wdHlSZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJRmxhc2hOb2RlW10gY3JlYXRlRmxhc2hOb2RlQXJyYXkoT2JqZWN0W10gbm9kZU9ianMpIHsKLSAgICAgICAgaWYgKG5vZGVPYmpzID09IG51bGwpIHJldHVybiBlbXB0eVJlc3VsdDsKLSAgICAgICAgaW50IGxlbiA9IG5vZGVPYmpzLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gZW1wdHlSZXN1bHQ7Ci0gICAgICAgIElGbGFzaE5vZGVbXSByZXN1bHQgPSBuZXcgSUZsYXNoTm9kZVtsZW5dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobm9kZU9ianNbaV0gaW5zdGFuY2VvZiBBU09iamVjdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBGbGFzaE5vZGVJbXBsKHRoaXMsIChBU09iamVjdCkgbm9kZU9ianNbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIElGbGFzaE5vZGVbXSBnZXRJbm5lck5vZGVzV2l0aFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgSURpc3BhdGNoIGlkaXNwID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0SW5uZXJOb2RlcyIsIHBhdGgpOwotICAgICAgICAgICAgSW50ZWdlciBsZW5JbnQgPSAoSW50ZWdlcikgSGVscGVyLmdldChpZGlzcCwgImxlbmd0aCIpOwotICAgICAgICAgICAgaWYgKGxlbkludCA9PSBudWxsKSByZXR1cm4gZW1wdHlSZXN1bHQ7Ci0gICAgICAgICAgICBpbnQgbGVuID0gbGVuSW50LmludFZhbHVlKCk7Ci0gICAgICAgICAgICBJRmxhc2hOb2RlW10gcmVzdWx0ID0gbmV3IElGbGFzaE5vZGVbbGVuXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggY2lkaXNwID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpZGlzcCwgSW50ZWdlci50b1N0cmluZyhpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNpZGlzcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IEZsYXNoTm9kZUltcGwodGhpcywgY2lkaXNwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgT2JqZWN0W10gbm9kZU9ianMgPSAoT2JqZWN0W10pIGludm9rZUFTKG5ldyBPYmplY3RbXSB7ICJnZXRJbm5lck5vZGVzIiwgcGF0aCB9KTsKLSAgICAgICAgaWYgKG5vZGVPYmpzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZW1wdHlSZXN1bHQ7Ci0gICAgICAgIGludCBsZW4gPSBub2RlT2Jqcy5sZW5ndGg7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBlbXB0eVJlc3VsdDsKLSAgICAgICAgSUZsYXNoTm9kZVtdIHJlc3VsdCA9IG5ldyBJRmxhc2hOb2RlW2xlbl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChub2RlT2Jqc1tpXSBpbnN0YW5jZW9mIEFTT2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IEZsYXNoTm9kZUltcGwodGhpcywgKEFTT2JqZWN0KSBub2RlT2Jqc1tpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUZsYXNoTm9kZVtdIGdldFNXRkNoaWxkTm9kZXNXaXRoUGF0aChTdHJpbmcgcGF0aCkgewotICAgICAgICBPYmplY3RbXSBub2RlT2JqcyA9IChPYmplY3RbXSkgaW52b2tlQVMobmV3IE9iamVjdFtdIHsgImdldENoaWxkTm9kZXMiLCBwYXRoIH0pOwotICAgICAgICBpZiAobm9kZU9ianMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBlbXB0eVJlc3VsdDsKLSAgICAgICAgaW50IGxlbiA9IG5vZGVPYmpzLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbiA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGVtcHR5UmVzdWx0OwotICAgICAgICBJRmxhc2hOb2RlW10gcmVzdWx0ID0gbmV3IElGbGFzaE5vZGVbbGVuXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKG5vZGVPYmpzW2ldIGluc3RhbmNlb2YgQVNPYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgRmxhc2hOb2RlSW1wbCh0aGlzLCAoQVNPYmplY3QpIG5vZGVPYmpzW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJRmxhc2hOb2RlW10gdHJhbnNsYXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVdpdGhQYXRoKCJfbGV2ZWwwIik7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBlbXB0eVJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJRmxhc2hOb2RlW10gdHJhbnNsYXRlV2l0aFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgT2JqZWN0W10gbm9kZU9ianMgPSAoT2JqZWN0W10pIGludm9rZUFTKG5ldyBPYmplY3RbXSB7ICJ0cmFuc2xhdGUiLCBwYXRoIH0pOwotICAgICAgICByZXR1cm4gY3JlYXRlRmxhc2hOb2RlQXJyYXkobm9kZU9ianMpOwotICAgIH0KLQotICAgIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcGF0aCwgU3RyaW5nIHByb3ApIHsKLSAgICAgICAgcmV0dXJuIGludm9rZUFTKG5ldyBPYmplY3RbXSB7ICJnZXRQcm9wZXJ0eSIsIHBhdGgsIHByb3AgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcGF0aCwgU3RyaW5nIHByb3AsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnZva2VBUyhuZXcgT2JqZWN0W10geyAic2V0UHJvcGVydHkiLCBwYXRoLCBwcm9wLCB2YWx1ZSB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoKCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9ERVBUSDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRGcmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBJTm9kZUV4IGdldEJhc2VOb2RlKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5vZGUgT3ZlcnJpZGluZyBJbXBsLgotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImludmFsaWQoZ2V0Rmlyc3RDaGlsZCkuIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJpbnZhbGlkKGdldExhc3RDaGlsZCkuIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotICAgICAgICBMaXN0PE5vZGU+IGwgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KDMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGxldmVseE5hbWUgPSAiX2xldmVsIiArIGk7Ci0gICAgICAgICAgICBJRmxhc2hOb2RlIGxldmVseCA9IGdldE5vZGVGcm9tUGF0aChsZXZlbHhOYW1lKTsKLSAgICAgICAgICAgIGlmIChsZXZlbHggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbihsZXZlbHhOYW1lICsgIiBpcyBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICBsLmFkZChsZXZlbHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3IExpc3ROb2RlTGlzdEltcGwobCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc01lZGlhID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBoYXNNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGhhc01lZGlhOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5hbHl6ZWRSZXN1bHQgYW5hbHl6ZShBbmFseXplZFJlc3VsdCBhcikgewotICAgICAgICBJTm9kZUV4VmlkZW9bXSB2aWRlb3MgPSBzZWFyY2hWaWRlbygiX2xldmVsMCIpOwotICAgICAgICBpZiAoKHZpZGVvcyAhPSBudWxsKSAmJiB2aWRlb3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgaGFzTWVkaWEgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWRlb3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhci5hZGRWaWRlbyh2aWRlb3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIElOb2RlRXhTb3VuZFtdIHNvdW5kcyA9IHNlYXJjaFNvdW5kKCJfbGV2ZWwwIik7Ci0gICAgICAgIGlmIChzb3VuZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VuZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhci5hZGRTb3VuZChzb3VuZHNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFyLmFkZEZsYXNoVG9wTm9kZSh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGFyOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBSRVBBSVIgPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIHJlcGFpckZsYXNoKCkgewotICAgICAgICBpZiAoIVJFUEFJUikgewotICAgICAgICAgICAgUkVQQUlSID0gdHJ1ZTsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaW52b2tlQVMobmV3IE9iamVjdFtdIHsgInJlcGFpckZsYXNoIiwgIl9sZXZlbDAiIH0pOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBvKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU1TQUFOb2RlIGdldE1TQUEoKSB7Ci0gICAgICAgIGlmIChjYWNoZWRNU0FBID09IG51bGwpCi0gICAgICAgICAgICBjYWNoZWRNU0FBID0gTVNBQU5vZGVJbXBsLm5ld01TQUFOb2RlKHRoaXMsIGlub2RlKTsKLSAgICAgICAgaWYgKChjYWNoZWRNU0FBID09IG51bGwpIHx8IChjYWNoZWRNU0FBLmdldFdpbmRvdygpID09IDApKSByZXR1cm4gbnVsbDsKLSAgICAgICAgLy8gcmVwYWlyRmxhc2goKTsKLSAgICAgICAgdXBkYXRlVGFyZ2V0KCk7Ci0gICAgICAgIHJldHVybiBjYWNoZWRNU0FBOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldEhXTkQoKSB7Ci0gICAgICAgIHJldHVybiBNU0FBTm9kZUltcGwuZ2V0SFdOREZyb21PYmplY3QoKGludCkgc3VwZXIuZ2V0SU5vZGUoKS5nZXRQdHIoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFic3RyYWN0VGVybXMgZ2V0VGVybXMoKSB7Ci0gICAgICAgIHJldHVybiBGbGFzaFRlcm1zLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETy4uLgotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVkVGFyZ2V0ID0gZmFsc2U7Ci0gICAgcHVibGljIHZvaWQgdXBkYXRlVGFyZ2V0KCkgewotICAgICAgICBpZiAodXBkYXRlZFRhcmdldCkgcmV0dXJuOwotICAgICAgICBPYmplY3QgcmVzdWx0ID0gaW52b2tlQVMobmV3IE9iamVjdFtdIHsgInVwZGF0ZVRhcmdldCIsICJfbGV2ZWwwIiwgMTAgfSk7Ci0gICAgICAgIGlmICgocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbikgJiYgKCgoQm9vbGVhbikgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSkpIHsKLSAgICAgICAgICAgIHVwZGF0ZWRUYXJnZXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFZpZGVvSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFZpZGVvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmYxYjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hWaWRlb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuZmxhc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhWaWRlbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWwuQVNPYmplY3Q7Ci0KLQotY2xhc3MgRmxhc2hWaWRlb0ltcGwgaW1wbGVtZW50cyBJTm9kZUV4VmlkZW8gewotICAgIHByaXZhdGUgZmluYWwgRmxhc2hUb3BOb2RlSW1wbCBzd2Y7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0OwotICAgIC8vIFNvbWUgc29ydCBvZiBoYWNraW5nIHNvbHV0aW9uISEhCi0gICAgcHJpdmF0ZSBWaWRlb1N0YXRlIGN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfVU5LTk9XTjsKLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBGbGFzaFZpZGVvSW1wbChGbGFzaFRvcE5vZGVJbXBsIHN3ZiwgQVNPYmplY3Qgbm9kZUFTT2JqKSB7Ci0gICAgICAgIHRoaXMuc3dmID0gc3dmOwotICAgICAgICB0aGlzLnRhcmdldCA9IChTdHJpbmcpIG5vZGVBU09iai5nZXQoInRhcmdldCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByZXZpb3VzVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXh0VHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wTWVkaWEoKSB7Ci0gICAgICAgIHN3Zi5jYWxsTWV0aG9kKG5ldyBPYmplY3RbXSB7IGdldFRhcmdldCgpLCAic3RvcCIgfSk7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcGxheU1lZGlhKCkgewotICAgICAgICBzd2YuY2FsbE1ldGhvZChuZXcgT2JqZWN0W10geyBnZXRUYXJnZXQoKSwgInBsYXkiIH0pOwotICAgICAgICBjdXJyZW50U3RhdGUgPSBWaWRlb1N0YXRlLlNUQVRFX1BMQVk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBhdXNlTWVkaWEoKSB7Ci0gICAgICAgIHN3Zi5jYWxsTWV0aG9kKG5ldyBPYmplY3RbXSB7IGdldFRhcmdldCgpLCAicGF1c2UiIH0pOwotICAgICAgICBjdXJyZW50U3RhdGUgPSBWaWRlb1N0YXRlLlNUQVRFX1BBVVNFOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0UmV2ZXJzZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZhc3RGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRDdXJyZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIE9iamVjdCBvID0gc3dmLmNhbGxNZXRob2QobmV3IE9iamVjdFtdIHsgZ2V0VGFyZ2V0KCksICJnZXRDdXJyZW50UG9zaXRpb24iIH0pOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSBvKS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGbG9hdCkgewotICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIG8pLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgbykuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFRvdGFsTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3RhdGUgZ2V0Q3VycmVudFN0YXRlKCkgewotICAgICAgICAvLyBUT0RPCi0gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIElOb2RlRXggZ2V0UmVmZXJlbmNlTm9kZSgpIHsKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgdG9wIG5vZGUgKG1heWJlIGEgbWFrZXNoaWZ0KS4KLSAgICAgICAgcmV0dXJuIHN3ZjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL01TQUFOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9NU0FBTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlNTg3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL01TQUFOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmZsYXNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklNU0FBTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuQ29tU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuQ09NVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuR1VJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLklVbmtub3duOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQXV0b21hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuYWNjc2VydmljZS5zd3RicmlkZ2UuQWNjZXNzaWJsZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLmFjY3NlcnZpY2Uuc3d0YnJpZGdlLkFjY2Vzc2libGVPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuYWNjc2VydmljZS5zd3RicmlkZ2UuSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLmFjY3NlcnZpY2Uuc3d0YnJpZGdlLk1TQUE7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTVNBQU5vZGVJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJTVNBQU5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0gICAgICAgIHJldHVybiBhT2JqZWN0LmdldEFjY0tleWJvYXJkU2hvcnRjdXQoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gdGhpcy5nZXRJRCgpOwotICAgICAgICBpZiAoaWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotICAgICAgICByZXR1cm4gaWQuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJTVNBQU5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLSAgICAgICAgSU1TQUFOb2RlIG1zYWEgPSAoSU1TQUFOb2RlKSBvOwotICAgICAgICBTdHJpbmcgaWQxID0gdGhpcy5nZXRJRCgpOwotICAgICAgICBTdHJpbmcgaWQyID0gbXNhYS5nZXRJRCgpOwotICAgICAgICBpZiAoaWQxID09IG51bGwgfHwgaWQyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgICAgICByZXR1cm4gaWQxLmVxdWFscyhpZDIpOwotICAgIH0KLSAgIAotICAgIEFjY2Vzc2libGVPYmplY3QgYU9iamVjdDsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNUb3A7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBNU0FBTm9kZUltcGwgdG9wTm9kZTsKLQotICAgIHByb3RlY3RlZCBFbGVtZW50SW1wbCBiYXNlOwotCi0gICAgcHJpdmF0ZSBOb2RlSW1wbCBwYXJlbnQ7Ci0KLSAgICBwcml2YXRlIGludCBudW1iZXI7Ci0KLSAgICBwcml2YXRlIE1TQUFOb2RlSW1wbChFbGVtZW50SW1wbCBpbXBsLCBJRGlzcGF0Y2ggaW5vZGUsIEFjY2Vzc2libGVPYmplY3QgYU9iamVjdCkgewotICAgICAgICBzdXBlcihpbXBsLCBpbm9kZSk7Ci0gICAgICAgIHRoaXMuYmFzZSA9IGltcGw7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKLSAgICAgICAgdGhpcy5hT2JqZWN0ID0gc2VhcmNoRmxhc2goYU9iamVjdCk7Ci0gICAgICAgIHRoaXMudG9wTm9kZSA9IHRoaXM7Ci0gICAgICAgIHRoaXMuaXNUb3AgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgQWNjZXNzaWJsZU9iamVjdCBzZWFyY2hGbGFzaChBY2Nlc3NpYmxlT2JqZWN0IHRvcCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNlYXJjaEZsYXNoKHRvcCwgMTAwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmxlT2JqZWN0IHNlYXJjaEZsYXNoKEFjY2Vzc2libGVPYmplY3QgdG9wLCBpbnQgbikgewotICAgICAgICBpZiAodG9wID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgQWNjZXNzaWJsZU9iamVjdFtdIGNoaWxkcmVuID0gdG9wLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGlzRmxhc2goY2hpbGRyZW5baV0pKSB7Ci0gICAgICAgICAgICAgICAgVmFyaWFudCB2ID0gZ2V0SFRNTEVsZW1lbnRGcm9tT2JqZWN0KGNoaWxkcmVuW2ldKTsKLQotICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHB0ciA9IHYuZ2V0RGlzcGF0Y2goKS5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIElEaXNwYXRjaCBpZCA9IENvbVNlcnZpY2UubmV3SURpc3BhdGNoKGlub2RlLmdldFJlc291cmNlTWFuYWdlcigpLCBwdHIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFVuaXF1ZUlEID0gKFN0cmluZykgSGVscGVyLmdldChpZCwgInVuaXF1ZUlEIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBteVVuaXF1ZUlEID0gKFN0cmluZykgYmFzZS5nZXRVbmlxdWVJRCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXlVbmlxdWVJRC5lcXVhbHModGFyZ2V0VW5pcXVlSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgQWNjZXNzaWJsZU9iamVjdCBhbyA9IHNlYXJjaEZsYXNoKGNoaWxkcmVuW2ldLCBuIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYoYW8gIT0gbnVsbCkKLQkgICAgICAgICAgICAgICAgcmV0dXJuIGFvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTVNBQU5vZGVJbXBsKEVsZW1lbnRJbXBsIG1zYWFCYXNlLCBOb2RlSW1wbCBwYXJlbnQsIE1TQUFOb2RlSW1wbCB0b3BOb2RlLCBBY2Nlc3NpYmxlT2JqZWN0IGFPYmplY3QpIHsKLSAgICAgICAgc3VwZXIobXNhYUJhc2UsIG51bGwpOwotICAgICAgICB0aGlzLmJhc2UgPSBtc2FhQmFzZTsKLSAgICAgICAgdGhpcy5hT2JqZWN0ID0gYU9iamVjdDsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMudG9wTm9kZSA9IHRvcE5vZGU7Ci0gICAgICAgIHRoaXMuaXNUb3AgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1TQUFOb2RlSW1wbCBuZXdNU0FBTm9kZShFbGVtZW50SW1wbCBpbXBsLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAgICAgVmFyaWFudCB2ID0gZ2V0TVNBQUZyb21PYmplY3QoKGludCkgaW5vZGUuZ2V0UHRyKCkpOwotICAgICAgICBpZiAobnVsbCAhPSB2ICYmIE9MRS5WVF9ESVNQQVRDSCA9PSB2LmdldFR5cGUoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmxlT2JqZWN0IGFPYmplY3QgPSBBY2Nlc3NpYmxlT2JqZWN0RmFjdG9yeS5nZXRBY2Nlc3NpYmxlT2JqZWN0RnJvbVZhcmlhbnQodik7Ci0gICAgICAgICAgICAgICAgTVNBQU5vZGVJbXBsIHJldCA9IG5ldyBNU0FBTm9kZUltcGwoaW1wbCwgaW5vZGUsIGFPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChyZXQuYU9iamVjdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB2LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR1VJRCBJSURfSUhUTUxFbGVtZW50ID0gQ09NVXRpbC5JSURGcm9tU3RyaW5nKCJ7MzA1MGYxZmYtOThiNS0xMWNmLWJiODItMDBhYTAwYmRjZTBifSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdVSUQgSUlEX0lBY2Nlc3NpYmxlID0gQ09NVXRpbC5JSURGcm9tU3RyaW5nKCJ7NjE4NzM2RTAtM0MzRC0xMUNGLTgxMEMtMDBBQTAwMzg5QjcxfSIpOyAvLyAkTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBWYXJpYW50IGdldE1TQUFGcm9tT2JqZWN0KGludCB1bmtub3duKSB7Ci0gICAgICAgIElVbmtub3duIG9ialVua25vd24gPSBuZXcgSVVua25vd24odW5rbm93bik7Ci0gICAgICAgIGludFtdIHBwdlNlcnZpY2VQcm92aWRlciA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGlmIChPTEUuU19PSyA9PSAoKElVbmtub3duKSBvYmpVbmtub3duKS5RdWVyeUludGVyZmFjZShJU2VydmljZVByb3ZpZGVyLklJRCwgcHB2U2VydmljZVByb3ZpZGVyKSkgewotICAgICAgICAgICAgSVNlcnZpY2VQcm92aWRlciBzcCA9IG5ldyBJU2VydmljZVByb3ZpZGVyKHBwdlNlcnZpY2VQcm92aWRlclswXSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludFtdIHBwdk9iamVjdCA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgaWYgKE9MRS5TX09LID09IHNwLlF1ZXJ5U2VydmljZShJSURfSUFjY2Vzc2libGUsIElJRF9JQWNjZXNzaWJsZSwgcHB2T2JqZWN0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhbnQobmV3IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuSURpc3BhdGNoKHBwdk9iamVjdFswXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc3AuUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRIV05ERnJvbU9iamVjdChpbnQgdW5rbm93bikgewotICAgICAgICBWYXJpYW50IHYgPSBnZXRNU0FBRnJvbU9iamVjdCh1bmtub3duKTsKLSAgICAgICAgaWYgKCh2ID09IG51bGwpIHx8ICh2LmdldFR5cGUoKSAhPSBPTEUuVlRfRElTUEFUQ0gpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIEFjY2Vzc2libGVPYmplY3QgYU9iamVjdCA9IEFjY2Vzc2libGVPYmplY3RGYWN0b3J5LmdldEFjY2Vzc2libGVPYmplY3RGcm9tVmFyaWFudCh2KTsKLSAgICAgICAgcmV0dXJuIGFPYmplY3QuZ2V0V2luZG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWYXJpYW50IGdldEhUTUxFbGVtZW50RnJvbU9iamVjdChPYmplY3Qgb2JqVW5rbm93bikgewotICAgICAgICBpZiAob2JqVW5rbm93biBpbnN0YW5jZW9mIEFjY2Vzc2libGVPYmplY3QpIHsKLSAgICAgICAgICAgIG9ialVua25vd24gPSAoKEFjY2Vzc2libGVPYmplY3QpIG9ialVua25vd24pLmdldElBY2Nlc3NpYmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9ialVua25vd24gaW5zdGFuY2VvZiBJVW5rbm93bikgewotICAgICAgICAgICAgaW50W10gcHB2U2VydmljZVByb3ZpZGVyID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIGlmIChPTEUuU19PSyA9PSAoKElVbmtub3duKSBvYmpVbmtub3duKS5RdWVyeUludGVyZmFjZShJU2VydmljZVByb3ZpZGVyLklJRCwgcHB2U2VydmljZVByb3ZpZGVyKSkgewotICAgICAgICAgICAgICAgIElTZXJ2aWNlUHJvdmlkZXIgc3AgPSBuZXcgSVNlcnZpY2VQcm92aWRlcihwcHZTZXJ2aWNlUHJvdmlkZXJbMF0pOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludFtdIHBwdk9iamVjdCA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChPTEUuU19PSyA9PSBzcC5RdWVyeVNlcnZpY2UoSUlEX0lIVE1MRWxlbWVudCwgSUlEX0lIVE1MRWxlbWVudCwgcHB2T2JqZWN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYW50KG5ldyBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLklEaXNwYXRjaChwcHZPYmplY3RbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzcC5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsYXNoKEFjY2Vzc2libGVPYmplY3QgYWNjT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBpc0ZsYXNoQ2xhc3MoYWNjT2JqZWN0LmdldENsYXNzTmFtZSgpKSB8fCBpc0ludmlzaWJsZUZsYXNoKGFjY09iamVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ludmlzaWJsZUZsYXNoKEFjY2Vzc2libGVPYmplY3QgYWNjT2JqZWN0KSB7Ci0gICAgICAgIGlmIChNU0FBLlJPTEVfU1lTVEVNX0NMSUVOVCA9PSBhY2NPYmplY3QuZ2V0QWNjUm9sZSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBhY2NPYmplY3QuZ2V0QWNjRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IGRlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoIlBMVUdJTjogdHlwZT0iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZ2V0SHRtbEF0dHJpYnV0ZShhY2NPYmplY3QsICJXTW9kZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0bWxBdHRyaWJ1dGUoT2JqZWN0IG9ialVua25vd24sIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFZhcmlhbnQgdmFyRWxlbWVudCA9IGdldEhUTUxFbGVtZW50RnJvbU9iamVjdChvYmpVbmtub3duKTsKLSAgICAgICAgaWYgKG51bGwgIT0gdmFyRWxlbWVudCAmJiBPTEUuVlRfRElTUEFUQ0ggPT0gdmFyRWxlbWVudC5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2xlQXV0b21hdGlvbiBhdXRvbWF0aW9uID0gdmFyRWxlbWVudC5nZXRBdXRvbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaW50W10gaWRBdHRyID0gYXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7IG5hbWUgfSk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gaWRBdHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZhcmlhbnQgdmFyQXR0ciA9IGF1dG9tYXRpb24uZ2V0UHJvcGVydHkoaWRBdHRyWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdmFyQXR0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdmFyQXR0ciAmJiBPTEUuVlRfQlNUUiA9PSB2YXJBdHRyLmdldFR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJBdHRyLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB2YXJFbGVtZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmxhc2hDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiAiTWFjcm9tZWRpYUZsYXNoUGxheWVyQWN0aXZlWCIuZXF1YWxzKGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkgewotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgTm9kZUxpc3QgewotICAgICAgICBBcnJheUxpc3Q8Tm9kZT4gbGlzdDsKLQotICAgICAgICBNU0FBTm9kZUltcGwgcGFyZW50OwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG93T2Zmc2NyZWVuID0gdHJ1ZTsKLQotICAgICAgICBwcml2YXRlIE5vZGVMaXN0SW1wbChBY2Nlc3NpYmxlT2JqZWN0W10gYU9iamVjdHMsIE1TQUFOb2RlSW1wbCBwYXJlbnQsIGJvb2xlYW4gaXNUb3AsIGludCB0b3RhbCkgewotICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhT2JqZWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChhT2JqZWN0c1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhY2NTdGF0ZSA9IGFPYmplY3RzW2ldLmdldEFjY1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIE1TQUFOb2RlSW1wbCBub2RlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gKGFjY1N0YXRlICYgTVNBQS5TVEFURV9JTlZJU0lCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IE1TQUFOb2RlSW1wbChwYXJlbnQuYmFzZSwgcGFyZW50LCBwYXJlbnQudG9wTm9kZSwgYU9iamVjdHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dPZmZzY3JlZW4gJiYgMCAhPSAoYWNjU3RhdGUgJiBNU0FBLlNUQVRFX09GRlNDUkVFTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTVNBQU5vZGVJbXBsKHBhcmVudC5iYXNlLCBwYXJlbnQsIHBhcmVudC50b3BOb2RlLCBhT2JqZWN0c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5udW1iZXIgPSB0b3RhbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldExpbmtVUkkoKSB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0NsaWNrKCkgewotICAgICAgICByZXR1cm4gYU9iamVjdC5kb0RlZmF1bHRBY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLSAgICAgICAgaWYgKGFPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwobmV3IEFjY2Vzc2libGVPYmplY3RbMF0sIHRoaXMsIGlzVG9wLCAwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5vZGVMaXN0SW1wbChhT2JqZWN0LmdldENoaWxkcmVuKCksIHRoaXMsIGlzVG9wLCAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotICAgICAgICBpZiAoYU9iamVjdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYU9iamVjdC5nZXRDaGlsZENvdW50KCkgPiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0gICAgICAgIE5vZGVMaXN0IGxpc3QgPSBuZXcgTm9kZUxpc3RJbXBsKGFPYmplY3QuZ2V0Q2hpbGRyZW4oKSwgdGhpcywgaXNUb3AsIDApOwotICAgICAgICBpZiAobGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVtKDApOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0gICAgICAgIE5vZGVMaXN0IGxpc3QgPSBuZXcgTm9kZUxpc3RJbXBsKGFPYmplY3QuZ2V0Q2hpbGRyZW4oKSwgdGhpcywgaXNUb3AsIDApOwotICAgICAgICBpZiAobGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVtKGxpc3QuZ2V0TGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZygpIHsKLSAgICAgICAgaWYgKGFPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICBpbnQgciA9IGFPYmplY3QuZ2V0QWNjUm9sZSgpOwotICAgICAgICBTdHJpbmcgYWNjTmFtZSA9IGFPYmplY3QuZ2V0QWNjTmFtZSgpOwotICAgICAgICBpZiAoYWNjTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgYWNjTmFtZSA9ICIiOwotCi0gICAgICAgIGlmIChyID09IE1TQUEuUk9MRV9TWVNURU1fUFVTSEJVVFRPTikgewotICAgICAgICAgICAgaWYgKGFjY05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGFjY05hbWUgPSAiIiArIG51bWJlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWNjTmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gYWNjTmFtZTsKLSAgICAgICAgcmV0dXJuIGFjY05hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFnTmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhpZ2hsaWdodCgpIHsKLSAgICAgICAgYU9iamVjdC5zZWxlY3QoTVNBQS5TRUxGTEFHX1RBS0VGT0NVUyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7Ci0gICAgICAgIGlmIChhT2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGFPYmplY3Quc2VsZWN0KE1TQUEuU0VMRkxBR19UQUtFRk9DVVMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB1bmhpZ2hsaWdodCgpIHsKLSAgICAgICAgaWYgKGFPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgYU9iamVjdC5zZWxlY3QoTVNBQS5TRUxGTEFHX1JFTU9WRVNFTEVDVElPTik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIGlmIChhT2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0vLyAgICAgICAgU3RyaW5nIGlkID0gYU9iamVjdC5nZXRBY2NLZXlib2FyZFNob3J0Y3V0KCk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJRCA9ICIgKyBpZCk7Ci0gICAgICAgIC8vCi0gICAgICAgIFN0cmluZyByb2xlID0gTVNBQS5nZXRSb2xlVGV4dChhT2JqZWN0LmdldEFjY1JvbGUoKSk7Ci0gICAgICAgIFN0cmluZyBhY2NOYW1lID0gYU9iamVjdC5nZXRBY2NOYW1lKCk7Ci0gICAgICAgIGlmIChhY2NOYW1lID09IG51bGwpCi0gICAgICAgICAgICBhY2NOYW1lID0gIiI7Ci0gICAgICAgIC8vcmV0dXJuIGFPYmplY3QuZ2V0QWNjTG9jYXRpb24oKSArICIoIiArIHJvbGUgKyAiKSIgKyBhY2NOYW1lOwotICAgICAgICByZXR1cm4gIigiICsgcm9sZSArICIpIiArIGFjY05hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLSAgICAgICAgLy8gcmV0dXJuIEZMQVNIX05PREU7Ci0gICAgICAgIHJldHVybiBOb2RlLkVMRU1FTlRfTk9ERTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRXaW5kb3coKSB7Ci0gICAgICAgIHJldHVybiBhT2JqZWN0LmdldFdpbmRvdygpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWJzdHJhY3RUZXJtcyBnZXRUZXJtcygpewotICAgICAgICByZXR1cm4gTVNBQVRlcm1zLmdldEluc3RhbmNlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSU1TQUFOb2RlIHNlYXJjaEJ5SURJbnRlcm5hbChTdHJpbmcgaWQpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldCA9IGFPYmplY3QuZ2V0QWNjS2V5Ym9hcmRTaG9ydGN1dCgpOwotICAgICAgICBpZiAoaWQuZXF1YWxzKHRhcmdldCkpIHJldHVybiB0aGlzOwotICAgICAgICBOb2RlTGlzdCBubCA9IGdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgaW50IGxlbiA9IG5sLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBNU0FBTm9kZUltcGwgbiA9IChNU0FBTm9kZUltcGwpIG5sLml0ZW0oaSk7Ci0gICAgICAgICAgICBJTVNBQU5vZGUgcmV0ID0gbi5zZWFyY2hCeUlESW50ZXJuYWwoaWQpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJTVNBQU5vZGUgc2VhcmNoQnlJRChTdHJpbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIHRvcE5vZGUuc2VhcmNoQnlJREludGVybmFsKGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5vZGVFeCBnZXRCYXNlTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHNob3J0IGdldEhlYWRpbmdMZXZlbCgpIHsKLSAgICAgICAgaWYgKGlzVG9wKQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEhlYWRpbmdMZXZlbCgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gYmFzZS5nZXRMb2NhdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvTVNBQVRlcm1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL01TQUFUZXJtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg5MzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvTVNBQVRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuYWNjc2VydmljZS5zd3RicmlkZ2UuTVNBQTsKLQotCi0KLXB1YmxpYyBjbGFzcyBNU0FBVGVybXMgZXh0ZW5kcyBBYnN0cmFjdFRlcm1zIHsKLSAgICBwcml2YXRlIHN0YXRpYyBNU0FBVGVybXMgaW5zdGFuY2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1TQUFUZXJtcyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IE1TQUFUZXJtcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1TQUFOb2RlSW1wbCkgewotICAgICAgICAgICAgTVNBQU5vZGVJbXBsIG5vZGUgPSAoTVNBQU5vZGVJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIGludCByb2xlID0gbm9kZS5hT2JqZWN0LmdldEFjY1JvbGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJvbGUgPT0gTVNBQS5ST0xFX1NZU1RFTV9QVVNIQlVUVE9OIHx8IHJvbGUgPT0gTVNBQS5ST0xFX1NZU1RFTV9SQURJT0JVVFRPTgotICAgICAgICAgICAgICAgICAgICB8fCByb2xlID09IE1TQUEuUk9MRV9TWVNURU1fQ0hFQ0tCVVRUT04gfHwgcm9sZSA9PSBNU0FBLlJPTEVfU1lTVEVNX0xJTks7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1TQUFOb2RlSW1wbCkgewotICAgICAgICAgICAgTVNBQU5vZGVJbXBsIG5vZGUgPSAoTVNBQU5vZGVJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByb2xlID0gbm9kZS5hT2JqZWN0LmdldEFjY1JvbGUoKTsKLSAgICAgICAgICAgIGludCBzdGF0ZSA9IG5vZGUuYU9iamVjdC5nZXRBY2NTdGF0ZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcm9sZSA9PSBNU0FBLlJPTEVfU1lTVEVNX1RFWFQgJiYgc3RhdGUgIT0gTVNBQS5TVEFURV9SRUFET05MWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZE5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZU5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnV0dG9uKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTVNBQU5vZGVJbXBsKSB7Ci0gICAgICAgICAgICBNU0FBTm9kZUltcGwgbm9kZSA9IChNU0FBTm9kZUltcGwpIHRhcmdldDsKLQotICAgICAgICAgICAgaW50IHJvbGUgPSBub2RlLmFPYmplY3QuZ2V0QWNjUm9sZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcm9sZSA9PSBNU0FBLlJPTEVfU1lTVEVNX1BVU0hCVVRUT047Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHRlcmFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIE1TQUFOb2RlSW1wbCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFpc0NsaWNrYWJsZSh0YXJnZXQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIE1TQUFOb2RlSW1wbCBtbiA9IChNU0FBTm9kZUltcGwpIHRhcmdldDsKLSAgICAgICAgU3RyaW5nIGlkID0gbW4uZ2V0SUQoKTsKLSAgICAgICAgaWYgKGlkID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGlkLmxlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU2YzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjZDJkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIERvbUJ5Q29tIFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjAuMQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uRG9tYnljb21QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFjdGYuYWkua2V5LmtleWhvb2sud2luMzIsCi0gb3JnLmVjbGlwc2UuYWN0Zi5jb21tb24sCi0gb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20KLUJ1bmRsZS1DbGFzc1BhdGg6IGJpbi8sCi0gcnVudGltZXMvZG9tYnljb20uamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYThjOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcnVudGltZXMvZG9tYnljb20uamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNvdXJjZS5ydW50aW1lcy9kb21ieWNvbS5qYXIgPSBzcmMvCi1vdXRwdXQucnVudGltZXMvZG9tYnljb20uamFyID0gYmluLwotamFycy5jb21waWxlLm9yZGVyID0gcnVudGltZXMvZG9tYnljb20uamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjE4Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsZW1lbnRGYWN0b3J5IiBuYW1lPSJFbGVtZW50IEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL2VsZW1lbnRGYWN0b3J5LmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NjaGVtYS9lbGVtZW50RmFjdG9yeS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zY2hlbWEvZWxlbWVudEZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwNjg1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NjaGVtYS9lbGVtZW50RmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbSIgaWQ9ImVsZW1lbnRGYWN0b3J5IiBuYW1lPSJFbGVtZW50IEZhY3RvcnkiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0RWxlbWVudEZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0RWxlbWVudEZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbXBsZW1lbnRhdGlvbnMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU9iamVjdEVsZW1lbnRGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vQW5hbHl6ZWRSZXN1bHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0FuYWx5emVkUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTA4NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vQW5hbHl6ZWRSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBBbmFseXplZFJlc3VsdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5vZGVFeFZpZGVvW10gZW1wdHlWaWRlb0FycmF5ID0gbmV3IElOb2RlRXhWaWRlb1swXTsgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5vZGVFeFNvdW5kW10gZW1wdHlTb3VuZEFycmF5ID0gbmV3IElOb2RlRXhTb3VuZFswXTsgCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SU5vZGVFeFZpZGVvPiB2aWRlb0xpc3QgPSBuZXcgQXJyYXlMaXN0PElOb2RlRXhWaWRlbz4oKTsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxJTm9kZUV4U291bmQ+IHNvdW5kTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU5vZGVFeFNvdW5kPigpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElOb2RlRXhbXSBlbXB0eUFjY2Vzc0tleUFycmF5ID0gbmV3IElOb2RlRXhbMF07Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SU5vZGVFeD4gYWNjZXNzS2V5TGlzdCA9IG5ldyBBcnJheUxpc3Q8SU5vZGVFeD4oKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmxhc2hOb2RlW10gZW1wdHlGbGFzaFRvcE5vZGVBcnJheSA9IG5ldyBJRmxhc2hOb2RlWzBdOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PElGbGFzaE5vZGU+IGZsYXNoTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElGbGFzaE5vZGU+KCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkRmxhc2hUb3BOb2RlKElGbGFzaE5vZGUgZikgewotICAgICAgICBmbGFzaE5vZGVMaXN0LmFkZChmKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVmlkZW8oSU5vZGVFeFZpZGVvIHYpIHsKLSAgICAgICAgdmlkZW9MaXN0LmFkZCh2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTb3VuZChJTm9kZUV4U291bmQgcykgewotICAgICAgICBzb3VuZExpc3QuYWRkKHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRBY2Nlc3NLZXkoSU5vZGVFeCBhKSB7Ci0gICAgICAgIGFjY2Vzc0tleUxpc3QuYWRkKGEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU5vZGVFeFZpZGVvW10gZ2V0VmlkZW9Ob2RlcygpIHsKLSAgICAgICAgcmV0dXJuIHZpZGVvTGlzdC50b0FycmF5KGVtcHR5VmlkZW9BcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIElOb2RlRXhTb3VuZFtdIGdldFNvdW5kTm9kZXMoKSB7Ci0gICAgICAgIHJldHVybiBzb3VuZExpc3QudG9BcnJheShlbXB0eVNvdW5kQXJyYXkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU5vZGVFeFtdIGdldEFjY2Vzc0tleU5vZGVzKCkgewotICAgICAgICByZXR1cm4gYWNjZXNzS2V5TGlzdC50b0FycmF5KGVtcHR5QWNjZXNzS2V5QXJyYXkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUZsYXNoTm9kZVtdIGdldEZsYXNoVG9wTm9kZXMoKSB7Ci0gICAgICAgIHJldHVybiBmbGFzaE5vZGVMaXN0LnRvQXJyYXkoZW1wdHlGbGFzaFRvcE5vZGVBcnJheSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vRG9tQnlDb20uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0RvbUJ5Q29tLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4M2NlM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vRG9tQnlDb20uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLlN0eWxlU2hlZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuQ29tUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuQ29tU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBEb21CeUNvbSB7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJRGlzcGF0Y2ggaVdlYkJyb3dzZXIyOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRElWID0gIl9fb3JnX2VjbGlwc2VfYWN0Zl9oaWdobGlnaHRfZGl2X18iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElWX0JPUkRFUl9XSURUSCA9IDM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9CT1JERVIgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElWX0JPUkRFUiA9IDE7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfQk9SREVSMiA9IDI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JERVJfTU9ERSA9IFNUWUxFX0JPUkRFUjI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9SREVSX1NUWUxFX1NUUklORyA9ICJib3JkZXI6IDNweCBzb2xpZCAjMDcxOyBiYWNrZ3JvdW5kOiAjZmRkOyI7Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkU3R5bGVzKERvY3VtZW50SW1wbCBkb2MpIHsKLSAgICAgICAgU3R5bGVTaGVldEltcGwgc3R5bGUgPSBkb2MuY3JlYXRlU3R5bGVTaGVldCgpOwotICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3R5bGUuYWRkUnVsZSgiLkNTU3RvSGlnaGxpZ2h0IiwgQk9SREVSX1NUWUxFX1NUUklORyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRGl2cyhEb2N1bWVudEltcGwgZG9jKSB7Ci0gICAgICAgIEVsZW1lbnQgZWwgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoSURfRElWKTsKLSAgICAgICAgaWYgKGVsID09IG51bGwpIHsKLSAgICAgICAgICAgIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJpZCIsIElEX0RJVik7Ci0KLSAgICAgICAgICAgIE5vZGVMaXN0IGJvZHkgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKTsKLSAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwgJiYgYm9keS5nZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImluc2VydCIpOwotICAgICAgICAgICAgICAgIGJvZHkuaXRlbSgwKS5hcHBlbmRDaGlsZChlbCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJRWxlbWVudEV4IGVseCA9IChJRWxlbWVudEV4KSBlbDsKLSAgICAgICAgICAgICAgICAgICAgSVN0eWxlIHN0ID0gZWx4LmdldFN0eWxlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3QucHV0KCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpOwotICAgICAgICAgICAgICAgICAgICBzdC5wdXQoImJhY2tncm91bmRDb2xvciIsICJ0cmFuc3BhcmVudCIpOwotICAgICAgICAgICAgICAgICAgICBzdC5wdXQoImJvcmRlciIsIERJVl9CT1JERVJfV0lEVEggKyAicHggc29saWQgZ3JlZW4iKTsKLSAgICAgICAgICAgICAgICAgICAgc3QucHV0KCJ6SW5kZXgiLCAiMTAwMDAiKTsKLSAgICAgICAgICAgICAgICAgICAgc3QucHV0KCJsZWZ0IiwgIi0xMDAwcHgiKTsKLSAgICAgICAgICAgICAgICAgICAgc3QucHV0KCJ0b3AiLCAiLTEwMDBweCIpOwotICAgICAgICAgICAgICAgICAgICBzdC5wdXQoIndpZHRoIiwgIjEwMHB4Iik7Ci0gICAgICAgICAgICAgICAgICAgIHN0LnB1dCgiaGVpZ2h0IiwgIjEwMHB4Iik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShEb2N1bWVudEltcGwgZG9jKSB7Ci0gICAgICAgIGlmIChCT1JERVJfTU9ERSA9PSBTVFlMRV9CT1JERVIpIHsKLSAgICAgICAgICAgIGFkZFN0eWxlcyhkb2MpOwotICAgICAgICB9IGVsc2UgaWYgKEJPUkRFUl9NT0RFID09IERJVl9CT1JERVIpIHsKLSAgICAgICAgICAgIGFkZERpdnMoZG9jKTsKLSAgICAgICAgfSBlbHNlIGlmIChCT1JERVJfTU9ERSA9PSBTVFlMRV9CT1JERVIyKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3RoaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgcmVzb3VyY2VNYW5hZ2VyLnJlbGVhc2VBbGwoaVdlYkJyb3dzZXIyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURvY3VtZW50RXggZ2V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBpRG9jdW1lbnQgPSAoSURpc3BhdGNoKSBpV2ViQnJvd3NlcjIuZ2V0KCJEb2N1bWVudCIpOwotICAgICAgICBEb2N1bWVudEltcGwgZG9jID0gbmV3IERvY3VtZW50SW1wbChpRG9jdW1lbnQpOwotICAgICAgICBpbml0aWFsaXplKGRvYyk7Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgcHVibGljIERvbUJ5Q29tKGxvbmcgaVdlYkJyb3dzZXIyKSB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VNYW5hZ2VyID0gQ29tUGx1Z2luLmdldERlZmF1bHQoKS5uZXdSZXNvdXJjZU1hbmFnZXIobnVsbCk7Ci0gICAgICAgIHRoaXMuaVdlYkJyb3dzZXIyID0gQ29tU2VydmljZS5uZXdJRGlzcGF0Y2gocmVzb3VyY2VNYW5hZ2VyLCBpV2ViQnJvd3NlcjIsIHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0RvbWJ5Y29tUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9Eb21ieWNvbVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTcwZmNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0RvbWJ5Y29tUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRG9tYnljb21QbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0gICAgLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotICAgIHByaXZhdGUgc3RhdGljIERvbWJ5Y29tUGx1Z2luIHBsdWdpbjsKLQkKLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIERvbWJ5Y29tUGx1Z2luKCkgewotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9tYnljb21QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lEb2N1bWVudEV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRG9jdW1lbnRFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ3ZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lEb2N1bWVudEV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50RXggZXh0ZW5kcyBEb2N1bWVudCB7Ci0gICAgU3RyaW5nIENTUzFfQ09NUEFUID0gIkNTUzFDb21wYXQiOwotICAgIFN0cmluZyBCQUNLX0NPTVBBVCA9ICJCYWNrQ29tcGF0IjsKLSAgICBMaXN0PE5vZGU+IGdldEVsZW1lbnRzQnlJZEluQWxsRnJhbWVzKFN0cmluZyBpZCk7Ci0gICAgU3RyaW5nIGdldENvbXBhdE1vZGUoKTsKLSAgICBFbGVtZW50IGdldFRhcmdldEVsZW1lbnQoU3RyaW5nIHRhcmdldCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRWxlbWVudEV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRWxlbWVudEV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTg4ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSUVsZW1lbnRFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLQotcHVibGljIGludGVyZmFjZSBJRWxlbWVudEV4IHsKLSAgICBwdWJsaWMgY2xhc3MgUG9zaXRpb24gewotICAgICAgICBwdWJsaWMgaW50IGluZGV4OwotICAgICAgICBwdWJsaWMgaW50IHRvdGFsOwotICAgIH0KLSAgICBwdWJsaWMgSVN0eWxlIGdldFN0eWxlKCk7Ci0gICAgCi0gICAgcHVibGljIFBvc2l0aW9uIGdldFJhZGlvUG9zaXRpb24oKTsKLSAgICBwdWJsaWMgUG9zaXRpb24gZ2V0TGlzdFBvc2l0aW9uKCk7Ci0gICAgcHVibGljIEVsZW1lbnQgZ2V0Rm9ybUxhYmVsKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRmxhc2hOb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRmxhc2hOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYmNjOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSUZsYXNoTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUZsYXNoTm9kZSBleHRlbmRzIElOb2RlRXggewotICAgIHNob3J0IEZMQVNIX05PREUgPSAxMjA7Ci0gICAgaW50IElOVkFMSURfREVQVEggPSAtMTYzODQ7Ci0KLSAgICBTdHJpbmcgZ2V0VGFyZ2V0KCk7Ci0gICAgSUZsYXNoTm9kZSBnZXROb2RlRnJvbVBhdGgoU3RyaW5nIHBhdGgpOwotICAgIElGbGFzaE5vZGUgZ2V0Tm9kZUF0RGVwdGgoaW50IGRlcHRoKTsKLSAgICBJRmxhc2hOb2RlW10gZ2V0SW5uZXJOb2RlcygpOwotICAgIGludCBnZXREZXB0aCgpOwotICAgIGludCBnZXRDdXJyZW50RnJhbWUoKTsKLQotICAgIElGbGFzaE5vZGVbXSB0cmFuc2xhdGUoKTsKLQotICAgIElNU0FBTm9kZSBnZXRNU0FBKCk7Ci0gICAgdm9pZCByZXBhaXJGbGFzaCgpOwotCi0gICAgSU5vZGVFeCBnZXRCYXNlTm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSUltYWdlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSUltYWdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTNmYWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lJbWFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElJbWFnZUVsZW1lbnQgZXh0ZW5kcyBJTm9kZUV4IHsKLSAgICBwdWJsaWMgRWxlbWVudCBnZXRNYXAoKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVc2VtYXAoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lNU0FBTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU1TQUFOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2JmMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU1TQUFOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLQotcHVibGljIGludGVyZmFjZSBJTVNBQU5vZGUgZXh0ZW5kcyBJTm9kZUV4IHsKLSAgICBTdHJpbmcgZ2V0SUQoKTsKLQotICAgIElNU0FBTm9kZSBzZWFyY2hCeUlEKFN0cmluZyBpZCk7Ci0KLSAgICBJTm9kZUV4IGdldEJhc2VOb2RlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOWQ0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU5vZGVFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlRXggZXh0ZW5kcyBOb2RlLCBJRXZhbFRhcmdldHsKLSAgICBTdHJpbmcgZXh0cmFjdFN0cmluZygpOwotICAgIHNob3J0IGdldEhlYWRpbmdMZXZlbCgpOwotICAgIFN0cmluZyBnZXRMaW5rVVJJKCk7Ci0gICAgY2hhciBnZXRBY2Nlc3NLZXkoKTsKLSAgICAvLyBtYXliZSBoZWF2eSB0YXNrCi0gICAgaW50IGdldE50aCgpOwotICAgIAotICAgIGJvb2xlYW4gZG9DbGljaygpOwotICAgIGJvb2xlYW4gaGlnaGxpZ2h0KCk7Ci0gICAgYm9vbGVhbiB1bmhpZ2hsaWdodCgpOwotICAgIGJvb2xlYW4gc2V0Rm9jdXMoKTsKLSAgICBib29sZWFuIHNldFRleHQoU3RyaW5nIHRleHQpOwotICAgIFN0cmluZyBnZXRUZXh0KCk7Ci0KLSAgICAvLyFGTiEKLSAgICBTdHJpbmdbXSBnZXRTdGlsbFBpY3R1cmVEYXRhKCk7Ci0KLSAgICBBbmFseXplZFJlc3VsdCBhbmFseXplKEFuYWx5emVkUmVzdWx0IGFyKTsKLSAgICBSZWN0YW5nbGUgZ2V0TG9jYXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lOb2RlRXhTb3VuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU5vZGVFeFNvdW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOWRiOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU5vZGVFeFNvdW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlRXhTb3VuZCB7Ci0gICAgaW50IFZPTFVNRV9NSU4gPSAwOwotICAgIGludCBWT0xVTUVfTUFYID0gMTAwMDsKLQotICAgIGJvb2xlYW4gZ2V0TXV0ZVN0YXRlKCk7Ci0gICAgYm9vbGVhbiBtdXRlTWVkaWEoYm9vbGVhbiBmbGFnKTsKLQotICAgIC8vIDAgLS0gMTAwMAotICAgIGludCBnZXRWb2x1bWUoKTsKLQotICAgIGJvb2xlYW4gc2V0Vm9sdW1lKGludCB2YWwpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU5vZGVFeFZpZGVvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4VmlkZW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0NzFiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4VmlkZW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJTm9kZUV4VmlkZW8gewotICAgIHB1YmxpYyBlbnVtIFZpZGVvU3RhdGUgewotICAgICAgICBTVEFURV9VTktOT1dOLAotICAgICAgICBTVEFURV9QTEFZLAotICAgICAgICBTVEFURV9TVE9QLAotICAgICAgICBTVEFURV9QQVVTRSwKLSAgICAgICAgU1RBVEVfRkFTVEZPUldBUkQsCi0gICAgICAgIFNUQVRFX0ZBU1RSRVZFUlNFLAotICAgICAgICBTVEFURV9XQUlUSU5HCi0gICAgfTsKLQotICAgIFZpZGVvU3RhdGUgZ2V0Q3VycmVudFN0YXRlKCk7Ci0KLSAgICBib29sZWFuIHByZXZpb3VzVHJhY2soKTsKLQotICAgIGJvb2xlYW4gbmV4dFRyYWNrKCk7Ci0KLSAgICBib29sZWFuIHN0b3BNZWRpYSgpOwotCi0gICAgYm9vbGVhbiBwbGF5TWVkaWEoKTsKLQotICAgIGJvb2xlYW4gcGF1c2VNZWRpYSgpOwotCi0gICAgYm9vbGVhbiBmYXN0UmV2ZXJzZSgpOwotCi0gICAgYm9vbGVhbiBmYXN0Rm9yd2FyZCgpOwotCi0gICAgZG91YmxlIGdldEN1cnJlbnRQb3NpdGlvbigpOwotCi0gICAgZG91YmxlIGdldFRvdGFsTGVuZ3RoKCk7Ci0KLSAgICBJTm9kZUV4IGdldFJlZmVyZW5jZU5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lPYmplY3RFbGVtZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU9iamVjdEVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOWM0ODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU9iamVjdEVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLQotcHVibGljIGludGVyZmFjZSBJT2JqZWN0RWxlbWVudEZhY3RvcnkgewotCi0JcHVibGljIE5vZGVJbXBsIGNyZWF0ZVRvcE5vZGUoTm9kZUltcGwgYmFzZSwgSURpc3BhdGNoIGlub2RlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTZWxlY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JU2VsZWN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU1Y2FiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTZWxlY3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLQotcHVibGljIGludGVyZmFjZSBJU2VsZWN0RWxlbWVudCBleHRlbmRzIElOb2RlRXh7Ci0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRpY2VzKGludFtdIGluZGljZXMpOwotICAgIHB1YmxpYyBpbnRbXSBnZXRTZWxlY3RlZEluZGljZXMoKTsKLSAgICBwdWJsaWMgaW50IGdldE9wdGlvbnNDb3VudCgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uVGV4dEF0KGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JU3R5bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjM3NjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlIHsKLSAgICBib29sZWFuIHB1dChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLSAgICBPYmplY3QgZ2V0KFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvQXR0ckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvQXR0ckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4OTI1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0F0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIEF0dHJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBBdHRyIHsKLSAgICBBdHRySW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSwgTm9kZS5BVFRSSUJVVEVfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgIm5hbWUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTcGVjaWZpZWQoKSB7Ci0gICAgICAgIC8vIFdlIHJlZ2FyZCBgdGhpcycgYXR0cmlidXRlIGlzIGFsd2F5cyBzcGVjaWZpZWQgaW4gSFRNTCBET00gd2hlbmV2ZXIgYHRoaXMnIGV4aXN0cy4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJ2YWx1ZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJ2YWx1ZSIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgInBhcmVudE5vZGUiKTsKLSAgICAgICAgaWYgKGkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgbmV3Tm9kZShpLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWQoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvRG9jdW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0RvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU5NWE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRG9jdW1lbnRFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWwuSFRNTEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRW51bVVua25vd247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JT2xlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSVVua25vd247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLQotcHVibGljIGNsYXNzIERvY3VtZW50SW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgSURvY3VtZW50RXggewotICAgIHByaXZhdGUgSURpc3BhdGNoIGh0bWxEb2N1bWVudDsKLQotICAgIC8vIFVuaXF1ZSBJRCAtPiBOb2RlSW1wbAotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIE5vZGVJbXBsPiBpbm9kZU1hcDsKLQotICAgIHN5bmNocm9uaXplZCBOb2RlSW1wbCBsb29rdXBOb2RlKFN0cmluZyB1bmlxdWVOYW1lKSB7Ci0gICAgICAgIE5vZGVJbXBsIG4gPSBpbm9kZU1hcC5nZXQodW5pcXVlTmFtZSk7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCB2b2lkIHJlZ05vZGUoU3RyaW5nIHVuaXF1ZU5hbWUsIE5vZGVJbXBsIG5vZGUpIHsKLSAgICAgICAgaW5vZGVNYXAucHV0KHVuaXF1ZU5hbWUsIG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudEltcGwoSURpc3BhdGNoIGh0bWxEb2N1bWVudCkgewotICAgICAgICBzdXBlcihodG1sRG9jdW1lbnQpOwotICAgICAgICBpbm9kZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTm9kZUltcGw+KCk7Ci0gICAgICAgIHRoaXMuaHRtbERvY3VtZW50ID0gaHRtbERvY3VtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLSAgICAgICAgSURpc3BhdGNoIGlub2RlID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChodG1sRG9jdW1lbnQsICJkb2N1bWVudEVsZW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSBuZXdOb2RlKGlub2RlLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N0eXBlKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWduYW1lKSB7Ci0gICAgICAgIElEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCB0YWduYW1lKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCh0aGlzLCByKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpbXBvcnROb2RlKE5vZGUgaW1wb3J0ZWROb2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKSB7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0RWxlbWVudEJ5SWQiLCBlbGVtZW50SWQpOwotICAgICAgICBpZiAoaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgbmV3Tm9kZShpLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHNCeUlkSW5BbGxGcmFtZXMoU3RyaW5nIGlkKSB7Ci0gICAgICAgIExpc3Q8Tm9kZT4gciA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLSAgICAgICAgRWxlbWVudCBlID0gZ2V0RWxlbWVudEJ5SWQoaWQpOwotICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgci5hZGQoZSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0PE5vZGU+IGlkcyA9IGdldEVsZW1lbnRzQnlJZEluRnJhbWVzKGh0bWxEb2N1bWVudCwgaWQpOwotICAgICAgICBpZiAoaWRzICE9IG51bGwpCi0gICAgICAgICAgICByLmFkZEFsbChpZHMpOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PE5vZGU+IGdldEVsZW1lbnRzQnlJZEluRnJhbWVzKElEaXNwYXRjaCBodG1sRG9jdW1lbnQsIFN0cmluZyBpZCkgewotICAgICAgICBpZiAoIWhhc0ZyYW1lcyhodG1sRG9jdW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgICAgICBMaXN0PE5vZGU+IHIgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0gICAgICAgIElPbGVDb250YWluZXIgaW9sZSA9IChJT2xlQ29udGFpbmVyKSBodG1sRG9jdW1lbnQucXVlcnlJbnRlcmZhY2UoSVVua25vd24uSUlEX0lPbGVDb250YWluZXIpOwotICAgICAgICBJRW51bVVua25vd24gaWV1ID0gaW9sZS5lbnVtT2JqZWN0cyhJT2xlQ29udGFpbmVyLk9MRUNPTlRGX0VNQkVERElOR1MpOwotCi0gICAgICAgIGlmIChpZXUgIT0gbnVsbCkgewotICAgICAgICAgICAgSVVua25vd25bXSBpdW5rczsKLSAgICAgICAgICAgIGZvciAoaXVua3MgPSBpZXUubmV4dCgxKTsgaXVua3MgIT0gbnVsbCAmJiBpdW5rcy5sZW5ndGggPiAwOyBpdW5rcyA9IGlldS5uZXh0KDEpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSURpc3BhdGNoIGlkaXNwID0gKElEaXNwYXRjaCkgaXVua3NbMF0ucXVlcnlJbnRlcmZhY2UoSVVua25vd24uSUlEX0lXZWJCcm93c2VyMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZGlzcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggZCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaWRpc3AsICJEb2N1bWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Tm9kZT4gcjIgPSBnZXRFbGVtZW50c0J5SWRJbkZyYW1lcyhkLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmFkZEFsbChyMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggaW4gPSAoSURpc3BhdGNoKSBkLmludm9rZTEoImdldEVsZW1lbnRCeUlkIiwgaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG4gPSBuZXdOb2RlKGluLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgci5hZGQobik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRnJhbWVzKElEaXNwYXRjaCBodG1sRG9jdW1lbnQpIHsKLSAgICAgICAgSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBodG1sRG9jdW1lbnQuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCAiZnJhbWUiKTsKLSAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZUxpc3RJbXBsIG5sID0gbmV3IE5vZGVMaXN0SW1wbCh0aGlzLCByKTsKLSAgICAgICAgICAgIGlmIChubC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHIgPSAoSURpc3BhdGNoKSBodG1sRG9jdW1lbnQuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCAiaWZyYW1lIik7Ci0gICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5vZGVMaXN0SW1wbCBubCA9IG5ldyBOb2RlTGlzdEltcGwodGhpcywgcik7Ci0gICAgICAgICAgICBpZiAobmwuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sU3RhbmRhbG9uZShib29sZWFuIHhtbFN0YW5kYWxvbmUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBzdHJpY3RFcnJvckNoZWNraW5nKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRVUkkoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRVUkkoU3RyaW5nIGRvY3VtZW50VVJJKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGFkb3B0Tm9kZShOb2RlIHNvdXJjZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIERPTUNvbmZpZ3VyYXRpb24gZ2V0RG9tQ29uZmlnKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFRhcmdldEVsZW1lbnQoU3RyaW5nIHRhcmdldCkgewotICAgICAgICBOb2RlTGlzdCBsaXN0ID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkEiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWwgPSAoRWxlbWVudCkgbGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKHRhcmdldC5lcXVhbHMoZWwuZ2V0QXR0cmlidXRlKCJuYW1lIikpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRCeUlkKHRhcmdldCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBwcml2YXRlIGV4dGVuc2lvbgotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgU3R5bGVTaGVldEltcGwgY3JlYXRlU3R5bGVTaGVldCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpbm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UwKCJjcmVhdGVTdHlsZVNoZWV0Iik7Ci0gICAgICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZVNoZWV0SW1wbChyKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMsIGlub2RlLCB0YWdOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGh0bWxEb2N1bWVudCwgImNvbXBhdE1vZGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURpc3BhdGNoIGdldFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJwYXJlbnRXaW5kb3ciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURpc3BhdGNoIGdldERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImRvY3VtZW50RWxlbWVudCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9FbXB0eU5vZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9FbXB0eU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTA0MjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvRW1wdHlOb2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRW1wdHlOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOb2RlTGlzdCBJTlNUQU5DRSA9IG5ldyBFbXB0eU5vZGVMaXN0SW1wbCgpOwotICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVtcHR5Tm9kZUxpc3RJbXBsKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYwZGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBIZWxwZXIgewotICAgIHN0YXRpYyBwdWJsaWMgT2JqZWN0IGdldChJRGlzcGF0Y2ggaWRpc3AsIFN0cmluZyBwcm9wKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaWRpc3AgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gaWRpc3AuZ2V0KHByb3ApOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gcHV0KElEaXNwYXRjaCBpZGlzcCwgU3RyaW5nIHByb3AsIE9iamVjdCB2YWwpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlkaXNwLnB1dChwcm9wLCB2YWwpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydHkoSURpc3BhdGNoIGlkaXNwLCBTdHJpbmcgcHJvcCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHIgPSBpZGlzcC5nZXQocHJvcCk7Ci0gICAgICAgICAgICBpZiAociAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyB0cmltSFRNTFN0cihTdHJpbmcgc3JjKSB7Ci0gICAgICAgIHNyYyA9IHNyYy50cmltKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHNyYy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoYyA9PSAnXHUwMGEwJykgewotICAgICAgICAgICAgICAgIC8vICZuYnNwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByID0gcmV0LnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIGlmIChyLm1hdGNoZXMoIlxcQShbXFx1ZmY1Y1xcdTMwZmJ8XSlcXHoiKSkgcmV0dXJuICIiOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIHZvaWQgbm90U3VwcG9ydGVkKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWVkIG5vZGUgbXVzdCBiZSBjcmVhdGVkIGJ5IERvbUJ5Q29tIik7IC8vICROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHN0YXRpYyBwdWJsaWMgUmVjdGFuZ2xlIGdldExvY2F0aW9uKElEaXNwYXRjaCBpZGlzcCkgewotICAgICAgICBSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0gICAgICAgIGdldE9mZnNldChpZGlzcCwgcik7Ci0KLSAgICAgICAgci53aWR0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlkaXNwLCAib2Zmc2V0V2lkdGgiKTsKLSAgICAgICAgci5oZWlnaHQgPSAoSW50ZWdlcikgSGVscGVyLmdldChpZGlzcCwgIm9mZnNldEhlaWdodCIpOwotCi0gICAgICAgIHJldHVybiByOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldE9mZnNldChJRGlzcGF0Y2ggaW5vZGUsIFJlY3RhbmdsZSByKSB7Ci0gICAgICAgIGludCBvbCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAib2Zmc2V0TGVmdCIpOwotICAgICAgICBpbnQgb3QgPSAoSW50ZWdlcikgSGVscGVyLmdldChpbm9kZSwgIm9mZnNldFRvcCIpOwotCi0gICAgICAgIHIueCArPSBvbDsKLSAgICAgICAgci55ICs9IG90OwotCi0gICAgICAgIElEaXNwYXRjaCBwYXJlbnQgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAib2Zmc2V0UGFyZW50Iik7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHIpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGdldE9mZnNldChwYXJlbnQsIHIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTGlzdE5vZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9MaXN0Tm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGI3OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9MaXN0Tm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTGlzdE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Tm9kZT4gbDsKLQotICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gbC5zaXplKCkpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIChOb2RlKSBsLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBsLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdE5vZGVMaXN0SW1wbChMaXN0PE5vZGU+IGwpIHsKLSAgICAgICAgdGhpcy5sID0gbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05hbWVkTm9kZU1hcEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGEwMzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIE5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBOYW1lZE5vZGVNYXAgewotICAgIHByaXZhdGUgSURpc3BhdGNoIGF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPEF0dHJLZXksIE5vZGU+IGF0dHJNYXA7Ci0gICAgcHJpdmF0ZSBOb2RlSW1wbCBiYXNlTm9kZTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdHRyS2V5IHsKLSAgICAgICAgU3RyaW5nIG5zOwotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBdHRyS2V5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgQXR0cktleSBhayA9IChBdHRyS2V5KSBvOwotICAgICAgICAgICAgcmV0dXJuIG5zLmVxdWFscyhhay5ucykgJiYgbmFtZS5lcXVhbHMoYWsubmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBucy5oYXNoQ29kZSgpIF4gbmFtZS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXR0cktleShTdHJpbmcgbnMsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLm5zID0gbnM7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVkTm9kZU1hcEltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHRoaXMuYmFzZU5vZGUgPSBiYXNlTm9kZTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENhY2hlKCkgewotICAgICAgICBpZiAoYXR0ck1hcCAhPSBudWxsKSByZXR1cm47Ci0gICAgICAgIGF0dHJNYXAgPSBuZXcgSGFzaE1hcDxBdHRyS2V5LCBOb2RlPigpOwotICAgICAgICBpbnQgbGVuID0gZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbiA9IGl0ZW0oaSk7Ci0gICAgICAgICAgICBBdHRyS2V5IGtleSA9IG5ldyBBdHRyS2V5KG4uZ2V0TmFtZXNwYWNlVVJJKCksIG4uZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgYXR0ck1hcC5wdXQoa2V5LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJRGlzcGF0Y2ggaSA9IChJRGlzcGF0Y2gpIGF0dHJpYnV0ZXMuaW52b2tlMSgiaXRlbSIsIEludGVnZXIudmFsdWVPZihpbmRleCkpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VOb2RlLm5ld05vZGUoaSk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICBJbnRlZ2VyIGkgPSAoSW50ZWdlcikgSGVscGVyLmdldChhdHRyaWJ1dGVzLCAibGVuZ3RoIik7Ci0gICAgICAgIGlmIChpID09IG51bGwpIHJldHVybiAwOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBhdHRyaWJ1dGVzLmludm9rZTEoInJlbW92ZU5hbWVkSXRlbSIsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VOb2RlLm5ld05vZGUoaSk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgc2V0TmFtZWRJdGVtKE5vZGUgbm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBOb2RlSW1wbCkpIHsKLSAgICAgICAgICAgIEhlbHBlci5ub3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCBuaSA9IChOb2RlSW1wbCkgbm9kZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgYXR0cmlidXRlcy5pbnZva2UxKCJzZXROYW1lZEl0ZW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmkuZ2V0SU5vZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZU5vZGUubmV3Tm9kZShpKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBhdHRyaWJ1dGVzLmludm9rZTEoInJlbW92ZU5hbWVkSXRlbSIsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VOb2RlLm5ld05vZGUoaSk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBpbml0Q2FjaGUoKTsKLSAgICAgICAgTm9kZSBuID0gKE5vZGUpIGF0dHJNYXAuZ2V0KG5ldyBBdHRyS2V5KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKSk7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbU5TKE5vZGUgbm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGluaXRDYWNoZSgpOwotICAgICAgICBOb2RlIG4gPSAoTm9kZSkgYXR0ck1hcC5nZXQobmV3IEF0dHJLZXkobm9kZS5nZXROYW1lc3BhY2VVUkkoKSwgbm9kZS5nZXRMb2NhbE5hbWUoKSkpOwotICAgICAgICByZXR1cm4gc2V0TmFtZWRJdGVtKG4pOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpbml0Q2FjaGUoKTsKLSAgICAgICAgTm9kZSBuID0gKE5vZGUpIGF0dHJNYXAuZ2V0KG5ldyBBdHRyS2V5KG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKSk7Ci0gICAgICAgIHJldHVybiByZW1vdmVOYW1lZEl0ZW0obi5nZXROb2RlTmFtZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGIwNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5BbmFseXplZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbC5IVE1MRWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5vYmplY3QuT2JqZWN0RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5Wb2NhYnVsYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTm9kZUltcGwgaW1wbGVtZW50cyBOb2RlIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgSURpc3BhdGNoIGlub2RlOwotCi0gICAgSURpc3BhdGNoIGdldElEaXNwYXRjaCgpIHsKLSAgICAgICAgcmV0dXJuIGlub2RlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBzaG9ydCBub2RlVHlwZTsKLQotICAgIHByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZTsKLQotICAgIHByaXZhdGUgRG9jdW1lbnRJbXBsIGRvYzsKLQotICAgIFN0cmluZyB1bmlxdWVOYW1lOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidW5pcXVlSUQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE5vZGVJbXBsIG5ld05vZGVCeVR5cGUoSURpc3BhdGNoIGlub2RlLCBzaG9ydCB0eXBlKSB7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJJbXBsKHRoaXMsIGlub2RlKTsKLSAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0gICAgICAgICAgICAvLyByZXR1cm4gbmV3IERvY3VtZW50SW1wbChpbm9kZSk7Ci0gICAgICAgICAgICAvLyBXZSB3b3VsZCBsaWtlIHRvIGtlZXAgb2JqZWN0IGlkZW50aXR5IG9mIERvY3VtZW50SW1wbC4KLSAgICAgICAgICAgIC8vIFRodXMgcmV0dXJucyB0aGUgYmFzZSBEb2N1bWVudEltcGwgdGhhdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBkb2N1bWVudCBvZiAiaW5vZGUiLgotICAgICAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOgotICAgICAgICAgICAgLy8gY2FzZSBOb2RlLkRPQ1VNRU5UX0ZMQUdNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVJbXBsKHRoaXMsIGlub2RlLCB0eXBlKTsKLQotICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotICAgICAgICAgICAgaWYgKEhlbHBlci5oYXNQcm9wZXJ0eShpbm9kZSwgImNvbnRlbnRXaW5kb3ciKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBIVE1MRWxlbWVudEZhY3RvcnkuY3JlYXRlKHRoaXMsIGlub2RlLCAiRnJhbWVOb2RlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJub2RlTmFtZSIpOwotICAgICAgICAgICAgaWYgKCJPQkpFQ1QiLmVxdWFscyhuYW1lKSB8fCAiRU1CRUQiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIE5vZGVJbXBsIG5ld05vZGUgPSBPYmplY3RFbGVtZW50RmFjdG9yeS5jcmVhdGUodGhpcywgaW5vZGUpOwotICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdOb2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeS5jcmVhdGUodGhpcywgaW5vZGUsIG5hbWUpOwotCi0gICAgICAgIGNhc2UgTm9kZS5FTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlLk5PVEFUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVJbXBsKHRoaXMsIGlub2RlLCB0eXBlKTsKLSAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBIVE1MRWxlbWVudEZhY3RvcnkuY3JlYXRlKHRoaXMsIGlub2RlLCAiVGV4dCIpOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVJbXBsKHRoaXMsIGlub2RlLCB0eXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE5vZGVJbXBsIG5ld05vZGUoSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIGlmIChpbm9kZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyB1bmlxdWVOYW1lID0gZ2V0VW5pcXVlTmFtZShpbm9kZSk7Ci0gICAgICAgIGlmICh1bmlxdWVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5vZGVJbXBsIGFub2RlID0gZG9jLmxvb2t1cE5vZGUodW5pcXVlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoYW5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlub2RlLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSW50ZWdlciB2YWwgPSAoSW50ZWdlcikgSGVscGVyLmdldChpbm9kZSwgIm5vZGVUeXBlIik7Ci0gICAgICAgIGlmICh2YWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBzaG9ydCB0eXBlID0gKHNob3J0KSB2YWwuaW50VmFsdWUoKTsKLSAgICAgICAgTm9kZUltcGwgbm9kZSA9IG5ld05vZGVCeVR5cGUoaW5vZGUsIHR5cGUpOwotCi0gICAgICAgIGlmICh1bmlxdWVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5vZGUudW5pcXVlTmFtZSA9IHVuaXF1ZU5hbWU7Ci0gICAgICAgICAgICBkb2MucmVnTm9kZSh1bmlxdWVOYW1lLCBub2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTm9kZUltcGwgbmV3Tm9kZShJRGlzcGF0Y2ggaW5vZGUsIHNob3J0IHR5cGUpIHsKLSAgICAgICAgaWYgKGlub2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVuaXF1ZU5hbWUgPSBnZXRVbmlxdWVOYW1lKGlub2RlKTsKLSAgICAgICAgaWYgKHVuaXF1ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZUltcGwgYW5vZGUgPSBkb2MubG9va3VwTm9kZSh1bmlxdWVOYW1lKTsKLSAgICAgICAgICAgIGlmIChhbm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5vZGUucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBhbm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5vZGVJbXBsIG5vZGUgPSBuZXdOb2RlQnlUeXBlKGlub2RlLCB0eXBlKTsKLSAgICAgICAgICAgIG5vZGUudW5pcXVlTmFtZSA9IHVuaXF1ZU5hbWU7Ci0gICAgICAgICAgICBkb2MucmVnTm9kZSh1bmlxdWVOYW1lLCBub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ld05vZGVCeVR5cGUoaW5vZGUsIHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5vZGVJbXBsIG5ld05vZGUoSURpc3BhdGNoIGlub2RlLCBzaG9ydCB0eXBlLCBOb2RlSW1wbCBwYXJlbnQpIHsKLSAgICAgICAgTm9kZUltcGwgbm9kZSA9IG5ld05vZGUoaW5vZGUsIHR5cGUpOwotICAgICAgICBub2RlLnBhcmVudE5vZGUgPSBwYXJlbnQ7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGlzcGF0Y2ggZ2V0SU5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBpbm9kZTsKLSAgICB9Ci0KLSAgICAvLyBTcGVjaWFsIGNvbnN0cnVjdG9yIGZvciBEb2N1bWVudCBOb2RlLgotICAgIE5vZGVJbXBsKElEaXNwYXRjaCBpbm9kZSkgewotICAgICAgICB0aGlzLmRvYyA9IChEb2N1bWVudEltcGwpIHRoaXM7Ci0gICAgICAgIHRoaXMuaW5vZGUgPSBpbm9kZTsKLSAgICAgICAgdGhpcy5ub2RlVHlwZSA9IE5vZGUuRE9DVU1FTlRfTk9ERTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTm9kZUltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZSwgc2hvcnQgbm9kZVR5cGUpIHsKLSAgICAgICAgdGhpcy5kb2MgPSBiYXNlTm9kZS5kb2M7Ci0gICAgICAgIHRoaXMuaW5vZGUgPSBpbm9kZTsKLSAgICAgICAgdGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNhY2hlZE5vZGVOYW1lID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIGlmIChjYWNoZWROb2RlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWROb2RlTmFtZSA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJub2RlTmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZWROb2RlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdGV4dCA9IEhlbHBlci5nZXQoaW5vZGUsICJub2RlVmFsdWUiKTsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB0ZXh0OwotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIElEaXNwYXRjaCkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoKElEaXNwYXRjaCkgdGV4dCwgImRhdGEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJub2RlVmFsdWUiLCBub2RlVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0gICAgICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBwYXJlbnQgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAicGFyZW50Tm9kZSIpOwotICAgICAgICAgICAgcGFyZW50Tm9kZSA9IG5ld05vZGUocGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyZW50Tm9kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE5vZGVMaXN0TmV4dFNpYmxpbmdJbXBsIGNhY2hlZENoaWxkTm9kZXM7Ci0KLSAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLSAgICAgICAgaWYgKGNhY2hlZENoaWxkTm9kZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGVkQ2hpbGROb2Rlcy5pbml0aWFsaXplKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBDYXV0aW9uIQotICAgICAgICAgICAgICAgIC8vIER1ZSB0byBJRSdzIHByb2JsZW0sICJjaGlsZE5vZGVzIiBwcm9wZXJ0eSBtYXkgaGF2ZSB3cm9uZyB2YWx1ZQotICAgICAgICAgICAgICAgIC8vIHVubGVzcyB0aGUgZG9jdW1lbnQgaXMgd2VsbC1mb3JtZWQuICBXZSBhdm9pZCB1c2luZyB0aGlzIHByb3BlcnR5LAotICAgICAgICAgICAgICAgIC8vIGFuZCB1c2UgIm5leHRTaWJsaW5nIiBpbnN0ZWFkIG9mIHRoYXQuCi0gICAgICAgICAgICAgICAgSURpc3BhdGNoIG5vZGVDb2xsZWN0aW9uID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImNoaWxkTm9kZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZUNvbGxlY3Rpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgLy8gY2FjaGVkQ2hpbGROb2RlcyA9IG5ldyBOb2RlTGlzdEltcGwodGhpcywgbm9kZUNvbGxlY3Rpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYWNoZWRDaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0TmV4dFNpYmxpbmdJbXBsKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZWRDaGlsZE5vZGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBmaXJzdENoaWxkID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImZpcnN0Q2hpbGQiKTsKLSAgICAgICAgcmV0dXJuIG5ld05vZGUoZmlyc3RDaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotICAgICAgICBJRGlzcGF0Y2ggbGFzdENoaWxkID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImxhc3RDaGlsZCIpOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShsYXN0Q2hpbGQpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLSAgICAgICAgSURpc3BhdGNoIHByZXZpb3VzU2libGluZyA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJwcmV2aW91c1NpYmxpbmciKTsKLSAgICAgICAgcmV0dXJuIG5ld05vZGUocHJldmlvdXNTaWJsaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLSAgICAgICAgSURpc3BhdGNoIG5leHRTaWJsaW5nID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgIm5leHRTaWJsaW5nIik7Ci0gICAgICAgIHJldHVybiBuZXdOb2RlKG5leHRTaWJsaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBhdHRyaWJ1dGVzID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImF0dHJpYnV0ZXMiKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3IE5hbWVkTm9kZU1hcEltcGwodGhpcywgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpZiAoISgobmV3Q2hpbGQgaW5zdGFuY2VvZiBOb2RlSW1wbCkgJiYgKHJlZkNoaWxkIGluc3RhbmNlb2YgTm9kZUltcGwpKSkgewotICAgICAgICAgICAgSGVscGVyLm5vdFN1cHBvcnRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsIG5jaSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0gICAgICAgIE5vZGVJbXBsIHJjaSA9IChOb2RlSW1wbCkgcmVmQ2hpbGQ7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlKCJpbnNlcnRCZWZvcmUiLCBuZXcgT2JqZWN0W10geyBuY2kuZ2V0SU5vZGUoKSwgcmNpLmdldElOb2RlKCkgfSk7Ci0gICAgICAgIHJldHVybiBuZXdOb2RlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEoKG5ld0NoaWxkIGluc3RhbmNlb2YgTm9kZUltcGwpICYmIChvbGRDaGlsZCBpbnN0YW5jZW9mIE5vZGVJbXBsKSkpIHsKLSAgICAgICAgICAgIEhlbHBlci5ub3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCBuY2kgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotICAgICAgICBOb2RlSW1wbCBvY2kgPSAoTm9kZUltcGwpIG9sZENoaWxkOwotICAgICAgICBJRGlzcGF0Y2ggaSA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZSgicmVwbGFjZUNoaWxkIiwgbmV3IE9iamVjdFtdIHsgbmNpLmdldElOb2RlKCksIG9jaS5nZXRJTm9kZSgpIH0pOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEob2xkQ2hpbGQgaW5zdGFuY2VvZiBOb2RlSW1wbCkpIHsKLSAgICAgICAgICAgIEhlbHBlci5ub3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCBvY2kgPSAoTm9kZUltcGwpIG9sZENoaWxkOwotICAgICAgICBJRGlzcGF0Y2ggaSA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoInJlbW92ZUNoaWxkIiwgb2NpLmdldElOb2RlKCkpOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEobmV3Q2hpbGQgaW5zdGFuY2VvZiBOb2RlSW1wbCkpIHsKLSAgICAgICAgICAgIEhlbHBlci5ub3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBOb2RlSW1wbCBuY2kgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotICAgICAgICBJRGlzcGF0Y2ggaSA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoImFwcGVuZENoaWxkIiwgbmNpLmdldElOb2RlKCkpOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotICAgICAgICBCb29sZWFuIGIgPSAoQm9vbGVhbikgaW5vZGUuaW52b2tlMCgiaGFzQ2hpbGROb2RlcyIpOwotICAgICAgICBpZiAoYiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiY2xvbmVOb2RlIiwgQm9vbGVhbi52YWx1ZU9mKGRlZXApKTsKLSAgICAgICAgcmV0dXJuIG5ld05vZGUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHkgd2UgcmVnYXJkIGFsbCBmZWF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZC4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBTdHJpbmcgciA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJuYW1lc3BhY2VVUkkiKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBUcmVhdCB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIG51bGwgZm9yIFhQYXRoIDEuMCBkYXRhIG1vZGVsLgotICAgICAgICBpZiAoci5sZW5ndGgoKSA9PSAwKSByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICBTdHJpbmcgciA9IGdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGlmIChyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIGludCBwb3MgPSByLmluZGV4T2YoIjoiKTsKLSAgICAgICAgaWYgKHBvcyA8IDApCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiByLnN1YnN0cmluZygwLCBwb3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyByID0gZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgaW50IHBvcyA9IHIuaW5kZXhPZigiOiIpOwotICAgICAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICByZXR1cm4gci5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLSAgICAgICAgSURpc3BhdGNoIGF0dHJpYnV0ZXMgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAiYXR0cmlidXRlcyIpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoKSB7Ci0gICAgICAgIC8vIE5vIHdheSB0byBvYnRhaW4gYmFzZSBVUkkhCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gV2UgZG8gbm90IHN1cHBvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSU5vZGVFeCBpbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlua1VSSSgpIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJocmVmIik7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZSBwID0gZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoSU5vZGVFeCkgcCkuZ2V0TGlua1VSSSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgZ2V0SGVhZGluZ0xldmVsKCkgewotICAgICAgICBOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlRXgpIHsKLSAgICAgICAgICAgIHJldHVybiAoKElOb2RlRXgpIHBhcmVudCkuZ2V0SGVhZGluZ0xldmVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChzaG9ydCkgMDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFuYWx5emVkUmVzdWx0IGFuYWx5emUoQW5hbHl6ZWRSZXN1bHQgYXIpIHsKLSAgICAgICAgaWYgKCFWb2NhYnVsYXJ5LmlzVmFsaWROb2RlKCkuZXZhbCgoSUV2YWxUYXJnZXQpIHRoaXMpKQotICAgICAgICAgICAgcmV0dXJuIGFyOwotICAgICAgICBOb2RlIG4gPSBnZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAobiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIElOb2RlRXgpIHsKLSAgICAgICAgICAgICAgICBhciA9ICgoSU5vZGVFeCkgbikuYW5hbHl6ZShhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGlmIChIZWxwZXIuaGFzUHJvcGVydHkoaW5vZGUsICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSGVscGVyLnB1dChpbm9kZSwgInZhbHVlIiwgdGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBOb2RlSW1wbCBlbGVtZW50ID0gKE5vZGVJbXBsKSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAoIlRFWFRBUkVBIi5lcXVhbHMoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggdHIgPSAoSURpc3BhdGNoKSBlbGVtZW50Lmlub2RlLmludm9rZTAoImNyZWF0ZVRleHRSYW5nZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBIZWxwZXIucHV0KHRyLCAidGV4dCIsIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBTdHJpbmcgcmV0ID0gIiI7Ci0gICAgICAgIGlmIChIZWxwZXIuaGFzUHJvcGVydHkoaW5vZGUsICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICByZXQgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidmFsdWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE5vZGVJbXBsIGVsZW1lbnQgPSAoTm9kZUltcGwpIGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmICgiVEVYVEFSRUEiLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElEaXNwYXRjaCB0ciA9IChJRGlzcGF0Y2gpIGVsZW1lbnQuaW5vZGUuaW52b2tlMCgiY3JlYXRlVGV4dFJhbmdlIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gKFN0cmluZykgSGVscGVyLmdldCh0ciwgInRleHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdGgoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBjdXJyZW50ID0gaW5vZGU7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAxOyBjdXJyZW50ICE9IG51bGw7IGkrKykgewotICAgICAgICAgICAgY3VycmVudCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoY3VycmVudCwgInByZXZpb3VzU2libGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidW5pcXVlSUQiKTsKLSAgICB9Ci0KLSAgICAvLyAhRk4hCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN0aWxsUGljdHVyZURhdGEoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbM107Ci0gICAgICAgIHJldFsxXSA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJzcmMiKTsKLSAgICAgICAgcmV0WzJdID0gIiI7Ci0gICAgICAgIFN0cmluZyBtdCA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJtaW1lVHlwZSIpOwotICAgICAgICBpZiAobXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0WzBdID0gIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdCA9IG10LnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAobXQuY29udGFpbnMoIkdJRiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0WzBdID0gImltYWdlL2dpZiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG10LmNvbnRhaW5zKCJKUEVHIikpIHsKLSAgICAgICAgICAgICAgICByZXRbMF0gPSAiaW1hZ2UvanBlZyI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG10LmNvbnRhaW5zKCJQTkciKSkgewotICAgICAgICAgICAgICAgIHJldFswXSA9ICJpbWFnZS9wbmciOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXRbMF0gPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTm9kZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGMzNDFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotcHVibGljIGNsYXNzIE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLSAgICBwcml2YXRlIElEaXNwYXRjaCBpbm9kZUNvbGxlY3Rpb247Ci0gICAgcHJpdmF0ZSBOb2RlSW1wbCBiYXNlTm9kZTsKLQotICAgIHB1YmxpYyBOb2RlTGlzdEltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5iYXNlTm9kZSA9IGJhc2VOb2RlOwotICAgICAgICB0aGlzLmlub2RlQ29sbGVjdGlvbiA9IGlub2RlQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBpbm9kZUNvbGxlY3Rpb24uaW52b2tlMSgiaXRlbSIsIEludGVnZXIudmFsdWVPZihpbmRleCkpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VOb2RlLm5ld05vZGUoaSk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlQ29sbGVjdGlvbiwgImxlbmd0aCIpOwotICAgICAgICBpZiAoaSA9PSBudWxsKSByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGkuaW50VmFsdWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVMaXN0TmV4dFNpYmxpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVMaXN0TmV4dFNpYmxpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGJiYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9Ob2RlTGlzdE5leHRTaWJsaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdE5leHRTaWJsaW5nSW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlSW1wbD4gaW5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlSW1wbD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgTm9kZUltcGwgYmFzZU5vZGU7Ci0KLSAgICBwdWJsaWMgTm9kZUxpc3ROZXh0U2libGluZ0ltcGwoTm9kZUltcGwgYmFzZU5vZGUpIHsKLSAgICAgICAgdGhpcy5iYXNlTm9kZSA9IGJhc2VOb2RlOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgaW5vZGVMaXN0LmNsZWFyKCk7Ci0gICAgICAgIE5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGJhc2VOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCJIVE1MIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSAmJiAhKCIjZG9jdW1lbnQiLmVxdWFscyhiYXNlTm9kZS5nZXROb2RlTmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICBub2RlID0gKE5vZGVJbXBsKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpbm9kZUxpc3QuYWRkKG5vZGUpOwotICAgICAgICAgICAgbm9kZSA9IChOb2RlSW1wbCkgbm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpbm9kZUxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gaW5vZGVMaXN0LnNpemUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1NpbmdsZXRvbk5vZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9TaW5nbGV0b25Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMDJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1NpbmdsZXRvbk5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBTaW5nbGV0b25Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOb2RlIG5vZGU7Ci0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4ID09IDApIHJldHVybiBub2RlOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcHVibGljIFNpbmdsZXRvbk5vZGVMaXN0SW1wbChOb2RlIG5vZGUpIHsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1N0eWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9TdHlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZTE0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1N0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBTdHlsZUltcGwgaW1wbGVtZW50cyBJU3R5bGUgewotICAgIAotICAgIElEaXNwYXRjaCBzdHlsZTsKLSAgICAKLSAgICBwdWJsaWMgU3R5bGVJbXBsKElEaXNwYXRjaCBzdHlsZSl7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gSGVscGVyLmdldChzdHlsZSwgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHV0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEhlbHBlci5wdXQoc3R5bGUsIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvU3R5bGVTaGVldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0NzczZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1N0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci0KLQotcHVibGljIGNsYXNzIFN0eWxlU2hlZXRJbXBsIHsKLSAgICBwcml2YXRlIElEaXNwYXRjaCBpZGlzcGF0Y2g7Ci0gICAgCi0gICAgcHVibGljIFN0eWxlU2hlZXRJbXBsKElEaXNwYXRjaCBpZGlzcGF0Y2gpIHsKLSAgICAgICAgdGhpcy5pZGlzcGF0Y2ggPSBpZGlzcGF0Y2g7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUnVsZShTdHJpbmcgc2VsZWN0b3IsIFN0cmluZyBzdHlsZSkgewotICAgICAgICBpZGlzcGF0Y2guaW52b2tlKCJhZGRSdWxlIiwgbmV3IE9iamVjdFtde3NlbGVjdG9yLCBzdHlsZX0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9DaGFyYWN0ZXJEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0NoYXJhY3RlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjc1YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0NoYXJhY3RlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLQotYWJzdHJhY3QgY2xhc3MgQ2hhcmFjdGVyRGF0YUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIENoYXJhY3RlckRhdGEgewotICAgIENoYXJhY3RlckRhdGFJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaW5vZGUsIHNob3J0IHR5cGUpIHsKLSAgICAgICAgc3VwZXIoYmFzZU5vZGUsIGlub2RlLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJkYXRhIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJkYXRhIiwgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIGlmIChpID09IG51bGwpIHJldHVybiAwOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgciA9IChTdHJpbmcpIGlub2RlLmludm9rZSgic3Vic3RyaW5nRGF0YSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZihjb3VudCl9KTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kRGF0YShTdHJpbmcgc3RyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaW5vZGUuaW52b2tlMSgiYXBwZW5kRGF0YSIsIHN0cik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaW5vZGUuaW52b2tlKCJpbnNlcnREYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob2Zmc2V0KSwgc3RyfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpbm9kZS5pbnZva2UoImRlbGV0ZURhdGEiLAotICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihvZmZzZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZihjb3VudCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBzdHIpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpbm9kZS5pbnZva2UoInJlcGxhY2VEYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoY291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cn0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWJzdHJhY3RUZXJtcyBnZXRUZXJtcygpewotICAgICAgICByZXR1cm4gSFRNTFRlcm1zLmdldEluc3RhbmNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwNjhkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkFuYWx5emVkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkRvbUJ5Q29tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklEb2N1bWVudEV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklFbGVtZW50RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLlN0eWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5Wb2NhYnVsYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBFbGVtZW50LCBJTm9kZUV4LCBJRWxlbWVudEV4IHsKLSAgICBwcm90ZWN0ZWQgRWxlbWVudEltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZSkgewotICAgICAgICBzdXBlcihiYXNlTm9kZSwgaW5vZGUsIE5vZGUuRUxFTUVOVF9OT0RFKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsIGJhc2VEb2MsIElEaXNwYXRjaCBpbm9kZSkgewotICAgICAgICBzdXBlcihiYXNlRG9jLCBpbm9kZSwgTm9kZS5FTEVNRU5UX05PREUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJ0YWdOYW1lIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBnZXRTZXRBdHRyaWJ1dGVGbGFnID0gSW50ZWdlci52YWx1ZU9mKDIpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHIgPSAoU3RyaW5nKSBpbm9kZS5pbnZva2UoImdldEF0dHJpYnV0ZSIsIG5ldyBPYmplY3RbXSB7IG5hbWUsIGdldFNldEF0dHJpYnV0ZUZsYWcgfSk7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaW5vZGUuaW52b2tlKCJzZXRBdHRyaWJ1dGUiLCBuZXcgT2JqZWN0W10geyBuYW1lLCB2YWx1ZSwgZ2V0U2V0QXR0cmlidXRlRmxhZyB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpbm9kZS5pbnZva2UxKCJyZW1vdmVBdHRyaWJ1dGUiLCBuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNpZmllZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotICAgICAgICBJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoImdldEF0dHJpYnV0ZU5vZGUiLCBuYW1lKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBCb29sZWFuIGIgPSAoQm9vbGVhbikgSGVscGVyLmdldChyLCAic3BlY2lmaWVkIik7Ci0gICAgICAgIGlmICghYi5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKFN0cmluZykgSGVscGVyLmdldChyLCAidmFsdWUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIElEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0QXR0cmlidXRlTm9kZSIsIG5hbWUpOwotICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoQXR0cikgbmV3Tm9kZShyLCBOb2RlLkFUVFJJQlVURV9OT0RFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKG5ld0F0dHIgaW5zdGFuY2VvZiBBdHRySW1wbCkpIHsKLSAgICAgICAgICAgIEhlbHBlci5ub3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBBdHRySW1wbCBhID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotICAgICAgICBJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoInNldEF0dHJpYnV0ZU5vZGUiLCBhLmdldElOb2RlKCkpOwotICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoQXR0cikgbmV3Tm9kZShyLCBOb2RlLkFUVFJJQlVURV9OT0RFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIgb2xkQXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKG9sZEF0dHIgaW5zdGFuY2VvZiBBdHRySW1wbCkpIHsKLSAgICAgICAgICAgIEhlbHBlci5ub3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotICAgICAgICBBdHRySW1wbCBhID0gKEF0dHJJbXBsKSBvbGRBdHRyOwotICAgICAgICBJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoInJlbW92ZUF0dHJpYnV0ZU5vZGUiLCBhLmdldElOb2RlKCkpOwotICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoQXR0cikgbmV3Tm9kZShyLCBOb2RlLkFUVFJJQlVURV9OT0RFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIG5hbWUpOwotICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RJbXBsKHRoaXMsIHIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTmFtZWROb2RlTWFwSW1wbCBjYWNoZWRBdHRyaWJ1dGVzOwotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDYWNoZSgpIHsKLSAgICAgICAgaWYgKGNhY2hlZEF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FjaGVkQXR0cmlidXRlcyA9IChOYW1lZE5vZGVNYXBJbXBsKSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIGluaXRDYWNoZSgpOwotICAgICAgICBBdHRyIGEgPSAoQXR0cikgY2FjaGVkQXR0cmlidXRlcy5nZXROYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmIChhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGEuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGluaXRDYWNoZSgpOwotICAgICAgICBBdHRyIGEgPSAoQXR0cikgY2FjaGVkQXR0cmlidXRlcy5nZXROYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmIChhID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHJlbW92ZUF0dHJpYnV0ZU5vZGUoYSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgaW5pdENhY2hlKCk7Ci0gICAgICAgIEF0dHIgYSA9IChBdHRyKSBjYWNoZWRBdHRyaWJ1dGVzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLSAgICAgICAgaWYgKGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgaWYgKHZhbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIFN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgICAgIGlmICh2YWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSU5vZGVFeCBpbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIGJvb2xlYW4gZG9DbGljaygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICgiT1BUSU9OIi5lcXVhbHMoZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgSGVscGVyLnB1dChpbm9kZSwgInNlbGVjdGVkIiwgQm9vbGVhbi52YWx1ZU9mKHRydWUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlNFTEVDVCIuZXF1YWxzKGdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlub2RlLmludm9rZTAoImNsaWNrIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG9yaWdpbmFsQm9yZGVyOwotCi0gICAgcHVibGljIGJvb2xlYW4gaGlnaGxpZ2h0KCkgewotICAgICAgICBpZiAoRG9tQnlDb20uQk9SREVSX01PREUgPT0gRG9tQnlDb20uU1RZTEVfQk9SREVSKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgImNsYXNzTmFtZSIpOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGNsYXNzTmFtZSArPSAiIENTU3RvSGlnaGxpZ2h0IjsKLSAgICAgICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJjbGFzc05hbWUiLCBjbGFzc05hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKERvbUJ5Q29tLkJPUkRFUl9NT0RFID09IERvbUJ5Q29tLkRJVl9CT1JERVIpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZGl2ID0gZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKERvbUJ5Q29tLklEX0RJVik7Ci0gICAgICAgICAgICBJU3R5bGUgc3R5bGUgPSAoKElFbGVtZW50RXgpIGRpdikuZ2V0U3R5bGUoKTsKLQotICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBIZWxwZXIuZ2V0TG9jYXRpb24oaW5vZGUpOwotCi0gICAgICAgICAgICBTdHJpbmcgY29tcGF0TW9kZSA9ICgoSURvY3VtZW50RXgpIGdldE93bmVyRG9jdW1lbnQoKSkuZ2V0Q29tcGF0TW9kZSgpOwotICAgICAgICAgICAgaW50IHcgPSAwOwotICAgICAgICAgICAgaWYgKGNvbXBhdE1vZGUuZXF1YWxzKElEb2N1bWVudEV4LkNTUzFfQ09NUEFUKSkgewotICAgICAgICAgICAgICAgIHcgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXRNb2RlLmVxdWFscyhJRG9jdW1lbnRFeC5CQUNLX0NPTVBBVCkpIHsKLSAgICAgICAgICAgICAgICB3ID0gRG9tQnlDb20uRElWX0JPUkRFUl9XSURUSCAqIDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0eWxlLnB1dCgibGVmdCIsIChyLnggLSBEb21CeUNvbS5ESVZfQk9SREVSX1dJRFRIKSArICJweCIpOwotICAgICAgICAgICAgc3R5bGUucHV0KCJ0b3AiLCAoci55IC0gRG9tQnlDb20uRElWX0JPUkRFUl9XSURUSCkgKyAicHgiKTsKLSAgICAgICAgICAgIHN0eWxlLnB1dCgid2lkdGgiLCAoci53aWR0aCArIHcpICsgInB4Iik7Ci0gICAgICAgICAgICBzdHlsZS5wdXQoImhlaWdodCIsIChyLmhlaWdodCArIHcpICsgInB4Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAoRG9tQnlDb20uQk9SREVSX01PREUgPT0gRG9tQnlDb20uU1RZTEVfQk9SREVSMikgewotICAgICAgICAgICAgSURpc3BhdGNoIHN0eWxlID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgInN0eWxlIik7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBvcmlnaW5hbEJvcmRlciA9IChTdHJpbmcpIEhlbHBlci5nZXQoc3R5bGUsICJjc3NUZXh0Iik7Ci0gICAgICAgICAgICBTdHJpbmcgYm9yZGVyID0gb3JpZ2luYWxCb3JkZXIgKyBEb21CeUNvbS5CT1JERVJfU1RZTEVfU1RSSU5HOwotICAgICAgICAgICAgSGVscGVyLnB1dChzdHlsZSwgImNzc1RleHQiLCBib3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlub2RlLmludm9rZTAoInNjcm9sbEludG9WaWV3Iik7Ci0gICAgICAgICAgICBpbm9kZS5pbnZva2UwKCJvbm1vdXNlb3ZlciIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdW5oaWdobGlnaHQoKSB7Ci0gICAgICAgIGlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5TVFlMRV9CT1JERVIpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAiY2xhc3NOYW1lIik7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlQWxsKCIgQ1NTdG9IaWdobGlnaHQiLCAiIik7Ci0gICAgICAgICAgICBIZWxwZXIucHV0KGlub2RlLCAiY2xhc3NOYW1lIiwgbmV3Q2xhc3NOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5ESVZfQk9SREVSKSB7Ci0gICAgICAgICAgICBFbGVtZW50IGRpdiA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChEb21CeUNvbS5JRF9ESVYpOwotICAgICAgICAgICAgSVN0eWxlIHN0eWxlID0gKChJRWxlbWVudEV4KSBkaXYpLmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBzdHlsZS5wdXQoImxlZnQiLCAiLTEwMDBweCIpOwotICAgICAgICAgICAgc3R5bGUucHV0KCJ0b3AiLCAiLTEwMDBweCIpOwotICAgICAgICAgICAgc3R5bGUucHV0KCJ3aWR0aCIsICIxMDBweCIpOwotICAgICAgICAgICAgc3R5bGUucHV0KCJoZWlnaHQiLCAiMTAwcHgiKTsKLSAgICAgICAgfSBlbHNlIGlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5TVFlMRV9CT1JERVIyKSB7Ci0gICAgICAgICAgICBJRGlzcGF0Y2ggc3R5bGUgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAic3R5bGUiKTsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIEhlbHBlci5wdXQoc3R5bGUsICJjc3NUZXh0Iiwgb3JpZ2luYWxCb3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlub2RlLmludm9rZTAoIm9ubW91c2VvdXQiKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgSW5wdXRUeXBlIHsKLSAgICAgICAgcHVibGljIGVudW0gSW5wdXRDbGFzcyB7Ci0gICAgICAgICAgICBFRElULCBCVVRUT04sIFJBRElPLCBDSEVDS0JPWCwgQ09NQk9CT1gsIEhJRERFTiwgUEFTU1dPUkQsIEZJTEUKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgSW5wdXRDbGFzcyBpbnB1dENsYXNzOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVpU3RyaW5nOwotCi0gICAgICAgIFN0cmluZyBnZXRVSVN0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiB1aVN0cmluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNFZGl0KCkgewotICAgICAgICAgICAgcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuRURJVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRmlsZUVkaXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlucHV0Q2xhc3MgPT0gSW5wdXRDbGFzcy5GSUxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNCdXR0b24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlucHV0Q2xhc3MgPT0gSW5wdXRDbGFzcy5CVVRUT04pOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1JhZGlvKCkgewotICAgICAgICAgICAgcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuUkFESU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0NoZWNrQm94KCkgewotICAgICAgICAgICAgcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuQ0hFQ0tCT1gpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0NvbWJvQm94KCkgewotICAgICAgICAgICAgcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuQ09NQk9CT1gpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0hpZGRlbigpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW5wdXRDbGFzcyA9PSBJbnB1dENsYXNzLkhJRERFTik7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzUGFzc3dvcmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGlucHV0Q2xhc3MgPT0gSW5wdXRDbGFzcy5QQVNTV09SRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzQ2xpY2thYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIChpc0J1dHRvbigpIHx8IGlzUmFkaW8oKSB8fCBpc0NoZWNrQm94KCkgfHwgaXNDb21ib0JveCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBodG1sVHlwZTsKLQotICAgICAgICBJbnB1dFR5cGUoU3RyaW5nIHVpU3RyaW5nLCBTdHJpbmcgaHRtbFR5cGUsIElucHV0Q2xhc3MgaW5wdXRDbGFzcykgewotICAgICAgICAgICAgdGhpcy51aVN0cmluZyA9IHVpU3RyaW5nOwotICAgICAgICAgICAgdGhpcy5odG1sVHlwZSA9IGh0bWxUeXBlOwotICAgICAgICAgICAgdGhpcy5pbnB1dENsYXNzID0gaW5wdXRDbGFzczsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5wdXRUeXBlW10gSFRNTElOUFVUQ0xBU1NFUyA9IG5ldyBJbnB1dFR5cGVbXSB7Ci0gICAgICAgICAgICBuZXcgSW5wdXRUeXBlKCJlZGl0IiwgInRleHQiLCBJbnB1dFR5cGUuSW5wdXRDbGFzcy5FRElUKSwKLSAgICAgICAgICAgIG5ldyBJbnB1dFR5cGUoInBhc3N3b3JkIGVkaXQiLCAicGFzc3dvcmQiLCBJbnB1dFR5cGUuSW5wdXRDbGFzcy5QQVNTV09SRCksCi0gICAgICAgICAgICBuZXcgSW5wdXRUeXBlKCJyYWRpbyBidXR0b24iLCAicmFkaW8iLCBJbnB1dFR5cGUuSW5wdXRDbGFzcy5SQURJTyksCi0gICAgICAgICAgICBuZXcgSW5wdXRUeXBlKCJjaGVja2JveCIsICJjaGVja2JveCIsIElucHV0VHlwZS5JbnB1dENsYXNzLkNIRUNLQk9YKSwKLSAgICAgICAgICAgIG5ldyBJbnB1dFR5cGUoImZpbGUgdXBsb2FkIGVkaXQiLCAiZmlsZSIsIElucHV0VHlwZS5JbnB1dENsYXNzLkZJTEUpLAotICAgICAgICAgICAgbmV3IElucHV0VHlwZSgiIiwgImhpZGRlbiIsIElucHV0VHlwZS5JbnB1dENsYXNzLkhJRERFTiksCi0gICAgICAgICAgICBuZXcgSW5wdXRUeXBlKCJidXR0b24iLCAic3VibWl0IiwgSW5wdXRUeXBlLklucHV0Q2xhc3MuQlVUVE9OKSwKLSAgICAgICAgICAgIG5ldyBJbnB1dFR5cGUoInJlc2V0IGJ1dHRvbiIsICJyZXNldCIsIElucHV0VHlwZS5JbnB1dENsYXNzLkJVVFRPTiksCi0gICAgICAgICAgICBuZXcgSW5wdXRUeXBlKCJidXR0b24iLCAiYnV0dG9uIiwgSW5wdXRUeXBlLklucHV0Q2xhc3MuQlVUVE9OKSwKLSAgICAgICAgICAgIG5ldyBJbnB1dFR5cGUoImJ1dHRvbiIsICJpbWFnZSIsIElucHV0VHlwZS5JbnB1dENsYXNzLkJVVFRPTikgfTsKLQotICAgIElucHV0VHlwZSBnZXRJbnB1dFR5cGUoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gSGVscGVyLmdldChpbm9kZSwgInR5cGUiKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFN0cmluZykpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSBvOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEhUTUxJTlBVVENMQVNTRVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscyhIVE1MSU5QVVRDTEFTU0VTW2ldLmh0bWxUeXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBIVE1MSU5QVVRDTEFTU0VTW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldElucHV0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidmFsdWUiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtb2RpZnlTcmNTdHIoU3RyaW5nIHNyYykgewotICAgICAgICBpbnQgc3QgPSBzcmMubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgaW50IGVuZCA9IHNyYy5sYXN0SW5kZXhPZignPycpOwotICAgICAgICBpZiAoZW5kID09IC0xKQotICAgICAgICAgICAgZW5kID0gc3JjLmxlbmd0aCgpOwotICAgICAgICBpZiAoc3QgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZW5kIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3JjOwotICAgICAgICAgICAgc3QgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3QrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5kIDw9IHN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3JjLnN1YnN0cmluZyhzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3JjLnN1YnN0cmluZyhzdCwgZW5kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgaWYgKCJJTUciLmVxdWFscyhuYW1lKSkgewotCi0gICAgICAgICAgICBTdHJpbmcgYWx0ID0gZ2V0U3BlY2lmaWVkQXR0cmlidXRlKCJhbHQiKTsKLSAgICAgICAgICAgIGlmIChhbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFsdCA9IEhlbHBlci50cmltSFRNTFN0cihhbHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0U3BlY2lmaWVkQXR0cmlidXRlKCJ0aXRsZSIpOwotICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgdGl0bGUgPSBIZWxwZXIudHJpbUhUTUxTdHIodGl0bGUpOwotICAgICAgICAgICAgICAgIGlmIChhbHQgPT0gbnVsbCB8fCBhbHQubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYWx0ID0gdGl0bGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBzcmMgPSBnZXRBdHRyaWJ1dGUoInNyYyIpOwotICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3JjID0gbW9kaWZ5U3JjU3RyKHNyYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gbm9BbHQgPSAoYWx0ID09IG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBudWxsQWx0ID0gKChhbHQgIT0gbnVsbCkgJiYgKGFsdC5sZW5ndGgoKSA9PSAwKSk7Ci0gICAgICAgICAgICBib29sZWFuIGlzTGluayA9IFZvY2FidWxhcnkuaXNMaW5rKCkuZXZhbCh0aGlzKTsKLQotICAgICAgICAgICAgaWYgKGlzTGluaykgewotICAgICAgICAgICAgICAgIGlmIChub0FsdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoVm9jYWJ1bGFyeS5pc1JlYWROb0FsdEltYWdlTGluaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudWxsQWx0ICYmIFZvY2FidWxhcnkuaXNSZWFkTnVsbEFsdEltYWdlTGluaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAJaWYgKGFueVRleHRJblBhcmVudExpbmsoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gYWx0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBhbHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChub0FsdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoVm9jYWJ1bGFyeS5pc1JlYWROb0FsdEltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bGxBbHQgJiYgVm9jYWJ1bGFyeS5pc1JlYWROdWxsQWx0SW1hZ2UoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKFZvY2FidWxhcnkuaXNFbWJlZGRlZE9iamVjdCgpLmV2YWwodGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiAiKEVtYmVkZGVkIE9iamVjdCkiOwotICAgICAgICB9IGVsc2UgaWYgKCJJTlBVVCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICBJbnB1dFR5cGUgdHlwZSA9IGdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzSGlkZGVuKCkpLy8gfHwgdHlwZS5pc0NoZWNrQm94KCkgfHwgdHlwZS5pc1JhZGlvKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWx0ID0gZ2V0QXR0cmlidXRlKCJhbHQiKTsKLSAgICAgICAgICAgICAgICBpZiAoYWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWx0ID0gSGVscGVyLnRyaW1IVE1MU3RyKGFsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0SW5wdXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzUGFzc3dvcmQoKSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCIuIiwgIioiKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBnZXRBdHRyaWJ1dGUoInRpdGxlIik7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCJTRUxFQ1QiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuICJTZWxlY3QiOwotICAgICAgICB9IGVsc2UgaWYgKCJBUkVBIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbHQgPSBnZXRBdHRyaWJ1dGUoImFsdCIpOwotICAgICAgICAgICAgaWYgKGFsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWx0ID0gSGVscGVyLnRyaW1IVE1MU3RyKGFsdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFsdC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIC8vIHRpdGxlIGF0dHJpYnV0ZSBjYW4gYmUgYWRkZWQgdG8gYW55IGVsZW1lbnQgYWNjb2RpbmcgdG8gWEhUTUwyLgotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gZ2V0U3BlY2lmaWVkQXR0cmlidXRlKCJ0aXRsZSIpOwotICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsgCi0gICAgICAgICAgICAgICAgdGl0bGUgPSBIZWxwZXIudHJpbUhUTUxTdHIodGl0bGUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYW55VGV4dEluUGFyZW50TGluaygpIHsKLSAgICAgICAgTm9kZSBjdXJyZW50ID0gdGhpcy5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHdoaWxlKGN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCJBIi5lcXVhbHMoY3VycmVudC5nZXROb2RlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIGFueVRleHRJblNpYmxpbmdzKGN1cnJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGFueVRleHRJblNpYmxpbmdzKE5vZGUgZWxlbWVudCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgTm9kZSBuZXh0ID0gZWxlbWVudDsKLSAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBJbWFnZUVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChhbnlUZXh0SW5TaWJsaW5ncyhuZXh0LmdldEZpcnN0Q2hpbGQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0gICAgICAgICAgICAgICAgSU5vZGVFeCBuZXggPSAoSU5vZGVFeCkgbmV4dDsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChuZXguZXh0cmFjdFN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBIZWxwZXIudHJpbUhUTUxTdHIoYnVmZi50b1N0cmluZygpKS5sZW5ndGgoKSA+IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHNob3J0IGdldEhlYWRpbmdMZXZlbCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgIT0gMikKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRIZWFkaW5nTGV2ZWwoKTsKLSAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdIJykKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRIZWFkaW5nTGV2ZWwoKTsKLSAgICAgICAgc3dpdGNoIChuYW1lLmNoYXJBdCgxKSkgewotICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIDI7Ci0gICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgMzsKLSAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgICAgICByZXR1cm4gKHNob3J0KSA0OwotICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIDU7Ci0gICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgNjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SGVhZGluZ0xldmVsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbm9kZS5pbnZva2UwKCJmb2N1cyIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIZWxwZXIucHV0KGlub2RlLCAiaW5uZXJUZXh0IiwgdGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0eWxlIGdldFN0eWxlKCkgewotICAgICAgICBJRGlzcGF0Y2ggc3R5bGUgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAiY3VycmVudFN0eWxlIik7Ci0gICAgICAgIHJldHVybiAoSVN0eWxlKSBuZXcgU3R5bGVJbXBsKHN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RUZXJtcyBnZXRUZXJtcygpIHsKLSAgICAgICAgcmV0dXJuIEhUTUxUZXJtcy5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gSGVscGVyLmdldExvY2F0aW9uKGlub2RlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRMb2NhdGlvbiBlcnJvciAiK3RoaXMuZXh0cmFjdFN0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9zaXRpb24gZ2V0UmFkaW9Qb3NpdGlvbigpIHsKLSAgICAgICAgaWYgKGdldElucHV0VHlwZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKCFnZXRJbnB1dFR5cGUoKS5pc1JhZGlvKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBFbGVtZW50IGZvcm0gPSBnZXRQYXJlbnRFbGVtZW50KG5ldyBTdHJpbmdbXSB7ICJGT1JNIiB9KTsKLSAgICAgICAgaWYgKGZvcm0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0cmluZyByYWRpb05hbWUgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAibmFtZSIpOwotCi0gICAgICAgIFBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oKTsKLSAgICAgICAgc2VhcmNoUmFkaW9Qb3NpdGlvbihmb3JtLCByYWRpb05hbWUsIHAsIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlYXJjaFJhZGlvUG9zaXRpb24oRWxlbWVudCBwYXJlbnQsIFN0cmluZyByYWRpb05hbWUsIFBvc2l0aW9uIHAsIGJvb2xlYW4gZm91bmQpIHsKLSAgICAgICAgTm9kZUxpc3QgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGludCBsZW4gPSBsaXN0LmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG4gPSBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudEltcGwgZSA9IChFbGVtZW50SW1wbCkgbjsKLSAgICAgICAgICAgICAgICBpZiAoZS5oYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmFkaW9Qb3NpdGlvbihlLCByYWRpb05hbWUsIHAsIGZvdW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0SW5wdXRUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFlLmdldElucHV0VHlwZSgpLmlzUmFkaW8oKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIEhlbHBlci5nZXQoZS5nZXRJTm9kZSgpLCAibmFtZSIpOwotICAgICAgICAgICAgICAgIGlmIChyYWRpb05hbWUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICBwLmluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIHAudG90YWwrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGUuaXNTYW1lTm9kZSh0aGlzKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBvc2l0aW9uIGdldExpc3RQb3NpdGlvbigpIHsKLSAgICAgICAgRWxlbWVudCBsaXN0ID0gZ2V0UGFyZW50RWxlbWVudChuZXcgU3RyaW5nW10geyAiVUwiLCAiT0wiLCAiREwiIH0pOwotICAgICAgICBFbGVtZW50IGl0ZW0gPSBnZXRQYXJlbnRFbGVtZW50KG5ldyBTdHJpbmdbXSB7ICJMSSIsICJEVCIgfSk7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbigpOwotICAgICAgICBzZWFyY2hMaXN0UG9zaXRpb24obGlzdCwgaXRlbSwgcCwgZmFsc2UpOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VhcmNoTGlzdFBvc2l0aW9uKEVsZW1lbnQgcGFyZW50LCBFbGVtZW50IGl0ZW0sIFBvc2l0aW9uIHAsIGJvb2xlYW4gZm91bmQpIHsKLSAgICAgICAgTm9kZUxpc3QgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGludCBsZW4gPSBsaXN0LmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG4gPSBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudEltcGwgZSA9IChFbGVtZW50SW1wbCkgbjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZS5oYXNDaGlsZE5vZGVzKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhKCJVTCIuZXF1YWxzKG5hbWUpIHx8ICJPTCIuZXF1YWxzKG5hbWUpIHx8ICJETCIuZXF1YWxzKG5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBzZWFyY2hMaXN0UG9zaXRpb24oZSwgaXRlbSwgcCwgZm91bmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoISJMSSIuZXF1YWxzKGUuZ2V0Tm9kZU5hbWUoKSkgJiYgISJEVCIuZXF1YWxzKGUuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgcC5pbmRleCsrOwotICAgICAgICAgICAgICAgIHAudG90YWwrKzsKLSAgICAgICAgICAgICAgICBpZiAoZS5pc1NhbWVOb2RlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChTdHJpbmdbXSB0YWdOYW1lcykgewotICAgICAgICBFbGVtZW50IHBhcmVudCA9IHRoaXM7Ci0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNldC5hZGQodGFnTmFtZXNbaV0uaW50ZXJuKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcGFyZW50LmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIHdoaWxlICghc2V0LmNvbnRhaW5zKG5hbWUuaW50ZXJuKCkpKSB7Ci0gICAgICAgICAgICBOb2RlIHRlbXAgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHRlbXAgPT0gbnVsbCB8fCAhKHRlbXAgaW5zdGFuY2VvZiBFbGVtZW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHBhcmVudCA9IChFbGVtZW50KSB0ZW1wOwotICAgICAgICAgICAgbmFtZSA9IHBhcmVudC5nZXROb2RlTmFtZSgpOwotICAgICAgICB9IAotCi0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0Rm9ybUxhYmVsKCkgewotICAgICAgICBOb2RlTGlzdCBubCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTEFCRUwiKTsKLSAgICAgICAgT2JqZWN0IG15SWQgPSBIZWxwZXIuZ2V0KGlub2RlLCAiaWQiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBubC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgICAgIEVsZW1lbnRJbXBsIGxhYmVsID0gKEVsZW1lbnRJbXBsKSBub2RlOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIEhlbHBlci5nZXQobGFiZWwuaW5vZGUsICJodG1sRm9yIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhteUlkKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyIGdldEFjY2Vzc0tleSgpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROb2RlTmFtZSgpOwotICAgICAgICBpZiAoIkxBQkVMIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBFbGVtZW50IGxhYmVsID0gZ2V0Rm9ybUxhYmVsKCk7Ci0gICAgICAgIGlmIChsYWJlbCAhPSBudWxsICYmIGxhYmVsIGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIEhlbHBlci5nZXQoKChFbGVtZW50SW1wbCkgbGFiZWwpLmlub2RlLCAiYWNjZXNzS2V5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAiYWNjZXNzS2V5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa2V5ICE9IG51bGwgJiYga2V5Lmxlbmd0aCgpID09IDEpCi0gICAgICAgICAgICByZXR1cm4ga2V5LnRvVXBwZXJDYXNlKCkuY2hhckF0KDApOwotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbmFseXplZFJlc3VsdCBhbmFseXplKEFuYWx5emVkUmVzdWx0IGFyKSB7Ci0gICAgICAgIGNoYXIga2V5ID0gZ2V0QWNjZXNzS2V5KCk7Ci0gICAgICAgIGlmIChrZXkgIT0gMCkKLSAgICAgICAgICAgIGFyLmFkZEFjY2Vzc0tleSh0aGlzKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIuYW5hbHl6ZShhcik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRnJhbWVOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0ZyYW1lTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjNzhlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRnJhbWVOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5FbXB0eU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuU2luZ2xldG9uTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuU3R5bGVTaGVldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklFbnVtVW5rbm93bjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklPbGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JVW5rbm93bjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotCi0KLWNsYXNzIEZyYW1lTm9kZUltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCB7Ci0gICAgRnJhbWVOb2RlSW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlkaXNwKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpZGlzcCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSl7Ci0gICAgICAgIElEaXNwYXRjaCBkb2N1bWVudCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJkb2N1bWVudCIpOwotICAgICAgICBJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGRvY3VtZW50Lmludm9rZTEoImdldEVsZW1lbnRzQnlUYWdOYW1lIiwgdGFnTmFtZSk7Ci0gICAgICAgIGlmIChyID09IG51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RJbXBsKHRoaXMsIHIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRGcmFtZUluZGV4KCkgewotICAgICAgICBOb2RlTGlzdCBmcmFtZSA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZSIpOwotICAgICAgICBpZiAoZnJhbWUuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGdldEZyYW1lSW5kZXgoZnJhbWUpOwotICAgICAgICAKLSAgICAgICAgTm9kZUxpc3QgaWZyYW1lID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpOwotICAgICAgICBpZiAoaWZyYW1lLmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHJldHVybiBnZXRGcmFtZUluZGV4KGlmcmFtZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldEZyYW1lSW5kZXgoTm9kZUxpc3QgZnJhbWUpIHsKLSAgICAgICAgaW50IGxlbiA9IGZyYW1lLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBmcmFtZS5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElOb2RlRXgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYoKChJTm9kZUV4KSBub2RlKS5pc1NhbWVOb2RlKHRoaXMpKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIElEaXNwYXRjaCBnZXRGcmFtZUJ5SW5kZXgoSURpc3BhdGNoIGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgSU9sZUNvbnRhaW5lciBpb2xlID0gKElPbGVDb250YWluZXIpIGRvY3VtZW50LnF1ZXJ5SW50ZXJmYWNlKElVbmtub3duLklJRF9JT2xlQ29udGFpbmVyKTsKLSAgICAgICAgSUVudW1Vbmtub3duIGlldSA9IGlvbGUuZW51bU9iamVjdHMoSU9sZUNvbnRhaW5lci5PTEVDT05URl9FTUJFRERJTkdTKTsKLSAgICAgICAgSVVua25vd25bXSBpdW5rczsKLSAgICAgICAgaW50IGNvdW50ID0gLTE7Ci0gICAgICAgIGZvciAoaXVua3MgPSBpZXUubmV4dCgxKTsgaXVua3MgIT0gbnVsbCAmJiBpdW5rcy5sZW5ndGggPiAwOyBpdW5rcyA9IGlldS5uZXh0KDEpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElEaXNwYXRjaCBpZGlzcCA9IChJRGlzcGF0Y2gpIGl1bmtzWzBdLnF1ZXJ5SW50ZXJmYWNlKElVbmtub3duLklJRF9JV2ViQnJvd3NlcjIpOwotICAgICAgICAgICAgICAgIGl1bmtzWzBdLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoaWRpc3AgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkaXNwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGV4KXsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0RnJhbWVSb290RWxlbWVudCgpIHsKLSAgICAgICAgSURpc3BhdGNoIGRvY3VtZW50ID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImRvY3VtZW50Iik7Ci0gICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSBnZXRGcmFtZUluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgICAgICBJRGlzcGF0Y2ggaWRpc3AgPSBnZXRGcmFtZUJ5SW5kZXgoZG9jdW1lbnQsIGluZGV4KTsKLSAgICAgICAgaWYgKGlkaXNwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBJRGlzcGF0Y2ggaWRvYyA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaWRpc3AsICJEb2N1bWVudCIpOwotICAgICAgICBpZiAoaWRvYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIElEaXNwYXRjaCBpZWxlbSA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaWRvYywgImRvY3VtZW50RWxlbWVudCIpOwotICAgICAgICBpZiAoaWVsZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGluaXRpYWxpemUoaWRvYyk7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgbmV3Tm9kZShpZWxlbSwgTm9kZS5FTEVNRU5UX05PREUsIHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKElEaXNwYXRjaCBkb2MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgZG9jLmludm9rZTAoImNyZWF0ZVN0eWxlU2hlZXQiKTsKLSAgICAgICAgICAgIGlmIChyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgU3R5bGVTaGVldEltcGwgc3R5bGUgPSBuZXcgU3R5bGVTaGVldEltcGwocik7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0eWxlLmFkZFJ1bGUoIi5DU1N0b0hpZ2hsaWdodCIsICJib3JkZXI6IDNweCBzb2xpZCBncmVlbjsgYmFja2dyb3VuZDogI2ZkZDsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTm9kZSBPdmVycmlkaW5nIEltcGwuCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEZyYW1lUm9vdEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGcmFtZVJvb3RFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0gICAgICAgIE5vZGUgbiA9IGdldEZyYW1lUm9vdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG4gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBFbXB0eU5vZGVMaXN0SW1wbC5JTlNUQU5DRTsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25Ob2RlTGlzdEltcGwobik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLSAgICAgICAgTm9kZSBuID0gZ2V0RnJhbWVSb290RWxlbWVudCgpOwotICAgICAgICBpZiAobiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MRWxlbWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MRWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzM2M3NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvSFRNTEVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudEZhY3RvcnkgewotICAgIHB1YmxpYyBzdGF0aWMgTm9kZUltcGwgY3JlYXRlKE5vZGVJbXBsIGJhc2UsIElEaXNwYXRjaCBpbm9kZSwgU3RyaW5nIHRhZ05hbWUpewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRhZ05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImZyYW1lbm9kZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFtZU5vZGVJbXBsKGJhc2UsIGlub2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZih0YWdOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0ZXh0IikpewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dEltcGwoYmFzZSwgaW5vZGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmKHRhZ05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInNlbGVjdCIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEVsZW1lbnRJbXBsKGJhc2UsIGlub2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZih0YWdOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJpbWciKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUVsZW1lbnRJbXBsKGJhc2UsIGlub2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudEltcGwoYmFzZSwgaW5vZGUpOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnRJbXBsIGJhc2UsIElEaXNwYXRjaCBpbm9kZSwgU3RyaW5nIHRhZ05hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElEaXNwYXRjaCByOwotICAgICAgICAgICAgciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoImNyZWF0ZUVsZW1lbnQiLCB0YWdOYW1lKTsKLSAgICAgICAgICAgIGlmIChyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJpZnJhbWUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnJhbWVOb2RlSW1wbChiYXNlLCByKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRJbXBsKGJhc2UsIHIpOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0hUTUxUZXJtcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0hUTUxUZXJtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODZlOGY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MVGVybXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbC5FbGVtZW50SW1wbC5JbnB1dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5Db21QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5Wb2NhYnVsYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgSFRNTFRlcm1zIGV4dGVuZHMgQWJzdHJhY3RUZXJtcyB7Ci0gICAgLy8gQURERUQgQlkgS09CQVlBU0hJICggLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWx0ZXJhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gaXNJbWFnZSh0YXJnZXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEhUTUxUZXJtcyBpbnN0YW5jZTsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBoZWFkaW5nVGFnczsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBsaXN0SXRlbVRhZ3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PFN0cmluZz4gYmxvY2tUYWdzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IGxpc3RUb3BUYWdzOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgaGVhZGluZ1RhZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGhlYWRpbmdUYWdzLmFkZCgiSDEiLmludGVybigpKTsKLSAgICAgICAgaGVhZGluZ1RhZ3MuYWRkKCJIMiIuaW50ZXJuKCkpOwotICAgICAgICBoZWFkaW5nVGFncy5hZGQoIkgzIi5pbnRlcm4oKSk7Ci0gICAgICAgIGhlYWRpbmdUYWdzLmFkZCgiSDQiLmludGVybigpKTsKLSAgICAgICAgaGVhZGluZ1RhZ3MuYWRkKCJINSIuaW50ZXJuKCkpOwotICAgICAgICBoZWFkaW5nVGFncy5hZGQoIkg2Ii5pbnRlcm4oKSk7Ci0KLSAgICAgICAgbGlzdEl0ZW1UYWdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBsaXN0SXRlbVRhZ3MuYWRkKCJMSSIuaW50ZXJuKCkpOwotICAgICAgICBsaXN0SXRlbVRhZ3MuYWRkKCJEVCIuaW50ZXJuKCkpOwotCi0gICAgICAgIGxpc3RUb3BUYWdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBsaXN0VG9wVGFncy5hZGQoIlVMIi5pbnRlcm4oKSk7Ci0gICAgICAgIGxpc3RUb3BUYWdzLmFkZCgiT0wiLmludGVybigpKTsKLSAgICAgICAgbGlzdFRvcFRhZ3MuYWRkKCJETCIuaW50ZXJuKCkpOwotCi0gICAgICAgIGJsb2NrVGFncyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiSDEiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiSDIiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiSDMiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiSDQiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiSDUiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiSDYiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiQiIuaW50ZXJuKCkpOwotICAgICAgICBibG9ja1RhZ3MuYWRkKCJTVFJPTkciLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiRElWIi5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIlNQQU4iLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiUCIuaW50ZXJuKCkpOwotICAgICAgICBibG9ja1RhZ3MuYWRkKCJGT05UIi5pbnRlcm4oKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEhUTUxUZXJtcyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEhUTUxUZXJtcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIkhFQUQiLmVxdWFscyhuYW1lKSB8fCAiTUFQIi5lcXVhbHMobmFtZSkpIAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpbGluZUVkaXQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCJURVhUQVJFQSIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgIFRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNNdWx0aWxpbmVFZGl0KChJRXZhbFRhcmdldCkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RPcHRpb24oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCJPUFRJT04iLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRleHRJbXBsKSB7Ci0gICAgICAgICAgICBUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHBhcmVudCA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU2VsZWN0T3B0aW9uKChJRXZhbFRhcmdldCkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dGFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCJJTlBVVCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50LmdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0VkaXQoKSB8fCB0eXBlLmlzUGFzc3dvcmQoKSB8fCB0eXBlLmlzRmlsZUVkaXQoKSB8fCB0eXBlLmlzQ2hlY2tCb3goKSB8fCB0eXBlLmlzUmFkaW8oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlRFWFRBUkVBIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUZXh0SW1wbCkgewotICAgICAgICAgICAgVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBWb2NhYnVsYXJ5LmlzSW5wdXRhYmxlKCkuZXZhbCgoSUV2YWxUYXJnZXQpIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21ib2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIlNFTEVDVCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgIFRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVm9jYWJ1bGFyeS5pc1NlbGVjdGFibGUoKS5ldmFsKChJRXZhbFRhcmdldCkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpU2VsZWN0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIlNFTEVDVCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBIZWxwZXIuZ2V0KGVsZW1lbnQuZ2V0SU5vZGUoKSwgIm11bHRpcGxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgIFRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVm9jYWJ1bGFyeS5pc011bHRpU2VsZWN0YWJsZSgpLmV2YWwoKElFdmFsVGFyZ2V0KSBwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2xpY2thYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgIFRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVm9jYWJ1bGFyeS5pc0NsaWNrYWJsZSgpLmV2YWwoKElFdmFsVGFyZ2V0KSBwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGhyZWYgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGVsZW1lbnQuZ2V0SU5vZGUoKSwgImhyZWYiKTsKLSAgICAgICAgICAgIGlmICgoIkEiLmVxdWFscyhuYW1lKSB8fCAiQVJFQSIuZXF1YWxzKG5hbWUpKSAKLSAgICAgICAgICAgICAgICAgICAgJiYgaHJlZiAhPSBudWxsICYmIGhyZWYubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKCJCVVRUT04iLmVxdWFscyhuYW1lKSB8fCAiT1BUSU9OIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoIklOUFVUIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFR5cGUgdHlwZSA9IGVsZW1lbnQuZ2V0SW5wdXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NsaWNrYWJsZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEhlbHBlci5oYXNQcm9wZXJ0eShlbGVtZW50LmdldElOb2RlKCksICJvbmNsaWNrIikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkKLSAgICAgICAgICAgICAgICByZXR1cm4gVm9jYWJ1bGFyeS5pc0NsaWNrYWJsZSgpLmV2YWwoKElFdmFsVGFyZ2V0KSBwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmsoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUZXh0SW1wbCkgewotICAgICAgICAgICAgVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBWb2NhYnVsYXJ5LmlzTGluaygpLmV2YWwoKElFdmFsVGFyZ2V0KSBwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGhyZWYgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGVsZW1lbnQuZ2V0SU5vZGUoKSwgImhyZWYiKTsKLSAgICAgICAgICAgIGlmICgoIkEiLmVxdWFscyhuYW1lKSB8fCAiQVJFQSIuZXF1YWxzKG5hbWUpKSAKLSAgICAgICAgICAgICAgICAgICAgJiYgaHJlZiAhPSBudWxsICYmIGhyZWYubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHAgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFZvY2FidWxhcnkuaXNMaW5rKCkuZXZhbCgoSUV2YWxUYXJnZXQpIHApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrYm94KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIElucHV0VHlwZSB0eXBlID0gZWxlbWVudC5nZXRJbnB1dFR5cGUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDaGVja0JveCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IEhlbHBlci5nZXQoKChFbGVtZW50SW1wbCkgdGFyZ2V0KS5nZXRJTm9kZSgpLCAiY2hlY2tlZCIpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgb2JqOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhZGlvKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIElucHV0VHlwZSB0eXBlID0gZWxlbWVudC5nZXRJbnB1dFR5cGUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNSYWRpbygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RleHRib3goSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgSW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50LmdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0VkaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXNzd29yZChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBJbnB1dFR5cGUgdHlwZSA9IGVsZW1lbnQuZ2V0SW5wdXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzUGFzc3dvcmQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdXR0b24oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgSW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50LmdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0J1dHRvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJblRhZ3MoSUV2YWxUYXJnZXQgdGFyZ2V0LCBIYXNoU2V0PFN0cmluZz4gdGFncykgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgaWYgKHRhZ3MuY29udGFpbnMobmFtZS5pbnRlcm4oKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0VG9wKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoaXNJblRhZ3ModGFyZ2V0LCBsaXN0VG9wVGFncykpIHsKLSAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlID0gKEVsZW1lbnQpIHRhcmdldDsKLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBubCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGUgbiA9IG5sLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgSUV2YWxUYXJnZXQgJiYgaXNMaXN0SXRlbSgoSUV2YWxUYXJnZXQpIG4pKQotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdEl0ZW0oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBpc0xpc3RJdGVtSnVtcFBvaW50KHRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaWxlRWRpdChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBJbnB1dFR5cGUgdHlwZSA9IGVsZW1lbnQuZ2V0SW5wdXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzRmlsZUVkaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZE9iamVjdChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgiRU1CRUQiLmVxdWFscyhuYW1lKSB8fCAiT0JKRUNUIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW1hZ2UoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgcmV0dXJuICJJTUciLmVxdWFscyhuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGlzTXVsdGlsaW5lRWRpdCh0YXJnZXQpKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhaGFzQ29udGVudCgoSUV2YWxUYXJnZXQpICgoRWxlbWVudCkgdGFyZ2V0KS5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0lucHV0YWJsZSh0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGlzTGlzdFRvcCh0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc0NvbnRlbnQodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0PFN0cmluZz4gcmVkdWNpYmxlRWxlbWVudE5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkZPTlQiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiQkFTRUZPTlQiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiUyIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJTVFJJS0UiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiVSIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJFTSIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJTVFJPTkciLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiU1BBTiIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJWQVIiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiQ09ERSIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJDSVRFIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkFCQlIiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiQUNST05ZTSIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJRIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkIiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiQklHIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkkiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiU01BTEwiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiVFQiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiU1VCIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlNVUCIuaW50ZXJuKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gbm9uIG9mZmljaWFsIHRhZwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJXQlIiLmludGVybigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZHVjaWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgLy8gTWlnaHQgaXQgYmUgaW5jbHVkZWQgaW4gdGhlIHJ1bGVzPwotICAgICAgICAvLyBpZiAoVm9jYWJ1bGFyeS5pc0NsaWNrYWJsZSgpLmV2YWwodGFyZ2V0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpLmludGVybigpOwotICAgICAgICByZXR1cm4gcmVkdWNpYmxlRWxlbWVudE5hbWVzLmNvbnRhaW5zKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaXRlZExpbmsoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIElOb2RlRXgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBJTm9kZUV4IG5leCA9IChJTm9kZUV4KSB0YXJnZXQ7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdXJsID0gbmV4LmdldExpbmtVUkkoKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIENvbVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJvd3Nlckhpc3RvcnkoKS5pc1Zpc2l0ZWQodXJsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmdKdW1wUG9pbnQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBpc0p1bXBQb2ludCh0YXJnZXQsIGhlYWRpbmdUYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RJdGVtSnVtcFBvaW50KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gaXNKdW1wUG9pbnQodGFyZ2V0LCBsaXN0SXRlbVRhZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQmxvY2tKdW1wUG9pbnRGKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gaXNKdW1wUG9pbnQodGFyZ2V0LCBibG9ja1RhZ3MsIDMpIHx8IGlzSnVtcFBvaW50Mih0YXJnZXQsIGhlYWRpbmdUYWdzLCAzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50QihJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGlzSnVtcFBvaW50KHRhcmdldCwgYmxvY2tUYWdzLCAzKSB8fCBpc0p1bXBQb2ludDIodGFyZ2V0LCBoZWFkaW5nVGFncywgMyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSnVtcFBvaW50KElFdmFsVGFyZ2V0IHRhcmdldCwgSGFzaFNldCB0YWdzKSB7Ci0gICAgICAgIHJldHVybiBpc0p1bXBQb2ludCh0YXJnZXQsIHRhZ3MsIDEwMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSnVtcFBvaW50KElFdmFsVGFyZ2V0IHRhcmdldCwgSGFzaFNldCB0YWdzLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgaWYgKGRlcHRoIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSB0YXJnZXQ7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAodGFncy5jb250YWlucyhuYW1lLmludGVybigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0gICAgICAgIE5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIHdoaWxlIChwcmV2ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChoYXNUZXh0KHByZXYpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldiA9IHByZXYuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNKdW1wUG9pbnQoKElFdmFsVGFyZ2V0KSBwYXJlbnQsIHRhZ3MsIGRlcHRoIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSnVtcFBvaW50MihJRXZhbFRhcmdldCB0YXJnZXQsIEhhc2hTZXQgdGFncywgaW50IGRlcHRoKSB7Ci0gICAgICAgIGlmIChkZXB0aCA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKHRhZ3MuY29udGFpbnMobmFtZS5pbnRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotCi0gICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0p1bXBQb2ludCgoSUV2YWxUYXJnZXQpIHBhcmVudCwgdGFncywgZGVwdGggLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVGV4dChOb2RlIHByZXYpIHsKLSAgICAgICAgaWYgKHByZXYgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0gICAgICAgICAgICBJTm9kZUV4IG5leCA9IChJTm9kZUV4KSBwcmV2OwotICAgICAgICAgICAgaWYgKG5leC5oYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBsaXN0ID0gbmV4LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBOb2RlIGNuID0gbGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGV4dChjbikpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChuZXguZXh0cmFjdFN0cmluZygpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWNjZXNzS2V5KGNoYXIga2V5LCBJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBJTm9kZUV4KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgSU5vZGVFeCBuZXggPSAoSU5vZGVFeCkgbm9kZTsKLSAgICAgICAgY2hhciBjID0gbmV4LmdldEFjY2Vzc0tleSgpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGMgPT0ga2V5OwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWNoYWJsZShJRXZhbFRhcmdldCBldmFsVGFyZ2V0LCBOb2RlIHRhcmdldCkgewotICAgICAgICBpZiAoIShldmFsVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgZXZhbFRhcmdldDsKLSAgICAgICAgCi0gICAgICAgIE5vZGUgYTEgPSBzZWFyY2hOb25SZWR1Y2libGVBbmNlc3Rvcihub2RlKTsKLSAgICAgICAgaWYgKGExID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIE5vZGUgYTIgPSBzZWFyY2hOb25SZWR1Y2libGVBbmNlc3Rvcih0YXJnZXQpOwotICAgICAgICBpZiAoYTIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAoYTEuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChhMi5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAoIShhMS5nZXRQYXJlbnROb2RlKCkuaXNTYW1lTm9kZShhMi5nZXRQYXJlbnROb2RlKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGExIGluc3RhbmNlb2YgSUV2YWxUYXJnZXQgJiYgYTIgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkgewotICAgICAgICAgICAgICAgIElFdmFsVGFyZ2V0IHQxID0gKElFdmFsVGFyZ2V0KSBhMTsKLSAgICAgICAgICAgICAgICBJRXZhbFRhcmdldCB0MiA9IChJRXZhbFRhcmdldCkgYTI7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTGluayh0MSkgJiYgaXNMaW5rKHQyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzQnV0dG9uKHQxKSAmJiBpc0J1dHRvbih0MikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTm9kZSBzdGFydCA9IG5vZGU7Ci0KLSAgICAgICAgTm9kZSBlbmQgPSB0YXJnZXQ7Ci0gICAgICAgIGlmIChlbmQgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICAgICAgZW5kID0gZ2V0UHJldihlbmQpOwotICAgICAgICBpZiAoZW5kID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBOb2RlIG5leHQgPSBnZXROZXh0KHN0YXJ0KTsKLSAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCEobmV4dCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSkgewotICAgICAgICAgICAgICAgIG5leHQgPSBnZXROZXh0KG5leHQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghVm9jYWJ1bGFyeS5pc1JlZHVjaWJsZSgpLmV2YWwoKElFdmFsVGFyZ2V0KSBuZXh0KSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZihuZXh0LmlzU2FtZU5vZGUoZW5kKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG5leHQgPSBnZXROZXh0KG5leHQpOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgCi0gICAgcHJpdmF0ZSBOb2RlIGdldFByZXYoTm9kZSBub2RlKSB7Ci0gICAgICAgIE5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIGlmIChwcmV2ICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcHJldjsKLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE5vZGUgZ2V0TmV4dChOb2RlIG5vZGUpIHsKLSAgICAgICAgTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICBpZiAobmV4dCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgIHJldHVybiBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE5vZGUgc2VhcmNoTm9uUmVkdWNpYmxlQW5jZXN0b3IoTm9kZSBub2RlKSB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBudWxsOwotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGU7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQgJiYgCi0gICAgICAgICAgICAgICAgKHBhcmVudCBpbnN0YW5jZW9mIFRleHQgCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0ltYWdlKChJRXZhbFRhcmdldCkgcGFyZW50KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzUmVkdWNpYmxlKChJRXZhbFRhcmdldCkgcGFyZW50KSkgewotICAgICAgICAgICAgY2hpbGQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9JbWFnZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvSW1hZ2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI0MmQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9JbWFnZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSUltYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0KLQotcHVibGljIGNsYXNzIEltYWdlRWxlbWVudEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElJbWFnZUVsZW1lbnQgewotCi0gICAgcHVibGljIEltYWdlRWxlbWVudEltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZSkgewotICAgICAgICBzdXBlcihiYXNlTm9kZSwgaW5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1VzZW1hcCgpIHsKLSAgICAgICAgU3RyaW5nIHVzZW1hcCA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJ1c2VtYXAiKTsKLSAgICAgICAgcmV0dXJuICh1c2VtYXAgIT0gbnVsbCAmJiB1c2VtYXAubGVuZ3RoKCkgPj0gMik7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0TWFwKCkgewotICAgICAgICBTdHJpbmcgdXNlbWFwID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgInVzZW1hcCIpOwotICAgICAgICBpZiAodXNlbWFwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgaWYgKHVzZW1hcC5zdGFydHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgIG5hbWUgPSB1c2VtYXAuc3Vic3RyaW5nKDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmFtZSA9IHVzZW1hcDsKLSAgICAgICAgfQotICAgICAgICBOb2RlTGlzdCBubCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTUFQIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKyl7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBubC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKCJNQVAiLmVxdWFscyhub2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBhcmVhID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZWEuZ2V0QXR0cmlidXRlKCJuYW1lIikpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJlYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvU2VsZWN0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9TZWxlY3RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjlhYmU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9TZWxlY3RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JU2VsZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RWxlbWVudEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElTZWxlY3RFbGVtZW50IHsKLQotICAgIHB1YmxpYyBTZWxlY3RFbGVtZW50SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRpY2VzKGludFtdIGluZGljZXMpIHsKLSAgICAgICAgaW50W10gcHJldiA9IGdldFNlbGVjdGVkSW5kaWNlcygpOwotICAgICAgICAKLSAgICAgICAgaW50IGxlbmd0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBvcHRpb24gPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJpdGVtIiwgaSk7Ci0gICAgICAgICAgICBIZWxwZXIucHV0KG9wdGlvbiwgInNlbGVjdGVkIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJRGlzcGF0Y2ggb3B0aW9uID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiaXRlbSIsIGluZGljZXNbaV0pOwotICAgICAgICAgICAgSGVscGVyLnB1dChvcHRpb24sICJzZWxlY3RlZCIsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEhlbHBlci5oYXNQcm9wZXJ0eShpbm9kZSwgIm9uY2hhbmdlIikpIHsKLSAgICAgICAgICAgIGlmIChwcmV2Lmxlbmd0aCAhPSBpbmRpY2VzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlub2RlLmludm9rZTAoIm9uY2hhbmdlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJldltpXSAhPSBpbmRpY2VzW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm9kZS5pbnZva2UwKCJvbmNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50W10gZ2V0U2VsZWN0ZWRJbmRpY2VzKCkgewotICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBvcHRpb24gPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJpdGVtIiwgaSk7Ci0gICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKEJvb2xlYW4pIEhlbHBlci5nZXQob3B0aW9uLCAic2VsZWN0ZWQiKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZCkKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChpKTsKLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbbGlzdC5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpbmRpY2VzW2ldID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgIHJldHVybiBpbmRpY2VzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldE9wdGlvbnNDb3VudCgpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uVGV4dEF0KGludCBpbmRleCkgewotICAgICAgICBJRGlzcGF0Y2ggb3B0aW9uID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiaXRlbSIsIGluZGV4KTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQob3B0aW9uLCAidGV4dCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9UZXh0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL1RleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2U3YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL1RleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRWxlbWVudEV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0KLWNsYXNzIFRleHRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBUZXh0LCBJTm9kZUV4IHsKLSAgICBUZXh0SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSwgTm9kZS5URVhUX05PREUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0IHNwbGl0VGV4dChpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgic3BsaXRUZXh0IiwgSW50ZWdlci52YWx1ZU9mKG9mZnNldCkpOwotICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gKFRleHQpIG5ld05vZGUociwgTm9kZS5URVhUX05PREUpOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSU5vZGVFeCBpbnRlcmZhY2UKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBkb0NsaWNrKCkgewotICAgICAgICBOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlRXgpIHsKLSAgICAgICAgICAgIHJldHVybiAoKElOb2RlRXgpIHBhcmVudCkuZG9DbGljaygpOwotICAgICAgICB9Ci0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhpZ2hsaWdodCgpIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJTm9kZUV4KSBwYXJlbnQpLmhpZ2hsaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB1bmhpZ2hsaWdodCgpIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJTm9kZUV4KSBwYXJlbnQpLnVuaGlnaGxpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIG52ID0gZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIGlmIChudiA9PSBudWxsKSByZXR1cm4gIiI7Ci0gICAgICAgIG52ID0gSGVscGVyLnRyaW1IVE1MU3RyKG52KTsKLQotICAgICAgICBOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSkKLSAgICAgICAgICAgIHJldHVybiBudjsKLSAgICAgICAgCi0gICAgICAgIGlmICghIkFCQlIiLmVxdWFscyhwYXJlbnQuZ2V0Tm9kZU5hbWUoKSkgLy8KLSAgICAgICAgICAgICAgICAmJiAhIkFDUk9OWU0iLmVxdWFscyhwYXJlbnQuZ2V0Tm9kZU5hbWUoKSkpIAotICAgICAgICAgICAgcmV0dXJuIG52OwotICAgICAgICAKLSAgICAgICAgRWxlbWVudEltcGwgZWwgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IGVsLmdldEF0dHJpYnV0ZSgidGl0bGUiKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudiArICIgKCIrdGl0bGUrIikiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRMb2NhdGlvbigpewotICAgICAgICBOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgSUVsZW1lbnRFeCkpewotICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKElOb2RlRXgpIHBhcmVudCkuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhciBnZXRBY2Nlc3NLZXkoKSB7Ci0gICAgICAgIE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgSU5vZGVFeCkpIAotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKChJTm9kZUV4KSBwYXJlbnQpLmdldEFjY2Vzc0tleSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L01lZGlhT2JqZWN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvTWVkaWFPYmplY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGI1ZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvTWVkaWFPYmplY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkFuYWx5emVkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeFNvdW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhWaWRlbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtczsKLQotCi0KLQotCi1hYnN0cmFjdCBjbGFzcyBNZWRpYU9iamVjdEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElOb2RlRXhWaWRlbywgSU5vZGVFeFNvdW5kIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5hbHl6ZWRSZXN1bHQgYW5hbHl6ZShBbmFseXplZFJlc3VsdCBhcikgewotICAgICAgICBhci5hZGRWaWRlbyh0aGlzKTsKLSAgICAgICAgYXIuYWRkU291bmQodGhpcyk7Ci0gICAgICAgIHJldHVybiBhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5vZGVFeCBnZXRSZWZlcmVuY2VOb2RlKCkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWJzdHJhY3RUZXJtcyBnZXRUZXJtcygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhT2JqZWN0VGVybXMuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVkaWFPYmplY3RJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaWRpc3ApIHsKLSAgICAgICAgc3VwZXIoYmFzZU5vZGUsIGlkaXNwKTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L01lZGlhT2JqZWN0VGVybXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L01lZGlhT2JqZWN0VGVybXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhYzRlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9NZWRpYU9iamVjdFRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQ7Ci0KLQotCi0KLWNsYXNzIE1lZGlhT2JqZWN0VGVybXMgZXh0ZW5kcyBBYnN0cmFjdFRlcm1zIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYU9iamVjdFRlcm1zIGluc3RhbmNlID0gbmV3IE1lZGlhT2JqZWN0VGVybXMoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTWVkaWEoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsdGVyYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZE5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZU5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyBNZWRpYU9iamVjdFRlcm1zIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9PYmplY3RFbGVtZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvT2JqZWN0RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlMGEzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9PYmplY3RFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU9iamVjdEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLQotcHVibGljIGNsYXNzIE9iamVjdEVsZW1lbnRGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIElPYmplY3RFbGVtZW50RmFjdG9yeVtdIGZhY3RvcmllcyA9IE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uLmdldE9iamVjdEVsZW1lbnRGYWN0b3JpZXMoKTsKLQkKLQlwdWJsaWMgc3RhdGljIE5vZGVJbXBsIGNyZWF0ZShOb2RlSW1wbCBiYXNlLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLQkJZm9yIChJT2JqZWN0RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA6IGZhY3Rvcmllcyl7Ci0JCQlOb2RlSW1wbCBuZXdOb2RlID0gZmFjdG9yeS5jcmVhdGVUb3BOb2RlKGJhc2UsIGlub2RlKTsKLQkJCWlmIChuZXdOb2RlICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ld05vZGU7CQkJCi0JCX0KLQotCQlPYmplY3QgY29udHJvbHMgPSBIZWxwZXIuZ2V0KGlub2RlLCAiY29udHJvbHMiKTsKLQkJaWYgKGNvbnRyb2xzIGluc3RhbmNlb2YgSURpc3BhdGNoKSB7Ci0JCQlyZXR1cm4gbmV3IFdNUE5vZGVJbXBsKGJhc2UsIGlub2RlLCAoSURpc3BhdGNoKSBjb250cm9scyk7Ci0JCX0KLQotCQlPYmplY3QgY2xpZW50SUQgPSBIZWxwZXIuZ2V0KGlub2RlLCAiQ2xpZW50SUQiKTsKLQkJaWYgKGNsaWVudElEICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgV01QNjROb2RlSW1wbChiYXNlLCBpbm9kZSk7Ci0JCX0KLQotCQl0cnkgewotCQkJT2JqZWN0IHF0VmVyc2lvbiA9IGlub2RlLmludm9rZTAoIkdldFF1aWNrVGltZVZlcnNpb24iKTsKLQkJCWlmIChxdFZlcnNpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgUVROb2RlSW1wbChiYXNlLCBpbm9kZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXRyeSB7Ci0JCQlPYmplY3QgcnBWZXJzaW9uID0gaW5vZGUuaW52b2tlMCgiR2V0VmVyc2lvbkluZm8iKTsKLQkJCWlmIChycFZlcnNpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgUlBOb2RlSW1wbChiYXNlLCBpbm9kZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L09iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjAwN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklPYmplY3RFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05BTUUgPSAiZWxlbWVudEZhY3RvcnkiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9FTEVNRU5UX0ZBQ1RPUlkgPSAib2JqZWN0RWxlbWVudEZhY3RvcnkiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU1QTCA9ICJpbXBsZW1lbnRhdGlvbnMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb25bXSBleHRlbnNpb25zOwotCi0JcHJpdmF0ZSBzdGF0aWMgSU9iamVjdEVsZW1lbnRGYWN0b3J5W10gZmFjdG9yaWVzID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgSU9iamVjdEVsZW1lbnRGYWN0b3J5W10gZ2V0T2JqZWN0RWxlbWVudEZhY3RvcmllcygpIHsKLQkJaWYgKGZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFjdG9yaWVzOwotCQl9Ci0KLQkJT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb25bXSB0bXBFeHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucygpOwotCQlBcnJheUxpc3Q8SU9iamVjdEVsZW1lbnRGYWN0b3J5PiB0bXBMaXN0ID0gbmV3IEFycmF5TGlzdDxJT2JqZWN0RWxlbWVudEZhY3Rvcnk+KCk7Ci0JCWlmICh0bXBFeHRlbnNpb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG1wRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlPYmplY3RFbGVtZW50RmFjdG9yeSB0bXBGYWN0b3J5ID0gdG1wRXh0ZW5zaW9uc1tpXS5nZXRGYWN0b3J5KCk7Ci0JCQkJaWYgKHRtcEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQl0bXBMaXN0LmFkZCh0bXBGYWN0b3J5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmFjdG9yaWVzID0gbmV3IElPYmplY3RFbGVtZW50RmFjdG9yeVt0bXBMaXN0LnNpemUoKV07Ci0JCXRtcExpc3QudG9BcnJheShmYWN0b3JpZXMpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uW10gZ2V0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkKLQkJCXJldHVybiBleHRlbnNpb25zOwotCi0JCUlFeHRlbnNpb25bXSB0bXBFeHRlbnNpb25zID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20iLCBFWFRFTlNJT05fTkFNRSkKLQkJCQkuZ2V0RXh0ZW5zaW9ucygpOwotCi0JCUxpc3Q8T2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gdG1wRXh0ZW5zaW9uc1tpXQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24gZXggPSBwYXJzZUV4dGVuc2lvbihjb25maWdFbGVtZW50c1tqXSk7Ci0JCQkJaWYgKGV4ICE9IG51bGwpIHsKLQkJCQkJbC5hZGQoZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlleHRlbnNpb25zID0gbC50b0FycmF5KG5ldyBPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbltsLnNpemUoKV0pOwotCQlyZXR1cm4gZXh0ZW5zaW9uczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbiBwYXJzZUV4dGVuc2lvbigKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCWlmICghY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKE9CSkVDVF9FTEVNRU5UX0ZBQ1RPUlkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbihjb25maWdFbGVtZW50KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElPYmplY3RFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZmFjdG9yeSA9IChJT2JqZWN0RWxlbWVudEZhY3RvcnkpIGNvbmZpZ0VsZW1lbnQKLQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9JTVBMKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJT2JqZWN0RWxlbWVudEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1FUTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1FUTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1MjAwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9RVE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuSURpc3BhdGNoOwotCi0KLQotCi1jbGFzcyBRVE5vZGVJbXBsIGV4dGVuZHMgTWVkaWFPYmplY3RJbXBsIHsKLSAgICAKLSAgICBib29sZWFuIHBhdXNlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFZpZGVvU3RhdGUgY3VycmVudFN0YXRlID0gVmlkZW9TdGF0ZS5TVEFURV9VTktOT1dOOwotICAgIAotICAgIFFUTm9kZUltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZSkgewotICAgICAgICBzdXBlcihiYXNlTm9kZSwgaW5vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGV4ZWMwKFN0cmluZyBjbWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpbm9kZS5pbnZva2UwKGNtZCk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBleGVjMShTdHJpbmcgY21kLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5vZGUuaW52b2tlMShjbWQsIG9iaik7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRNdXRlU3RhdGUoKSB7Ci0gICAgICAgIE9iamVjdCBib29sID0gZXhlYzAoIkdldE11dGUiKTsKLSAgICAgICAgaWYgKGJvb2wgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIGJvb2wpLmludFZhbHVlKCkgIT0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICAvLyByYW5nZSBpcyAwLTI1NgotICAgICAgICAvLyBtYXBwaW5nIHRvIDAtMTAwMAotICAgICAgICBPYmplY3Qgdm9sdW1lID0gZXhlYzAoIkdldFZvbHVtZSIpOwotCi0gICAgICAgIGlmICh2b2x1bWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZvbHVtZSkuaW50VmFsdWUoKSAqIDEwMDAgLyAyNTY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG11dGVNZWRpYShib29sZWFuIGZsYWcpIHsKLSAgICAgICAgZXhlYzEoInNldE11dGUiLCBCb29sZWFuLnZhbHVlT2YoZmxhZykpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRWb2x1bWUoaW50IHZhbCkgewotICAgICAgICBpbnQgdm9sdW1lID0gdmFsICogMjU2IC8gMTAwMDsKLSAgICAgICAgZXhlYzEoIlNldFZvbHVtZSIsIHZvbHVtZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZhc3RGb3J3YXJkKCkgewotICAgICAgICAvLyBUT0RPCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0UmV2ZXJzZSgpIHsKLSAgICAgICAgZXhlYzAoIlJld2luZCIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgT2JqZWN0IHRpbWUgPSBleGVjMCgiR2V0VGltZSIpOwotICAgICAgICBPYmplY3Qgc2NhbGUgPSBleGVjMCgiR2V0VGltZVNjYWxlIik7Ci0KLSAgICAgICAgaWYgKHRpbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHRpbWUpLmRvdWJsZVZhbHVlKCkgLyAoKEludGVnZXIpIHNjYWxlKS5kb3VibGVWYWx1ZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdGF0ZSBnZXRDdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRUb3RhbExlbmd0aCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXh0VHJhY2soKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBhdXNlTWVkaWEoKSB7Ci0gICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRSkgCi0gICAgICAgICAgICByZXR1cm4gcGxheU1lZGlhKCk7Ci0gICAgICAgIGV4ZWMwKCJTdG9wIik7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfUEFVU0U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBsYXlNZWRpYSgpIHsKLSAgICAgICAgZXhlYzAoIlBsYXkiKTsKLSAgICAgICAgY3VycmVudFN0YXRlID0gVmlkZW9TdGF0ZS5TVEFURV9QTEFZOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwcmV2aW91c1RyYWNrKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdG9wTWVkaWEoKSB7Ci0gICAgICAgIGV4ZWMwKCJTdG9wIik7Ci0gICAgICAgIGV4ZWMxKCJTZXRUaW1lIiwgMCk7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvUlBOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvUlBOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEyNDQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1JQTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5jb21jbHV0Y2gud2luMzIuRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5JRGlzcGF0Y2g7Ci0KLQotCi0KLWNsYXNzIFJQTm9kZUltcGwgZXh0ZW5kcyBNZWRpYU9iamVjdEltcGwgewotCi0gICAgLy8gSG9sZGluZyBpbnRlcm5hbCBzdGF0ZSBiZWNhdXNlIFJlYWwgUGxheWVyJ3Mgc3RhdGUKLSAgICAvLyBpcyBub3QgY2hhbmdlZCByaWdodCBhZnRlciBleGVjdXRpbmcgY29tbWFuZAotCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhdXNlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcGxheSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0b3AgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtdXRlID0gZmFsc2U7Ci0KLSAgICBSUE5vZGVJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAgICAgc3VwZXIoYmFzZU5vZGUsIGlub2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBleGVjMChTdHJpbmcgY21kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5vZGUuaW52b2tlMChjbWQpOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZXhlYzEoU3RyaW5nIGNtZCwgT2JqZWN0IG9iaikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlub2RlLmludm9rZTEoY21kLCBvYmopOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TXV0ZVN0YXRlKCkgewotICAgICAgICBPYmplY3QgYm9vbCA9IGV4ZWMwKCJHZXRNdXRlIik7Ci0KLSAgICAgICAgaWYgKG11dGUpIHsKLSAgICAgICAgICAgIG11dGUgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJvb2wgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGJvb2wpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIC8vIHJhbmdlIGlzIDAtMTAwCi0gICAgICAgIC8vIG1hcHBpbmcgdG8gMC0xMDAwCi0gICAgICAgIE9iamVjdCB2b2x1bWUgPSBleGVjMCgiR2V0Vm9sdW1lIik7Ci0KLSAgICAgICAgaWYgKHZvbHVtZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICgoU2hvcnQpIHZvbHVtZSkuaW50VmFsdWUoKSAqIDEwMDAgLyAxMDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG11dGVNZWRpYShib29sZWFuIGZsYWcpIHsKLSAgICAgICAgLy8gY2Fubm90IG11dGUgbWVkaWEgd2l0aCAidHJ1ZSIsIGJ1dCBjYW4gbXV0ZSBtZWRpYSB3aXRoICIxIgotICAgICAgICAvLyBbIGV4ZWMxKCJTZXRNdXRlIiwgdHJ1ZSk7IF0geAotICAgICAgICAvLyBbIGV4ZWMxKCJTZXRNdXRlIiwgMSk7IF0gbwotICAgICAgICAvLyBbIGV4ZWMxKCJTZXRNdXRlIiwgZmFsc2UpO10gbwotCi0gICAgICAgIGV4ZWMxKCJTZXRNdXRlIiwgZmxhZyA/IDEgOiAwKTsKLSAgICAgICAgbXV0ZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldFZvbHVtZShpbnQgdmFsKSB7Ci0gICAgICAgIGludCB2b2x1bWUgPSB2YWwgKiAxMDAgLyAxMDAwOwotICAgICAgICBleGVjMSgiU2V0Vm9sdW1lIiwgdm9sdW1lKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmFzdEZvcndhcmQoKSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZhc3RSZXZlcnNlKCkgewotICAgICAgICBleGVjMCgiUmV3aW5kIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotICAgICAgICBPYmplY3QgdGltZSA9IGV4ZWMwKCJHZXRQb3NpdGlvbiIpOwotCi0gICAgICAgIGlmICh0aW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSB0aW1lKS5kb3VibGVWYWx1ZSgpIC8gMTAwMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3RhdGUgZ2V0Q3VycmVudFN0YXRlKCkgewotICAgICAgICBPYmplY3Qgc3RhdGUgPSBleGVjMCgiR2V0UGxheVN0YXRlIik7Ci0KLSAgICAgICAgaWYgKHBhdXNlKSB7Ci0gICAgICAgICAgICBwYXVzZSA9IHBsYXkgPSBzdG9wID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheSkgewotICAgICAgICAgICAgcGF1c2UgPSBwbGF5ID0gc3RvcCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfUExBWTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RvcCkgewotICAgICAgICAgICAgcGF1c2UgPSBwbGF5ID0gc3RvcCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCgoSW50ZWdlcikgc3RhdGUpLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9TVE9QOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1dBSVRJTkc7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfUExBWTsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRTsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9XQUlUSU5HOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1VOS05PV047Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRUb3RhbExlbmd0aCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXh0VHJhY2soKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBhdXNlTWVkaWEoKSB7Ci0gICAgICAgIGlmIChnZXRDdXJyZW50U3RhdGUoKSA9PSBWaWRlb1N0YXRlLlNUQVRFX1BBVVNFKQotICAgICAgICAgICAgcmV0dXJuIHBsYXlNZWRpYSgpOwotICAgICAgICBleGVjMCgiRG9QYXVzZSIpOwotICAgICAgICBwYXVzZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBsYXlNZWRpYSgpIHsKLSAgICAgICAgZXhlYzAoIkRvUGxheSIpOwotICAgICAgICBwbGF5ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHJldmlvdXNUcmFjaygpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcE1lZGlhKCkgewotICAgICAgICBleGVjMCgiRG9TdG9wIik7Ci0gICAgICAgIHN0b3AgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9XTVA2NE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9XTVA2NE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzljYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvV01QNjROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeFNvdW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLQotCi0KLQotY2xhc3MgV01QNjROb2RlSW1wbCBleHRlbmRzIE1lZGlhT2JqZWN0SW1wbCB7Ci0gICAgLy8gVGhpcyBmbGFnIGlzIHNvbWV3aGF0IGEgd29ya2Fyb3VuZC4KLSAgICAvLyBFdmVuIGlmIHdlIHB1dCAiTXV0ZSIgcHJvcGVydHkgdG8gInRydWUiLAotICAgIC8vIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgdmFsdWUgdG8gYmUgb2J0YWluZWQuCi0gICAgLy8gVGhlcmVmb3JlLCB3ZSByZW1lbWJlciB0aGUgbXV0ZSBzdGF0ZSBieSBvdXJzZWx2ZXMuCi0gICAgcHJpdmF0ZSBib29sZWFuIG11dGVTdGF0ZTsKLQotICAgIFdNUDY0Tm9kZUltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpZGlzcCkgewotICAgICAgICBzdXBlcihiYXNlTm9kZSwgaWRpc3ApOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBleGVjQ29udHJvbHMoU3RyaW5nIGNtZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5vZGUuaW52b2tlMChjbWQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHB1dFNldHRpbmdzKFN0cmluZyBwcm9wLCBPYmplY3QgdmFsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbm9kZS5wdXQocHJvcCwgdmFsKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGdldFNldHRpbmdzKFN0cmluZyBwcm9wKSB7Ci0gICAgICAgIHJldHVybiBIZWxwZXIuZ2V0KGlub2RlLCBwcm9wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0Rm9yd2FyZCgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygiZmFzdEZvcndhcmQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0UmV2ZXJzZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygiZmFzdFJldmVyc2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgT2JqZWN0IG8gPSBIZWxwZXIuZ2V0KGlub2RlLCAiY3VycmVudFBvc2l0aW9uIik7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChEb3VibGUpIG8pLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGbG9hdCkgbykuZmxvYXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBvKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0VG90YWxMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXh0VHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoIm5leHQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwYXVzZU1lZGlhKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJwYXVzZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBsYXlNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygicGxheSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByZXZpb3VzVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoInByZXZpb3VzIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcE1lZGlhKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJzdG9wIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gZ2V0U2V0dGluZ3MoIlZvbHVtZSIpOwotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSW50ZWdlcikpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGludCB2b2wgPSAoKEludGVnZXIpIG8pLmludFZhbHVlKCk7Ci0gICAgICAgIC8vIFdNUDY0IHZvbHVtZSByYW5nZSBpcyAwIC0tIC0xMDAwMC4gRGVmYXVsdCBpcyAtNjAwLiAgV2UgcmVzY2FsZSBpdCB0byAwIC0tIC0yMDAwCi0gICAgICAgIGlmICh2b2wgPCAtMjAwMCkgewotICAgICAgICAgICAgcmV0dXJuIElOb2RlRXhTb3VuZC5WT0xVTUVfTUlOOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKCh2b2wgKyAyMDAwKSAqIChJTm9kZUV4U291bmQuVk9MVU1FX01BWCAtIElOb2RlRXhTb3VuZC5WT0xVTUVfTUlOKSAvIDIwMDApCi0gICAgICAgICAgICAgICAgKyBJTm9kZUV4U291bmQuVk9MVU1FX01JTik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbXV0ZU1lZGlhKGJvb2xlYW4gZmxhZykgewotICAgICAgICBpZiAocHV0U2V0dGluZ3MoIk11dGUiLCBmbGFnKSkgewotICAgICAgICAgICAgbXV0ZVN0YXRlID0gZmxhZzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TXV0ZVN0YXRlKCkgewotICAgICAgICBPYmplY3QgbyA9IGdldFNldHRpbmdzKCJNdXRlIik7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBCb29sZWFuKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCkgfHwgbXV0ZVN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNldFZvbHVtZShpbnQgdmFsKSB7Ci0gICAgICAgIC8vIEZpcnN0LCBzY2FsZSBvdXIgdm9sdW1lIHJhbmdlIHRvIDIwMDAgLS0gMDsKLSAgICAgICAgdmFsID0gKCgodmFsIC0gSU5vZGVFeFNvdW5kLlZPTFVNRV9NSU4pICogMjAwMCkKLSAgICAgICAgICAgICAgIC8gKElOb2RlRXhTb3VuZC5WT0xVTUVfTUFYIC0gSU5vZGVFeFNvdW5kLlZPTFVNRV9NSU4pKTsKLSAgICAgICAgaWYgKHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICB2YWwgPSAtIDEwMDAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsIC09IDIwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHB1dFNldHRpbmdzKCJWb2x1bWUiLCBJbnRlZ2VyLnZhbHVlT2YodmFsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3RhdGUgZ2V0Q3VycmVudFN0YXRlKCkgewotICAgICAgICBPYmplY3QgbyA9IEhlbHBlci5nZXQoaW5vZGUsICJQbGF5U3RhdGUiKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBpbnQgd21wc3QgPSAoSW50ZWdlcikgbzsKLSAgICAgICAgICAgIHN3aXRjaCAod21wc3QpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9TVE9QOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1BBVVNFOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1BMQVk7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfV0FJVElORzsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9GQVNURk9SV0FSRDsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9GQVNUUkVWRVJTRTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1VOS05PV047Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9XTVBOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvV01QTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxNTAyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9XTVBOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeFNvdW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmNvbWNsdXRjaC53aW4zMi5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuY29tY2x1dGNoLndpbjMyLklEaXNwYXRjaDsKLQotCi0KLQotY2xhc3MgV01QTm9kZUltcGwgZXh0ZW5kcyBNZWRpYU9iamVjdEltcGwgewotICAgIHByaXZhdGUgZmluYWwgSURpc3BhdGNoIGNvbnRyb2xzOwotICAgIHByaXZhdGUgZmluYWwgSURpc3BhdGNoIHNldHRpbmdzOwotCi0gICAgV01QTm9kZUltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpZGlzcCwgSURpc3BhdGNoIGNvbnRyb2xzKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpZGlzcCk7Ci0gICAgICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9sczsKLSAgICAgICAgT2JqZWN0IG8gPSBIZWxwZXIuZ2V0KGlkaXNwLCAic2V0dGluZ3MiKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJRGlzcGF0Y2gpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSAoSURpc3BhdGNoKSBvOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY0NvbnRyb2xzKFN0cmluZyBjbWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xzLmludm9rZTAoY21kKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBwdXRTZXR0aW5ncyhTdHJpbmcgcHJvcCwgT2JqZWN0IHZhbCkgewotICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0dGluZ3MucHV0KHByb3AsIHZhbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRTZXR0aW5ncyhTdHJpbmcgcHJvcCkgewotICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBIZWxwZXIuZ2V0KHNldHRpbmdzLCBwcm9wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0Rm9yd2FyZCgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygiZmFzdEZvcndhcmQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0UmV2ZXJzZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygiZmFzdFJldmVyc2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgT2JqZWN0IG8gPSBIZWxwZXIuZ2V0KGNvbnRyb2xzLCAiY3VycmVudFBvc2l0aW9uIik7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChEb3VibGUpIG8pLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGbG9hdCkgbykuZmxvYXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBvKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0VG90YWxMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXh0VHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoIm5leHQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwYXVzZU1lZGlhKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJwYXVzZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBsYXlNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygicGxheSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByZXZpb3VzVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoInByZXZpb3VzIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcE1lZGlhKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJzdG9wIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gZ2V0U2V0dGluZ3MoInZvbHVtZSIpOwotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSW50ZWdlcikpIHJldHVybiAtMTsKLSAgICAgICAgaW50IHZvbCA9ICgoSW50ZWdlcikgbykuaW50VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuICgodm9sICogKChJTm9kZUV4U291bmQuVk9MVU1FX01BWCAtIElOb2RlRXhTb3VuZC5WT0xVTUVfTUlOKSAvIDEwMCkpCi0gICAgICAgICAgICAgICAgKyBJTm9kZUV4U291bmQuVk9MVU1FX01JTik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbXV0ZU1lZGlhKGJvb2xlYW4gZmxhZykgewotICAgICAgICByZXR1cm4gcHV0U2V0dGluZ3MoIm11dGUiLCBmbGFnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRWb2x1bWUoaW50IHZhbCkgewotICAgICAgICB2YWwgPSAoKCh2YWwgLSBJTm9kZUV4U291bmQuVk9MVU1FX01JTikgKiAxMDApCi0gICAgICAgICAgICAgICAvIChJTm9kZUV4U291bmQuVk9MVU1FX01BWCAtIElOb2RlRXhTb3VuZC5WT0xVTUVfTUlOKSk7Ci0gICAgICAgIHJldHVybiBwdXRTZXR0aW5ncygidm9sdW1lIiwgSW50ZWdlci52YWx1ZU9mKHZhbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N0YXRlIGdldEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgT2JqZWN0IG8gPSBIZWxwZXIuZ2V0KGlub2RlLCAicGxheVN0YXRlIik7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgaW50IHdtcHN0ID0gKEludGVnZXIpIG87Ci0gICAgICAgICAgICBzd2l0Y2ggKHdtcHN0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfVU5LTk9XTjsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9TVE9QOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1BBVVNFOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1BMQVk7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfRkFTVEZPUldBUkQ7Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfRkFTVFJFVkVSU0U7Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfV0FJVElORzsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1VOS05PV047Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRNdXRlU3RhdGUoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gZ2V0U2V0dGluZ3MoIm11dGUiKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEJvb2xlYW4pKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIG8pLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMDJlNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlNjg0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEZlYiAyMSAyMTowMjo0MiBKU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9hYm91dF9maWxlcy9XM0NfU29mdHdhcmVfTGljZW5zZS5odG1sPUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwYWMxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgSFRNTCBNb2RlbCBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbAotQnVuZGxlLVZlcnNpb246IDAuMC4xCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLkh0bWxQYXJzZXJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbCwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmVycm9yaGFuZGxlciwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGwsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC51dGlsLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXIsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC51dGlsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTdiZWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDE+QWJvdXQgVGhpcyBDb250ZW50PC9oMT4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMj5MaWNlbnNlPC9oMj4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotCi0JPGgyPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gyPgotCTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLQlkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLQlmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi0JdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGgzPkhUTUwgRFREczwvaDM+Ci0KLTxwPlRoZSBwbHVnLWluIGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSAoVzNDKS48L3A+Ci0KLTxwPlRoZSBIVE1MIERURHMgYXJlIGNvbnRhaW5lZCBpbiB0aGlzIHBsdWctaW4uIFRoZXNlIGZpbGVzIGFyZSBwcm92aWRlZCB3aXRob3V0IG1vZGlmaWNhdGlvbi4gCi1UaGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBjYW4gYmUgb2J0YWluZWQgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnczYy5vcmcvIj5Xb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtPC9hPiBXZWIgc2l0ZS48L3A+Ci0KLTxwPllvdXIgdXNlIG9mIHRoZSBIVE1MIERURHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIFczQyZyZWc7IFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRS4gCi1BIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIAotPGEgaHJlZj0iYWJvdXRfZmlsZXMvVzNDX1NvZnR3YXJlX0xpY2Vuc2UuaHRtbCI+VzNDX1NvZnR3YXJlX0xpY2Vuc2UuaHRtbDwvYT4gCi1hbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgCi08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS5odG1sIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS5odG1sPC9hPi4KLQotPHA+VGhlIG5hbWVzIG9mIHRoZXNlIERURHMgYW5kICAmcXVvdDtXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIChXM0MpJnF1b3Q7IAotbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICAKLUZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxhIGhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL2Fib3V0X2ZpbGVzL1czQ19Tb2Z0d2FyZV9MaWNlbnNlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYWJvdXRfZmlsZXMvVzNDX1NvZnR3YXJlX0xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkZTlhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYWJvdXRfZmlsZXMvVzNDX1NvZnR3YXJlX0xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci0gIDx0aXRsZT5XM0MgU29mdHdhcmUgTGljZW5zZTwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N0eWxlU2hlZXRzL2Jhc2UuY3NzIiAvPgotICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotIDwhLS0KLWgzI3ZlcnNpb24geyBtYXJnaW4tdG9wOiAtMC44ZW07fSAgCi0tLT4KLQotCi0KLQotCi0KLQotCi0KLSAgPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgdGV4dD0iIzAwMDAwMCIgYmdjb2xvcj0iI0ZGRkZGRiI+Ci08aDE+VzNDPHN1cD6uPC9zdXA+IFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRTwvaDE+Ci0KLTxoMyBpZD0idmVyc2lvbiI+PGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzE8L2E+PC9oMz4KLQotPHA+VGhpcyB3b3JrIChhbmQgaW5jbHVkZWQgc29mdHdhcmUsIGRvY3VtZW50YXRpb24gc3VjaCBhcyBSRUFETUVzLCBvciBvdGhlcgotcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcKLWxpY2Vuc2UuIEJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkKLWFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZwotdGVybXMgYW5kIGNvbmRpdGlvbnMuPC9wPgotCi08cD5QZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwO2ZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAotZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbgotQUxMIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nCi1tb2RpZmljYXRpb25zOjwvcD4KLTxvbD4KLSAgPGxpPlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUKLSAgICByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay48L2xpPgotICA8bGk+QW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCi0gICAgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIHRoZSA8YQotICAgIGhyZWY9ImNvcHlyaWdodC1zb2Z0d2FyZS1zaG9ydC1ub3RpY2UtMjAwMjEyMzEuaHRtbCI+VzNDIFNvZnR3YXJlIFNob3J0Ci0gICAgTm90aWNlPC9hPiBzaG91bGQgYmUgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKQotICAgIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGUuPC9saT4KLSAgPGxpPk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlCi0gICAgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbQotICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKTwvbGk+Ci08L29sPgotCi08cD5USElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUwotTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFCi1BTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuPC9wPgotCi08cD5DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IKLURPQ1VNRU5UQVRJT04uPC9wPgotCi08cD5UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4KLWFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCi1wcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQKLWRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuPC9wPgotCi08cD48L3A+Ci0KLTxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvcD4KLQotPHA+VGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbiBEZWNlbWJlciAzMQotMjAwMi4gVGhpcyB2ZXJzaW9uIHJlbW92ZXMgdGhlIGNvcHlyaWdodCBvd25lcnNoaXAgbm90aWNlIHN1Y2ggdGhhdCB0aGlzCi1saWNlbnNlIGNhbiBiZSB1c2VkIHdpdGggbWF0ZXJpYWxzIG90aGVyIHRoYW4gdGhvc2Ugb3duZWQgYnkgdGhlIFczQywKLXJlZmxlY3RzIHRoYXQgRVJDSU0gaXMgbm93IGEgaG9zdCBvZiB0aGUgVzNDLCBpbmNsdWRlcyByZWZlcmVuY2VzIHRvIHRoaXMKLXNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UsIGFuZCByZW1vdmVzIHRoZSBhbWJpZ3VvdXMgZ3JhbnQgb2YKLSJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwIj5wcmV2aW91cwotdmVyc2lvbjwvYT4gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIDxhCi1ocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS9saWNlbnNlLWxpc3QuaHRtbCNHUExDb21wYXRpYmxlTGljZW5zZXMiPkZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5PC9hPiBhbmQgPGEKLWhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvVzNDLnBocCI+T1NJJ3MgY2VydGlmaWNhdGlvbjwvYT4KLXVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2RvY3MvZGVmaW5pdGlvbi5waHAiPk9wZW4gU291cmNlCi1EZWZpbml0aW9uPC9hPi4gUGxlYXNlIHNlZSBvdXIgPGEKLWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUSI+Q29weXJpZ2h0IEZBUTwvYT4gZm9yCi1jb21tb24gcXVlc3Rpb25zIGFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMKLXRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlIGxpYnd3dywgQW1heWEsIGFuZCBKaWdzYXcuIE90aGVyCi1xdWVzdGlvbnMgYWJvdXQgdGhpcyBub3RpY2UgY2FuIGJlIGRpcmVjdGVkIHRvIDxhCi1ocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmc8L2E+LjxiciAvPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkYTUxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0NoYXJzZXRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvQ2hhcnNldEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmMTQ5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvQ2hhcnNldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW50ZXJuYWwudXRpbC5SZXJlYWRhYmxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5EZWZhdWx0RG9jdW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuSVNHTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBXYXRjaCBhIGVsZW1lbnQgdGhhdCBzcGVjaWZ5IGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQuIElmCi0gKiA8Y29kZT4gJmx0O01FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9eHh4IiZndDsKLSAqIGFwcGVhcnMgaW4gYSBkb2N1bWVudCwgdGhpcyBtZXRob2QgY2hhbmdlcyBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyc2V0SGFuZGxlciBleHRlbmRzIERlZmF1bHREb2N1bWVudEhhbmRsZXIgewotCXByaXZhdGUgUmVyZWFkYWJsZUlucHV0U3RyZWFtIHJpczsKLQotCXB1YmxpYyBDaGFyc2V0SGFuZGxlcihIVE1MUGFyc2VyIHBhcnNlciwgUmVyZWFkYWJsZUlucHV0U3RyZWFtIHJpcykgewotCQlzdXBlcihwYXJzZXIpOwotCQl0aGlzLnJpcyA9IHJpczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBIikpIHsKLQkJCVN0cmluZyBodHRwRXF1aXYgPSBudWxsOwotCQkJU3RyaW5nIGNvbnRlbnQgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQluYW1lID0gYXR0cy5nZXROYW1lKGkpOwotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImh0dHAtZXF1aXYiKSkgewotCQkJCQlodHRwRXF1aXYgPSBhdHRzLmdldFZhbHVlKGkpOwotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjb250ZW50IikpIHsKLQkJCQkJY29udGVudCA9IGF0dHMuZ2V0VmFsdWUoaSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGh0dHBFcXVpdiA9PSBudWxsIHx8IGNvbnRlbnQgPT0gbnVsbCkgewotCQkJCXN1cGVyLnN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoaHR0cEVxdWl2LmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtVHlwZSIpKSB7Ci0JCQkJaW50IGNoYXJzZXRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiY2hhcnNldD0iKTsKLQkJCQlpZiAoY2hhcnNldEluZGV4ID09IC0xKSB7Ci0JCQkJCWNoYXJzZXRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiQ0hBUlNFVD0iKTsKLQkJCQl9Ci0JCQkJaWYgKGNoYXJzZXRJbmRleCAhPSAtMSkgewotCQkJCQlTdHJpbmcgZW5jb2RpbmcgPSBjb250ZW50LnN1YnN0cmluZyhjaGFyc2V0SW5kZXgKLQkJCQkJCQkrICJjaGFyc2V0PSIubGVuZ3RoKCkpOwotCQkJCQl0cnkgewotCQkJCQkJSW5wdXRTdHJlYW1SZWFkZXIgbmV3UmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCQkJCQl0aGlzLnJpcywgZW5jb2RpbmcpOwotCQkJCQkJaWYgKCgoSFRNTFBhcnNlcikgcGFyc2VyKS5nZXRFbmNvZGluZygpID09IG51bGwpIHsKLQkJCQkJCQkoKEhUTUxQYXJzZXIpIHBhcnNlcikuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotCQkJCQkJfQotCQkJCQkJZW5jb2RpbmcgPSBuZXdSZWFkZXIuZ2V0RW5jb2RpbmcoKTsKLQkJCQkJCVN0cmluZyBwcmV2RW5jb2RpbmcgPSAoKEhUTUxQYXJzZXIpIHBhcnNlcikKLQkJCQkJCQkJLmdldElTUmVhZGVyKCkuZ2V0RW5jb2RpbmcoKTsKLQkJCQkJCWlmIChwcmV2RW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSkgewotCQkJCQkJCXBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIoYW5vdGhlcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRoaXMucmlzLnJlc2V0KCk7Ci0JCQkJCQkJKChIVE1MUGFyc2VyKSBwYXJzZXIpLmdldElTUmVhZGVyKCkuY2xvc2UoKTsKLQkJCQkJCQlwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKGFub3RoZXIpOwotCQkJCQkJCXRocm93IG5ldyBFbmNvZGluZ0V4Y2VwdGlvbihuZXdSZWFkZXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwYXJzZXIuZXJyb3IoSVNHTUxDb25zdGFudHMuTUlTQ19FUlIsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCXBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIoYW5vdGhlcik7Ci0JCQkJCQlzdXBlci5zdGFydEVsZW1lbnQobmFtZSwgYXR0cyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJCT0RZIikpIHsKLQkJCXBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIoYW5vdGhlcik7Ci0JCX0KLQkJc3VwZXIuc3RhcnRFbGVtZW50KG5hbWUsIGF0dHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9FbmNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0VuY29kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzI1MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0VuY29kaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1jbGFzcyBFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbVJlYWRlciBuZXdSZWFkZXI7Ci0KLQlFbmNvZGluZ0V4Y2VwdGlvbihJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLQkJc3VwZXIoIiIpOwotCQl0aGlzLm5ld1JlYWRlciA9IHJlYWRlcjsKLQl9Ci0KLQlJbnB1dFN0cmVhbVJlYWRlciBnZXROZXdSZWFkZXIoKSB7Ci0JCXJldHVybiB0aGlzLm5ld1JlYWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSFRNTFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0hUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxZGRmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSFRNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyLkZyYW1lc2V0RXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyLkhUTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsLlNIRE9NSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGwuU0hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmludGVybmFsLnV0aWwuUmVyZWFkYWJsZUlucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuSUVycm9yTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTERPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBIVE1MIFBhcnNlci4gVG8gdXNlIHRoaXMgY2xhc3MsCi0gKiA8b2w+Ci0gKiA8bGk+Q29uc3RydWN0IEhUTUxQYXJzZXIgaW5zdGFuY2Ugd2l0aCBhIGZpbGUgdG8gcmVhZC4KLSAqIDxsaT5jYWxsIHBhcnNlKC4uLikgbWV0aG9kLiBJZiBhbiBlcnJvciBvY2N1cnJlZCwKLSAqIDxjb2RlPlBhcnNlRXhjZXB0aW9uPC9jb2RlPiBvciBJT0V4Y2VwdGlvbiByYWlzZXMuCi0gKiA8bGk+IGdldCA8Y29kZT5Eb2N1bWVudDwvY29kZT4gaW5zdGFuY2UgYnkgY2FsbGluZyB7QGxpbmsgI2dldERvY3VtZW50KCl9LgotICogSWYgYSA8Y29kZT5QYXJzZUV4Y2VwdGlvbjwvY29kZT4gd2FzIHRocm93biwgdGhlIHJldHVybmVkIGluc3RhbmNlIGhvbGRzCi0gKiBzdWIgRE9NIGNyZWF0ZWQgZnJvbSBzdWIgZG9jdW1lbnQgdG8gdGhlIGVycm9yIHBvaW50LgotICogPC9vbD4KLSAqIEZvciBleGFtcGxlLAotICogCi0gKiA8cHJlPgotICogPGNvZGU+Ci0gKiBIVE1MUGFyc2VyIHBhcnNlciA9IG5ldyBIVE1MUGFyc2VyKCk7Ci0gKiB0cnkgewotICogCXBhcnNlci5wYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKCZxdW90O3h4eC5odG1sJnF1b3Q7KSk7Ci0gKiB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gKiAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAqIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAqIAllLnByaW50U3RhY2tUcmFjZSgpOwotICogfQotICogb3JnLnczYy5Eb2N1bWVudCBkb2MgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKTsKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MUGFyc2VyIGV4dGVuZHMgU0dNTFBhcnNlciB7Ci0Jc3RhdGljIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlpcyA9IEhUTUxQYXJzZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgicHVibGljX2VudGl0aWVzLnByb3BlcnRpZXMiKTsKLQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgbWFwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbWFwLmxvYWQoaXMpOwotCQkJCS8vIHB1YkVudGl0eU1hcC5wdXRBbGwobWFwKTsKLQkJCQlFbnVtZXJhdGlvbiBrZXlzID0gbWFwLmtleXMoKTsgLy8gQ1JTCi0JCQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsgLy8gQ1JTCi0JCQkJCVN0cmluZyBhS2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOyAvLyBDUlMKLQkJCQkJU3RyaW5nIHJlcGxhY2VLZXkgPSBhS2V5LnJlcGxhY2UoJ0AnLCAnICcpOyAvLyBDUlMKLQkJCQkJcHViRW50aXR5TWFwLnB1dChyZXBsYWNlS2V5LCAoU3RyaW5nKSBtYXAuZ2V0KGFLZXkpKTsgLy8gQ1JTCi0JCQkJfSAvLyBDUlMKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXJlYWRhYmxlSW5wdXRTdHJlYW0gcmlzOwotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbVJlYWRlciBpc1JlYWRlcjsKLQotCUlucHV0U3RyZWFtUmVhZGVyIGdldElTUmVhZGVyKCkgewotCQlyZXR1cm4gaXNSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBIVE1MUGFyc2VyIGluc3RhbmNlIHdob3NlIGRlZmF1bHREVEQgaXMKLQkgKiA8Y29kZT4iLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI8L2NvZGU+LiBBbmQgYWxzbywKLQkgKiB7QGxpbmsgSFRNTEVycm9ySGFuZGxlcn0gYW5kIHtAbGluayBGcmFtZXNldEVycm9ySGFuZGxlcn0gaW5zdGFuY2VzIGFyZQotCSAqIGFkZGVkLgotCSAqLwotCXB1YmxpYyBIVE1MUGFyc2VyKCkgewotCQlkZWZhdWx0RFREID0gIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iOwotCQlhZGRFcnJvckhhbmRsZXIobmV3IEZyYW1lc2V0RXJyb3JIYW5kbGVyKCkpOwotCQlhZGRFcnJvckhhbmRsZXIobmV3IEhUTUxFcnJvckhhbmRsZXIoKSk7Ci0JCXNldERvY3VtZW50SGFuZGxlcihuZXcgUFJFSGFuZGxlcih0aGlzKSk7Ci0JCXNldERPTUltcGxlbWVudGF0aW9uKFNIRE9NSW1wbC5nZXRET01JbXBsZW1lbnRhdGlvbigpKTsKLQkJaWYgKGdldERPTUltcGxlbWVudGF0aW9uKCkgPT0gbnVsbCkgewotCQkJc2V0RG9jdW1lbnQobmV3IFNIRG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlzID0gSFRNTFBhcnNlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJkdGQvIgotCQkJCSsgcmVzb3VyY2VOYW1lKTsKLQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBmaWxlcyBhbmQgcHJpbnQgdGhlaXIgdG9wIGVsZW1lbnRzLiBUaGlzIG1ldGhvZCBpcyBqdXN0IGZvciB0ZXN0LgotCSAqIHVzYWdlOiBqYXZhIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSFRNTFBhcnNlciBbb3B0aW9uc10gZmlsZXMuLi4gPGJyPgotCSAqIG9wdGlvbnM6Ci0JICogPERMPgotCSAqIDxEVD4gLWUgZW5jb2RpbmcKLQkgKiA8REQ+IHNwZWNpZnkgY2hhcmFjdGVyIGVuY29kaW5nIHRvIDxjb2RlPmVuY29kaW5nPC9jb2RlPgotCSAqIDxEVD4gLWMKLQkgKiA8REQ+IElmIGl0IG1lZXRzCi0JICogPGNvZGU+ICZsdDtNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOwotCSAqIGNoYXJzZXQ9eHh4IiZndDs8L2NvZGU+Ci0JICogdGFnLCBjaGFuZ2UgZW5jb2RpbmcgdG8gPGNvZGU+eHh4PC9jb2RlPgotCSAqIDxEVD4gLWQKLQkgKiA8REQ+IER1bXAgcmVzdWx0cy4KLQkgKiA8RFQ+IC1vIG91dHB1dCBmaWxlCi0JICogPERUPiAteCBbZHRkXQotCSAqIDxERD4gRHVtcCBhcyB4bWwgZm9ybWF0LgotCSAqIDxEVD4gLXc/Ci0JICogPEREPiB3YXJuaW5nCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JCWJvb2xlYW4gZHVtcCA9IGZhbHNlOwotCQlTdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gYXJncy5sZW5ndGg7Ci0JCVN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0JCWJvb2xlYW4gY2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBpbmRlbnQgPSBmYWxzZTsKLQkJaW50IHdhcm5pbmcgPSAtMTsKLQkJYm9vbGVhbiBwaHlzaWNhbCA9IGZhbHNlOwotCQlib29sZWFuIHhtbCA9IGZhbHNlOwotCQlTdHJpbmcgbGlzdCA9IG51bGw7Ci0JCWJvb2xlYW4ga2VlcFVua25vd24gPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1kIikpIHsKLQkJCQlkdW1wID0gdHJ1ZTsKLQkJCQlsZW5ndGgtLTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1vIikpIHsKLQkJCQlpKys7Ci0JCQkJdGFyZ2V0RmlsZU5hbWUgPSBhcmdzW2ldOwotCQkJCWxlbmd0aCAtPSAyOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWUiKSkgewotCQkJCWlmICgrK2kgPT0gYXJncy5sZW5ndGgpCi0JCQkJCXVzYWdlKCk7Ci0JCQkJZW5jb2RpbmcgPSBhcmdzW2ldOwotCQkJCWxlbmd0aCAtPSAyOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWMiKSkgewotCQkJCWNlID0gdHJ1ZTsKLQkJCQlsZW5ndGgtLTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi14IikpIHsKLQkJCQl4bWwgPSB0cnVlOwotCQkJCWxlbmd0aC0tOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWkiKSkgewotCQkJCWluZGVudCA9IHRydWU7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLXciKSkgewotCQkJCWlmIChhcmdzW2ldLmxlbmd0aCgpID09IDIpIHsKLQkJCQkJd2FybmluZyA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdhcm5pbmcgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0uc3Vic3RyaW5nKDIpKTsKLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXVzYWdlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLWt1IikpIHsKLQkJCQlrZWVwVW5rbm93biA9IHRydWU7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcGh5c2ljYWwiKSkgewotCQkJCXBoeXNpY2FsID0gdHJ1ZTsKLQkJCQlsZW5ndGgtLTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItbCIpICYmIGFyZ3NbaV0ubGVuZ3RoKCkgPiAyKSB7Ci0JCQkJbGlzdCA9IGFyZ3NbaV0uc3Vic3RyaW5nKDIpOwotCQkJCWxlbmd0aC0tOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXVzYWdlKCk7Ci0JCX0KLQkJSFRNTFBhcnNlciBwYXJzZXI7Ci0JCWZvciAoaW50IGkgPSBhcmdzLmxlbmd0aCAtIGxlbmd0aDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJcGFyc2VyID0gbmV3IEhUTUxQYXJzZXIoKTsKLQkJCQlwYXJzZXIua2VlcFVua25vd25FbGVtZW50cyhrZWVwVW5rbm93bik7Ci0JCQkJaWYgKHdhcm5pbmcgIT0gLTEpIHsKLQkJCQkJaWYgKHdhcm5pbmcgPT0gMCkgewotCQkJCQkJcGFyc2VyLmFkZEVycm9yTG9nTGlzdGVuZXIobmV3IElFcnJvckxvZ0xpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGVycm9yTG9nKGludCBjb2RlLCBTdHJpbmcgbXNnKSB7Ci0JCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZmluYWwgaW50IGVycm9yS2luZCA9IHdhcm5pbmc7Ci0JCQkJCQlwYXJzZXIuYWRkRXJyb3JMb2dMaXN0ZW5lcihuZXcgSUVycm9yTG9nTGlzdGVuZXIoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgZXJyb3JMb2coaW50IGNvZGUsIFN0cmluZyBtc2cpIHsKLQkJCQkJCQkJaWYgKGNvZGUgPT0gZXJyb3JLaW5kKSB7Ci0JCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwaHlzaWNhbCkgewotCQkJCQlwYXJzZXIuZWxlbWVudEhhbmRsZShmYWxzZSk7Ci0JCQkJfQotCQkJCWlmICh4bWwpIHsKLQkJCQkJcGFyc2VyLnNldERlZmF1bHRUYWdDYXNlKExPV0VSX0NBU0UpOwotCQkJCQlwYXJzZXIuc2V0VGFnQ2FzZShMT1dFUl9DQVNFKTsKLQkJCQkJcGFyc2VyLnNldEF0dHJOYW1lQ2FzZShMT1dFUl9DQVNFKTsKLQkJCQl9Ci0JCQkJSW5wdXRTdHJlYW0gaXM7Ci0JCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItdSIpKSB7Ci0JCQkJCWkrKzsKLQkJCQkJamF2YS5uZXQuVVJMIHVybCA9IG5ldyBqYXZhLm5ldC5VUkwoYXJnc1tpXSk7Ci0JCQkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1tpXSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigicGFyc2luZyAiICsgYXJnc1tpXSArICIgLi4uIik7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNlKSB7Ci0JCQkJCQlwYXJzZXIucGFyc2VTd2l0Y2hFbmMoaXMsIGVuY29kaW5nKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5jb2Rpbmc6ICIgKyBwYXJzZXIuZ2V0RW5jb2RpbmcoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXJzZXIucGFyc2UoaXMsIGVuY29kaW5nKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlwYXJzZXIuY2xvc2UoKTsKLQkJCQlpZiAoZHVtcCkgewotCQkJCQlQcmludFdyaXRlciBwdzsKLQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gdGFyZ2V0RmlsZU5hbWUgPT0gbnVsbCA/IChPdXRwdXRTdHJlYW0pIFN5c3RlbS5vdXQKLQkJCQkJCQk6IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGVOYW1lKTsKLQkJCQkJaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLQkJCQkJCXB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsCi0JCQkJCQkJCWVuY29kaW5nKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwdyA9IG5ldyBQcmludFdyaXRlcihvcyk7Ci0JCQkJCX0KLQkJCQkJaWYgKCF4bWwpIHsKLQkJCQkJCSgoU0hEb2N1bWVudCkgcGFyc2VyLmdldERvY3VtZW50KCkpLnByaW50QXNTR01MKHB3LAotCQkJCQkJCQlpbmRlbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJKChTSERvY3VtZW50KSBwYXJzZXIuZ2V0RG9jdW1lbnQoKSkucHJpbnRBc1hIVE1MKHB3LAotCQkJCQkJCQlpbmRlbnQsIGVuY29kaW5nKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyc2VyLmdldERvY3VtZW50KCkKLQkJCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUobGlzdCk7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZUxpc3QuaXRlbShpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhbiBIVE1MIGRvY3VtZW50IGFuZCByZXR1cm4gaXRzIHRvcCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgaW5wdXRzdHJlYW0gdG8gcGFyc2Ugd2l0aCBkZWZhdWx0IGVuY29kaW5nLgotCSAqIEByZXR1cm4gVG9wIGVsZW1lbnQuCi0JICogQGV4Y2VwdGlvbiBQYXNlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHVucmVjb3ZlcmFibGUgc3ludGF4IG9yIHRva2VuIGVycm9yIG9jY3VycmVkLCB0aHJvd2VkCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJU0FYRXhjZXB0aW9uIHsKLQkJaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotCQlyZXR1cm4gcGFyc2UoaXNSZWFkZXIpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIEhUTUwgZG9jdW1lbnQgYW5kIHJldHVybiBpdHMgdG9wIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBpbnB1dHN0cmVhbSB0byBwYXJzZSB3aXRoIGRlZmF1bHQgZW5jb2RpbmcuCi0JICogQHJldHVybiBUb3AgZWxlbWVudC4KLQkgKiBAZXhjZXB0aW9uIFBhc2VyRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdW5yZWNvdmVyYWJsZSBzeW50YXggb3IgdG9rZW4gZXJyb3Igb2NjdXJyZWQsIHRocm93ZWQKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE5vZGUgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyRW5jb2RpbmcpIHRocm93cyBTQVhFeGNlcHRpb24sCi0JCQlQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoY2hhckVuY29kaW5nID09IG51bGwpIHsKLQkJCWlzUmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZW5jb2RpbmcgPSBjaGFyRW5jb2Rpbmc7Ci0JCQlpc1JlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgY2hhckVuY29kaW5nKTsKLQkJfQotCQlyZXR1cm4gcGFyc2UoaXNSZWFkZXIpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIEhUTUwgZG9jdW1lbnQgYW5kIHJldHVybiBpdHMgdG9wIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGlzIGFsbW9zdAotCSAqIHNhbWUgYXMge0BsaW5rICNwYXJzZShJbnB1dFN0cmVhbSkgcGFyc2UoSW5wdXRTdHJlYW0pfS4gSWYgaXQgbWVldHMKLQkgKiA8Y29kZT4gJmx0O01FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAKLQkgKiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9eHh4IiZndDs8L2NvZGU+Ci0JICogdGFnIGluIGEgZG9jdW1lbnQsIGl0IHRyaWVzIHRvIGNoYW5nZSBlbmNvZGluZyB0byA8Y29kZT54eHg8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgaW5wdXRzdHJlYW0gdG8gcGFyc2UKLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3dlZAotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTm9kZSBwYXJzZVN3aXRjaEVuYyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVN3aXRjaEVuYyhpcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGEgSFRNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4gVGhpcyBtZXRob2QgaXMgdGhlCi0JICogc2FtZSBhcyB7QGxpbmsgI3BhcnNlKElucHV0U3RyZWFtLFN0cmluZykgcGFyc2UoSW5wdXRTdHJlYW0sU3RyaW5nKX0gSWYKLQkgKiBpdCBtZWV0cyA8Y29kZT4gJmx0O01FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotCSAqIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD14eHgiJmd0OzwvY29kZT4KLQkgKiB0YWcgaW4gYSBkb2N1bWVudCwgaXQgdHJpZXMgdG8gY2hhbmdlIGVuY29kaW5nIHRvIDxjb2RlPnh4eDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBpbnB1dHN0cmVhbSB0byBwYXJzZQotCSAqIEBwYXJhbSBkZWZhdWx0RW5jb2RpbmcKLQkgKiAgICAgICAgICAgIGRlZmF1bHQgZW5jb2RpbmcgYmVmb3JlIHN3aXRjaGluZyBlbmNvZGluZy4KLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3dlZAotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTm9kZSBwYXJzZVN3aXRjaEVuYyhJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGRlZmF1bHRFbmNvZGluZykKLQkJCXRocm93cyBTQVhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJpcyA9IG5ldyBSZXJlYWRhYmxlSW5wdXRTdHJlYW0oaXMpOwotCQlzZXREb2N1bWVudEhhbmRsZXIobmV3IENoYXJzZXRIYW5kbGVyKHRoaXMsIHJpcykpOwotCQl0cnkgewotCQkJaWYgKGRlZmF1bHRFbmNvZGluZyA9PSBudWxsKSB7Ci0JCQkJaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZW5jb2RpbmcgPSBkZWZhdWx0RW5jb2Rpbmc7Ci0JCQkJaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmlzLCBkZWZhdWx0RW5jb2RpbmcpOwotCQkJfQotCQkJcmV0dXJuIHBhcnNlKGlzUmVhZGVyKTsKLQkJfSBjYXRjaCAoRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gY2xlYXIgY3JlYXRlZCBjaGlsZCBub2Rlcy4KLQkJCWlmIChzZXRET01JbXBsZW1lbnRhdGlvbihnZXRET01JbXBsZW1lbnRhdGlvbigpKSA9PSBudWxsKSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJCQl3aGlsZSAoZG9jLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlkb2MucmVtb3ZlQ2hpbGQoZG9jLmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQkJfQotCQkJfQotCQkJaW5pdCgpOwotCQkJZW5jb2RpbmcgPSBlLmdldE5ld1JlYWRlcigpLmdldEVuY29kaW5nKCk7Ci0JCQlyZXR1cm4gcGFyc2UoZS5nZXROZXdSZWFkZXIoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoRG9jdW1lbnRUeXBlIGRvY1R5cGUpIHsKLQkJRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbCA9IGdldERPTUltcGxlbWVudGF0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoIShkb21JbXBsIGluc3RhbmNlb2YgSFRNTERPTUltcGxlbWVudGF0aW9uKSkgewotCQkJCXJldHVybiBzdXBlci5jcmVhdGVEb2N1bWVudChkb2NUeXBlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURvY3VtZW50KGRvY1R5cGUpOwotCQl9Ci0JCURvY3VtZW50IHJldCA9ICgoSFRNTERPTUltcGxlbWVudGF0aW9uKSBkb21JbXBsKQotCQkJCS5jcmVhdGVIVE1MRG9jdW1lbnQoImR1bW15Iik7Ci0JCWlmIChyZXQuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJcmV0LnJlbW92ZUNoaWxkKHJldC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCX0KLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXQuaW5zZXJ0QmVmb3JlKGRvY1R5cGUsIG51bGwpOwotCQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotCS8qKgotCSAqIENoYXJhY3RlciBFbmNvZGluZyBwYXJzZWQgYSBkb2N1bWVudCB3aXRoLgotCSAqIAotCSAqIEByZXR1cm4gSWYgbnVsbCBwYXJzZWQgYSBkb2N1bWVudCB3aXRoIGRlZmF1bHQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCXZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuYykgewotCQl0aGlzLmVuY29kaW5nID0gZW5jOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXNhZ2UoKSB7Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigidXNhZ2UgamF2YSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLkhUTUxQYXJzZXIgWy13WyNdXSBbLWRdIFstZSBlbmNvZGluZ10gWy1jXSBmaWxlcy4uLiIpOwotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgcmV0dXJucyAiSFRNTCIKLQkgKiAKLQkgKiBAcmV0dXJuICJIVE1MIgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRvcEVsZW1lbnQoKSB7Ci0JCXJldHVybiAiSFRNTCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0h0bWxQYXJzZXJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9IdG1sUGFyc2VyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWVkNGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0h0bWxQYXJzZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBIdG1sUGFyc2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEh0bWxQYXJzZXJQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBIdG1sUGFyc2VyUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBIdG1sUGFyc2VyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvUFJFSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL1BSRUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjU2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvUFJFSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5EZWZhdWx0RG9jdW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBQUkVIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdERvY3VtZW50SGFuZGxlciB7Ci0JcHJpdmF0ZSBib29sZWFuIHByZXZpb3VzUHJzdldTOwotCi0JcHVibGljIFBSRUhhbmRsZXIoSFRNTFBhcnNlciBwYXJzZXIpIHsKLQkJc3VwZXIocGFyc2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJQUkUiKSkgewotCQkJcHJldmlvdXNQcnN2V1MgPSBwYXJzZXIuZ2V0UHJlc2VydmVXaGl0ZXNwYWNlKCk7Ci0JCQlwYXJzZXIuc2V0UHJlc2VydmVXaGl0ZXNwYWNlKHRydWUpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiUFJFIikpIHsKLQkJCXBhcnNlci5zZXRQcmVzZXJ2ZVdoaXRlc3BhY2UocHJldmlvdXNQcnN2V1MpOwotCQl9Ci0JCXN1cGVyLmVuZEVsZW1lbnQobmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1MMzIuZHRkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1MMzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU2MGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTDMyLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi08IS0tCi0gICAgICAgIFczQyBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gZm9yIHRoZSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlCi0gICAgICAgIHZlcnNpb24gMy4yIGFzIHJhdGlmaWVkIGJ5IGEgdm90ZSBvZiBXM0MgbWVtYmVyIGNvbXBhbmllcy4KLSAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVzNDIGxvb2sgYXQgIFVSTCBodHRwOi8vd3d3LnczLm9yZy8KLQotICAgICAgICBEYXRlOiBUdWVzZGF5IEphbnVhcnkgMTR0aCAxOTk3Ci0KLSAgICAgICAgQXV0aG9yOiBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0KLSAgICAgICAgSFRNTCAzLjIgYWltcyB0byBjYXB0dXJlIHJlY29tbWVuZGVkIHByYWN0aWNlIGFzIG9mIGVhcmx5ICc5NgotICAgICAgICBhbmQgYXMgc3VjaCB0byBiZSB1c2VkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIEhUTUwgMi4wIChSRkMgMTg2NikuCi0gICAgICAgIFdpZGVseSBkZXBsb3llZCByZW5kZXJpbmcgYXR0cmlidXRlcyBhcmUgaW5jbHVkZWQgd2hlcmUgdGhleQotICAgICAgICBoYXZlIGJlZW4gc2hvd24gdG8gYmUgaW50ZXJvcGVyYWJsZS4gU0NSSVBUIGFuZCBTVFlMRSBhcmUKLSAgICAgICAgaW5jbHVkZWQgdG8gc21vb3RoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgY2xpZW50LXNpZGUgc2NyaXB0cwotICAgICAgICBhbmQgc3R5bGUgc2hlZXRzLiBCcm93c2VycyBtdXN0IGF2b2lkIHNob3dpbmcgdGhlIGNvbnRlbnRzCi0gICAgICAgIG9mIHRoZXNlIGVsZW1lbnQgT3RoZXJ3aXNlIHN1cHBvcnQgZm9yIHRoZW0gaXMgbm90IHJlcXVpcmVkLgotICAgICAgICBJRCwgQ0xBU1MgYW5kIFNUWUxFIGF0dHJpYnV0ZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHZlcnNpb24KLSAgICAgICAgb2YgSFRNTC4KLS0tPgotCi08IUVOVElUWSAlIEhUTUwuVmVyc2lvbgotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIgotCi0gICAgICAgIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICAgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLSAgICAgICAgICAgIDxodG1sPgotICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICA8L2h0bWw+Ci0gICAgICAgIC0tCi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBEZXByZWNhdGVkIEZlYXR1cmVzIFN3aXRjaCA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTC5EZXByZWNhdGVkICJJTkNMVURFIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudC1UeXBlICJDREFUQSIKLSAgICAgICAgLS0gbWVhbmluZyBhIE1JTUUgY29udGVudCB0eXBlLCBhcyBwZXIgUkZDMTUyMQotICAgICAgICAtLT4KLQotPCFFTlRJVFkgJSBIVFRQLU1ldGhvZCAiR0VUIHwgUE9TVCIKLSAgICAgICAgLS0gYXMgcGVyIEhUVFAgc3BlY2lmaWNhdGlvbgotICAgICAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkwgIkNEQVRBIgotICAgICAgICAtLSBUaGUgdGVybSBVUkwgbWVhbnMgYSBDREFUQSBhdHRyaWJ1dGUKLSAgICAgICAgICAgd2hvc2UgdmFsdWUgaXMgYSBVbmlmb3JtIFJlc291cmNlIExvY2F0b3IsCi0gICAgICAgICAgIFNlZSBSRkMxODA4IChKdW5lIDk1KSBhbmQgUkZDMTczOCAoRGVjIDk0KS4KLSAgICAgICAgLS0+Ci0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOSyIgLS0gcmVwZWF0YWJsZSBoZWFkIGVsZW1lbnRzIC0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4KLQotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIHwgIERJUiB8IE1FTlUiPgotCi08IVsgJUhUTUwuRGVwcmVjYXRlZCBbCi0gICAgPCFFTlRJVFkgJSBwcmVmb3JtYXR0ZWQgIlBSRSB8IFhNUCB8IExJU1RJTkciPgotXV0+Ci0KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBJU09sYXQxIFBVQkxJQwotICAgICAgICJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBBZGRlZCBMYXRpbiAxLy9FTi8vSFRNTCI+Ci0lSVNPbGF0MTsKLQotPCEtLT09PT09PT09PT09PT09PT0gRW50aXRpZXMgZm9yIHNwZWNpYWwgc3ltYm9scyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICZ0cmFkZSBhbmQgJmNic3AgYXJlIG5vdCB3aWRlbHkgZGVwbG95ZWQgYW5kIHNvIG5vdCBpbmNsdWRlZCBoZXJlIC0tPgotCi08IUVOVElUWSBhbXAgICAgQ0RBVEEgIiYjMzg7IiAgIC0tIGFtcGVyc2FuZCAgICAgICAgICAtLT4KLTwhRU5USVRZIGd0ICAgICBDREFUQSAiJiM2MjsiICAgLS0gZ3JlYXRlciB0aGFuICAgICAgIC0tPgotPCFFTlRJVFkgbHQgICAgIENEQVRBICImIzYwOyIgICAtLSBsZXNzIHRoYW4gICAgICAgICAgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGZvbnQgIlRUIHwgSSB8IEIgIHwgVSB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8IFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIj4KLQotPCFFTlRJVFkgJSBzcGVjaWFsICJBIHwgSU1HIHwgQVBQTEVUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfCBNQVAiPgotCi08IUVOVElUWSAlIGZvcm0gIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEiPgotCi08IUVOVElUWSAlIHRleHQgIiNQQ0RBVEEgfCAlZm9udCB8ICVwaHJhc2UgfCAlc3BlY2lhbCB8ICVmb3JtIj4KLQotPCFFTEVNRU5UICglZm9udHwlcGhyYXNlKSAtIC0gKCV0ZXh0KSo+Ci0KLTwhLS0gdGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIGFsdGhvdWdoCi0gIHRoZSByZXN1bHRpbmcgY29sb3JzIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQ6Ci0KLSAgIGFxdWEsIGJsYWNrLCBibHVlLCBmdWNoc2lhLCBncmF5LCBncmVlbiwgbGltZSwgbWFyb29uLAotICAgbmF2eSwgb2xpdmUsIHB1cnBsZSwgcmVkLCBzaWx2ZXIsIHRlYWwsIHdoaXRlLCBhbmQgeWVsbG93Ci0KLSBUaGVzZSBjb2xvcnMgd2VyZSBvcmlnaW5hbGx5IHBpY2tlZCBhcyBiZWluZyB0aGUgc3RhbmRhcmQKLSAxNiBjb2xvcnMgc3VwcG9ydGVkIHdpdGggdGhlIFdpbmRvd3MgVkdBIHBhbGV0dGUuCi0gLS0+Ci0KLTwhRUxFTUVOVCBGT05UIC0gLSAoJXRleHQpKiAgICAgLS0gbG9jYWwgY2hhbmdlIHRvIGZvbnQgLS0+Ci08IUFUVExJU1QgRk9OVAotICAgIHNpemUgICAgQ0RBVEEgICAjSU1QTElFRCAgICAtLSBbK11ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT00IC0tCi0gICAgY29sb3IgICBDREFUQSAgICNJTVBMSUVEICAgIC0tICNSUkdHQkIgaW4gaGV4LCBlLmcuIHJlZDogY29sb3I9IiNGRjAwMDAiIC0tCi0gICAgPgotCi08IUVMRU1FTlQgQkFTRUZPTlQgLSBPIEVNUFRZICAgIC0tIGJhc2UgZm9udCBzaXplICgxIHRvIDcpLS0+Ci08IUFUVExJU1QgQkFTRUZPTlQKLSAgICBzaXplICAgIENEQVRBICAgI0lNUExJRUQgICAgLS0gZS5nLiBzaXplPTMgLS0KLSAgICA+Ci0KLTwhRUxFTUVOVCBCUiAgICAtIE8gRU1QVFkgICAgLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgQlIKLSAgICAgICAgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgICBIVE1MIGhhcyB0aHJlZSBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAldGV4dCAgICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlZmxvdyAgICAgICBibG9jay1saWtlIGVsZW1lbnRzIGUuZy4gcGFyYWdyYXBocyBhbmQgbGlzdHMKLSAgICAgICAgJWJvZHl0ZXh0ICAgYXMgJWZsb3cgcGx1cyBoZWFkZXJzIEgxLUg2IGFuZCBBRERSRVNTCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVsaXN0IHwgJXByZWZvcm1hdHRlZCB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLSAgICAgIEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwgVEFCTEUiPgotCi08IS0tICVmbG93IGlzIHVzZWQgZm9yIEREIGFuZCBMSSAtLT4KLQotPCFFTlRJVFkgJSBmbG93ICIoJXRleHQgfCAlYmxvY2spKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGJvZHkuY29udGVudCAiKCVoZWFkaW5nIHwgJXRleHQgfCAlYmxvY2sgfCBBRERSRVNTKSoiPgotCi08IUVOVElUWSAlIGNvbG9yICJDREFUQSIgLS0gYSBjb2xvciBzcGVjaWZpY2F0aW9uOiAjSEhISEhIIEBAIGRldGFpbHM/IC0tPgotCi08IUVOVElUWSAlIGJvZHktY29sb3ItYXR0cnMgIgotICAgICAgICBiZ2NvbG9yICVjb2xvciAjSU1QTElFRAotICAgICAgICB0ZXh0ICVjb2xvciAjSU1QTElFRAotICAgICAgICBsaW5rICVjb2xvciAjSU1QTElFRAotICAgICAgICB2bGluayAlY29sb3IgI0lNUExJRUQKLSAgICAgICAgYWxpbmsgJWNvbG9yICNJTVBMSUVECi0gICAgICAgICI+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAgJWJvZHkuY29udGVudD4KLTwhQVRUTElTVCBCT0RZCi0gICAgICAgIGJhY2tncm91bmQgJVVSTCAjSU1QTElFRCAgLS0gdGV4dHVyZSB0aWxlIGZvciBkb2N1bWVudCBiYWNrZ3JvdW5kIC0tCi0gICAgICAgICVib2R5LWNvbG9yLWF0dHJzOyAgLS0gYmdjb2xvciwgdGV4dCwgbGluaywgdmxpbmssIGFsaW5rIC0tCi0gICAgICAgID4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmNvbnRlbnQgIigoJXRleHQ7KSB8IFApKiI+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAlYWRkcmVzcy5jb250ZW50PgotCi08IUVMRU1FTlQgRElWIC0gLSAlYm9keS5jb250ZW50PgotPCFBVFRMSVNUIERJVgotICAgICAgICBhbGlnbiAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQgLS0gYWxpZ25tZW50IG9mIGZvbGxvd2luZyB0ZXh0IC0tCi0gICAgICAgID4KLQotPCEtLSBDRU5URVIgaXMgYSBzaG9ydGhhbmQgZm9yIERJViB3aXRoIEFMSUdOPUNFTlRFUiAtLT4KLTwhRUxFTUVOVCBjZW50ZXIgLSAtICVib2R5LmNvbnRlbnQ+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQSAtIC0gKCV0ZXh0KSogLShBKT4KLTwhQVRUTElTVCBBCi0gICAgICAgIG5hbWUgICAgQ0RBVEEgICAjSU1QTElFRCAgICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICAgICAgICBocmVmICAgICVVUkwgICAgI0lNUExJRUQgICAgLS0gVVJMIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgICAgICAgcmVsICAgICBDREFUQSAgICNJTVBMSUVEICAgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICAgICAgICByZXYgICAgIENEQVRBICAgI0lNUExJRUQgICAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gICAgICAgIHRpdGxlICAgQ0RBVEEgICAjSU1QTElFRCAgICAtLSBhZHZpc29yeSB0aXRsZSBzdHJpbmcgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRU5USVRZICUgU0hBUEUgIihyZWN0fGNpcmNsZXxwb2x5KSI+Ci08IUVOVElUWSAlIENPT1JEUyAiQ0RBVEEiIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG51bWJlcnMgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgLSAtIChBUkVBKSo+Ci08IUFUVExJU1QgTUFQCi0gICAgbmFtZSAgICBDREFUQSAgICNJTVBMSUVECi0gICAgPgotCi08IUVMRU1FTlQgQVJFQSAtIE8gRU1QVFk+Ci08IUFUVExJU1QgQVJFQQotICAgIHNoYXBlICAgJVNIQVBFICByZWN0Ci0gICAgY29vcmRzICAlQ09PUkRTICNJTVBMSUVEICAtLSBkZWZpbmVzIGNvb3JkaW5hdGVzIGZvciBzaGFwZSAtLQotICAgIGhyZWYgICAgJVVSTCAgICAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gYWN0cyBhcyBoeXBlcnRleHQgbGluayAtLQotICAgIG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gaGFzIG5vIGFjdGlvbiAtLQotICAgIGFsdCAgICAgQ0RBVEEgICAjUkVRVUlSRUQgLS0gbmVlZGVkIGZvciBub24tZ3JhcGhpY2FsIHVzZXIgYWdlbnRzIC0tCi0gICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFR5cGVzICJDREFUQSIKLSAgICAgICAgLS0gU2VlIEludGVybmV0IERyYWZ0OiBkcmFmdC1pZXRmLWh0bWwtcmVscmV2LTAwLnR4dAotICAgICAgICAgICBMSU5LIGhhcyBiZWVuIHBhcnQgb2YgSFRNTCBzaW5jZSB0aGUgZWFybHkgZGF5cwotICAgICAgICAgICBhbHRob3VnaCBmZXcgYnJvd3NlcnMgYXMgeWV0IHRha2UgYWR2YW50YWdlIG9mIGl0LgotCi0gICAgICAgICAgIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICAgICAgICAgICAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQgaGVhZDoKLSAgICAgICAgICAgICAgICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQKLSAgICAgICAgICAgICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdAotICAgICAgICAgICAgICAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICAgICAgICAgICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgICAgICAgICAgICAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZPgotPCFBVFRMSVNUIExJTksKLSAgICAgICAgaHJlZiAgICAlVVJMICAgICNJTVBMSUVEICAgIC0tIFVSTCBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gICAgICAgIHJlbCAgICAgJVR5cGVzICAjSU1QTElFRCAgICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgICAgICAgcmV2ICAgICAlVHlwZXMgICNJTVBMSUVEICAgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICAgICAgICB0aXRsZSAgIENEQVRBICAgI0lNUExJRUQgICAgLS0gYWR2aXNvcnkgdGl0bGUgc3RyaW5nIC0tCi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSIgICAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIFBpeGVscyAiTlVNQkVSIiAgLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCEtLSBTdWdnZXN0ZWQgd2lkdGhzIGFyZSB1c2VkIGZvciBuZWdvdGlhdGluZyBpbWFnZSBzaXplCi0gICAgIHdpdGggdGhlIG1vZHVsZSByZXNwb25zaWJsZSBmb3IgcGFpbnRpbmcgdGhlIGltYWdlLgotICAgICBhbGlnbj1sZWZ0IG9yIHJpZ2h0IGNhdXNlIGltYWdlIHRvIGZsb2F0IHRvIG1hcmdpbgotICAgICBhbmQgZm9yIHN1YnNlcXVlbnQgdGV4dCB0byB3cmFwIGFyb3VuZCBpbWFnZSAtLT4KLQotPCFFTlRJVFkgJSBJQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBJTUcgICAgLSBPIEVNUFRZIC0tICBFbWJlZGRlZCBpbWFnZSAtLT4KLTwhQVRUTElTVCBJTUcKLSAgICAgICAgc3JjICAgICAlVVJMICAgICAjUkVRVUlSRUQgIC0tIFVSTCBvZiBpbWFnZSB0byBlbWJlZCAtLQotICAgICAgICBhbHQgICAgIENEQVRBICAgICNJTVBMSUVEICAgLS0gZm9yIGRpc3BsYXkgaW4gcGxhY2Ugb2YgaW1hZ2UgLS0KLSAgICAgICAgYWxpZ24gICAlSUFsaWduICAjSU1QTElFRCAgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gICAgICAgIGhlaWdodCAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgaGVpZ2h0IGluIHBpeGVscyAtLQotICAgICAgICB3aWR0aCAgICVQaXhlbHMgICNJTVBMSUVEICAgLS0gc3VnZ2VzdGVkIHdpZHRoIGluIHBpeGVscyAtLQotICAgICAgICBib3JkZXIgICVQaXhlbHMgICNJTVBMSUVEICAgLS0gc3VnZ2VzdGVkIGxpbmsgYm9yZGVyIHdpZHRoIC0tCi0gICAgICAgIGhzcGFjZSAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgICAgICAgdnNwYWNlICAlUGl4ZWxzICAjSU1QTElFRCAgIC0tIHN1Z2dlc3RlZCB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgICAgICAgdXNlbWFwICAlVVJMICAgICAjSU1QTElFRCAgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgICAgICAgaXNtYXAgICAoaXNtYXApICAjSU1QTElFRCAgIC0tIHVzZSBzZXJ2ZXIgaW1hZ2UgbWFwIC0tCi0gICAgICAgID4KLQotPCEtLSBVU0VNQVAgcG9pbnRzIHRvIGEgTUFQIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEphdmEgQVBQTEVUIHRhZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBUaGlzIHRhZyBpcyBzdXBwb3J0ZWQgYnkgYWxsIEphdmEgZW5hYmxlZCBicm93c2Vycy4gQXBwbGV0IHJlc291cmNlcwotICAoaW5jbHVkaW5nIHRoZWlyIGNsYXNzZXMpIGFyZSBub3JtYWxseSBsb2FkZWQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50Ci0gIFVSTCAob3IgPEJBU0U+IGVsZW1lbnQgaWYgaXQgaXMgZGVmaW5lZCkuIFRoZSBDT0RFQkFTRSBhdHRyaWJ1dGUgaXMgdXNlZAotICB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJlaGF2aW9yLiBJZiB0aGUgQ09ERUJBU0UgYXR0cmlidXRlIGlzIGRlZmluZWQgdGhlbgotICBpdCBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgbG9jYXRpb24gdG8gZmluZCBhcHBsZXQgcmVzb3VyY2VzLiBUaGUgdmFsdWUKLSAgY2FuIGJlIGFuIGFic29sdXRlIFVSTCBvciBhIHJlbGF0aXZlIFVSTC4gVGhlIGFic29sdXRlIFVSTCBpcyB1c2VkIGFzIGlzCi0gIHdpdGhvdXQgbW9kaWZpY2F0aW9uIGFuZCBpcyBub3QgZWZmZWN0ZWQgYnkgdGhlIGRvY3VtZW50cyA8QkFTRT4gZWxlbWVudC4KLSAgV2hlbiB0aGUgY29kZWJhc2UgYXR0cmlidXRlIGlzIHJlbGF0aXZlLCB0aGVuIGl0IGlzIHJlbGF0aXZlIHRvIHRoZQotICBkb2N1bWVudCBVUkwgKG9yIDxCQVNFPiB0YWcgaWYgZGVmaW5lZCkuCi0tLT4KLTwhRUxFTUVOVCBBUFBMRVQgLSAtIChQQVJBTSB8ICV0ZXh0KSo+Ci08IUFUVExJU1QgQVBQTEVUCi0gICAgICAgIGNvZGViYXNlICVVUkwgICAgICNJTVBMSUVEICAgLS0gY29kZSBiYXNlIC0tCi0gICAgICAgIGNvZGUgICAgIENEQVRBICAgICNSRVFVSVJFRCAgLS0gY2xhc3MgZmlsZSAtLQotICAgICAgICBhbHQgICAgICBDREFUQSAgICAjSU1QTElFRCAgIC0tIGZvciBkaXNwbGF5IGluIHBsYWNlIG9mIGFwcGxldCAtLQotICAgICAgICBuYW1lICAgICBDREFUQSAgICAjSU1QTElFRCAgIC0tIGFwcGxldCBuYW1lIC0tCi0gICAgICAgIHdpZHRoICAgICVQaXhlbHMgICNSRVFVSVJFRCAgLS0gc3VnZ2VzdGVkIHdpZHRoIGluIHBpeGVscyAtLQotICAgICAgICBoZWlnaHQgICAlUGl4ZWxzICAjUkVRVUlSRUQgIC0tIHN1Z2dlc3RlZCBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gICAgICAgIGFsaWduICAgICVJQWxpZ24gICNJTVBMSUVEICAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgICAgICAgaHNwYWNlICAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgICAgICAgdnNwYWNlICAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgdmVydGljYWwgZ3V0dGVyIC0tCi0gICAgICAgID4KLQotPCFFTEVNRU5UIFBBUkFNIC0gTyBFTVBUWT4KLTwhQVRUTElTVCBQQVJBTQotICAgICAgICBuYW1lICAgIE5NVE9LRU4gICAjUkVRVUlSRUQgIC0tIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgLS0KLSAgICAgICAgdmFsdWUgICBDREFUQSAgICAgI0lNUExJRUQgICAtLSBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciAtLQotICAgICAgICA+Ci0KLTwhLS0KLUhlcmUgaXMgYW4gZXhhbXBsZToKLQotICAgIDxhcHBsZXQgY29kZWJhc2U9ImFwcGxldHMvTmVydm91c1RleHQiCi0gICAgICAgIGNvZGU9TmVydm91c1RleHQuY2xhc3MKLSAgICAgICAgd2lkdGg9MzAwCi0gICAgICAgIGhlaWdodD01MD4KLSAgICA8cGFyYW0gbmFtZT10ZXh0IHZhbHVlPSJKYXZhIGlzIENvb2whIj4KLSAgICA8aW1nIHNyYz1zb3JyeS5naWYgYWx0PSJUaGlzIGxvb2tzIGJldHRlciB3aXRoIEphdmEgc3VwcG9ydCI+Ci0gICAgPC9hcHBsZXQ+Ci0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBIUiAgICAtIE8gRU1QVFk+Ci08IUFUVExJU1QgSFIKLSAgICAgICAgYWxpZ24gKGxlZnR8cmlnaHR8Y2VudGVyKSAjSU1QTElFRAotICAgICAgICBub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRAotICAgICAgICBzaXplICAlUGl4ZWxzICNJTVBMSUVECi0gICAgICAgIHdpZHRoICVMZW5ndGggI0lNUExJRUQKLSAgICAgICAgPgotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBQICAgICAtIE8gKCV0ZXh0KSo+Ci08IUFUVExJU1QgUAotICAgICAgICBhbGlnbiAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRlcnMgZnJvbSBIMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBINiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UICggJWhlYWRpbmcgKSAgLSAtICAoJXRleHQ7KSo+Ci08IUFUVExJU1QgKCAlaGVhZGluZyApCi0gICAgICAgIGFsaWduICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgaW1hZ2VzIGFuZCBjaGFuZ2VzIGluIGZvbnQgc2l6ZSAtLT4KLQotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8QklHfFNNQUxMfFNVQnxTVVB8Rk9OVCI+Ci0KLTwhRUxFTUVOVCBQUkUgLSAtICgldGV4dCkqIC0oJXByZS5leGNsdXNpb24pPgotPCFBVFRMSVNUIFBSRQotICAgICAgICB3aWR0aCBOVU1CRVIgI2ltcGxpZWQgLS0gaXMgdGhpcyB3aWRlbHkgc3VwcG9ydGVkPyAtLQotICAgICAgICA+Ci0KLTwhWyAlSFRNTC5EZXByZWNhdGVkIFsKLQotPCFFTlRJVFkgJSBsaXRlcmFsICJDREFUQSIKLSAgICAgICAgLS0gaGlzdG9yaWNhbCwgbm9uLWNvbmZvcm1pbmcgcGFyc2luZyBtb2RlIHdoZXJlCi0gICAgICAgICAgIHRoZSBvbmx5IG1hcmt1cCBzaWduYWwgaXMgdGhlIGVuZCB0YWcKLSAgICAgICAgICAgaW4gZnVsbAotICAgICAgICAtLT4KLQotPCFFTEVNRU5UIChYTVB8TElTVElORykgLSAtICAlbGl0ZXJhbD4KLTwhRUxFTUVOVCBQTEFJTlRFWFQgLSBPICVsaXRlcmFsPgotCi1dXT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFIC0gLSAlYm9keS5jb250ZW50PgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgIEhUTUwgMy4yIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBvcmRlcmVkIGxpc3RzLgotICAgIFlvdSBjYW4gc2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgd2l0aCB0aGUgU1RBUlQgYW5kIFZBTFVFIGF0dHJpYnV0ZXMuCi0gICAgVGhlIFRZUEUgYXR0cmlidXRlIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlbmRlcmluZyBvZiBvcmRlcmVkCi0gICAgYW5kIHVub3JkZXJlZCBsaXN0cy4KLS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgICAgLSAtICAoRFR8REQpKz4KLTwhQVRUTElTVCBETAotICAgICAgICBjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCAtLSBtb3JlIGNvbXBhY3Qgc3R5bGUgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgRFQgLSBPICAoJXRleHQpKj4KLTwhRUxFTUVOVCBERCAtIE8gICVmbG93Oz4KLQotPCEtLSBPcmRlcmVkIGxpc3RzIE9MLCBhbmQgdW5vcmRlcmVkIGxpc3RzIFVMIC0tPgotPCFFTEVNRU5UIChPTHxVTCkgLSAtICAoTEkpKz4KLQotPCEtLQotICAgICAgIE51bWJlcmluZyBzdHlsZQotICAgIDEgICBhcmFibGljIG51bWJlcnMgICAgIDEsIDIsIDMsIC4uLgotICAgIGEgICBsb3dlciBhbHBoYSAgICAgICAgIGEsIGIsIGMsIC4uLgotICAgIEEgICB1cHBlciBhbHBoYSAgICAgICAgIEEsIEIsIEMsIC4uLgotICAgIGkgICBsb3dlciByb21hbiAgICAgICAgIGksIGlpLCBpaWksIC4uLgotICAgIEkgICB1cHBlciByb21hbiAgICAgICAgIEksIElJLCBJSUksIC4uLgotCi0gICAgVGhlIHN0eWxlIGlzIGFwcGxpZWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciB3aGljaCBieSBkZWZhdWx0Ci0gICAgaXMgcmVzZXQgdG8gMSBmb3IgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiBhbiBvcmRlcmVkIGxpc3QuCi0KLSAgICBUaGlzIGNhbid0IGJlIGV4cHJlc3NlZCBkaXJlY3RseSBpbiBTR01MIGR1ZSB0byBjYXNlIGZvbGRpbmcuCi0tLT4KLQotPCFFTlRJVFkgJSBPTFN0eWxlICJDREFUQSIgLS0gY29uc3RyYWluZWQgdG86IFsxfGF8QXxpfEldIC0tPgotCi08IUFUVExJU1QgT0wgLS0gb3JkZXJlZCBsaXN0cyAtLQotICAgICAgICB0eXBlICAgICAgJU9MU3R5bGUgICAjSU1QTElFRCAgIC0tIG51bWJlcmluZyBzdHlsZSAtLQotICAgICAgICBzdGFydCAgICAgTlVNQkVSICAgICAjSU1QTElFRCAgIC0tIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciAtLQotICAgICAgICBjb21wYWN0ICAoY29tcGFjdCkgICAjSU1QTElFRCAgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgICAgICAgPgotCi08IS0tIGJ1bGxldCBzdHlsZXMgLS0+Ci0KLTwhRU5USVRZICUgVUxTdHlsZSAiZGlzY3xzcXVhcmV8Y2lyY2xlIj4KLQotPCFBVFRMSVNUIFVMIC0tIHVub3JkZXJlZCBsaXN0cyAtLQotICAgICAgICB0eXBlICAgICglVUxTdHlsZSkgICAjSU1QTElFRCAgIC0tIGJ1bGxldCBzdHlsZSAtLQotICAgICAgICBjb21wYWN0IChjb21wYWN0KSAgICAjSU1QTElFRCAgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgKERJUnxNRU5VKSAtIC0gIChMSSkrIC0oJWJsb2NrKT4KLTwhQVRUTElTVCBESVIKLSAgICAgICAgY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQKLSAgICAgICAgPgotPCFBVFRMSVNUIE1FTlUKLSAgICAgICAgY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IS0tIDxESVI+ICAgICAgICAgICAgICBEaXJlY3RvcnkgbGlzdCAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA8RElSIENPTVBBQ1Q+ICAgICAgQ29tcGFjdCBsaXN0IHN0eWxlICAgICAgICAgICAgICAtLT4KLTwhLS0gPE1FTlU+ICAgICAgICAgICAgIE1lbnUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIDxNRU5VIENPTVBBQ1Q+ICAgICBDb21wYWN0IGxpc3Qgc3R5bGUgICAgICAgICAgICAgIC0tPgotCi08IS0tIFRoZSB0eXBlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGJ1bGxldCBzdHlsZQotICAgICBpbiB1bm9yZGVyZWQgbGlzdHMgYW5kIHRoZSBudW1iZXJpbmcgc3R5bGUgaW4gb3JkZXJlZCBsaXN0cyAtLT4KLQotPCFFTlRJVFkgJSBMSVN0eWxlICJDREFUQSIgLS0gY29uc3RyYWluZWQgdG86ICIoJVVMU3R5bGV8JU9MU3R5bGUpIiAtLT4KLQotPCFFTEVNRU5UIExJIC0gTyAlZmxvdyAtLSBsaXN0IGl0ZW0gLS0+Ci08IUFUVExJU1QgTEkKLSAgICAgICAgdHlwZSAgICAlTElTdHlsZSAgICAgI0lNUExJRUQgICAtLSBsaXN0IGl0ZW0gc3R5bGUgLS0KLSAgICAgICAgdmFsdWUgICAgTlVNQkVSICAgICAgI0lNUExJRUQgICAtLSByZXNldCBzZXF1ZW5jZSBudW1iZXIgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgRk9STSAtIC0gJWJvZHkuY29udGVudCAtKEZPUk0pPgotPCFBVFRMSVNUIEZPUk0KLSAgICAgICAgYWN0aW9uICVVUkwgI0lNUExJRUQgIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICAgICAgICBtZXRob2QgKCVIVFRQLU1ldGhvZCkgR0VUIC0tIHNlZSBIVFRQIHNwZWNpZmljYXRpb24gLS0KLSAgICAgICAgZW5jdHlwZSAlQ29udGVudC1UeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICAgICAgICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfCBSQURJTyB8IFNVQk1JVAotICAgICAgICAgICAgfCBSRVNFVCB8IEZJTEUgfCBISURERU4gfCBJTUFHRSkiPgotCi08IUVMRU1FTlQgSU5QVVQgLSBPIEVNUFRZPgotPCFBVFRMSVNUIElOUFVUCi0gICAgICAgIHR5cGUgJUlucHV0VHlwZSBURVhUICAgICAtLSB3aGF0IGtpbmQgb2Ygd2lkZ2V0IGlzIG5lZWRlZCAtLQotICAgICAgICBuYW1lICBDREFUQSAgICNJTVBMSUVEICAgLS0gcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLQotICAgICAgICB2YWx1ZSBDREFUQSAgICNJTVBMSUVEICAgLS0gcmVxdWlyZWQgZm9yIHJhZGlvIGFuZCBjaGVja2JveGVzIC0tCi0gICAgICAgIGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICAgICAgICBzaXplIENEQVRBICAgICNJTVBMSUVEICAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gICAgICAgIG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQgLS0gbWF4IGNoYXJzIGFsbG93ZWQgaW4gdGV4dCBmaWVsZHMgLS0KLSAgICAgICAgc3JjICAgJVVSTCAgICAjSU1QTElFRCAgIC0tIGZvciBmaWVsZHMgd2l0aCBiYWNrZ3JvdW5kIGltYWdlcyAtLQotICAgICAgICBhbGlnbiAlSUFsaWduICNJTVBMSUVEICAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgU0VMRUNUIC0gLSAoT1BUSU9OKyk+Ci08IUFUVExJU1QgU0VMRUNUCi0gICAgICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVECi0gICAgICAgIHNpemUgTlVNQkVSICNJTVBMSUVECi0gICAgICAgIG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IUVMRU1FTlQgT1BUSU9OIC0gTyAoI1BDREFUQSkqPgotPCFBVFRMSVNUIE9QVElPTgotICAgICAgICBzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVECi0gICAgICAgIHZhbHVlICBDREFUQSAgI0lNUExJRUQgLS0gZGVmYXVsdHMgdG8gZWxlbWVudCBjb250ZW50IC0tCi0gICAgICAgID4KLQotPCEtLSBNdWx0aS1saW5lIHRleHQgaW5wdXQgZmllbGQuIC0tPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgLSAtICgjUENEQVRBKSo+Ci08IUFUVExJU1QgVEVYVEFSRUEKLSAgICAgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgcm93cyBOVU1CRVIgI1JFUVVJUkVECi0gICAgICAgIGNvbHMgTlVNQkVSICNSRVFVSVJFRAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFdpZGVseSBkZXBsb3llZCBzdWJzZXQgb2YgdGhlIGZ1bGwgdGFibGUgc3RhbmRhcmQsIHNlZSBSRkMgMTk0MgotICAgICBlLmcuIGF0IGh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvaHRtbC9yZmMxOTQyLnR4dCAtLT4KLQotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byB3aW5kb3cgLS0+Ci08IUVOVElUWSAlIFdoZXJlICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsLmhhbGlnbgotICAgICAgICAiYWxpZ24gIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQiCi0gICAgICAgID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbC52YWxpZ24KLSAgICAgICAgInZhbGlnbiAgKHRvcHxtaWRkbGV8Ym90dG9tKSAgI0lNUExJRUQiCi0gICAgICAgID4KLQotPCFFTEVNRU5UIHRhYmxlIC0gLSAoY2FwdGlvbj8sIHRyKyk+Ci08IUVMRU1FTlQgdHIgLSBPICh0aHx0ZCkqPgotPCFFTEVNRU5UICh0aHx0ZCkgLSBPICVib2R5LmNvbnRlbnQ+Ci0KLTwhQVRUTElTVCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAgICAgICBhbGlnbiAgICAgJVdoZXJlOyAgICNJTVBMSUVEICAtLSB0YWJsZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB3aW5kb3cgLS0KLSAgICAgICAgd2lkdGggICAgICVMZW5ndGggICAjSU1QTElFRCAgLS0gdGFibGUgd2lkdGggcmVsYXRpdmUgdG8gd2luZG93IC0tCi0gICAgICAgIGJvcmRlciAgICAlUGl4ZWxzICAgI0lNUExJRUQgIC0tIGNvbnRyb2xzIGZyYW1lIHdpZHRoIGFyb3VuZCB0YWJsZSAtLQotICAgICAgICBjZWxsc3BhY2luZyAlUGl4ZWxzICNJTVBMSUVEICAtLSBzcGFjaW5nIGJldHdlZW4gY2VsbHMgLS0KLSAgICAgICAgY2VsbHBhZGRpbmcgJVBpeGVscyAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgQ0FQVElPTiAtIC0gKCV0ZXh0OykqIC0tIHRhYmxlIG9yIGZpZ3VyZSBjYXB0aW9uIC0tPgotPCFBVFRMSVNUIENBUFRJT04KLSAgICAgICAgYWxpZ24gKHRvcHxib3R0b20pICNJTVBMSUVECi0gICAgICAgID4KLQotPCFBVFRMSVNUIHRyICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgICAgICAgJWNlbGwuaGFsaWduOyAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgICAgICAgJWNlbGwudmFsaWduOyAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICAgICAgID4KLQotPCFBVFRMSVNUICh0aHx0ZCkgICAgICAgICAgICAgICAgICAtLSBoZWFkZXIgb3IgZGF0YSBjZWxsIC0tCi0gICAgICAgIG5vd3JhcCAobm93cmFwKSAgI0lNUExJRUQgIC0tIHN1cHByZXNzIHdvcmQgd3JhcCAtLQotICAgICAgICByb3dzcGFuIE5VTUJFUiAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgICAgICAgY29sc3BhbiBOVU1CRVIgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIGNvbHMgc3Bhbm5lZCBieSBjZWxsIC0tCi0gICAgICAgICVjZWxsLmhhbGlnbjsgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGwgLS0KLSAgICAgICAgJWNlbGwudmFsaWduOyAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGwgLS0KLSAgICAgICAgd2lkdGggICAlUGl4ZWxzICAjSU1QTElFRCAgLS0gc3VnZ2VzdGVkIHdpZHRoIGZvciBjZWxsIC0tCi0gICAgICAgIGhlaWdodCAgJVBpeGVscyAgI0lNUExJRUQgIC0tIHN1Z2dlc3RlZCBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSAlaGVhZC5taXNjIGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOSyIgLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gICglaGVhZC5jb250ZW50KSArKCVoZWFkLm1pc2MpPgotCi08IUVMRU1FTlQgVElUTEUgLSAtICAoI1BDREFUQSkqIC0oJWhlYWQubWlzYykKLSAgICAgICAgICAtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgICAgICAgd2luZG93IHRpdGxlLgotICAgICAgICAgIC0tPgotCi08IUVMRU1FTlQgSVNJTkRFWCAtIE8gRU1QVFk+Ci08IUFUVExJU1QgSVNJTkRFWAotICAgICAgICBwcm9tcHQgQ0RBVEEgI0lNUExJRUQgLS0gcHJvbXB0IG1lc3NhZ2UgLS0+Ci0KLTwhLS0KLSAgICBUaGUgQkFTRSBlbGVtZW50IGdpdmVzIGFuIGFic29sdXRlIFVSTCBmb3IgZGVyZWZlcmVuY2luZyByZWxhdGl2ZQotICAgIFVSTHMsIGUuZy4KLQotICAgICAgICAgPEJBU0UgaHJlZj0iaHR0cDovL2Zvby5jb20vaW5kZXguaHRtbCI+Ci0gICAgICAgICAuLi4KLSAgICAgICAgIDxJTUcgU1JDPSJpbWFnZXMvYmFyLmdpZiI+Ci0KLSAgICBUaGUgaW1hZ2UgaXMgZGVmZXJlbmNlZCB0bwotCi0gICAgICAgICBodHRwOi8vZm9vLmNvbS9pbWFnZXMvYmFyLmdpZgotCi0gICBJbiB0aGUgYWJzZW5jZSBvZiBhIEJBU0UgZWxlbWVudCB0aGUgZG9jdW1lbnQgVVJMIHNob3VsZCBiZSB1c2VkLgotICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBVUkwgdXNlZCB0bwotICAgcmVxdWVzdCB0aGUgZG9jdW1lbnQsIGFzIHRoZSBiYXNlIFVSTCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhbiBIVFRQCi0gICBoZWFkZXIgYWNjb21wYW55aW5nIHRoZSBkb2N1bWVudC4KLS0tPgotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFk+Ci08IUFUVExJU1QgQkFTRQotICAgICAgICBocmVmICVVUkwgICNSRVFVSVJFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBNRVRBIC0gTyBFTVBUWSAtLSBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICAgICAgIGh0dHAtZXF1aXYgIE5BTUUgICAgI0lNUExJRUQgIC0tIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgIC0tCi0gICAgICAgIG5hbWUgICAgICAgIE5BTUUgICAgI0lNUExJRUQgIC0tIG1ldGFpbmZvcm1hdGlvbiBuYW1lICAgICAgIC0tCi0gICAgICAgIGNvbnRlbnQgICAgIENEQVRBICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gICAgIC0tCi0gICAgICAgID4KLQotPCEtLSBTQ1JJUFQvU1RZTEUgYXJlIHBsYWNlIGhvbGRlcnMgZm9yIHRyYW5zaXRpb24gdG8gbmV4dCB2ZXJzaW9uIG9mIEhUTUwgLS0+Ci0KLTwhRUxFTUVOVCBTVFlMRSAgLSAtIENEQVRBIC0tIHBsYWNlaG9sZGVyIGZvciBzdHlsZSBpbmZvIC0tPgotPCFFTEVNRU5UIFNDUklQVCAtIC0gQ0RBVEEgLS0gcGxhY2Vob2xkZXIgZm9yIHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSB2ZXJzaW9uLmF0dHIgIlZFUlNJT04gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOyciPgotCi08IVsgJUhUTUwuRGVwcmVjYXRlZCBbCi0gICAgPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFksIFBMQUlOVEVYVD8iPgotXV0+Ci0KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4KLQotPCFFTEVNRU5UIEhUTUwgTyBPICAoJWh0bWwuY29udGVudCk+Ci08IUFUVExJU1QgSFRNTAotICAgICAgICAldmVyc2lvbi5hdHRyOwotICAgICAgICA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0hUTUxsYXQxLmVudCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTGxhdDEuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ0NDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTGxhdDEuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMS8vRU4vL0hUTUwiPgotICAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgIENEQVRBICImIzE2MDsiIC0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgQ0RBVEEgIiYjMTYxOyIgLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICBDREFUQSAiJiMxNjI7IiAtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgQ0RBVEEgIiYjMTYzOyIgLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiBDREFUQSAiJiMxNjQ7IiAtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgIENEQVRBICImIzE2NTsiIC0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyIENEQVRBICImIzE2NjsiIC0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgQ0RBVEEgIiYjMTY3OyIgLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgIENEQVRBICImIzE2ODsiIC0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgQ0RBVEEgIiYjMTY5OyIgLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgQ0RBVEEgIiYjMTcwOyIgLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgQ0RBVEEgIiYjMTcxOyIgLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgIENEQVRBICImIzE3MjsiIC0tIG5vdCBzaWduLCBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgIENEQVRBICImIzE3MzsiIC0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICBDREFUQSAiJiMxNzQ7IiAtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgIENEQVRBICImIzE3NTsiIC0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgIENEQVRBICImIzE3NjsiIC0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uIENEQVRBICImIzE3NzsiIC0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgIENEQVRBICImIzE3ODsiIC0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICBDREFUQSAiJiMxNzk7IiAtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICBDREFUQSAiJiMxODA7IiAtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgQ0RBVEEgIiYjMTgxOyIgLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICBDREFUQSAiJiMxODI7IiAtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90IENEQVRBICImIzE4MzsiIC0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICBDREFUQSAiJiMxODQ7IiAtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgIENEQVRBICImIzE4NTsiIC0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgIENEQVRBICImIzE4NjsiIC0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gIENEQVRBICImIzE4NzsiIC0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0IENEQVRBICImIzE4ODsiIC0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgQ0RBVEEgIiYjMTg5OyIgLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCBDREFUQSAiJiMxOTA7IiAtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0IENEQVRBICImIzE5MTsiIC0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlIENEQVRBICImIzE5MjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSBDREFUQSAiJiMxOTM7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgQ0RBVEEgIiYjMTk0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgQ0RBVEEgIiYjMTk1OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgIENEQVRBICImIzE5NjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICBDREFUQSAiJiMxOTg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCBDREFUQSAiJiMxOTk7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBDIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSBDREFUQSAiJiMyMDA7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgQ0RBVEEgIiYjMjAxOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgIENEQVRBICImIzIwMjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgIENEQVRBICImIzIwMzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgQ0RBVEEgIiYjMjA0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlIENEQVRBICImIzIwNTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICBDREFUQSAiJiMyMDY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICBDREFUQSAiJiMyMDc7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgIENEQVRBICImIzIwODsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgQ0RBVEEgIiYjMjA5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlIENEQVRBICImIzIxMDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSBDREFUQSAiJiMyMTE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgQ0RBVEEgIiYjMjEyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgQ0RBVEEgIiYjMjEzOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgIENEQVRBICImIzIxNDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgQ0RBVEEgIiYjMjE1OyIgLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCBDREFUQSAiJiMyMTY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggc3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlIENEQVRBICImIzIxNzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSBDREFUQSAiJiMyMTg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgQ0RBVEEgIiYjMjE5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgQ0RBVEEgIiYjMjIwOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSBDREFUQSAiJiMyMjE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgQ0RBVEEgIiYjMjIyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgQ0RBVEEgIiYjMjIzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlIENEQVRBICImIzIyNTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgQ0RBVEEgIiYjMjI2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlIENEQVRBICImIzIyNzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgQ0RBVEEgIiYjMjI4OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgIENEQVRBICImIzIzMDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsIENEQVRBICImIzIzMTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSBDREFUQSAiJiMyMzI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlIENEQVRBICImIzIzMzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgQ0RBVEEgIiYjMjM0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgIENEQVRBICImIzIzNTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlIENEQVRBICImIzIzNjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgQ0RBVEEgIiYjMjM3OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgQ0RBVEEgIiYjMjM5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgQ0RBVEEgIiYjMjQwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgQ0RBVEEgIiYjMjQxOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSBDREFUQSAiJiMyNDI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlIENEQVRBICImIzI0MzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgQ0RBVEEgIiYjMjQ0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgQ0RBVEEgIiYjMjQ2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgQ0RBVEEgIiYjMjQ3OyIgLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCBDREFUQSAiJiMyNDg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgQ0RBVEEgIiYjMjUwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICBDREFUQSAiJiMyNTE7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgQ0RBVEEgIiYjMjUzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICBDREFUQSAiJiMyNTQ7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1Mc3BlY2lhbC5lbnQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0hUTUxzcGVjaWFsLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNWM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0hUTUxzcGVjaWFsLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiPgotICAgICAlSFRNTHNwZWNpYWw7IC0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIENEQVRBIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBJU08gMTA2NDYgbmFtZXMuIAotCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBxdW90ICAgIENEQVRBICImIzM0OyIgICAtLSBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgIENEQVRBICImIzM4OyIgICAtLSBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgIENEQVRBICImIzYwOyIgICAtLSBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgQ0RBVEEgIiYjNjI7IiAgIC0tIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgIENEQVRBICImIzMzODsiICAtLSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgIENEQVRBICImIzMzOTsiICAtLSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gIENEQVRBICImIzM1MjsiICAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgQ0RBVEEgIiYjMzUzOyIgIC0tIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgQ0RBVEEgIiYjMzc2OyIgIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgIENEQVRBICImIzcxMDsiICAtLSBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICBDREFUQSAiJiM3MzI7IiAgLS0gc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgQ0RBVEEgIiYjODE5NDsiIC0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICBDREFUQSAiJiM4MTk1OyIgLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgIENEQVRBICImIzgyMDE7IiAtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICBDREFUQSAiJiM4MjA0OyIgLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgQ0RBVEEgIiYjODIwNTsiIC0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICBDREFUQSAiJiM4MjA2OyIgLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICBDREFUQSAiJiM4MjA3OyIgLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICBDREFUQSAiJiM4MjExOyIgLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgQ0RBVEEgIiYjODIxMjsiIC0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgIENEQVRBICImIzgyMTY7IiAtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgIENEQVRBICImIzgyMTc7IiAtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICBDREFUQSAiJiM4MjE4OyIgLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICBDREFUQSAiJiM4MjIwOyIgLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICBDREFUQSAiJiM4MjIxOyIgLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgQ0RBVEEgIiYjODIyMjsiIC0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgQ0RBVEEgIiYjODIyNDsiIC0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgQ0RBVEEgIiYjODIyNTsiIC0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgIENEQVRBICImIzgyNDA7IiAtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gIENEQVRBICImIzgyNDk7IiAtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICBDREFUQSAiJiM4MjUwOyIgLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgQ0RBVEEgIiYjODM2NDsiICAtLSBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1Mc3ltYm9sLmVudCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTHN5bWJvbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGJmZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1Mc3ltYm9sLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIj4KLSAgICAgJUhUTUxzeW1ib2w7IC0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIENEQVRBIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBJU08gMTA2NDYgbmFtZXMuIAotCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgQ0RBVEEgIiYjNDAyOyIgLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgQ0RBVEEgIiYjOTEzOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgIENEQVRBICImIzkxNDsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgIENEQVRBICImIzkxNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICBDREFUQSAiJiM5MTY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgQ0RBVEEgIiYjOTE3OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgQ0RBVEEgIiYjOTE4OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgQ0RBVEEgIiYjOTE5OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICBDREFUQSAiJiM5MjA7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgQ0RBVEEgIiYjOTIxOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgQ0RBVEEgIiYjOTIyOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgIENEQVRBICImIzkyMzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgQ0RBVEEgIiYjOTI0OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgIENEQVRBICImIzkyNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICBDREFUQSAiJiM5MjY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICBDREFUQSAiJiM5Mjc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICBDREFUQSAiJiM5Mjg7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICBDREFUQSAiJiM5Mjk7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICBDREFUQSAiJiM5MzE7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgQ0RBVEEgIiYjOTMyOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICBDREFUQSAiJiM5MzM7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICBDREFUQSAiJiM5MzQ7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgIENEQVRBICImIzkzNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgQ0RBVEEgIiYjOTM2OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICBDREFUQSAiJiM5Mzc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICBDREFUQSAiJiM5NDU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgIENEQVRBICImIzk0NjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgIENEQVRBICImIzk0NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgQ0RBVEEgIiYjOTQ4OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICBDREFUQSAiJiM5NDk7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgQ0RBVEEgIiYjOTUwOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgQ0RBVEEgIiYjOTUxOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICBDREFUQSAiJiM5NTI7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgIENEQVRBICImIzk1MzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgIENEQVRBICImIzk1NDsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgQ0RBVEEgIiYjOTU1OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgQ0RBVEEgIiYjOTU2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgIENEQVRBICImIzk1NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICBDREFUQSAiJiM5NTg7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgQ0RBVEEgIiYjOTU5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICBDREFUQSAiJiM5NjA7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgQ0RBVEEgIiYjOTYxOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICBDREFUQSAiJiM5NjI7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgIENEQVRBICImIzk2MzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgQ0RBVEEgIiYjOTY0OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICBDREFUQSAiJiM5NjU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgQ0RBVEEgIiYjOTY2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICBDREFUQSAiJiM5Njc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgIENEQVRBICImIzk2ODsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgQ0RBVEEgIiYjOTY5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSBDREFUQSAiJiM5Nzc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgIENEQVRBICImIzk3ODsiIC0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICBDREFUQSAiJiM5ODI7IiAtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICBDREFUQSAiJiM4MjI2OyIgLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgQ0RBVEEgIiYjODIzMDsiIC0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgQ0RBVEEgIiYjODI0MjsiIC0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgQ0RBVEEgIiYjODI0MzsiIC0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICBDREFUQSAiJiM4MjU0OyIgLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgQ0RBVEEgIiYjODI2MDsiIC0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgIENEQVRBICImIzg0NzI7IiAtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgIENEQVRBICImIzg0NjU7IiAtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgIENEQVRBICImIzg0NzY7IiAtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgQ0RBVEEgIiYjODQ4MjsiIC0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gIENEQVRBICImIzg1MDE7IiAtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgQ0RBVEEgIiYjODU5MjsiIC0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgIENEQVRBICImIzg1OTM7IiAtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICBDREFUQSAiJiM4NTk0OyIgLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgIENEQVRBICImIzg1OTU7IiAtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICBDREFUQSAiJiM4NTk2OyIgLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICBDREFUQSAiJiM4NjI5OyIgLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgQ0RBVEEgIiYjODY1NjsiIC0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICBDREFUQSAiJiM4NjU3OyIgLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgQ0RBVEEgIiYjODY1ODsiIC0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgQ0RBVEEgIiYjODY1OTsiIC0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgQ0RBVEEgIiYjODY2MDsiIC0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICBDREFUQSAiJiM4NzA0OyIgLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICBDREFUQSAiJiM4NzA2OyIgLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgIENEQVRBICImIzg3MDc7IiAtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgQ0RBVEEgIiYjODcwOTsiIC0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICBDREFUQSAiJiM4NzExOyIgLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgQ0RBVEEgIiYjODcxMjsiIC0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgQ0RBVEEgIiYjODcxMzsiIC0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgIENEQVRBICImIzg3MTU7IiAtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICBDREFUQSAiJiM4NzE5OyIgLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgQ0RBVEEgIiYjODcyMTsiIC0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICBDREFUQSAiJiM4NzIyOyIgLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICBDREFUQSAiJiM4NzI3OyIgLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgQ0RBVEEgIiYjODczMDsiIC0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgQ0RBVEEgIiYjODczMzsiIC0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICBDREFUQSAiJiM4NzM0OyIgLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgQ0RBVEEgIiYjODczNjsiIC0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgIENEQVRBICImIzg3NDM7IiAtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgIENEQVRBICImIzg3NDQ7IiAtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgIENEQVRBICImIzg3NDU7IiAtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgQ0RBVEEgIiYjODc0NjsiIC0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgIENEQVRBICImIzg3NDc7IiAtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICBDREFUQSAiJiM4NzU2OyIgLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgIENEQVRBICImIzg3NjQ7IiAtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICBDREFUQSAiJiM4NzczOyIgLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICBDREFUQSAiJiM4Nzc2OyIgLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgIENEQVRBICImIzg4MDA7IiAtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgQ0RBVEEgIiYjODgwMTsiIC0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICBDREFUQSAiJiM4ODA0OyIgLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgIENEQVRBICImIzg4MDU7IiAtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICBDREFUQSAiJiM4ODM0OyIgLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgIENEQVRBICImIzg4MzU7IiAtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgQ0RBVEEgIiYjODgzNjsiIC0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICBDREFUQSAiJiM4ODM4OyIgLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgIENEQVRBICImIzg4Mzk7IiAtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgIENEQVRBICImIzg4NTM7IiAtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgQ0RBVEEgIiYjODg1NTsiIC0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgIENEQVRBICImIzg4Njk7IiAtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICBDREFUQSAiJiM4OTAxOyIgLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICBDREFUQSAiJiM4OTY4OyIgLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgQ0RBVEEgIiYjODk2OTsiIC0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgIENEQVRBICImIzg5NzA7IiAtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICBDREFUQSAiJiM4OTcxOyIgLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgIENEQVRBICImIzkwMDE7IiAtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgQ0RBVEEgIiYjOTAwMjsiIC0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgQ0RBVEEgIiYjOTY3NDsiIC0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgQ0RBVEEgIiYjOTgyNDsiIC0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICBDREFUQSAiJiM5ODI3OyIgLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgIENEQVRBICImIzk4Mjk7IiAtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICBDREFUQSAiJiM5ODMwOyIgLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5lbnQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0lTT2xhdDEuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI1ODk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCEtLSAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0gICAgIFRoaXMgaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIHVzZSB3aXRoIEhUTUwgdG8gY292ZXIgdGhlIGZ1bGwKLSAgICAgc2V0IG9mIGNvZGVzIGluIHRoZSByYW5nZSAxNjAtMjU1IGRlY2ltYWwuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBJU09sYXQxIFBVQkxJQwotICAgICAgICJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBBZGRlZCBMYXRpbiAxLy9FTi8vSFRNTCI+Ci0gICAgICVJU09sYXQxOwotLS0+Ci08IUVOVElUWSBuYnNwICAgQ0RBVEEgIiYjMTYwOyIgLS0gbm8tYnJlYWsgc3BhY2UgLS0+Ci08IUVOVElUWSBpZXhjbCAgQ0RBVEEgIiYjMTYxOyIgLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyayAtLT4KLTwhRU5USVRZIGNlbnQgICBDREFUQSAiJiMxNjI7IiAtLSBjZW50IHNpZ24gLS0+Ci08IUVOVElUWSBwb3VuZCAgQ0RBVEEgIiYjMTYzOyIgLS0gcG91bmQgc3Rlcmxpbmcgc2lnbiAtLT4KLTwhRU5USVRZIGN1cnJlbiBDREFUQSAiJiMxNjQ7IiAtLSBnZW5lcmFsIGN1cnJlbmN5IHNpZ24gLS0+Ci08IUVOVElUWSB5ZW4gICAgQ0RBVEEgIiYjMTY1OyIgLS0geWVuIHNpZ24gLS0+Ci08IUVOVElUWSBicnZiYXIgQ0RBVEEgIiYjMTY2OyIgLS0gYnJva2VuICh2ZXJ0aWNhbCkgYmFyIC0tPgotPCFFTlRJVFkgc2VjdCAgIENEQVRBICImIzE2NzsiIC0tIHNlY3Rpb24gc2lnbiAtLT4KLTwhRU5USVRZIHVtbCAgICBDREFUQSAiJiMxNjg7IiAtLSB1bWxhdXQgKGRpZXJlc2lzKSAtLT4KLTwhRU5USVRZIGNvcHkgICBDREFUQSAiJiMxNjk7IiAtLSBjb3B5cmlnaHQgc2lnbiAtLT4KLTwhRU5USVRZIG9yZGYgICBDREFUQSAiJiMxNzA7IiAtLSBvcmRpbmFsIGluZGljYXRvciwgZmVtaW5pbmUgLS0+Ci08IUVOVElUWSBsYXF1byAgQ0RBVEEgIiYjMTcxOyIgLS0gYW5nbGUgcXVvdGF0aW9uIG1hcmssIGxlZnQgLS0+Ci08IUVOVElUWSBub3QgICAgQ0RBVEEgIiYjMTcyOyIgLS0gbm90IHNpZ24gLS0+Ci08IUVOVElUWSBzaHkgICAgQ0RBVEEgIiYjMTczOyIgLS0gc29mdCBoeXBoZW4gLS0+Ci08IUVOVElUWSByZWcgICAgQ0RBVEEgIiYjMTc0OyIgLS0gcmVnaXN0ZXJlZCBzaWduIC0tPgotPCFFTlRJVFkgbWFjciAgIENEQVRBICImIzE3NTsiIC0tIG1hY3JvbiAtLT4KLTwhRU5USVRZIGRlZyAgICBDREFUQSAiJiMxNzY7IiAtLSBkZWdyZWUgc2lnbiAtLT4KLTwhRU5USVRZIHBsdXNtbiBDREFUQSAiJiMxNzc7IiAtLSBwbHVzLW9yLW1pbnVzIHNpZ24gLS0+Ci08IUVOVElUWSBzdXAyICAgQ0RBVEEgIiYjMTc4OyIgLS0gc3VwZXJzY3JpcHQgdHdvIC0tPgotPCFFTlRJVFkgc3VwMyAgIENEQVRBICImIzE3OTsiIC0tIHN1cGVyc2NyaXB0IHRocmVlIC0tPgotPCFFTlRJVFkgYWN1dGUgIENEQVRBICImIzE4MDsiIC0tIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIG1pY3JvICBDREFUQSAiJiMxODE7IiAtLSBtaWNybyBzaWduIC0tPgotPCFFTlRJVFkgcGFyYSAgIENEQVRBICImIzE4MjsiIC0tIHBpbGNyb3cgKHBhcmFncmFwaCBzaWduKSAtLT4KLTwhRU5USVRZIG1pZGRvdCBDREFUQSAiJiMxODM7IiAtLSBtaWRkbGUgZG90IC0tPgotPCFFTlRJVFkgY2VkaWwgIENEQVRBICImIzE4NDsiIC0tIGNlZGlsbGEgLS0+Ci08IUVOVElUWSBzdXAxICAgQ0RBVEEgIiYjMTg1OyIgLS0gc3VwZXJzY3JpcHQgb25lIC0tPgotPCFFTlRJVFkgb3JkbSAgIENEQVRBICImIzE4NjsiIC0tIG9yZGluYWwgaW5kaWNhdG9yLCBtYXNjdWxpbmUgLS0+Ci08IUVOVElUWSByYXF1byAgQ0RBVEEgIiYjMTg3OyIgLS0gYW5nbGUgcXVvdGF0aW9uIG1hcmssIHJpZ2h0IC0tPgotPCFFTlRJVFkgZnJhYzE0IENEQVRBICImIzE4ODsiIC0tIGZyYWN0aW9uIG9uZS1xdWFydGVyIC0tPgotPCFFTlRJVFkgZnJhYzEyIENEQVRBICImIzE4OTsiIC0tIGZyYWN0aW9uIG9uZS1oYWxmIC0tPgotPCFFTlRJVFkgZnJhYzM0IENEQVRBICImIzE5MDsiIC0tIGZyYWN0aW9uIHRocmVlLXF1YXJ0ZXJzIC0tPgotPCFFTlRJVFkgaXF1ZXN0IENEQVRBICImIzE5MTsiIC0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsgLS0+Ci08IUVOVElUWSBBZ3JhdmUgQ0RBVEEgIiYjMTkyOyIgLS0gY2FwaXRhbCBBLCBncmF2ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBBYWN1dGUgQ0RBVEEgIiYjMTkzOyIgLS0gY2FwaXRhbCBBLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBBY2lyYyAgQ0RBVEEgIiYjMTk0OyIgLS0gY2FwaXRhbCBBLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4KLTwhRU5USVRZIEF0aWxkZSBDREFUQSAiJiMxOTU7IiAtLSBjYXBpdGFsIEEsIHRpbGRlIC0tPgotPCFFTlRJVFkgQXVtbCAgIENEQVRBICImIzE5NjsiIC0tIGNhcGl0YWwgQSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gY2FwaXRhbCBBLCByaW5nIC0tPgotPCFFTlRJVFkgQUVsaWcgIENEQVRBICImIzE5ODsiIC0tIGNhcGl0YWwgQUUgZGlwaHRob25nIChsaWdhdHVyZSkgLS0+Ci08IUVOVElUWSBDY2VkaWwgQ0RBVEEgIiYjMTk5OyIgLS0gY2FwaXRhbCBDLCBjZWRpbGxhIC0tPgotPCFFTlRJVFkgRWdyYXZlIENEQVRBICImIzIwMDsiIC0tIGNhcGl0YWwgRSwgZ3JhdmUgYWNjZW50IC0tPgotPCFFTlRJVFkgRWFjdXRlIENEQVRBICImIzIwMTsiIC0tIGNhcGl0YWwgRSwgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgRWNpcmMgIENEQVRBICImIzIwMjsiIC0tIGNhcGl0YWwgRSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBFdW1sICAgQ0RBVEEgIiYjMjAzOyIgLS0gY2FwaXRhbCBFLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4KLTwhRU5USVRZIElncmF2ZSBDREFUQSAiJiMyMDQ7IiAtLSBjYXBpdGFsIEksIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIElhY3V0ZSBDREFUQSAiJiMyMDU7IiAtLSBjYXBpdGFsIEksIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIEljaXJjICBDREFUQSAiJiMyMDY7IiAtLSBjYXBpdGFsIEksIGNpcmN1bWZsZXggYWNjZW50IC0tPgotPCFFTlRJVFkgSXVtbCAgIENEQVRBICImIzIwNzsiIC0tIGNhcGl0YWwgSSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBFVEggICAgQ0RBVEEgIiYjMjA4OyIgLS0gY2FwaXRhbCBFdGgsIEljZWxhbmRpYyAtLT4KLTwhRU5USVRZIE50aWxkZSBDREFUQSAiJiMyMDk7IiAtLSBjYXBpdGFsIE4sIHRpbGRlIC0tPgotPCFFTlRJVFkgT2dyYXZlIENEQVRBICImIzIxMDsiIC0tIGNhcGl0YWwgTywgZ3JhdmUgYWNjZW50IC0tPgotPCFFTlRJVFkgT2FjdXRlIENEQVRBICImIzIxMTsiIC0tIGNhcGl0YWwgTywgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgT2NpcmMgIENEQVRBICImIzIxMjsiIC0tIGNhcGl0YWwgTywgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBPdGlsZGUgQ0RBVEEgIiYjMjEzOyIgLS0gY2FwaXRhbCBPLCB0aWxkZSAtLT4KLTwhRU5USVRZIE91bWwgICBDREFUQSAiJiMyMTQ7IiAtLSBjYXBpdGFsIE8sIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPgotPCFFTlRJVFkgdGltZXMgIENEQVRBICImIzIxNTsiIC0tIG11bHRpcGx5IHNpZ24gLS0+Ci08IUVOVElUWSBPc2xhc2ggQ0RBVEEgIiYjMjE2OyIgLS0gY2FwaXRhbCBPLCBzbGFzaCAtLT4KLTwhRU5USVRZIFVncmF2ZSBDREFUQSAiJiMyMTc7IiAtLSBjYXBpdGFsIFUsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIFVhY3V0ZSBDREFUQSAiJiMyMTg7IiAtLSBjYXBpdGFsIFUsIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIFVjaXJjICBDREFUQSAiJiMyMTk7IiAtLSBjYXBpdGFsIFUsIGNpcmN1bWZsZXggYWNjZW50IC0tPgotPCFFTlRJVFkgVXVtbCAgIENEQVRBICImIzIyMDsiIC0tIGNhcGl0YWwgVSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBZYWN1dGUgQ0RBVEEgIiYjMjIxOyIgLS0gY2FwaXRhbCBZLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBUSE9STiAgQ0RBVEEgIiYjMjIyOyIgLS0gY2FwaXRhbCBUSE9STiwgSWNlbGFuZGljIC0tPgotPCFFTlRJVFkgc3psaWcgIENEQVRBICImIzIyMzsiIC0tIHNtYWxsIHNoYXJwIHMsIEdlcm1hbiAoc3ogbGlnYXR1cmUpIC0tPgotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIHNtYWxsIGEsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIGFhY3V0ZSBDREFUQSAiJiMyMjU7IiAtLSBzbWFsbCBhLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBhY2lyYyAgQ0RBVEEgIiYjMjI2OyIgLS0gc21hbGwgYSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBhdGlsZGUgQ0RBVEEgIiYjMjI3OyIgLS0gc21hbGwgYSwgdGlsZGUgLS0+Ci08IUVOVElUWSBhdW1sICAgQ0RBVEEgIiYjMjI4OyIgLS0gc21hbGwgYSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gc21hbGwgYSwgcmluZyAtLT4KLTwhRU5USVRZIGFlbGlnICBDREFUQSAiJiMyMzA7IiAtLSBzbWFsbCBhZSBkaXBodGhvbmcgKGxpZ2F0dXJlKSAtLT4KLTwhRU5USVRZIGNjZWRpbCBDREFUQSAiJiMyMzE7IiAtLSBzbWFsbCBjLCBjZWRpbGxhIC0tPgotPCFFTlRJVFkgZWdyYXZlIENEQVRBICImIzIzMjsiIC0tIHNtYWxsIGUsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIGVhY3V0ZSBDREFUQSAiJiMyMzM7IiAtLSBzbWFsbCBlLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBlY2lyYyAgQ0RBVEEgIiYjMjM0OyIgLS0gc21hbGwgZSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBldW1sICAgQ0RBVEEgIiYjMjM1OyIgLS0gc21hbGwgZSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBpZ3JhdmUgQ0RBVEEgIiYjMjM2OyIgLS0gc21hbGwgaSwgZ3JhdmUgYWNjZW50IC0tPgotPCFFTlRJVFkgaWFjdXRlIENEQVRBICImIzIzNzsiIC0tIHNtYWxsIGksIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBzbWFsbCBpLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4KLTwhRU5USVRZIGl1bWwgICBDREFUQSAiJiMyMzk7IiAtLSBzbWFsbCBpLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4KLTwhRU5USVRZIGV0aCAgICBDREFUQSAiJiMyNDA7IiAtLSBzbWFsbCBldGgsIEljZWxhbmRpYyAtLT4KLTwhRU5USVRZIG50aWxkZSBDREFUQSAiJiMyNDE7IiAtLSBzbWFsbCBuLCB0aWxkZSAtLT4KLTwhRU5USVRZIG9ncmF2ZSBDREFUQSAiJiMyNDI7IiAtLSBzbWFsbCBvLCBncmF2ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBvYWN1dGUgQ0RBVEEgIiYjMjQzOyIgLS0gc21hbGwgbywgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgb2NpcmMgIENEQVRBICImIzI0NDsiIC0tIHNtYWxsIG8sIGNpcmN1bWZsZXggYWNjZW50IC0tPgotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIHNtYWxsIG8sIHRpbGRlIC0tPgotPCFFTlRJVFkgb3VtbCAgIENEQVRBICImIzI0NjsiIC0tIHNtYWxsIG8sIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPgotPCFFTlRJVFkgZGl2aWRlIENEQVRBICImIzI0NzsiIC0tIGRpdmlkZSBzaWduIC0tPgotPCFFTlRJVFkgb3NsYXNoIENEQVRBICImIzI0ODsiIC0tIHNtYWxsIG8sIHNsYXNoIC0tPgotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIHNtYWxsIHUsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIHVhY3V0ZSBDREFUQSAiJiMyNTA7IiAtLSBzbWFsbCB1LCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSB1Y2lyYyAgQ0RBVEEgIiYjMjUxOyIgLS0gc21hbGwgdSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gc21hbGwgdSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSB5YWN1dGUgQ0RBVEEgIiYjMjUzOyIgLS0gc21hbGwgeSwgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgdGhvcm4gIENEQVRBICImIzI1NDsiIC0tIHNtYWxsIHRob3JuLCBJY2VsYW5kaWMgLS0+Ci08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gc21hbGwgeSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0lTT2xhdDEuc2dtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5zZ21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjczODI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5zZ21sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCEtLSAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2DQotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgNCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbg0KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuDQotLS0+DQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOg0KLSAgICAgPCFFTlRJVFkgJSBJU09sYXQxIFBVQkxJQw0KLSAgICAgICAiSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgQWRkZWQgTGF0aW4gMS8vRU4vL0hUTUwiPg0KLSAgICAgJUlTT2xhdDE7DQotLS0+DQotPCEtLSAgICBNb2RpZmllZCBmb3IgdXNlIGluIEhUTUwgICAgICAgIA0KLSRJZDogSVNPbGF0MS5zZ21sLHYgMS4yIDE5OTQvMTEvMzAgMjM6NDU6MTIgY29ubm9sbHkgRXhwICQgLS0+DQotPCFFTlRJVFkgQUVsaWcgIENEQVRBICImIzE5ODsiIC0tIGNhcGl0YWwgQUUgZGlwaHRob25nIChsaWdhdHVyZSkgLS0+DQotPCFFTlRJVFkgQWFjdXRlIENEQVRBICImIzE5MzsiIC0tIGNhcGl0YWwgQSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIEFjaXJjICBDREFUQSAiJiMxOTQ7IiAtLSBjYXBpdGFsIEEsIGNpcmN1bWZsZXggYWNjZW50IC0tPg0KLTwhRU5USVRZIEFncmF2ZSBDREFUQSAiJiMxOTI7IiAtLSBjYXBpdGFsIEEsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gY2FwaXRhbCBBLCByaW5nIC0tPg0KLTwhRU5USVRZIEF0aWxkZSBDREFUQSAiJiMxOTU7IiAtLSBjYXBpdGFsIEEsIHRpbGRlIC0tPg0KLTwhRU5USVRZIEF1bWwgICBDREFUQSAiJiMxOTY7IiAtLSBjYXBpdGFsIEEsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIENjZWRpbCBDREFUQSAiJiMxOTk7IiAtLSBjYXBpdGFsIEMsIGNlZGlsbGEgLS0+DQotPCFFTlRJVFkgRVRIICAgIENEQVRBICImIzIwODsiIC0tIGNhcGl0YWwgRXRoLCBJY2VsYW5kaWMgLS0+DQotPCFFTlRJVFkgRWFjdXRlIENEQVRBICImIzIwMTsiIC0tIGNhcGl0YWwgRSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIEVjaXJjICBDREFUQSAiJiMyMDI7IiAtLSBjYXBpdGFsIEUsIGNpcmN1bWZsZXggYWNjZW50IC0tPg0KLTwhRU5USVRZIEVncmF2ZSBDREFUQSAiJiMyMDA7IiAtLSBjYXBpdGFsIEUsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBFdW1sICAgQ0RBVEEgIiYjMjAzOyIgLS0gY2FwaXRhbCBFLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBJYWN1dGUgQ0RBVEEgIiYjMjA1OyIgLS0gY2FwaXRhbCBJLCBhY3V0ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgSWNpcmMgIENEQVRBICImIzIwNjsiIC0tIGNhcGl0YWwgSSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgSWdyYXZlIENEQVRBICImIzIwNDsiIC0tIGNhcGl0YWwgSSwgZ3JhdmUgYWNjZW50IC0tPg0KLTwhRU5USVRZIEl1bWwgICBDREFUQSAiJiMyMDc7IiAtLSBjYXBpdGFsIEksIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIE50aWxkZSBDREFUQSAiJiMyMDk7IiAtLSBjYXBpdGFsIE4sIHRpbGRlIC0tPg0KLTwhRU5USVRZIE9hY3V0ZSBDREFUQSAiJiMyMTE7IiAtLSBjYXBpdGFsIE8sIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSBPY2lyYyAgQ0RBVEEgIiYjMjEyOyIgLS0gY2FwaXRhbCBPLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4NCi08IUVOVElUWSBPZ3JhdmUgQ0RBVEEgIiYjMjEwOyIgLS0gY2FwaXRhbCBPLCBncmF2ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgT3NsYXNoIENEQVRBICImIzIxNjsiIC0tIGNhcGl0YWwgTywgc2xhc2ggLS0+DQotPCFFTlRJVFkgT3RpbGRlIENEQVRBICImIzIxMzsiIC0tIGNhcGl0YWwgTywgdGlsZGUgLS0+DQotPCFFTlRJVFkgT3VtbCAgIENEQVRBICImIzIxNDsiIC0tIGNhcGl0YWwgTywgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+DQotPCFFTlRJVFkgVEhPUk4gIENEQVRBICImIzIyMjsiIC0tIGNhcGl0YWwgVEhPUk4sIEljZWxhbmRpYyAtLT4NCi08IUVOVElUWSBVYWN1dGUgQ0RBVEEgIiYjMjE4OyIgLS0gY2FwaXRhbCBVLCBhY3V0ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgVWNpcmMgIENEQVRBICImIzIxOTsiIC0tIGNhcGl0YWwgVSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgVWdyYXZlIENEQVRBICImIzIxNzsiIC0tIGNhcGl0YWwgVSwgZ3JhdmUgYWNjZW50IC0tPg0KLTwhRU5USVRZIFV1bWwgICBDREFUQSAiJiMyMjA7IiAtLSBjYXBpdGFsIFUsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIFlhY3V0ZSBDREFUQSAiJiMyMjE7IiAtLSBjYXBpdGFsIFksIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSBhYWN1dGUgQ0RBVEEgIiYjMjI1OyIgLS0gc21hbGwgYSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIGFjaXJjICBDREFUQSAiJiMyMjY7IiAtLSBzbWFsbCBhLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4NCi08IUVOVElUWSBhZWxpZyAgQ0RBVEEgIiYjMjMwOyIgLS0gc21hbGwgYWUgZGlwaHRob25nIChsaWdhdHVyZSkgLS0+DQotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIHNtYWxsIGEsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gc21hbGwgYSwgcmluZyAtLT4NCi08IUVOVElUWSBhdGlsZGUgQ0RBVEEgIiYjMjI3OyIgLS0gc21hbGwgYSwgdGlsZGUgLS0+DQotPCFFTlRJVFkgYXVtbCAgIENEQVRBICImIzIyODsiIC0tIHNtYWxsIGEsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIGNjZWRpbCBDREFUQSAiJiMyMzE7IiAtLSBzbWFsbCBjLCBjZWRpbGxhIC0tPg0KLTwhRU5USVRZIGVhY3V0ZSBDREFUQSAiJiMyMzM7IiAtLSBzbWFsbCBlLCBhY3V0ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgZWNpcmMgIENEQVRBICImIzIzNDsiIC0tIHNtYWxsIGUsIGNpcmN1bWZsZXggYWNjZW50IC0tPg0KLTwhRU5USVRZIGVncmF2ZSBDREFUQSAiJiMyMzI7IiAtLSBzbWFsbCBlLCBncmF2ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgZXRoICAgIENEQVRBICImIzI0MDsiIC0tIHNtYWxsIGV0aCwgSWNlbGFuZGljIC0tPg0KLTwhRU5USVRZIGV1bWwgICBDREFUQSAiJiMyMzU7IiAtLSBzbWFsbCBlLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBpYWN1dGUgQ0RBVEEgIiYjMjM3OyIgLS0gc21hbGwgaSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBzbWFsbCBpLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4NCi08IUVOVElUWSBpZ3JhdmUgQ0RBVEEgIiYjMjM2OyIgLS0gc21hbGwgaSwgZ3JhdmUgYWNjZW50IC0tPg0KLTwhRU5USVRZIGl1bWwgICBDREFUQSAiJiMyMzk7IiAtLSBzbWFsbCBpLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBudGlsZGUgQ0RBVEEgIiYjMjQxOyIgLS0gc21hbGwgbiwgdGlsZGUgLS0+DQotPCFFTlRJVFkgb2FjdXRlIENEQVRBICImIzI0MzsiIC0tIHNtYWxsIG8sIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSBvY2lyYyAgQ0RBVEEgIiYjMjQ0OyIgLS0gc21hbGwgbywgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgb2dyYXZlIENEQVRBICImIzI0MjsiIC0tIHNtYWxsIG8sIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBvc2xhc2ggQ0RBVEEgIiYjMjQ4OyIgLS0gc21hbGwgbywgc2xhc2ggLS0+DQotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIHNtYWxsIG8sIHRpbGRlIC0tPg0KLTwhRU5USVRZIG91bWwgICBDREFUQSAiJiMyNDY7IiAtLSBzbWFsbCBvLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBzemxpZyAgQ0RBVEEgIiYjMjIzOyIgLS0gc21hbGwgc2hhcnAgcywgR2VybWFuIChzeiBsaWdhdHVyZSkgLS0+DQotPCFFTlRJVFkgdGhvcm4gIENEQVRBICImIzI1NDsiIC0tIHNtYWxsIHRob3JuLCBJY2VsYW5kaWMgLS0+DQotPCFFTlRJVFkgdWFjdXRlIENEQVRBICImIzI1MDsiIC0tIHNtYWxsIHUsIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSB1Y2lyYyAgQ0RBVEEgIiYjMjUxOyIgLS0gc21hbGwgdSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIHNtYWxsIHUsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gc21hbGwgdSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+DQotPCFFTlRJVFkgeWFjdXRlIENEQVRBICImIzI1MzsiIC0tIHNtYWxsIHksIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gc21hbGwgeSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9jb21wYWN0LmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvY29tcGFjdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmI1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9jb21wYWN0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi08IS0tIENvbXBhY3QgSFRNTCBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gLS0+Ci0KLTwhLS0KLSAgICAgICAgRGF0ZTogVHVlc2RheSBOb3ZlbWJlciAyNXRoIDE5OTcKLSAgICAgICAgQXV0aG9yOiBUb21paGlzYSBLYW1hZGEgPHRvbXlAYWNjZXNzLmNvLmpwPgotLS0+Ci0KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uCi0gICAgICAgICItLy9XM0MvL0RURCBDb21wYWN0IEhUTUwgMS4wIERyYWZ0Ly9FTiIKLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERlcHJlY2F0ZWQgRmVhdHVyZXMgU3dpdGNoID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MLkRlcHJlY2F0ZWQgIklOQ0xVREUiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBDb250ZW50LVR5cGUgIkNEQVRBIj4KLQotPCFFTlRJVFkgJSBIVFRQLU1ldGhvZCAiR0VUIHwgUE9TVCI+Ci0KLTwhRU5USVRZICUgVVJMICJDREFUQSI+Ci0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4KLQotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIHwgIERJUiB8IE1FTlUiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSVNPbGF0MSBQVUJMSUMKLSAgICAgICAiSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgQWRkZWQgTGF0aW4gMS8vRU4vL0hUTUwiPgotCi0lSVNPbGF0MTsKLQotPCEtLT09PT09PT09PT09PT09PT0gRW50aXRpZXMgZm9yIHNwZWNpYWwgc3ltYm9scyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZIGFtcCAgICBDREFUQSAiJiIgIC0tIGFtcGVyc2FuZCAgICAtLT4KLTwhRU5USVRZIGd0ICAgICBDREFUQSAiPiIgIC0tIGdyZWF0ZXIgdGhhbiAtLT4KLTwhRU5USVRZIGx0ICAgICBDREFUQSAiPCIgIC0tIGxlc3MgdGhhbiAgICAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBNYXJrdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJERk4iPgotCi08IUVOVElUWSAlIHNwZWNpYWwgIkEgfCBJTUcgfCBCUiAiPgotCi08IUVOVElUWSAlIGZvcm0gIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEiPgotCi08IUVOVElUWSAlIHRleHQgIiNQQ0RBVEEgfCAlcGhyYXNlIHwgJXNwZWNpYWwgfCAlZm9ybSI+Ci0KLTwhRUxFTUVOVCAoJXBocmFzZSkgLSAtICgldGV4dCkqPgotCi08IUVMRU1FTlQgQlIgICAgLSBPIEVNUFRZPgotPCFBVFRMSVNUIEJSCi0gICAgICAgIGNsZWFyIChsZWZ0fGFsbHxyaWdodHxub25lKSBub25lIAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSFRNTCBjb250ZW50IG1vZGVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJQIHwgJWxpc3QgfCAlcHJlZm9ybWF0dGVkIHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgQkxPQ0tRVU9URSB8IEZPUk0gfCBIUiAiPgotCi08IUVOVElUWSAlIGZsb3cgIigldGV4dCB8ICVibG9jaykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgYm9keS5jb250ZW50ICIoJWhlYWRpbmcgfCAldGV4dCB8ICVibG9jayApKiI+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAlYm9keS5jb250ZW50PgotCi08IUVMRU1FTlQgRElWIC0gLSAlYm9keS5jb250ZW50PgotPCFBVFRMSVNUIERJVgotICAgICAgICBhbGlnbiAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IUVMRU1FTlQgY2VudGVyIC0gLSAlYm9keS5jb250ZW50PgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEEgLSAtICgldGV4dCkqIC0oQSk+Ci08IUFUVExJU1QgQQotICAgICAgICBuYW1lICAgIENEQVRBICAgI0lNUExJRUQKLSAgICAgICAgaHJlZiAgICAlVVJMICAgICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+Ci08IUVOVElUWSAlIFBpeGVscyAiTlVNQkVSIj4KLQotPCFFTlRJVFkgJSBJQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBJTUcgICAgLSBPIEVNUFRZPgotPCFBVFRMSVNUIElNRwotICAgICAgICBzcmMgICAgICVVUkwgICAgICNSRVFVSVJFRAotICAgICAgICBhbGlnbiAgICVJQWxpZ24gICNJTVBMSUVECi0gICAgICAgIHdpZHRoICAgJVBpeGVscyAgI0lNUExJRUQKLSAgICAgICAgaGVpZ2h0ICAlUGl4ZWxzICAjSU1QTElFRAotICAgICAgICBoc3BhY2UgICVQaXhlbHMgICNJTVBMSUVECi0gICAgICAgIHZzcGFjZSAgJVBpeGVscyAgI0lNUExJRUQKLSAgICAgICAgYWx0ICAgICBDREFUQSAgICAjSU1QTElFRAotICAgICAgICBib3JkZXIgICVQaXhlbHMgICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBIUiAgICAtIE8gRU1QVFk+Ci08IUFUVExJU1QgSFIKLSAgICAgICAgYWxpZ24gKGxlZnR8cmlnaHR8Y2VudGVyKSAjSU1QTElFRAotICAgICAgICBzaXplICAlUGl4ZWxzICNJTVBMSUVECi0gICAgICAgIHdpZHRoICVMZW5ndGggI0lNUExJRUQKLSAgICAgICAgbm9zaGFkZSAobm9zaGFkZSkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgICAgIC0gTyAoJXRleHQpKj4KLTwhQVRUTElTVCBQCi0gICAgICAgIGFsaWduICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCAoICVoZWFkaW5nICkgIC0gLSAgKCV0ZXh0OykqPgotPCFBVFRMSVNUICggJWhlYWRpbmcgKQotICAgICAgICBhbGlnbiAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHByZS5leGNsdXNpb24gIklNRyI+Ci0KLTwhRUxFTUVOVCBQUkUgLSAtICgldGV4dCkqIC0oJXByZS5leGNsdXNpb24pPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJMT0NLUVVPVEUgLSAtICVib2R5LmNvbnRlbnQ+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgREwgLSAtICAoRFR8REQpKz4KLTwhRUxFTUVOVCBEVCAtIE8gICgldGV4dCkqPgotPCFFTEVNRU5UIEREIC0gTyAgJWZsb3c7PgotCi08IUVMRU1FTlQgKE9MfFVMKSAtIC0gIChMSSkrPgotCi08IUVMRU1FTlQgKERJUnxNRU5VKSAtIC0gIChMSSkrIC0oJWJsb2NrKT4KLQotPCFFTEVNRU5UIExJIC0gTyAlZmxvdz4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEZPUk0gLSAtICVib2R5LmNvbnRlbnQgLShGT1JNKT4KLTwhQVRUTElTVCBGT1JNCi0gICAgICAgIGFjdGlvbiAlVVJMICNJTVBMSUVECi0gICAgICAgIG1ldGhvZCAoJUhUVFAtTWV0aG9kKSBHRVQKLSAgICAgICAgZW5jdHlwZSAlQ29udGVudC1UeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICAgICAgICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfCBSQURJTyB8IEhJRERFTiAKLSAgICAgICAgIHwgSU1BR0UgfCBTVUJNSVQgfCBSRVNFVCApIj4KLQotPCFFTEVNRU5UIElOUFVUIC0gTyBFTVBUWT4KLTwhQVRUTElTVCBJTlBVVAotICAgICAgICB0eXBlICVJbnB1dFR5cGUgVEVYVAotICAgICAgICBuYW1lICBDREFUQSAgICNJTVBMSUVECi0gICAgICAgIHZhbHVlIENEQVRBICAgI0lNUExJRUQKLSAgICAgICAgY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQKLSAgICAgICAgc2l6ZSBDREFUQSAgICAjSU1QTElFRAotICAgICAgICBtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVECi0gICAgICAgIHNyYyAgICVVUkwgICAgI0lNUExJRUQKLSAgICAgICAgYWxpZ24gJUlBbGlnbiAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBTRUxFQ1QgLSAtIChPUFRJT04rKT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgICAgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgc2l6ZSBOVU1CRVIgI0lNUExJRUQKLSAgICAgICAgbXVsdGlwbGUgKG11bHRpcGxlKSAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSo+Ci08IUFUVExJU1QgT1BUSU9OCi0gICAgICAgIHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQKLSAgICAgICAgdmFsdWUgIENEQVRBICAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpKj4KLTwhQVRUTElTVCBURVhUQVJFQQotICAgICAgICBuYW1lIENEQVRBICNSRVFVSVJFRAotICAgICAgICByb3dzIE5VTUJFUiAjUkVRVUlSRUQKLSAgICAgICAgY29scyBOVU1CRVIgI1JFUVVJUkVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gICglaGVhZC5jb250ZW50KT4KLQotPCFFTEVNRU5UIFRJVExFIC0gLSAgKCNQQ0RBVEEpKj4KLQotPCFFTEVNRU5UIEJBU0UgLSBPIEVNUFRZPgotPCFBVFRMSVNUIEJBU0UKLSAgICAgICAgaHJlZiAlVVJMICAjUkVRVUlSRUQKLSAgICAgICAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFk+Ci08IUFUVExJU1QgTUVUQQotICAgICAgICBodHRwLWVxdWl2ICBOQU1FICAgICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgdmVyc2lvbi5hdHRyICJWRVJTSU9OIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjsnIj4KLQotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gICglaHRtbC5jb250ZW50KT4KLTwhQVRUTElTVCBIVE1MCi0gICAgICAgICV2ZXJzaW9uLmF0dHI7Ci0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRW5kIG9mIERURCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2ZyYW1lc2V0LmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvZnJhbWVzZXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQzMTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvZnJhbWVzZXQuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgdGhlIEhUTUwgNC4wMSBGcmFtZXNldCBEVEQsIHdoaWNoIHNob3VsZCBiZQotICAgIHVzZWQgZm9yIGRvY3VtZW50cyB3aXRoIGZyYW1lcy4gVGhpcyBEVEQgaXMgaWRlbnRpY2FsCi0gICAgdG8gdGhlIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwgRFREIGV4Y2VwdCBmb3IgdGhlCi0gICAgY29udGVudCBtb2RlbCBvZiB0aGUgIkhUTUwiIGVsZW1lbnQ6IGluIGZyYW1lc2V0IAotICAgIGRvY3VtZW50cywgdGhlICJGUkFNRVNFVCIgZWxlbWVudCByZXBsYWNlcyB0aGUgIkJPRFkiIAotICAgIGVsZW1lbnQuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDE5OTkvMTIvMjQgMjM6MjA6MDggJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC4KLS0tPgotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGZyYW1lc2V0PgotICAgIC4uLgotICAgIDwvZnJhbWVzZXQ+Ci0gICAgPC9odG1sPgotLS0+Ci0KLTwhRU5USVRZICUgSFRNTC5GcmFtZXNldCAiSU5DTFVERSI+Ci08IUVOVElUWSAlIEhUTUw0LmR0ZCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLSVIVE1MNC5kdGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9mcmFtZXNldDQwMC5kdGQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2ZyYW1lc2V0NDAwLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ZDk2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2ZyYW1lc2V0NDAwLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIHRoZSBIVE1MIDQuMCBGcmFtZXNldCBEVEQsIHdoaWNoIHNob3VsZCBiZQotICAgIHVzZWQgZm9yIGRvY3VtZW50cyB3aXRoIGZyYW1lcy4gVGhpcyBEVEQgaXMgaWRlbnRpY2FsCi0gICAgdG8gdGhlIEhUTUwgNC4wIFRyYW5zaXRpb25hbCBEVEQgZXhjZXB0IGZvciB0aGUKLSAgICBjb250ZW50IG1vZGVsIG9mIHRoZSAiSFRNTCIgZWxlbWVudDogaW4gZnJhbWVzZXQgCi0gICAgZG9jdW1lbnRzLCB0aGUgIkZSQU1FU0VUIiBlbGVtZW50IHJlcGxhY2VzIHRoZSAiQk9EWSIgCi0gICAgZWxlbWVudC4KLQotICAgICAgICAgIERyYWZ0OiAkRGF0ZTogMTk5Ny8xMi8xMSAxNTozMToxMSAkCi0KLSAgICAgICAgICBBdXRob3JzOgotICAgICAgICAgICAgICBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0gICAgICAgICAgICAgIEFybmF1ZCBMZSBIb3JzIDxsZWhvcnNAdzMub3JnPgotICAgICAgICAgICAgICBJYW4gSmFjb2JzIDxpakB3My5vcmc+Ci0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IEhUTUwgNC4wIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAuCi0tLT4KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ZyYW1lc2V0LmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxmcmFtZXNldD4KLSAgICAuLi4KLSAgICA8L2ZyYW1lc2V0PgotICAgIDwvaHRtbD4KLS0tPgotCi08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklOQ0xVREUiPgotPCFFTlRJVFkgJSBIVE1MNC5kdGQgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLSVIVE1MNC5kdGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLTEuZHRkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLTEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVlYTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC0xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhLS0gICAgaHRtbC0xLmR0ZA0KLSAgICAgICAgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIGZvciB0aGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAgICAgICAgDQotd2l0aCBMZXZlbCAxIEV4dGVuc2lvbnMgICAgICAgIChIVE1MIExldmVsIDEgRFREKS4gICAgICAgIA0KLSRJZDogaHRtbC0xLmR0ZCx2IDEuMiAxOTk1LzAzLzI5IDE4OjUzOjEwIGNvbm5vbGx5IEV4cCAkICAgICAgICANCi1BdXRob3I6IERhbmllbCBXLiBDb25ub2xseSA8Y29ubm9sbHlAdzMub3JnPiAgICAgICAgDQotU2VlIEFsc286IGh0dHA6Ly9pbmZvLmNlcm4uY2gvaHlwZXJ0ZXh0L1dXVy9NYXJrVXAvTWFya1VwLmh0bWwNCi0tLT4NCi08IUVOVElUWSAlIEhUTUwuVmVyc2lvbiAgICAgICAgDQotIi0vL0lFVEYvL0RURCBIVE1MIDIuMCBMZXZlbCAxLy9FTiINCi0gICAgICAgIC0tIFR5cGljYWwgdXNhZ2U6DQotICAgICAgICAgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICAgICAgICAgICAgICAgDQotIi0vL0lFVEYvL0RURCBIVE1MIExldmVsIDEvL0VOIj4gICAgICAgIA0KLSAgICA8aHRtbD4gICAgICAgIA0KLSAgICAuLi4gICAgICAgIA0KLSAgICA8L2h0bWw+ICAgICAgICANCi0tLSAgICAgICAgDQotPg0KLTwhLS0gRmVhdHVyZSBUZXN0IEVudGl0aWVzIC0tPg0KLTwhRU5USVRZICUgSFRNTC5Gb3JtcyAiSUdOT1JFIj4NCi08IUVOVElUWSAlIGh0bWwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4NCi0laHRtbDsNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2h0bWwtMXMuZHRkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLTFzLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNTNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2h0bWwtMXMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCEtLSAgICBodG1sLTFzLmR0ZA0KLSAgICAgICAgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIGZvciB0aGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAgICAgICAgDQotU3RydWN0IExldmVsIDEgICAgICAgIA0KLSRJZDogaHRtbC0xcy5kdGQsdiAxLjMgMTk5NS8wNi8wMiAxODo1NTo0MyBjb25ub2xseSBFeHAgJCAgICAgICAgDQotQXV0aG9yOiBEYW5pZWwgVy4gQ29ubm9sbHkgPGNvbm5vbGx5QHczLm9yZz4gICAgICAgIA0KLVNlZSBBbHNvOiBodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL01hcmtVcC9NYXJrVXAuaHRtbA0KLS0tPg0KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICAgICAgICANCi0iLS8vSUVURi8vRFREIEhUTUwgMi4wIFN0cmljdCBMZXZlbCAxLy9FTiINCi0gICAgICAgIC0tIFR5cGljYWwgdXNhZ2U6DQotICAgICAgICAgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICAgICAgICAgICAgICAgDQotIi0vL0lFVEYvL0RURCBIVE1MIFN0cmljdCBMZXZlbCAxLy9FTiI+ICAgICAgICANCi0gICAgPGh0bWw+ICAgICAgICANCi0gICAgLi4uICAgICAgICANCi0gICAgPC9odG1sPiAgICAgICAgDQotLS0gICAgICAgIA0KLT4NCi08IS0tIEZlYXR1cmUgVGVzdCBFbnRpdGllcyAtLT4NCi08IUVOVElUWSAlIEhUTUwuUmVjb21tZW5kZWQgIklOQ0xVREUiPg0KLTwhRU5USVRZICUgaHRtbC0xIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wIExldmVsIDEvL0VOIj4NCi0laHRtbC0xOw0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC1zLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC1zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNDU0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2h0bWwtcy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IS0tICAgIGh0bWwtcy5kdGQNCi0gICAgICAgIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbiBmb3IgdGhlIEh5cGVyVGV4dCBNYXJrdXAgTGFuZ3VhZ2UgICAgICAgIA0KLXdpdGggc3RyaWN0IHZhbGlkYXRpb24gKEhUTUwgU3RyaWN0IERURCkuICAgICAgICANCi0kSWQ6IGh0bWwtcy5kdGQsdiAxLjMgMTk5NS8wNi8wMiAxODo1NTo0NiBjb25ub2xseSBFeHAgJCAgICAgICAgDQotQXV0aG9yOiBEYW5pZWwgVy4gQ29ubm9sbHkgPGNvbm5vbGx5QHczLm9yZz4gICAgICAgIA0KLVNlZSBBbHNvOiBodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL01hcmtVcC9NYXJrVXAuaHRtbA0KLS0tPg0KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICAgICAgICANCi0iLS8vSUVURi8vRFREIEhUTUwgMi4wIFN0cmljdC8vRU4iDQotICAgICAgICAtLSBUeXBpY2FsIHVzYWdlOg0KLSAgICAgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAgICAgICAgICAgICAgIA0KLSItLy9JRVRGLy9EVEQgSFRNTCBTdHJpY3QvL0VOIj4gICAgICAgIA0KLSAgICA8aHRtbD4gICAgICAgIA0KLSAgICAuLi4gICAgICAgIA0KLSAgICA8L2h0bWw+ICAgICAgICANCi0tLSAgICAgICAgDQotPg0KLTwhLS0gRmVhdHVyZSBUZXN0IEVudGl0aWVzIC0tPg0KLTwhRU5USVRZICUgSFRNTC5SZWNvbW1lbmRlZCAiSU5DTFVERSI+DQotPCFFTlRJVFkgJSBodG1sIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+DQotJWh0bWw7DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjN2Y3ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi08IS0tICAgIGh0bWwuZHRkDQotICAgICAgICBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gZm9yIHRoZSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlICAgICAgICAgICAgICAgDQotIChIVE1MIERURCkgICAgICAgIA0KLSRJZDogaHRtbC5kdGQsdiAxLjMwIDE5OTUvMDkvMjEgMjM6MzA6MTkgY29ubm9sbHkgRXhwICQgICAgICAgIA0KLUF1dGhvcjogRGFuaWVsIFcuIENvbm5vbGx5IDxjb25ub2xseUB3My5vcmc+ICAgICAgICANCi1TZWUgQWxzbzogaHRtbC5kZWNsLCBodG1sLTEuZHRkICAgICAgICANCi0gIGh0dHA6Ly93d3cudzMub3JnL2h5cGVydGV4dC9XV1cvTWFya1VwL01hcmtVcC5odG1sDQotLS0+DQotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24NCi0gICAgICAgICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIg0KLSAgICAgICAgLS0gVHlwaWNhbCB1c2FnZToNCi0gICAgICAgICAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+DQotICAgICAgICAgICAgPGh0bWw+DQotICAgICAgICAgICAgLi4uDQotICAgICAgICAgICAgPC9odG1sPg0KLSAgICAgICAgLS0NCi0gICAgICAgID4NCi08IS0tPT09PT09PT09PT09IEZlYXR1cmUgVGVzdCBFbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIEhUTUwuUmVjb21tZW5kZWQgIklHTk9SRSIgICAgICAgIA0KLS0tIENlcnRhaW4gZmVhdHVyZXMgb2YgdGhlIGxhbmd1YWdlIGFyZSBuZWNlc3NhcnkgZm9yICAgICAgICANCi0gICBjb21wYXRpYmlsaXR5IHdpdGggd2lkZXNwcmVhZCB1c2FnZSwgYnV0IHRoZXkgbWF5ICAgICAgICANCi0gICBjb21wcm9taXNlIHRoZSBzdHJ1Y3R1cmFsIGludGVncml0eSBvZiBhIGRvY3VtZW50LiAgICAgICAgDQotICAgVGhpcyBmZWF0dXJlIHRlc3QgZW50aXR5IGVuYWJsZXMgYSBtb3JlIHByZXNjcmlwdGl2ZSAgICAgICAgDQotICAgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIHRoYXQgZWxpbWluYXRlcyAgICAgICAgDQotICAgdGhvc2UgZmVhdHVyZXMuICAgICAgICANCi0tLT4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWw0KLSAgICAgICAgPCFFTlRJVFkgJSBIVE1MLkRlcHJlY2F0ZWQgIklHTk9SRSI+DQotXV0+DQotPCFFTlRJVFkgJSBIVE1MLkRlcHJlY2F0ZWQgIklOQ0xVREUiICAgICAgICANCi0tLSBDZXJ0YWluIGZlYXR1cmVzIG9mIHRoZSBsYW5ndWFnZSBhcmUgbmVjZXNzYXJ5IGZvciAgICAgICAgDQotICAgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24sICAgICAgICANCi0gICBidXQgdGhleSB0ZW5kIHRvIGJlIHVzZWQgYW5kIGltcGxlbWVudGVkIGluY29uc2lzdGVudGx5LCAgICAgICAgDQotICAgYW5kIHRoZWlyIHVzZSBpcyBkZXByZWNhdGVkLiBUaGlzIGZlYXR1cmUgdGVzdCBlbnRpdHkgICAgICAgIA0KLSAgIGVuYWJsZXMgYSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gdGhhdCBlbGltaW5hdGVzICAgICAgICANCi0gICB0aGVzZSBmZWF0dXJlcy4gICAgICAgIA0KLS0tPg0KLTwhRU5USVRZICUgSFRNTC5IaWdobGlnaHRpbmcgIklOQ0xVREUiICAgICAgICANCi0tLSBVc2UgdGhpcyBmZWF0dXJlIHRlc3QgZW50aXR5IHRvIHZhbGlkYXRlIHRoYXQgYSAgICAgICAgDQotICAgZG9jdW1lbnQgdXNlcyBubyBoaWdobGlnaHRpbmcgdGFncywgd2hpY2ggbWF5IGJlICAgICAgICANCi0gICBpZ25vcmVkIG9uIG1pbmltYWwgaW1wbGVtZW50YXRpb25zLiAgICAgICAgDQotLS0+DQotPCFFTlRJVFkgJSBIVE1MLkZvcm1zICJJTkNMVURFIg0KLSAgICAgICAgLS0gVXNlIHRoaXMgZmVhdHVyZSB0ZXN0IGVudGl0eSB0byB2YWxpZGF0ZSB0aGF0IGEgZG9jdW1lbnQNCi0gICAgICAgICAgIGNvbnRhaW5zIG5vIGZvcm1zLCB3aGljaCBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiBtaW5pbWFsDQotICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMNCi0gICAgICAgIC0tPg0KLTwhLS09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIENvbnRlbnQtVHlwZSAiQ0RBVEEiDQotICAgICAgICAtLSBtZWFuaW5nIGFuIGludGVybmV0IG1lZGlhIHR5cGUNCi0gICAgICAgICAgIChha2EgTUlNRSBjb250ZW50IHR5cGUsIGFzIHBlciBSRkMxNTIxKQ0KLSAgICAgICAgLS0+DQotPCFFTlRJVFkgJSBIVFRQLU1ldGhvZCAiR0VUIHwgUE9TVCINCi0gICAgICAgIC0tIGFzIHBlciBIVFRQIHNwZWNpZmljYXRpb24sIGluIHByb2dyZXNzDQotICAgICAgICAtLT4NCi08IS0tPT09PT09PT09IERURCAiTWFjcm9zIiA9PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4NCi08IUVOVElUWSAlIGxpc3QgIiBVTCB8IE9MIHwgRElSIHwgTUVOVSAiID4NCi08IS0tPT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIElTT2xhdDEgUFVCTElDDQotICAiSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgQWRkZWQgTGF0aW4gMS8vRU4vL0hUTUwiPg0KLSVJU09sYXQxOw0KLTwhRU5USVRZIGFtcCBDREFUQSAiJiMzODsiICAgICAtLSBhbXBlcnNhbmQgICAgICAgICAgLS0+DQotPCFFTlRJVFkgZ3QgQ0RBVEEgIiYjNjI7IiAgICAgIC0tIGdyZWF0ZXIgdGhhbiAgICAgICAtLT4NCi08IUVOVElUWSBsdCBDREFUQSAiJiM2MDsiICAgICAgLS0gbGVzcyB0aGFuICAgICAgICAgIC0tPg0KLTwhRU5USVRZIHF1b3QgQ0RBVEEgIiYjMzQ7IiAgICAtLSBkb3VibGUgcXVvdGUgICAgICAgLS0+DQotPCEtLT09PT09PT09PSBTR01MIERvY3VtZW50IEFjY2VzcyAoU0RBKSBQYXJhbWV0ZXIgRW50aXRpZXMgPT09PT0tLT4NCi08IS0tIEhUTUwgMi4wIGNvbnRhaW5zIFNHTUwgRG9jdW1lbnQgQWNjZXNzIChTREEpIGZpeGVkIGF0dHJpYnV0ZXMNCi1pbiBzdXBwb3J0IG9mIGVhc3kgdHJhbnNmb3JtYXRpb24gdG8gdGhlIEludGVybmF0aW9uYWwgQ29tbWl0dGVlDQotZm9yIEFjY2Vzc2libGUgRG9jdW1lbnQgRGVzaWduIChJQ0FERCkgRFREICAgICAgICANCi0gIi0vL0VDLVVTQS1DREEvSUNBREQvL0RURCBJQ0FERDIyLy9FTiIuDQotSUNBREQgYXBwbGljYXRpb25zIGFyZSBkZXNpZ25lZCB0byBzdXBwb3J0IHVzYWJsZSBhY2Nlc3MgdG8NCi1zdHJ1Y3R1cmVkIGluZm9ybWF0aW9uIGJ5IHByaW50LWltcGFpcmVkIGluZGl2aWR1YWxzIHRocm91Z2gNCi1CcmFpbGxlLCBsYXJnZSBwcmludCBhbmQgdm9pY2Ugc3ludGhlc2lzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24NCi1TREEgJiBJQ0FERDogIA0KLSAgICAgICAgLSBJU08gMTIwODM6MTk5MywgQW5uZXggQS44LCBGYWNpbGl0aWVzIGZvciBCcmFpbGxlLCAgICAgICAgDQotICBsYXJnZSBwcmludCBhbmQgY29tcHV0ZXIgdm9pY2UNCi0gICAgICAgIC0gSUNBREQgTGlzdFNlcnYgICAgICAgIA0KLSAgPElDQUREJUFTVUFDQUQuQklUTkVUQEFSSVpWTTEuY2NpdC5hcml6b25hLmVkdT4NCi0gICAgICAgIC0gVXNlbmV0IG5ld3MgZ3JvdXAgYml0Lmxpc3RzZXJ2LmVhc2kNCi0gICAgICAgIC0gUmVjb3JkaW5nIGZvciB0aGUgQmxpbmQsICsxIDgwMCAyMjEgNDc5Mg0KLS0tPg0KLTwhRU5USVRZICUgU0RBRk9STSAgIlNEQUZPUk0gIENEQVRBICAjRklYRUQiICAgICAgICANCi0gIC0tIG9uZSB0byBvbmUgbWFwcGluZyAgICAgICAgLS0+DQotPCFFTlRJVFkgJSBTREFSVUxFICAiU0RBUlVMRSAgQ0RBVEEgICNGSVhFRCIgICAgICAgIA0KLSAgLS0gY29udGV4dC1zZW5zaXRpdmUgbWFwcGluZyAtLT4NCi08IUVOVElUWSAlIFNEQVBSRUYgICJTREFQUkVGICBDREFUQSAgI0ZJWEVEIiAgICAgICAgDQotICAtLSBnZW5lcmF0ZWQgdGV4dCBwcmVmaXggICAgIC0tPg0KLTwhRU5USVRZICUgU0RBU1VGRiAgIlNEQVNVRkYgIENEQVRBICAjRklYRUQiICAgICAgICANCi0gIC0tIGdlbmVyYXRlZCB0ZXh0IHN1ZmZpeCAgICAgLS0+DQotPCFFTlRJVFkgJSBTREFTVVNQICAiU0RBU1VTUCAgTkFNRSAgICNGSVhFRCIgICAgICAgIA0KLSAgLS0gc3VzcGVuZCB0cmFuc2Zvcm0gcHJvY2VzcyAtLT4NCi08IS0tPT09PT09PT09PSBUZXh0IE1hcmt1cCA9PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IVsgJUhUTUwuSGlnaGxpZ2h0aW5nIFsNCi08IUVOVElUWSAlIGZvbnQgIiBUVCB8IEIgfCBJICI+DQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgQ09ERSB8IFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFICI+DQotPCFFTlRJVFkgJSB0ZXh0ICIjUENEQVRBIHwgQSB8IElNRyB8IEJSIHwgJXBocmFzZSB8ICVmb250Ij4NCi08IUVMRU1FTlQgKCVmb250O3wlcGhyYXNlKSAtIC0gKCV0ZXh0KSo+DQotPCFBVFRMSVNUICggVFQgfCBDT0RFIHwgU0FNUCB8IEtCRCB8IFZBUiApDQotICAgICAgICAlU0RBRk9STTsgIkxpdCINCi0gICAgICAgID4NCi08IUFUVExJU1QgKCBCIHwgU1RST05HICkNCi0gICAgICAgICVTREFGT1JNOyAiQiINCi0gICAgICAgID4NCi08IUFUVExJU1QgKCBJIHwgRU0gfCBDSVRFICkNCi0gICAgICAgICVTREFGT1JNOyAiSXQiDQotICAgICAgICA+DQotPCEtLSA8VFQ+ICAgICAgIFR5cGV3cml0ZXIgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxCPiAgICAgICAgQm9sZCB0ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPEk+ICAgICAgICBJdGFsaWMgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8RU0+ICAgICAgIEVtcGhhc2l6ZWQgcGhyYXNlICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxTVFJPTkc+ICAgU3Ryb25nIGVtcGhhc2lzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPENPREU+ICAgICBTb3VyY2UgY29kZSBwaHJhc2UgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8U0FNUD4gICAgIFNhbXBsZSB0ZXh0IG9yIGNoYXJhY3RlcnMgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxLQkQ+ICAgICAgS2V5Ym9hcmQgcGhyYXNlLCBlLmcuIHVzZXIgaW5wdXQgICAgICAgIC0tPg0KLTwhLS0gPFZBUj4gICAgICBWYXJpYWJsZSBwaHJhc2Ugb3Igc3Vic3RpdHV0YWJsZSAgICAgICAgLS0+DQotPCEtLSA8Q0lURT4gICAgIE5hbWUgb3IgdGl0bGUgb2YgY2l0ZWQgd29yayAgICAgICAgICAgICAtLT4NCi08IUVOVElUWSAlIHByZS5jb250ZW50ICIjUENEQVRBIHwgQSB8IEhSIHwgQlIgfCAlZm9udCB8ICVwaHJhc2UiPg0KLV1dPg0KLTwhRU5USVRZICUgdGV4dCAiI1BDREFUQSB8IEEgfCBJTUcgfCBCUiI+DQotPCFFTEVNRU5UIEJSICAgIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgQlINCi0gICAgICAgICVTREFQUkVGOyAiJiNSRTsiDQotICAgICAgICA+DQotPCEtLSA8QlI+ICAgICAgIExpbmUgYnJlYWsgICAgICAtLT4NCi08IS0tPT09PT09PT09IExpbmsgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIGxpbmtUeXBlICJOQU1FUyI+DQotPCFFTlRJVFkgJSBsaW5rRXh0cmFBdHRyaWJ1dGVzDQotICAgICAgICAiUkVMICVsaW5rVHlwZSAjSU1QTElFRA0KLSAgICAgICAgUkVWICVsaW5rVHlwZSAjSU1QTElFRA0KLSAgICAgICAgVVJOIENEQVRBICNJTVBMSUVEDQotICAgICAgICBUSVRMRSBDREFUQSAjSU1QTElFRA0KLSAgICAgICAgTUVUSE9EUyBOQU1FUyAjSU1QTElFRA0KLSAgICAgICAgIj4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWw0KLSAgICAgICAgPCFFTlRJVFkgJSBBLmNvbnRlbnQgICAiKCV0ZXh0KSoiDQotICAgICAgICAtLSA8SDE+PGEgbmFtZT0ieHh4Ij5IZWFkaW5nPC9hPjwvSDE+DQotICAgICAgICAgICAgICAgIGlzIHByZWZlcnJlZCB0bw0KLSAgICAgICAgICAgPGEgbmFtZT0ieHh4Ij48SDE+SGVhZGluZzwvSDE+PC9hPg0KLSAgICAgICAgLS0+DQotXV0+DQotPCFFTlRJVFkgJSBBLmNvbnRlbnQgICAiKCVoZWFkaW5nfCV0ZXh0KSoiPg0KLTwhRUxFTUVOVCBBICAgICAtIC0gJUEuY29udGVudCAtKEEpPg0KLTwhQVRUTElTVCBBDQotICAgICAgICBIUkVGIENEQVRBICNJTVBMSUVEDQotICAgICAgICBOQU1FIENEQVRBICNJTVBMSUVEDQotICAgICAgICAlbGlua0V4dHJhQXR0cmlidXRlczsNCi0gICAgICAgICVTREFQUkVGOyAiPEFuY2hvcjogI0F0dExpc3Q+Ig0KLSAgICAgICAgPg0KLTwhLS0gPEE+ICAgICAgICAgICAgICAgQW5jaG9yOyBzb3VyY2UvZGVzdGluYXRpb24gb2YgbGluayAgICAtLT4NCi08IS0tIDxBIE5BTUU9Ii4uLiI+ICAgICBOYW1lIG9mIHRoaXMgYW5jaG9yICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPEEgSFJFRj0iLi4uIj4gICAgIEFkZHJlc3Mgb2YgbGluayBkZXN0aW5hdGlvbiAgICAgICAgIC0tPg0KLTwhLS0gPEEgVVJOPSIuLi4iPiAgICAgIFBlcm1hbmVudCBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uICAgICAtLT4NCi08IS0tIDxBIFJFTD0uLi4+ICAgICAgICBSZWxhdGlvbnNoaXAgdG8gZGVzdGluYXRpb24gICAgICAgLS0+DQotPCEtLSA8QSBSRVY9Li4uPiAgICAgICAgUmVsYXRpb25zaGlwIG9mIGRlc3RpbmF0aW9uIHRvIHRoaXMgICAgLS0+DQotPCEtLSA8QSBUSVRMRT0iLi4uIj4gICAgVGl0bGUgb2YgZGVzdGluYXRpb24gKGFkdmlzb3J5KSAgICAgICAtLT4NCi08IS0tIDxBIE1FVEhPRFM9Ii4uLiI+ICBPcGVyYXRpb25zIG9uIGRlc3RpbmF0aW9uIChhZHZpc29yeSkgICAgIC0tPg0KLTwhLS09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KLTwhRUxFTUVOVCBJTUcgICAgLSBPIEVNUFRZPg0KLTwhQVRUTElTVCBJTUcNCi0gICAgICAgIFNSQyBDREFUQSAgI1JFUVVJUkVEDQotICAgICAgICBBTFQgQ0RBVEEgI0lNUExJRUQNCi0gICAgICAgIEFMSUdOICh0b3B8bWlkZGxlfGJvdHRvbSkgI0lNUExJRUQNCi0gICAgICAgIElTTUFQIChJU01BUCkgI0lNUExJRUQNCi0gICAgICAgICVTREFQUkVGOyAiPEZpZz48P1NEQVRyYW5zIEltZzogI0F0dExpc3Q+I0F0dFZhbChBbHQpPC9GaWc+Ig0KLSAgICAgICAgPg0KLTwhLS0gPElNRz4gICAgICAgICAgICAgIEltYWdlOyBpY29uLCBnbHlwaCBvciBpbGx1c3RyYXRpb24gICAgICAtLT4NCi08IS0tIDxJTUcgU1JDPSIuLi4iPiAgICBBZGRyZXNzIG9mIGltYWdlIG9iamVjdCAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8SU1HIEFMVD0iLi4uIj4gICAgVGV4dHVhbCBhbHRlcm5hdGl2ZSAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPElNRyBBTElHTj0uLi4+ICAgIFBvc2l0aW9uIHJlbGF0aXZlIHRvIHRleHQgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxJTUcgSVNNQVA+ICAgICAgICBFYWNoIHBpeGVsIGNhbiBiZSBhIGxpbmsgICAgICAgICAgICAgICAgLS0+DQotPCEtLT09PT09PT09PT0gUGFyYWdyYXBocz09PT09PT09PT09PT09PT09PT09PT09LS0+DQotPCFFTEVNRU5UIFAgICAgIC0gTyAoJXRleHQpKj4NCi08IUFUVExJU1QgUA0KLSAgICAgICAgJVNEQUZPUk07ICJQYXJhIg0KLSAgICAgICAgPg0KLTwhLS0gPFA+ICAgICAgICBQYXJhZ3JhcGggICAgICAgLS0+DQotPCEtLT09PT09PT09PT0gSGVhZGluZ3MsIFRpdGxlcywgU2VjdGlvbnMgPT09PT09PT09PT09PT09LS0+DQotPCFFTEVNRU5UIEhSICAgIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgSFINCi0gICAgICAgICVTREFQUkVGOyAiJiNSRTsmI1JFOyINCi0gICAgICAgID4NCi08IS0tIDxIUj4gICAgICAgSG9yaXpvbnRhbCBydWxlIC0tPg0KLTwhRUxFTUVOVCAoICVoZWFkaW5nICkgIC0gLSAgKCV0ZXh0OykqPg0KLTwhQVRUTElTVCBIMQ0KLSAgICAgICAgJVNEQUZPUk07ICJIMSINCi0gICAgICAgID4NCi08IUFUVExJU1QgSDINCi0gICAgICAgICVTREFGT1JNOyAiSDIiDQotICAgICAgICA+DQotPCFBVFRMSVNUIEgzDQotICAgICAgICAlU0RBRk9STTsgIkgzIg0KLSAgICAgICAgPg0KLTwhQVRUTElTVCBINA0KLSAgICAgICAgJVNEQUZPUk07ICJINCINCi0gICAgICAgID4NCi08IUFUVExJU1QgSDUNCi0gICAgICAgICVTREFGT1JNOyAiSDUiDQotICAgICAgICA+DQotPCFBVFRMSVNUIEg2DQotICAgICAgICAlU0RBRk9STTsgIkg2Ig0KLSAgICAgICAgPg0KLTwhLS0gPEgxPiAgICAgICBIZWFkaW5nLCBsZXZlbCAxIC0tPg0KLTwhLS0gPEgyPiAgICAgICBIZWFkaW5nLCBsZXZlbCAyIC0tPg0KLTwhLS0gPEgzPiAgICAgICBIZWFkaW5nLCBsZXZlbCAzIC0tPg0KLTwhLS0gPEg0PiAgICAgICBIZWFkaW5nLCBsZXZlbCA0IC0tPg0KLTwhLS0gPEg1PiAgICAgICBIZWFkaW5nLCBsZXZlbCA1IC0tPg0KLTwhLS0gPEg2PiAgICAgICBIZWFkaW5nLCBsZXZlbCA2IC0tPg0KLTwhLS09PT09PT09PT09IFRleHQgRmxvd3MgPT09PT09PT09PT09PT09PT09PT09PS0tPg0KLTwhWyAlSFRNTC5Gb3JtcyBbDQotICAgICAgICA8IUVOVElUWSAlIGJsb2NrLmZvcm1zICJCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVgiPg0KLV1dPg0KLTwhRU5USVRZICUgYmxvY2suZm9ybXMgIkJMT0NLUVVPVEUiPg0KLTwhWyAlSFRNTC5EZXByZWNhdGVkIFsNCi0gICAgICAgIDwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUgfCBYTVAgfCBMSVNUSU5HIj4NCi1dXT4NCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4NCi08IUVOVElUWSAlIGJsb2NrICJQIHwgJWxpc3QgfCBETA0KLSAgICAgICAgfCAlcHJlZm9ybWF0dGVkDQotICAgICAgICB8ICVibG9jay5mb3JtcyI+DQotPCFFTlRJVFkgJSBmbG93ICIoJXRleHR8JWJsb2NrKSoiPg0KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQgIiNQQ0RBVEEgfCBBIHwgSFIgfCBCUiI+DQotPCFFTEVNRU5UIFBSRSAtIC0gKCVwcmUuY29udGVudCkqPg0KLTwhQVRUTElTVCBQUkUNCi0gICAgICAgIFdJRFRIIE5VTUJFUiAjaW1wbGllZA0KLSAgICAgICAgJVNEQUZPUk07ICJMaXQiDQotICAgICAgICA+DQotPCEtLSA8UFJFPiAgICAgICAgICAgICAgUHJlZm9ybWF0dGVkIHRleHQgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxQUkUgV0lEVEg9Li4uPiAgICBNYXhpbXVtIGNoYXJhY3RlcnMgcGVyIGxpbmUgICAgIC0tPg0KLTwhWyAlSFRNTC5EZXByZWNhdGVkIFsNCi08IUVOVElUWSAlIGxpdGVyYWwgIkNEQVRBIg0KLSAgICAgICAgLS0gaGlzdG9yaWNhbCwgbm9uLWNvbmZvcm1pbmcgcGFyc2luZyBtb2RlIHdoZXJlDQotICAgICAgICAgICB0aGUgb25seSBtYXJrdXAgc2lnbmFsIGlzIHRoZSBlbmQgdGFnDQotICAgICAgICAgICBpbiBmdWxsDQotICAgICAgICAtLT4NCi08IUVMRU1FTlQgKFhNUHxMSVNUSU5HKSAtIC0gICVsaXRlcmFsPg0KLTwhQVRUTElTVCBYTVANCi0gICAgICAgICVTREFGT1JNOyAiTGl0Ig0KLSAgICAgICAgJVNEQVBSRUY7ICJFeGFtcGxlOiYjUkU7Ig0KLSAgICAgICAgPg0KLTwhQVRUTElTVCBMSVNUSU5HDQotICAgICAgICAlU0RBRk9STTsgIkxpdCINCi0gICAgICAgICVTREFQUkVGOyAiTGlzdGluZzomI1JFOyINCi0gICAgICAgID4NCi08IS0tIDxYTVA+ICAgICAgICAgICAgICBFeGFtcGxlIHNlY3Rpb24gICAgICAgICAtLT4NCi08IS0tIDxMSVNUSU5HPiAgICAgICAgICBDb21wdXRlciBsaXN0aW5nICAgICAgICAtLT4NCi08IUVMRU1FTlQgUExBSU5URVhUIC0gTyAlbGl0ZXJhbD4NCi08IS0tIDxQTEFJTlRFWFQ+ICAgICAgICBQbGFpbiB0ZXh0IHBhc3NhZ2UgICAgICAtLT4NCi08IUFUVExJU1QgUExBSU5URVhUDQotICAgICAgICAlU0RBRk9STTsgIkxpdCINCi0gICAgICAgID4NCi1dXT4NCi08IS0tPT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT0tLT4NCi08IUVMRU1FTlQgREwgICAgLSAtICAoRFQgfCBERCkrPg0KLTwhQVRUTElTVCBETA0KLSAgICAgICAgQ09NUEFDVCAoQ09NUEFDVCkgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTGlzdCINCi0gICAgICAgICVTREFQUkVGOyAiRGVmaW5pdGlvbiBMaXN0OiINCi0gICAgICAgID4NCi08IUVMRU1FTlQgRFQgICAgLSBPICgldGV4dCkqPg0KLTwhQVRUTElTVCBEVA0KLSAgICAgICAgJVNEQUZPUk07ICJUZXJtIg0KLSAgICAgICAgPg0KLTwhRUxFTUVOVCBERCAgICAtIE8gJWZsb3c+DQotPCFBVFRMSVNUIEREDQotICAgICAgICAlU0RBRk9STTsgIkxJdGVtIg0KLSAgICAgICAgPg0KLTwhLS0gPERMPiAgICAgICAgICAgICAgIERlZmluaXRpb24gbGlzdCwgb3IgZ2xvc3NhcnkgICAgLS0+DQotPCEtLSA8REwgQ09NUEFDVD4gICAgICAgQ29tcGFjdCBzdHlsZSBsaXN0ICAgICAgICAgICAgICAtLT4NCi08IS0tIDxEVD4gICAgICAgICAgICAgICBUZXJtIGluIGRlZmluaXRpb24gbGlzdCAgICAgICAgIC0tPg0KLTwhLS0gPEREPiAgICAgICAgICAgICAgIERlZmluaXRpb24gb2YgdGVybSAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIChPTHxVTCkgLSAtICAoTEkpKz4NCi08IUFUVExJU1QgT0wNCi0gICAgICAgIENPTVBBQ1QgKENPTVBBQ1QpICNJTVBMSUVEDQotICAgICAgICAlU0RBRk9STTsgIkxpc3QiDQotICAgICAgICA+DQotPCFBVFRMSVNUIFVMDQotICAgICAgICBDT01QQUNUIChDT01QQUNUKSAjSU1QTElFRA0KLSAgICAgICAgJVNEQUZPUk07ICJMaXN0Ig0KLSAgICAgICAgPg0KLTwhLS0gPFVMPiAgICAgICAgICAgICAgIFVub3JkZXJlZCBsaXN0ICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8VUwgQ09NUEFDVD4gICAgICAgQ29tcGFjdCBsaXN0IHN0eWxlICAgICAgICAgICAgICAtLT4NCi08IS0tIDxPTD4gICAgICAgICAgICAgICBPcmRlcmVkLCBvciBudW1iZXJlZCBsaXN0ICAgICAgIC0tPg0KLTwhLS0gPE9MIENPTVBBQ1Q+ICAgICAgIENvbXBhY3QgbGlzdCBzdHlsZSAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIChESVJ8TUVOVSkgLSAtICAoTEkpKyAtKCVibG9jayk+DQotPCFBVFRMSVNUIERJUg0KLSAgICAgICAgQ09NUEFDVCAoQ09NUEFDVCkgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTGlzdCINCi0gICAgICAgICVTREFQUkVGOyAiPExIZWFkPkRpcmVjdG9yeTwvTEhlYWQ+Ig0KLSAgICAgICAgPg0KLTwhQVRUTElTVCBNRU5VDQotICAgICAgICBDT01QQUNUIChDT01QQUNUKSAjSU1QTElFRA0KLSAgICAgICAgJVNEQUZPUk07ICJMaXN0Ig0KLSAgICAgICAgJVNEQVBSRUY7ICI8TEhlYWQ+TWVudTwvTEhlYWQ+Ig0KLSAgICAgICAgPg0KLTwhLS0gPERJUj4gICAgICAgICAgICAgIERpcmVjdG9yeSBsaXN0ICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8RElSIENPTVBBQ1Q+ICAgICAgQ29tcGFjdCBsaXN0IHN0eWxlICAgICAgICAgICAgICAtLT4NCi08IS0tIDxNRU5VPiAgICAgICAgICAgICBNZW51IGxpc3QgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPE1FTlUgQ09NUEFDVD4gICAgIENvbXBhY3QgbGlzdCBzdHlsZSAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIExJICAgIC0gTyAlZmxvdz4NCi08IUFUVExJU1QgTEkNCi0gICAgICAgICVTREFGT1JNOyAiTEl0ZW0iDQotICAgICAgICA+DQotPCEtLSA8TEk+ICAgICAgICAgICAgICAgTGlzdCBpdGVtICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tPT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT0tLT4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWyAgICAgICAgDQotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQgIiglaGVhZGluZ3wlYmxvY2t8SFJ8QUREUkVTU3xJTUcpKiIgICAgICAgIA0KLS0tIDxoMT5IZWFkaW5nPC9oMT4gICAgICAgIA0KLSAgIDxwPlRleHQgLi4uICAgICAgICAgICAgICAgDQotaXMgcHJlZmVycmVkIHRvICAgICAgICANCi0gICA8aDE+SGVhZGluZzwvaDE+ICAgICAgICANCi0gICBUZXh0IC4uLiAgICAgICAgDQotLS0+DQotXV0+DQotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQgIiglaGVhZGluZyB8ICV0ZXh0IHwgJWJsb2NrIHwgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSBIUiB8IEFERFJFU1MpKiI+DQotPCFFTEVNRU5UIEJPRFkgTyBPICAlYm9keS5jb250ZW50Pg0KLTwhLS0gPEJPRFk+ICAgICBEb2N1bWVudCBib2R5ICAgLS0+DQotPCFFTEVNRU5UIEJMT0NLUVVPVEUgLSAtICVib2R5LmNvbnRlbnQ+DQotPCFBVFRMSVNUIEJMT0NLUVVPVEUNCi0gICAgICAgICVTREFGT1JNOyAiQlEiDQotICAgICAgICA+DQotPCEtLSA8QkxPQ0tRVU9URT4gICAgICAgUXVvdGVkIHBhc3NhZ2UgIC0tPg0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoJXRleHR8UCkqPg0KLTwhQVRUTElTVCAgQUREUkVTUw0KLSAgICAgICAgJVNEQUZPUk07ICJMaXQiDQotICAgICAgICAlU0RBUFJFRjsgIkFkZHJlc3M6JiNSRTsiDQotICAgICAgICA+DQotPCEtLSA8QUREUkVTUz4gIEFkZHJlc3MsIHNpZ25hdHVyZSwgb3IgYnlsaW5lICAgIC0tPg0KLTwhLS09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09LS0+DQotPCFbICVIVE1MLkZvcm1zIFsNCi08IUVMRU1FTlQgRk9STSAtIC0gJWJvZHkuY29udGVudCAtKEZPUk0pICsoSU5QVVR8U0VMRUNUfFRFWFRBUkVBKT4NCi08IUFUVExJU1QgRk9STQ0KLSAgICAgICAgQUNUSU9OIENEQVRBICNJTVBMSUVEDQotICAgICAgICBNRVRIT0QgKCVIVFRQLU1ldGhvZCkgR0VUDQotICAgICAgICBFTkNUWVBFICVDb250ZW50LVR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAlU0RBUFJFRjsgIjxQYXJhPkZvcm06PC9QYXJhPiINCi0gICAgICAgICVTREFTVUZGOyAiPFBhcmE+Rm9ybSBFbmQuPC9QYXJhPiINCi0gICAgICAgID4NCi08IS0tIDxGT1JNPiAgICAgICAgICAgICAgICAgICAgIEZpbGwtb3V0IG9yIGRhdGEtZW50cnkgZm9ybSAgICAgLS0+DQotPCEtLSA8Rk9STSBBQ1RJT049Ii4uLiI+ICAgICAgICBBZGRyZXNzIGZvciBjb21wbGV0ZWQgZm9ybSAgICAgIC0tPg0KLTwhLS0gPEZPUk0gTUVUSE9EPS4uLj4gICAgICAgICAgTWV0aG9kIG9mIHN1Ym1pdHRpbmcgZm9ybSAgICAgICAtLT4NCi08IS0tIDxGT1JNIEVOQ1RZUEU9Ii4uLiI+ICAgICAgIFJlcHJlc2VudGF0aW9uIG9mIGZvcm0gZGF0YSAgICAgLS0+DQotPCFFTlRJVFkgJSBJbnB1dFR5cGUgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8DQotICAgICAgICAgICAgICAgICAgICAgICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8DQotICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0UgfCBISURERU4gKSI+DQotPCFFTEVNRU5UIElOUFVUIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgSU5QVVQgICAgICAgIA0KLVRZUEUgJUlucHV0VHlwZSBURVhUICAgICAgICANCi1OQU1FIENEQVRBICNJTVBMSUVEICAgICAgICANCi1WQUxVRSBDREFUQSAjSU1QTElFRCAgICAgICAgDQotU1JDIENEQVRBICNJTVBMSUVEICAgICAgICANCi1DSEVDS0VEIChDSEVDS0VEKSAjSU1QTElFRCAgICAgICAgDQotU0laRSBDREFUQSAjSU1QTElFRCAgICAgICAgDQotTUFYTEVOR1RIIE5VTUJFUiAjSU1QTElFRCAgICAgICAgDQotQUxJR04gKHRvcHxtaWRkbGV8Ym90dG9tKSAjSU1QTElFRA0KLSAgICAgICAgJVNEQVBSRUY7ICJJbnB1dDogIiAgICAgICAgDQotPg0KLTwhLS0gPElOUFVUPiAgICAgICAgIEZvcm0gaW5wdXQgZGF0dW0gICAgICAgICAtLT4NCi08IS0tIDxJTlBVVCBUWVBFPS4uLj4gICAgIFR5cGUgb2YgaW5wdXQgaW50ZXJhY3Rpb24gICAgICAgIC0tPg0KLTwhLS0gPElOUFVUIE5BTUU9Li4uPiAgICAgTmFtZSBvZiBmb3JtIGRhdHVtICAgICAgICAgICAgIC0tPg0KLTwhLS0gPElOUFVUIFZBTFVFPSIuLi4iPiAgICAgICAgRGVmYXVsdC9pbml0aWFsL3NlbGVjdGVkIHZhbHVlIC0tPg0KLTwhLS0gPElOUFVUIFNSQz0iLi4uIj4gICBBZGRyZXNzIG9mIGltYWdlICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8SU5QVVQgQ0hFQ0tFRD4gICAgICAgSW5pdGlhbCBzdGF0ZSBpcyAib24iICAgICAgICAgLS0+DQotPCEtLSA8SU5QVVQgU0laRT0uLi4+ICAgICBGaWVsZCBzaXplIGhpbnQgICAgICAgICAgIC0tPg0KLTwhLS0gPElOUFVUIE1BWExFTkdUSD0uLi4+ICAgICAgRGF0YSBsZW5ndGggbWF4aW11bSAgIC0tPg0KLTwhLS0gPElOUFVUIEFMSUdOPS4uLj4gICBJbWFnZSBhbGlnbm1lbnQgICAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVElPTispIC0oSU5QVVR8U0VMRUNUfFRFWFRBUkVBKT4NCi08IUFUVExJU1QgU0VMRUNUDQotICAgICAgICBOQU1FIENEQVRBICNSRVFVSVJFRA0KLSAgICAgICAgU0laRSBOVU1CRVIgI0lNUExJRUQNCi0gICAgICAgIE1VTFRJUExFIChNVUxUSVBMRSkgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTGlzdCINCi0gICAgICAgICVTREFQUkVGOw0KLSAgICAgICAgIjxMSGVhZD5TZWxlY3QgI0F0dFZhbChNdWx0aXBsZSk8L0xIZWFkPiIgICAgICAgIA0KLT4NCi08IS0tIDxTRUxFQ1Q+ICAgICAgU2VsZWN0aW9uIG9mIG9wdGlvbihzKSAgIC0tPg0KLTwhLS0gPFNFTEVDVCBOQU1FPS4uLj4gICBOYW1lIG9mIGZvcm0gZGF0dW0gICAgICAgICAgIC0tPg0KLTwhLS0gPFNFTEVDVCBTSVpFPS4uLj4gICBPcHRpb25zIGRpc3BsYXllZCBhdCBhIHRpbWUgICAgIC0tPg0KLTwhLS0gPFNFTEVDVCBNVUxUSVBMRT4gICBNdWx0aXBsZSBzZWxlY3Rpb25zIGFsbG93ZWQgICAgIC0tPg0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSo+DQotPCFBVFRMSVNUIE9QVElPTg0KLSAgICAgICAgU0VMRUNURUQgKFNFTEVDVEVEKSAjSU1QTElFRA0KLSAgICAgICAgVkFMVUUgQ0RBVEEgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTEl0ZW0iDQotICAgICAgICAlU0RBUFJFRjsNCi0gICAgICAgICJPcHRpb246ICNBdHRWYWwoVmFsdWUpICNBdHRWYWwoU2VsZWN0ZWQpIiAgICAgICAgDQotPg0KLTwhLS0gPE9QVElPTj4gICAgICBBIHNlbGVjdGlvbiBvcHRpb24gICAgICAgICAgIC0tPg0KLTwhLS0gPE9QVElPTiBTRUxFQ1RFRD4gICBJbml0aWFsIHN0YXRlICAgICAgLS0+DQotPCEtLSA8T1BUSU9OIFZBTFVFPSIuLi4iPiAgICAgICBGb3JtIGRhdHVtIHZhbHVlIGZvciB0aGlzIG9wdGlvbi0tPg0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpKiAtKElOUFVUfFNFTEVDVHxURVhUQVJFQSk+DQotPCFBVFRMSVNUIFRFWFRBUkVBDQotICAgICAgICBOQU1FIENEQVRBICNSRVFVSVJFRA0KLSAgICAgICAgUk9XUyBOVU1CRVIgI1JFUVVJUkVEDQotICAgICAgICBDT0xTIE5VTUJFUiAjUkVRVUlSRUQNCi0gICAgICAgICVTREFGT1JNOyAiUGFyYSINCi0gICAgICAgICVTREFQUkVGOyAiSW5wdXQgVGV4dCAtLSAjQXR0VmFsKE5hbWUpOiAiDQotICAgICAgICA+DQotPCEtLSA8VEVYVEFSRUE+ICAgICAgICAgICAgICAgIEFuIGFyZWEgZm9yIHRleHQgaW5wdXQgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxURVhUQVJFQSBOQU1FPS4uLj4gICAgICAgIE5hbWUgb2YgZm9ybSBkYXR1bSAgICAgICAgIC0tPg0KLTwhLS0gPFRFWFRBUkVBIFJPV1M9Li4uPiAgICAgICAgSGVpZ2h0IG9mIGFyZWEgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8VEVYVEFSRUEgQ09MUz0uLi4+ICAgICAgICBXaWR0aCBvZiBhcmVhICAgICAgICAgICAtLT4NCi1dXT4NCi08IS0tPT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWyAgICAgICAgDQotPCFFTlRJVFkgJSBoZWFkLmV4dHJhICIiPg0KLV1dPg0KLTwhRU5USVRZICUgaGVhZC5leHRyYSAiJiBORVhUSUQ/Ij4NCi08IUVOVElUWSAlIGhlYWQuY29udGVudCAiVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICVoZWFkLmV4dHJhIj4NCi08IUVMRU1FTlQgSEVBRCBPIE8gICglaGVhZC5jb250ZW50KSArKE1FVEF8TElOSyk+DQotPCEtLSA8SEVBRD4gICAgIERvY3VtZW50IGhlYWQgICAtLT4NCi08IUVMRU1FTlQgVElUTEUgLSAtICAoI1BDREFUQSkqICAtKE1FVEF8TElOSyk+DQotPCFBVFRMSVNUIFRJVExFDQotICAgICAgICAlU0RBRk9STTsgIlRpIiAgICA+DQotPCEtLSA8VElUTEU+ICAgIFRpdGxlIG9mIGRvY3VtZW50IC0tPg0KLTwhRUxFTUVOVCBMSU5LIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgTElOSw0KLSAgICAgICAgSFJFRiBDREFUQSAjUkVRVUlSRUQNCi0gICAgICAgICVsaW5rRXh0cmFBdHRyaWJ1dGVzOw0KLSAgICAgICAgJVNEQVBSRUY7ICJMaW5rZWQgdG8gOiAjQXR0VmFsIChUSVRMRSkgKFVSTikgKEhSRUYpPiIgICAgPg0KLTwhLS0gPExJTks+ICAgICAgICAgTGluayBmcm9tIHRoaXMgZG9jdW1lbnQgICAgICAgICAtLT4NCi08IS0tIDxMSU5LIEhSRUY9Ii4uLiI+ICBBZGRyZXNzIG9mIGxpbmsgZGVzdGluYXRpb24gICAgICAgICAgIC0tPg0KLTwhLS0gPExJTksgVVJOPSIuLi4iPiAgIExhc3RpbmcgbmFtZSBvZiBkZXN0aW5hdGlvbiAgICAgICAgICAgICAtLT4NCi08IS0tIDxMSU5LIFJFTD0uLi4+ICAgICBSZWxhdGlvbnNoaXAgdG8gZGVzdGluYXRpb24gICAgICAgICAtLT4NCi08IS0tIDxMSU5LIFJFVj0uLi4+ICAgICBSZWxhdGlvbnNoaXAgb2YgZGVzdGluYXRpb24gdG8gdGhpcyAgICAgICAgIC0tPg0KLTwhLS0gPExJTksgVElUTEU9Ii4uLiI+IFRpdGxlIG9mIGRlc3RpbmF0aW9uIChhZHZpc29yeSkgICAgICAgICAtLT4NCi08IS0tIDxMSU5LIE1FVEhPRFM9Ii4uLiI+IE9wZXJhdGlvbnMgYWxsb3dlZCAoYWR2aXNvcnkpICAgICAgICAgLS0+DQotPCFFTEVNRU5UIElTSU5ERVggLSBPIEVNUFRZPg0KLTwhQVRUTElTVCBJU0lOREVYDQotICAgICAgICAlU0RBUFJFRjsNCi0gICAiPFBhcmE+W0RvY3VtZW50IGlzIGluZGV4ZWQvc2VhcmNoYWJsZS5dPC9QYXJhPiI+DQotPCEtLSA8SVNJTkRFWD4gICAgICAgICAgRG9jdW1lbnQgaXMgYSBzZWFyY2hhYmxlIGluZGV4ICAgICAgICAgIC0tPg0KLTwhRUxFTUVOVCBCQVNFIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgQkFTRQ0KLSAgICAgICAgSFJFRiBDREFUQSAjUkVRVUlSRUQgICAgID4NCi08IS0tIDxCQVNFPiAgICAgICAgICAgICBCYXNlIGNvbnRleHQgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8QkFTRSBIUkVGPSIuLi4iPiAgQWRkcmVzcyBmb3IgdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgIC0tPg0KLTwhRUxFTUVOVCBORVhUSUQgLSBPIEVNUFRZPg0KLTwhQVRUTElTVCBORVhUSUQNCi0gICAgICAgIE4gQ0RBVEEgI1JFUVVJUkVEICAgICA+DQotPCEtLSA8TkVYVElEPiAgICAgTmV4dCBJRCB0byB1c2UgZm9yIGxpbmsgbmFtZSAgICAgICAgIC0tPg0KLTwhLS0gPE5FWFRJRCBOPS4uLj4gICAgIE5leHQgSUQgdG8gdXNlIGZvciBsaW5rIG5hbWUgICAgICAgICAgICAgICAtLT4NCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFk+DQotPCFBVFRMSVNUIE1FVEENCi0gICAgICAgIEhUVFAtRVFVSVYgIE5BTUUgICAgI0lNUExJRUQNCi0gICAgICAgIE5BTUUgICAgICAgIE5BTUUgICAgI0lNUExJRUQNCi0gICAgICAgIENPTlRFTlQgICAgIENEQVRBICAgI1JFUVVJUkVEICAgID4NCi08IS0tIDxNRVRBPiAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgTWV0YS1pbmZvcm1hdGlvbiAgICAgICAgLS0+DQotPCEtLSA8TUVUQSBIVFRQLUVRVUlWPS4uLj4gICAgICBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAgICAgIC0tPg0KLTwhLS0gPE1FVEEgTkFNRT0uLi4+ICAgICAgICAgICAgTWV0YS1pbmZvcm1hdGlvbiBuYW1lICAgICAgICAgICAtLT4NCi08IS0tIDxNRVRBIENPTlRFTlQ9Ii4uLiI+ICAgICAgIEFzc29jaWF0ZWQgaW5mb3JtYXRpb24gICAgICAgICAgLS0+DQotPCEtLT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09LS0+DQotPCFbICVIVE1MLkRlcHJlY2F0ZWQgWw0KLSAgICAgICAgPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFksIFBMQUlOVEVYVD8iPg0KLV1dPg0KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4NCi08IUVMRU1FTlQgSFRNTCBPIE8gICglaHRtbC5jb250ZW50KT4NCi08IUVOVElUWSAlIHZlcnNpb24uYXR0ciAiVkVSU0lPTiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247JyI+DQotPCFBVFRMSVNUIEhUTUwNCi0gICAgICAgICV2ZXJzaW9uLmF0dHI7DQotICAgICAgICAlU0RBRk9STTsgIkJvb2siDQotICAgICAgICA+DQotPCEtLSA8SFRNTD4gICAgICAgICAgICBIVE1MIERvY3VtZW50ICAgICAtLT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2xvb3NlLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2UuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDM5YmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2UuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MyArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyB0aGUgSFRNTCA0LjAxIFRyYW5zaXRpb25hbCBEVEQsIHdoaWNoIGluY2x1ZGVzCi0gICAgcHJlc2VudGF0aW9uIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgVzNDIGV4cGVjdHMgdG8gcGhhc2Ugb3V0Ci0gICAgYXMgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLQotICAgIEhUTUwgNCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDE5OTkvMTIvMjQgMjI6NDA6MzUgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQKLQotCi0gICAgVGhlIEhUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVzIGFkZGl0aW9uYWwKLSAgICBzeW50YWN0aWMgY29uc3RyYWludHMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIHdpdGhpbgotICAgIHRoZSBEVERzLgotCi0tLT4KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSAgLS0gVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBTdHJpY3QgSFRNTCA0LjAxIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgc3RyaWN0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L3N0cmljdC5kdGQKLQotICAgIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0IERURCB1bmxlc3MgdGhleSBuZWVkIHRoZQotICAgIHByZXNlbnRhdGlvbiBjb250cm9sIGZvciB1c2VyIGFnZW50cyB0aGF0IGRvbid0IChhZGVxdWF0ZWx5KQotICAgIHN1cHBvcnQgc3R5bGUgc2hlZXRzLgotCi0gICAgSWYgeW91IGFyZSB3cml0aW5nIGEgZG9jdW1lbnQgdGhhdCBpbmNsdWRlcyBmcmFtZXMsIHVzZSAKLSAgICB0aGUgZm9sbG93aW5nIEZQSToKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnJhbWVzZXQgRFREIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvZnJhbWVzZXQuZHRkCi0KLSAgICBVc2UgdGhlIGZvbGxvd2luZyAocmVsYXRpdmUpIFVSSXMgdG8gcmVmZXIgdG8gCi0gICAgdGhlIERURHMgYW5kIGVudGl0eSBkZWZpbml0aW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb246Ci0KLSAgICAic3RyaWN0LmR0ZCIKLSAgICAibG9vc2UuZHRkIgotICAgICJmcmFtZXNldC5kdGQiCi0gICAgIkhUTUxsYXQxLmVudCIKLSAgICAiSFRNTHN5bWJvbC5lbnQiCi0gICAgIkhUTUxzcGVjaWFsLmVudCIKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEZlYXR1cmUgU3dpdGNoIGZvciBmcmFtZXNldCBkb2N1bWVudHMgLS0+Ci08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklHTk9SRSI+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIgotICAgIC0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIgotICAgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiCi0gICAgLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiCi0gICAgLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOQU1FIgotICAgIC0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiCi0gICAgLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIgotICAgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIgotICAgIC0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycwotICAgIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiCi0gICAgLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsCi0gICAgICAgc2VlIFtVUkldCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIiAtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIiAtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSIgLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiQ0RBVEEiIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tPgotCi0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotCi0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tIHJlcGVhdGFibGUgaGVhZCBlbGVtZW50cyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJIMXxIMnxIM3xINHxINXxINiI+Ci0KLTwhRU5USVRZICUgbGlzdCAiVUwgfCBPTCB8ICBESVIgfCBNRU5VIj4KLQotPCFFTlRJVFkgJSBwcmVmb3JtYXR0ZWQgIlBSRSI+Ci0KLTwhRU5USVRZICUgQ29sb3IgIkNEQVRBIiAtLSBhIGNvbG9yIHVzaW5nIHNSR0I6ICNSUkdHQkIgYXMgSGV4IHZhbHVlcyAtLT4KLQotPCEtLSBUaGVyZSBhcmUgYWxzbyAxNiB3aWRlbHkga25vd24gY29sb3IgbmFtZXMgd2l0aCB0aGVpciBzUkdCIHZhbHVlczoKLQotICAgIEJsYWNrICA9ICMwMDAwMDAgICAgR3JlZW4gID0gIzAwODAwMAotICAgIFNpbHZlciA9ICNDMEMwQzAgICAgTGltZSAgID0gIzAwRkYwMAotICAgIEdyYXkgICA9ICM4MDgwODAgICAgT2xpdmUgID0gIzgwODAwMAotICAgIFdoaXRlICA9ICNGRkZGRkYgICAgWWVsbG93ID0gI0ZGRkYwMAotICAgIE1hcm9vbiA9ICM4MDAwMDAgICAgTmF2eSAgID0gIzAwMDA4MAotICAgIFJlZCAgICA9ICNGRjAwMDAgICAgQmx1ZSAgID0gIzAwMDBGRgotICAgIFB1cnBsZSA9ICM4MDAwODAgICAgVGVhbCAgID0gIzAwODA4MAotICAgIEZ1Y2hzaWE9ICNGRjAwRkYgICAgQXF1YSAgID0gIzAwRkZGRgotIC0tPgotCi08IUVOVElUWSAlIGJvZHljb2xvcnMgIgotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQgYmFja2dyb3VuZCBjb2xvciAtLQotICB0ZXh0ICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQgdGV4dCBjb2xvciAtLQotICBsaW5rICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gY29sb3Igb2YgbGlua3MgLS0KLSAgdmxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIHZpc2l0ZWQgbGlua3MgLS0KLSAgYWxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIHNlbGVjdGVkIGxpbmtzIC0tCi0gICI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbjEvL0VOLy9IVE1MIgotICAgIkhUTUxsYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgIkhUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiSFRNTHNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyAtLQotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRCAgLS0gYXNzb2NpYXRlZCBzdHlsZSBpbmZvIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhRU5USVRZICUgYWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAgI0lNUExJRUQiCi0gICAgICAgICAgICAgICAgICAgLS0gZGVmYXVsdCBpcyBsZWZ0IGZvciBsdHIgcGFyYWdyYXBocywgcmlnaHQgZm9yIHJ0bCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBVIHwgUyB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotICAgIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIj4KLQotPCFFTlRJVFkgJSBmb3JtY3RybCAiSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OIj4KLQotPCEtLSAlaW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaW5saW5lICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8ICVmb3JtY3RybDsiPgotCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAtIC0gKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgKFNVQnxTVVApIC0gLSAoJWlubGluZTspKiAgICAtLSBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIChTVUJ8U1VQKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgU1BBTiAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7CQkJICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIEJETyAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBCRE8KLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRCAtLSBkaXJlY3Rpb25hbGl0eSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCQVNFRk9OVCAtIE8gRU1QVFkgICAgICAgICAgIC0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIEJBU0VGT05UCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYmFzZSBmb250IHNpemUgZm9yIEZPTlQgZWxlbWVudHMgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgRk9OVCAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBGT05UCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsJCSAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gWyt8LV1ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT0iNCIgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLSAgICAgIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLQotPCFFTlRJVFkgJSBmbG93ICIlYmxvY2s7IHwgJWlubGluZTsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQk9EWSBPIE8gKCVmbG93OykqICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgYmFja2dyb3VuZCAgICAgICVVUkk7ICAgICAgI0lNUExJRUQgIC0tIHRleHR1cmUgdGlsZSBmb3IgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgLS0KLSAgJWJvZHljb2xvcnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGJnY29sb3IsIHRleHQsIGxpbmssIHZsaW5rLCBhbGluayAtLQotICA+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoKCVpbmxpbmU7KXxQKSogIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQ0VOVEVSIC0gLSAoJWZsb3c7KSogICAgICAgICAtLSBzaG9ydGhhbmQgZm9yIERJViBhbGlnbj1jZW50ZXIgLS0+Ci08IUFUVExJU1QgQ0VOVEVSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspIHwgQVJFQSkrIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gaGFzIG5vIGFjdGlvbiAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBMSU5LIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPXN0eWxlc2hlZXQpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPXNjcmlwdCkKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9YWx0ZXJuYXRlIG1lZGlhPXByaW50KQotLS0+Ci0KLTwhRUxFTUVOVCBMSU5LIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGEgbWVkaWEtaW5kZXBlbmRlbnQgbGluayAtLT4KLTwhQVRUTElTVCBMSU5LCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBhZHZpc29yeSBjb250ZW50IHR5cGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBmb3IgcmVuZGVyaW5nIG9uIHRoZXNlIG1lZGlhIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgaW4gc3RyaWN0IERURCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiIC0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIiAtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIiAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLV1dPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhRU5USVRZICUgSUFsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiIC0tIGNlbnRlcj8gLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgaW1hZ2UgZm9yIHNjcmlwdGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgYm9yZGVyIHdpZHRoIC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gID4KLQotPCEtLSBVU0VNQVAgcG9pbnRzIHRvIGEgTUFQIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPQkpFQ1QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT0JKRUNUIGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMgCi0gIFBBUkFNIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFNHTUwgbWl4ZWQgY29udGVudAotICBtb2RlbCB0ZWNobmljYWxpdHkgcHJlY2x1ZGVzIHNwZWNpZnlpbmcgdGhpcyBmb3JtYWxseSAuLi4KLS0tPgotCi08IUVMRU1FTlQgT0JKRUNUIC0gLSAoUEFSQU0gfCAlZmxvdzspKgotIC0tIGdlbmVyaWMgZW1iZWRkZWQgb2JqZWN0IC0tPgotPCFBVFRMSVNUIE9CSkVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQgIC0tIGRlY2xhcmUgYnV0IGRvbid0IGluc3RhbnRpYXRlIGZsYWcgLS0KLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGlkZW50aWZpZXMgYW4gaW1wbGVtZW50YXRpb24gLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGJhc2UgVVJJIGZvciBjbGFzc2lkLCBkYXRhLCBhcmNoaXZlLS0KLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlZmVyZW5jZSB0byBvYmplY3QncyBkYXRhIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGRhdGEgLS0KLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgY29kZSAtLQotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyAtLQotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gbWVzc2FnZSB0byBzaG93IHdoaWxlIGxvYWRpbmcgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHN1Ym1pdCBhcyBwYXJ0IG9mIGZvcm0gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBsaW5rIGJvcmRlciB3aWR0aCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgUEFSQU0gLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZSAtLT4KLTwhQVRUTElTVCBQQVJBTQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIHByb3BlcnR5IG5hbWUgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHByb3BlcnR5IHZhbHVlIC0tCi0gIHZhbHVldHlwZSAgIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEgICAtLSBIb3cgdG8gaW50ZXJwcmV0IHZhbHVlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHZhbHVldHlwZT1yZWYgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBKYXZhIEFQUExFVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9uZSBvZiBjb2RlIG9yIG9iamVjdCBhdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudC4KLSAgUGxhY2UgUEFSQU0gZWxlbWVudHMgYmVmb3JlIG90aGVyIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBBUFBMRVQgLSAtIChQQVJBTSB8ICVmbG93OykqIC0tIEphdmEgYXBwbGV0IC0tPgotPCFBVFRMSVNUIEFQUExFVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG9wdGlvbmFsIGJhc2UgVVJJIGZvciBhcHBsZXQgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgY29kZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGFwcGxldCBjbGFzcyBmaWxlIC0tCi0gIG9iamVjdCAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZXJpYWxpemVkIGFwcGxldCBmaWxlIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gYWxsb3dzIGFwcGxldHMgdG8gZmluZCBlYWNoIG90aGVyIC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRCAtLSBpbml0aWFsIHdpZHRoIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRCAtLSBpbml0aWFsIGhlaWdodCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgSFIgLSBPIEVNUFRZIC0tIGhvcml6b250YWwgcnVsZSAtLT4KLTwhQVRUTElTVCBIUgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWxpZ24gICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICBub3NoYWRlICAgICAobm9zaGFkZSkgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBQIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHBhcmFncmFwaCAtLT4KLTwhQVRUTElTVCBQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBleGNsdWRlcyBtYXJrdXAgZm9yIGltYWdlcyBhbmQgY2hhbmdlcyBpbiBmb250IHNpemUgLS0+Ci08IUVOVElUWSAlIHByZS5leGNsdXNpb24gIklNR3xPQkpFQ1R8QVBQTEVUfEJJR3xTTUFMTHxTVUJ8U1VQfEZPTlR8QkFTRUZPTlQiPgotCi08IUVMRU1FTlQgUFJFIC0gLSAoJWlubGluZTspKiAtKCVwcmUuZXhjbHVzaW9uOykgLS0gcHJlZm9ybWF0dGVkIHRleHQgLS0+Ci08IUFUVExJU1QgUFJFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB3aWR0aCAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBRIC0gLSAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHNob3J0IGlubGluZSBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgUQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFIC0gLSAoJWZsb3c7KSogICAgIC0tIGxvbmcgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIEJMT0NLUVVPVEUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLTwhLS0gSU5TL0RFTCBhcmUgaGFuZGxlZCBieSBpbmNsdXNpb24gb24gQk9EWSAtLT4KLTwhRUxFTUVOVCAoSU5TfERFTCkgLSAtICglZmxvdzspKiAgICAgIC0tIGluc2VydGVkIHRleHQsIGRlbGV0ZWQgdGV4dCAtLT4KLTwhQVRUTElTVCAoSU5TfERFTCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpbmZvIG9uIHJlYXNvbiBmb3IgY2hhbmdlIC0tCi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVEICAtLSBkYXRlIGFuZCB0aW1lIG9mIGNoYW5nZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIERUIGZvciB0ZXJtLCBERCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBETCAtIC0gKERUfEREKSsgICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gbGlzdCAtLT4KLTwhQVRUTElTVCBETAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVMRU1FTlQgRFQgLSBPICglaW5saW5lOykqICAgICAgICAgICAtLSBkZWZpbml0aW9uIHRlcm0gLS0+Ci08IUVMRU1FTlQgREQgLSBPICglZmxvdzspKiAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGRlc2NyaXB0aW9uIC0tPgotPCFBVFRMSVNUIChEVHxERCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLSBPcmRlcmVkIGxpc3RzIChPTCkgTnVtYmVyaW5nIHN0eWxlCi0KLSAgICAxICAgYXJhYmxpYyBudW1iZXJzICAgICAxLCAyLCAzLCAuLi4KLSAgICBhICAgbG93ZXIgYWxwaGEgICAgICAgICBhLCBiLCBjLCAuLi4KLSAgICBBICAgdXBwZXIgYWxwaGEgICAgICAgICBBLCBCLCBDLCAuLi4KLSAgICBpICAgbG93ZXIgcm9tYW4gICAgICAgICBpLCBpaSwgaWlpLCAuLi4KLSAgICBJICAgdXBwZXIgcm9tYW4gICAgICAgICBJLCBJSSwgSUlJLCAuLi4KLQotICAgIFRoZSBzdHlsZSBpcyBhcHBsaWVkIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggYnkgZGVmYXVsdAotICAgIGlzIHJlc2V0IHRvIDEgZm9yIHRoZSBmaXJzdCBsaXN0IGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0LgotCi0gICAgVGhpcyBjYW4ndCBiZSBleHByZXNzZWQgZGlyZWN0bHkgaW4gU0dNTCBkdWUgdG8gY2FzZSBmb2xkaW5nLgotLS0+Ci0KLTwhRU5USVRZICUgT0xTdHlsZSAiQ0RBVEEiICAgICAgLS0gY29uc3RyYWluZWQgdG86ICIoMXxhfEF8aXxJKSIgLS0+Ci0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJU9MU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIG51bWJlcmluZyBzdHlsZSAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICBzdGFydCAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLSBVbm9yZGVyZWQgTGlzdHMgKFVMKSBidWxsZXQgc3R5bGVzIC0tPgotPCFFTlRJVFkgJSBVTFN0eWxlICIoZGlzY3xzcXVhcmV8Y2lyY2xlKSI+Ci0KLTwhRUxFTUVOVCBVTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIHVub3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIFVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlVUxTdHlsZTsgICAgICAjSU1QTElFRCAgLS0gYnVsbGV0IHN0eWxlIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTEVNRU5UIChESVJ8TUVOVSkgLSAtIChMSSkrIC0oJWJsb2NrOykgLS0gZGlyZWN0b3J5IGxpc3QsIG1lbnUgbGlzdCAtLT4KLTwhQVRUTElTVCBESVIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotPCFBVFRMSVNUIE1FTlUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIiAtLSBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci0KLTwhRUxFTUVOVCBMSSAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGxpc3QgaXRlbSAtLT4KLTwhQVRUTElTVCBMSQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGxpc3QgaXRlbSBzdHlsZSAtLQotICB2YWx1ZSAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXQgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBGT1JNIC0gLSAoJWZsb3c7KSogLShGT1JNKSAgIC0tIGludGVyYWN0aXZlIGZvcm0gLS0+Ci08IUFUVExJU1QgRk9STQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICBtZXRob2QgICAgICAoR0VUfFBPU1QpICAgICBHRVQgICAgICAgLS0gSFRUUCBtZXRob2QgdXNlZCB0byBzdWJtaXQgdGhlIGZvcm0tLQotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBmb3JtIGZvciBzY3JpcHRpbmcgLS0KLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQgLS0KLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyByZXNldCAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQgIC0tIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJzZXRzIC0tCi0gID4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZCAtLT4KLTwhRUxFTUVOVCBMQUJFTCAtIC0gKCVpbmxpbmU7KSogLShMQUJFTCkgLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRCAgLS0gbWF0Y2hlcyBmaWVsZCBJRCB2YWx1ZSAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfAotICAgIFJBRElPIHwgU1VCTUlUIHwgUkVTRVQgfAotICAgIEZJTEUgfCBISURERU4gfCBJTUFHRSB8IEJVVFRPTikiCi0gICA+Ci0KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBTcGVjaWZ5IGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIC0tCi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVEICAtLSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2sgYm94ZXMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRCAgLS0gZm9yIHRleHQgYW5kIHBhc3N3ZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gIG1heGxlbmd0aCAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBtYXggY2hhcnMgZm9yIHRleHQgZmllbGRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgZmllbGRzIHdpdGggaW1hZ2VzIC0tCi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTRUxFQ1QgLSAtIChPUFRHUk9VUHxPUFRJT04pKyAtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1QgU0VMRUNUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZmllbGQgbmFtZSAtLQotICBzaXplICAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcm93cyB2aXNpYmxlIC0tCi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0IGlzIHNpbmdsZSBzZWxlY3Rpb24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRHUk9VUCAtIC0gKE9QVElPTikrIC0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBPUFRHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUSU9OIC0gTyAoI1BDREFUQSkgICAgICAgICAtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBPUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0cyB0byBlbGVtZW50IGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgLSAtICgjUENEQVRBKSAgICAgICAtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgVEVYVEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLQotICAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkIHRoZXJlIQotIC0tPgotPCFFTEVNRU5UIEZJRUxEU0VUIC0gLSAoI1BDREFUQSxMRUdFTkQsKCVmbG93OykqKSAtLSBmb3JtIGNvbnRyb2wgZ3JvdXAgLS0+Ci08IUFUVExJU1QgRklFTERTRVQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIExFR0VORCAtIC0gKCVpbmxpbmU7KSogICAgICAgLS0gZmllbGRzZXQgbGVnZW5kIC0tPgotPCFFTlRJVFkgJSBMQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIExFR0VORAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBhbGlnbiAgICAgICAlTEFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gcmVsYXRpdmUgdG8gZmllbGRzZXQgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxJU0lOREVYfEZJRUxEU0VUfElGUkFNRSkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKENPTCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgYWxpZ24gICAgICAgJVRBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHdpbmRvdyAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gYmFja2dyb3VuZCBjb2xvciBmb3IgY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhbGlnbiAgICAgICAlQ0FsaWduOyAgICAgICAjSU1QTElFRCAgLS0gcmVsYXRpdmUgdG8gdGFibGUgLS0KLSAgPgotCi08IS0tCi1DT0xHUk9VUCBncm91cHMgYSBzZXQgb2YgQ09MIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBDT0xHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIGRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMgaW4gZ3JvdXAgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGRlZmF1bHQgd2lkdGggZm9yIGVuY2xvc2VkIENPTHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gQ09MIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSBXSURUSCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBTUEFOIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gQ09MIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBDT0wgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNvbHVtbiBncm91cHMgYW5kIHByb3BlcnRpZXMgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBDT0wgYXR0cmlidXRlcyBhZmZlY3QgTiBjb2x1bW5zIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBjb2x1bW4gd2lkdGggc3BlY2lmaWNhdGlvbiAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSAgICBVc2UgVEhFQUQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBURk9PVCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIFRCT0RZIHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCAoVEhFQUR8VEJPRFl8VEZPT1QpICAgICAgICAgIC0tIHRhYmxlIHNlY3Rpb24gLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCFBVFRMSVNUIFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgcm93IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gYmFja2dyb3VuZCBjb2xvciBmb3Igcm93IC0tCi0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gVEggaXMgZm9yIGhlYWRlcnMsIFREIGZvciBkYXRhLCBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSBURCAtLT4KLTwhQVRUTElTVCAoVEh8VEQpICAgICAgICAgICAgICAgICAgICAgIC0tIGhlYWRlciBvciBkYXRhIGNlbGwgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhYmJyZXZpYXRpb24gZm9yIGhlYWRlciBjZWxsIC0tCi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWxhdGVkIGhlYWRlcnMtLQotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRCAgLS0gbGlzdCBvZiBpZCdzIGZvciBoZWFkZXIgY2VsbHMgLS0KLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQgIC0tIHNjb3BlIGNvdmVyZWQgYnkgaGVhZGVyIGNlbGxzIC0tCi0gIHJvd3NwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgY29sc3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiBjb2xzIHNwYW5uZWQgYnkgY2VsbCAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRCAgLS0gc3VwcHJlc3Mgd29yZCB3cmFwIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjZWxsIGJhY2tncm91bmQgY29sb3IgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHdpZHRoIGZvciBjZWxsIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERvY3VtZW50IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZSBjb250ZW50IG1vZGVsIGZvciBIVE1MIGRvY3VtZW50cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIEhFQUQgaXMKLSAgZm9sbG93ZWQgYnkgYSBGUkFNRVNFVCBvciBCT0RZIGVsZW1lbnQuIFRoZSB3aWRlc3ByZWFkIG9taXNzaW9uIG9mCi0gIHRoZSBCT0RZIHN0YXJ0IHRhZyBtYWtlcyBpdCBpbXByYWN0aWNhbCB0byBkZWZpbmUgdGhlIGNvbnRlbnQgbW9kZWwKLSAgd2l0aG91dCB0aGUgdXNlIG9mIGEgbWFya2VkIHNlY3Rpb24uCi0tLT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVMRU1FTlQgRlJBTUVTRVQgLSAtICgoRlJBTUVTRVR8RlJBTUUpKyAmIE5PRlJBTUVTPykgLS0gd2luZG93IHN1YmRpdmlzaW9uLS0+Ci08IUFUVExJU1QgRlJBTUVTRVQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIHJvd3MgICAgICAgICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIGxlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAxMDAlICgxIHJvdykgLS0KLSAgY29scyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEwMCUgKDEgY29sKSAtLQotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYWxsIHRoZSBmcmFtZXMgaGF2ZSBiZWVuIGxvYWRlZCAgLS0gCi0gIG9udW5sb2FkICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhbGwgdGhlIGZyYW1lcyBoYXZlIGJlZW4gcmVtb3ZlZCAtLSAKLSAgPgotXV0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCEtLSByZXNlcnZlZCBmcmFtZSBuYW1lcyBzdGFydCB3aXRoICJfIiBvdGhlcndpc2Ugc3RhcnRzIHdpdGggbGV0dGVyIC0tPgotPCFFTEVNRU5UIEZSQU1FIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gc3Vid2luZG93IC0tPgotPCFBVFRMSVNUIEZSQU1FCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgdGl0bGUpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZyYW1lIGZvciB0YXJnZXR0aW5nIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBzb3VyY2Ugb2YgZnJhbWUgY29udGVudCAtLQotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAxICAgICAgICAgLS0gcmVxdWVzdCBmcmFtZSBib3JkZXJzPyAtLQotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIHdpZHRocyBpbiBwaXhlbHMgLS0KLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gIG5vcmVzaXplICAgIChub3Jlc2l6ZSkgICAgICNJTVBMSUVEICAtLSBhbGxvdyB1c2VycyB0byByZXNpemUgZnJhbWVzPyAtLQotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICBhdXRvICAgICAgLS0gc2Nyb2xsYmFyIG9yIG5vbmUgLS0KLSAgPgotXV0+Ci0KLTwhRUxFTUVOVCBJRlJBTUUgLSAtICglZmxvdzspKiAgICAgICAgIC0tIGlubGluZSBzdWJ3aW5kb3cgLS0+Ci08IUFUVExJU1QgSUZSQU1FCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgdGl0bGUpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZyYW1lIGZvciB0YXJnZXR0aW5nIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBzb3VyY2Ugb2YgZnJhbWUgY29udGVudCAtLQotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAxICAgICAgICAgLS0gcmVxdWVzdCBmcmFtZSBib3JkZXJzPyAtLQotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIHdpZHRocyBpbiBwaXhlbHMgLS0KLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgIGF1dG8gICAgICAtLSBzY3JvbGxiYXIgb3Igbm9uZSAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIGZyYW1lIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gZnJhbWUgd2lkdGggLS0KLSAgPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgbm9mcmFtZXMuY29udGVudCAiKEJPRFkpIC0oTk9GUkFNRVMpIj4KLV1dPgotCi08IUVOVElUWSAlIG5vZnJhbWVzLmNvbnRlbnQgIiglZmxvdzspKiI+Ci0KLTwhRUxFTUVOVCBOT0ZSQU1FUyAtIC0gJW5vZnJhbWVzLmNvbnRlbnQ7Ci0gLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gZnJhbWUtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PRlJBTUVTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICVoZWFkLm1pc2M7IGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tPgotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQgIlRJVExFICYgSVNJTkRFWD8gJiBCQVNFPyI+Ci0KLTwhRUxFTUVOVCBIRUFEIE8gTyAoJWhlYWQuY29udGVudDspICsoJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IGhlYWQgLS0+Ci08IUFUVExJU1QgSEVBRAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBkaWN0aW9uYXJ5IG9mIG1ldGEgaW5mbyAtLQotICA+Ci0KLTwhLS0gVGhlIFRJVExFIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIFRJVExFIC0gLSAoI1BDREFUQSkgLSglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgdGl0bGUgLS0+Ci08IUFUVExJU1QgVElUTEUgJWkxOG4+Ci0KLTwhRUxFTUVOVCBJU0lOREVYIC0gTyBFTVBUWSAgICAgICAgICAgIC0tIHNpbmdsZSBsaW5lIHByb21wdCAtLT4KLTwhQVRUTElTVCBJU0lOREVYCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb21wdCAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBwcm9tcHQgbWVzc2FnZSAtLT4KLQotPCFFTEVNRU5UIEJBU0UgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci08IUFUVExJU1QgQkFTRQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIHRoYXQgYWN0cyBhcyBiYXNlIFVSSSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCBjb250ZW50IC0tCi0gIGh0dHAtZXF1aXYgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAtLQotICBuYW1lICAgICAgICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gbWV0YWluZm9ybWF0aW9uIG5hbWUgLS0KLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gLS0KLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbGVjdCBmb3JtIG9mIGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgU1RZTEUgLSAtICVTdHlsZVNoZWV0ICAgICAgICAtLSBzdHlsZSBpbmZvIC0tPgotPCFBVFRMSVNUIFNUWUxFCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCB0aXRsZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHN0eWxlIGxhbmd1YWdlIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggdGhlc2UgbWVkaWEgLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNDUklQVCAtIC0gJVNjcmlwdDsgICAgICAgICAgLS0gc2NyaXB0IHN0YXRlbWVudHMgLS0+Ci08IUFUVExJU1QgU0NSSVBUCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHNjcmlwdCBsYW5ndWFnZSAtLQotICBsYW5ndWFnZSAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJlZGVmaW5lZCBzY3JpcHQgbGFuZ3VhZ2UgbmFtZSAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBhbiBleHRlcm5hbCBzY3JpcHQgLS0KLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQgIC0tIFVBIG1heSBkZWZlciBleGVjdXRpb24gb2Ygc2NyaXB0IC0tCi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBmb3IgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgTk9TQ1JJUFQgLSAtICglZmxvdzspKgotICAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PU0NSSVBUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVOVElUWSAlIHZlcnNpb24gInZlcnNpb24gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOyciPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBGUkFNRVNFVCI+Ci1dXT4KLQotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gKCVodG1sLmNvbnRlbnQ7KSAgICAtLSBkb2N1bWVudCByb290IGVsZW1lbnQgLS0+Ci08IUFUVExJU1QgSFRNTAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gICV2ZXJzaW9uOwotICA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2xvb3NlNDAwLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2U0MDAuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTZkODQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2U0MDAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MiArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyB0aGUgSFRNTCA0LjAgVHJhbnNpdGlvbmFsIERURCwgd2hpY2ggaW5jbHVkZXMKLSAgICBwcmVzZW50YXRpb24gYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQKLSAgICBhcyBzdXBwb3J0IGZvciBzdHlsZSBzaGVldHMgbWF0dXJlcy4gQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QKLSAgICBEVEQgd2hlbiBwb3NzaWJsZSwgYnV0IG1heSB1c2UgdGhlIFRyYW5zaXRpb25hbCBEVEQgd2hlbiBzdXBwb3J0Ci0gICAgZm9yIHByZXNlbnRhdGlvbiBhdHRyaWJ1dGUgYW5kIGVsZW1lbnRzIGlzIHJlcXVpcmVkLgotCi0gICAgSFRNTCA0LjAgaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3Igc3R5bGUgc2hlZXRzLCBzY3JpcHRpbmcsCi0gICAgZW1iZWRkaW5nIG9iamVjdHMsIGltcHJvdmVkIHN1cHBvcnQgZm9yIHJpZ2h0IHRvIGxlZnQgYW5kIG1peGVkCi0gICAgZGlyZWN0aW9uIHRleHQsIGFuZCBlbmhhbmNlbWVudHMgdG8gZm9ybXMgZm9yIGltcHJvdmVkCi0gICAgYWNjZXNzaWJpbGl0eSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzLgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAxOTk4LzA0LzAyIDAwOjE3OjAwICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAKLS0tPgotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24gIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPgotICAgIDxodG1sPgotICAgIDxoZWFkPgotICAgIC4uLgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAuLi4KLSAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotCi0gICAgVGhlIFVSSSB1c2VkIGFzIGEgc3lzdGVtIGlkZW50aWZpZXIgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXIgYWxsb3dzCi0gICAgdGhlIHVzZXIgYWdlbnQgdG8gZG93bmxvYWQgdGhlIERURCBhbmQgZW50aXR5IHNldHMgYXMgbmVlZGVkLgotCi0gICAgVGhlIEZQSSBmb3IgdGhlIFN0cmljdCBIVE1MIDQuMCBEVEQgaXM6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiIKLQotICAgIGFuZCBpdHMgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZAotCi0gICAgQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QgRFREIHVubGVzcyB0aGV5IG5lZWQgdGhlCi0gICAgcHJlc2VudGF0aW9uIGNvbnRyb2wgZm9yIHVzZXIgYWdlbnRzIHRoYXQgZG9uJ3QgKGFkZXF1YXRlbHkpCi0gICAgc3VwcG9ydCBzdHlsZSBzaGVldHMuCi0KLSAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkb2N1bWVudCB0aGF0IGluY2x1ZGVzIGZyYW1lcywgdXNlIAotICAgIHRoZSBmb2xsb3dpbmcgRlBJOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iCi0KLSAgICB3aXRoIHRoZSBVUkk6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGQKLQotICAgIFRoZSBmb2xsb3dpbmcgVVJJcyBhcmUgc3VwcG9ydGVkIGluIHJlbGF0aW9uIHRvIEhUTUwgNC4wCi0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIiAoU3RyaWN0IERURCkKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiIChMb29zZSBEVEQpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIiAoRnJhbWVzZXQgRFREKQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL0hUTUxsYXQxLmVudCIgKExhdGluLTEgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHN5bWJvbC5lbnQiIChTeW1ib2wgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHNwZWNpYWwuZW50IiAoU3BlY2lhbCBlbnRpdGllcykKLQotICAgIFRoZXNlIFVSSXMgcG9pbnQgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggZmlsZS4gVG8gcmVmZXJlbmNlCi0gICAgdGhpcyBzcGVjaWZpYyByZXZpc2lvbiB1c2UgdGhlIGZvbGxvd2luZyBVUklzOgotCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9zdHJpY3QuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvbG9vc2UuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvZnJhbWVzZXQuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50IgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTHN5bWJvbC5lbnQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9IVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIkNEQVRBIiAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wgfCAgRElSIHwgTUVOVSI+Ci0KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi08IUVOVElUWSAlIENvbG9yICJDREFUQSIgLS0gYSBjb2xvciB1c2luZyBzUkdCOiAjUlJHR0JCIGFzIEhleCB2YWx1ZXMgLS0+Ci0KLTwhLS0gVGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIHdpdGggdGhlaXIgc1JHQiB2YWx1ZXM6Ci0KLSAgICBCbGFjayAgPSAjMDAwMDAwICAgIEdyZWVuICA9ICMwMDgwMDAKLSAgICBTaWx2ZXIgPSAjQzBDMEMwICAgIExpbWUgICA9ICMwMEZGMDAKLSAgICBHcmF5ICAgPSAjODA4MDgwICAgIE9saXZlICA9ICM4MDgwMDAKLSAgICBXaGl0ZSAgPSAjRkZGRkZGICAgIFllbGxvdyA9ICNGRkZGMDAKLSAgICBNYXJvb24gPSAjODAwMDAwICAgIE5hdnkgICA9ICMwMDAwODAKLSAgICBSZWQgICAgPSAjRkYwMDAwICAgIEJsdWUgICA9ICMwMDAwRkYKLSAgICBQdXJwbGUgPSAjODAwMDgwICAgIFRlYWwgICA9ICMwMDgwODAKLSAgICBGdWNoc2lhPSAjRkYwMEZGICAgIEFxdWEgICA9ICMwMEZGRkYKLSAtLT4KLQotPCFFTlRJVFkgJSBib2R5Y29sb3JzICIKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50IGJhY2tncm91bmQgY29sb3IgLS0KLSAgdGV4dCAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50IHRleHQgY29sb3IgLS0KLSAgbGluayAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIGxpbmtzIC0tCi0gIHZsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiB2aXNpdGVkIGxpbmtzIC0tCi0gIGFsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiBzZWxlY3RlZCBsaW5rcyAtLQotICAiPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbiAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhRU5USVRZICUgYWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAgI0lNUExJRUQiCi0gICAgICAgICAgICAgICAgICAgLS0gZGVmYXVsdCBpcyBsZWZ0IGZvciBsdHIgcGFyYWdyYXBocywgcmlnaHQgZm9yIHJ0bCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBVIHwgUyB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotICAgIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIj4KLQotPCFFTlRJVFkgJSBmb3JtY3RybCAiSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OIj4KLQotPCEtLSAlaW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaW5saW5lICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8ICVmb3JtY3RybDsiPgotCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAtIC0gKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgKFNVQnxTVVApIC0gLSAoJWlubGluZTspKiAgICAtLSBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIChTVUJ8U1VQKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgU1BBTiAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7CQkJICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIEJETyAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBCRE8KLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRCAtLSBkaXJlY3Rpb25hbGl0eSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCQVNFRk9OVCAtIE8gRU1QVFkgICAgICAgICAgIC0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIEJBU0VGT05UCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYmFzZSBmb250IHNpemUgZm9yIEZPTlQgZWxlbWVudHMgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgRk9OVCAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBGT05UCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsJCSAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gWyt8LV1ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT0iNCIgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLSAgICAgIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLQotPCFFTlRJVFkgJSBmbG93ICIlYmxvY2s7IHwgJWlubGluZTsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQk9EWSBPIE8gKCVmbG93OykqICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgYmFja2dyb3VuZCAgICAgICVVUkk7ICAgICAgI0lNUExJRUQgIC0tIHRleHR1cmUgdGlsZSBmb3IgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgLS0KLSAgJWJvZHljb2xvcnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGJnY29sb3IsIHRleHQsIGxpbmssIHZsaW5rLCBhbGluayAtLQotICA+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoKCVpbmxpbmU7KXxQKSogIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQ0VOVEVSIC0gLSAoJWZsb3c7KSogICAgICAgICAtLSBzaG9ydGhhbmQgZm9yIERJViBhbGlnbj1jZW50ZXIgLS0+Ci08IUFUVExJU1QgQ0VOVEVSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspKyB8IEFSRUErKSAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0+Ci08IUFUVExJU1QgTUFQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHJlZmVyZW5jZSBieSB1c2VtYXAgLS0KLSAgPgotCi08IUVMRU1FTlQgQVJFQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgYXJlYSAtLT4KLTwhQVRUTElTVCBBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICByZWN0ICAgICAgLS0gY29udHJvbHMgaW50ZXJwcmV0YXRpb24gb2YgY29vcmRzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQgIC0tIHRoaXMgcmVnaW9uIGhhcyBubyBhY3Rpb24gLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgTElOSyBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgTElOSyBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD1zdHlsZXNoZWV0KQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD1zY3JpcHQpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPWFsdGVybmF0ZSBtZWRpYT1wcmludCkKLS0tPgotCi08IUVMRU1FTlQgTElOSyAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBhIG1lZGlhLWluZGVwZW5kZW50IGxpbmsgLS0+Ci08IUFUVExJU1QgTElOSwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZm9yIHJlbmRlcmluZyBvbiB0aGVzZSBtZWRpYSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhRU5USVRZICUgSUFsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiIC0tIGNlbnRlcj8gLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBzZXJ2ZXItc2lkZSBpbWFnZSBtYXAgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGJvcmRlciAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBsaW5rIGJvcmRlciB3aWR0aCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBib3JkZXIgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gbGluayBib3JkZXIgd2lkdGggLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFBBUkFNIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gbmFtZWQgcHJvcGVydHkgdmFsdWUgLS0+Ci08IUFUVExJU1QgUEFSQU0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBwcm9wZXJ0eSBuYW1lIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcm9wZXJ0eSB2YWx1ZSAtLQotICB2YWx1ZXR5cGUgICAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBICAgLS0gSG93IHRvIGludGVycHJldCB2YWx1ZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB2YWx1ZXR5cGU9cmVmIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSmF2YSBBUFBMRVQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPbmUgb2YgY29kZSBvciBvYmplY3QgYXR0cmlidXRlcyBtdXN0IGJlIHByZXNlbnQuCi0gIFBsYWNlIFBBUkFNIGVsZW1lbnRzIGJlZm9yZSBvdGhlciBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgQVBQTEVUIC0gLSAoUEFSQU0gfCAlZmxvdzspKiAtLSBKYXZhIGFwcGxldCAtLT4KLTwhQVRUTElTVCBBUFBMRVQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBvcHRpb25hbCBiYXNlIFVSSSBmb3IgYXBwbGV0IC0tCi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYSBzZXBhcmF0ZWQgYXJjaGl2ZSBsaXN0IC0tCi0gIGNvZGUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBhcHBsZXQgY2xhc3MgZmlsZSAtLQotICBvYmplY3QgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VyaWFsaXplZCBhcHBsZXQgZmlsZSAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGFsbG93cyBhcHBsZXRzIHRvIGZpbmQgZWFjaCBvdGhlciAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQgLS0gaW5pdGlhbCB3aWR0aCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQgLS0gaW5pdGlhbCBoZWlnaHQgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVldmVudHM7Ci0gIGFsaWduICAgICAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgbm9zaGFkZSAgICAgKG5vc2hhZGUpICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBwYXJhZ3JhcGggLS0+Ci08IUFUVExJU1QgUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBIMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBINiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UICglaGVhZGluZzspICAtIC0gKCVpbmxpbmU7KSogLS0gaGVhZGluZyAtLT4KLTwhQVRUTElTVCAoJWhlYWRpbmc7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEFQUExFVHxCSUd8U01BTEx8U1VCfFNVUHxGT05UfEJBU0VGT05UIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgd2lkdGggICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVmbG93OykqICAgICAtLSBsb25nIHF1b3RhdGlvbiAtLT4KLTwhQVRUTElTVCBCTE9DS1FVT1RFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBzb3VyY2UgZG9jdW1lbnQgb3IgbXNnIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCi08IS0tIElOUy9ERUwgYXJlIGhhbmRsZWQgYnkgaW5jbHVzaW9uIG9uIEJPRFkgLS0+Ci08IUVMRU1FTlQgKElOU3xERUwpIC0gLSAoJWZsb3c7KSogICAgICAtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgKElOU3xERUwpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gaW5mbyBvbiByZWFzb24gZm9yIGNoYW5nZSAtLQotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRCAgLS0gZGF0ZSBhbmQgdGltZSBvZiBjaGFuZ2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgLSAtIChEVHxERCkrICAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGxpc3QgLS0+Ci08IUFUVExJU1QgREwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTEVNRU5UIERUIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgLS0gZGVmaW5pdGlvbiB0ZXJtIC0tPgotPCFFTEVNRU5UIEREIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBkZXNjcmlwdGlvbiAtLT4KLTwhQVRUTElTVCAoRFR8REQpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0gT3JkZXJlZCBsaXN0cyAoT0wpIE51bWJlcmluZyBzdHlsZQotCi0gICAgMSAgIGFyYWJsaWMgbnVtYmVycyAgICAgMSwgMiwgMywgLi4uCi0gICAgYSAgIGxvd2VyIGFscGhhICAgICAgICAgYSwgYiwgYywgLi4uCi0gICAgQSAgIHVwcGVyIGFscGhhICAgICAgICAgQSwgQiwgQywgLi4uCi0gICAgaSAgIGxvd2VyIHJvbWFuICAgICAgICAgaSwgaWksIGlpaSwgLi4uCi0gICAgSSAgIHVwcGVyIHJvbWFuICAgICAgICAgSSwgSUksIElJSSwgLi4uCi0KLSAgICBUaGUgc3R5bGUgaXMgYXBwbGllZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGJ5IGRlZmF1bHQKLSAgICBpcyByZXNldCB0byAxIGZvciB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdC4KLQotICAgIFRoaXMgY2FuJ3QgYmUgZXhwcmVzc2VkIGRpcmVjdGx5IGluIFNHTUwgZHVlIHRvIGNhc2UgZm9sZGluZy4KLS0tPgotCi08IUVOVElUWSAlIE9MU3R5bGUgIkNEQVRBIiAgICAgIC0tIGNvbnN0cmFpbmVkIHRvOiAiKDF8YXxBfGl8SSkiIC0tPgotCi08IUVMRU1FTlQgT0wgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSBvcmRlcmVkIGxpc3QgLS0+Ci08IUFUVExJU1QgT0wKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVPTFN0eWxlOyAgICAgICNJTVBMSUVEICAtLSBudW1iZXJpbmcgc3R5bGUgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgc3RhcnQgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciAtLQotICA+Ci0KLTwhLS0gVW5vcmRlcmVkIExpc3RzIChVTCkgYnVsbGV0IHN0eWxlcyAtLT4KLTwhRU5USVRZICUgVUxTdHlsZSAiKGRpc2N8c3F1YXJlfGNpcmNsZSkiPgotCi08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJVVMU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGJ1bGxldCBzdHlsZSAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoRElSfE1FTlUpIC0gLSAoTEkpKyAtKCVibG9jazspIC0tIGRpcmVjdG9yeSBsaXN0LCBtZW51IGxpc3QgLS0+Ci08IUFUVExJU1QgRElSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICA+Ci08IUFUVExJU1QgTUVOVQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIiAtLSBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci0KLTwhRUxFTUVOVCBMSSAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGxpc3QgaXRlbSAtLT4KLTwhQVRUTElTVCBMSQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGxpc3QgaXRlbSBzdHlsZSAtLQotICB2YWx1ZSAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXQgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBGT1JNIC0gLSAoJWZsb3c7KSogLShGT1JNKSAgIC0tIGludGVyYWN0aXZlIGZvcm0gLS0+Ci08IUFUVExJU1QgRk9STQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICBtZXRob2QgICAgICAoR0VUfFBPU1QpICAgICBHRVQgICAgICAgLS0gSFRUUCBtZXRob2QgdXNlZCB0byBzdWJtaXQgdGhlIGZvcm0tLQotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHN1Ym1pdHRlZCAtLQotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHJlc2V0IC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRCAgLS0gbGlzdCBvZiBzdXBwb3J0ZWQgY2hhcnNldHMgLS0KLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMIC0gLSAoJWlubGluZTspKiAtKExBQkVMKSAtLSBmb3JtIGZpZWxkIGxhYmVsIHRleHQgLS0+Ci08IUFUVExJU1QgTEFCRUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVEICAtLSBtYXRjaGVzIGZpZWxkIElEIHZhbHVlIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8Ci0gICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8Ci0gICAgRklMRSB8IEhJRERFTiB8IElNQUdFIHwgQlVUVE9OKSIKLSAgID4KLQotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXF1aXJlZCBmb3IgcmFkaW8gYW5kIGNoZWNrYm94ZXMgLS0KLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQgIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVEICAtLSBmb3IgdGV4dCBhbmQgcGFzc3dkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgZmllbGQgLS0KLSAgbWF4bGVuZ3RoICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIG1heCBjaGFycyBmb3IgdGV4dCBmaWVsZHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGZvciBmaWVsZHMgd2l0aCBpbWFnZXMgLS0KLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVEdST1VQfE9QVElPTikrIC0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBmaWVsZCBuYW1lIC0tCi0gIHNpemUgICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByb3dzIHZpc2libGUgLS0KLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHQgaXMgc2luZ2xlIHNlbGVjdGlvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQIC0gLSAoT1BUSU9OKSsgLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSAgICAgICAgIC0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIE9QVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHRzIHRvIGVsZW1lbnQgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpICAgICAgIC0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCBURVhUQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tCi0gICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgdGhlcmUhCi0gLS0+Ci08IUVMRU1FTlQgRklFTERTRVQgLSAtICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopIC0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgTEVHRU5EIC0gLSAoJWlubGluZTspKiAgICAgICAtLSBmaWVsZHNldCBsZWdlbmQgLS0+Ci08IUVOVElUWSAlIExBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgTEVHRU5ECi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIGFsaWduICAgICAgICVMQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSByZWxhdGl2ZSB0byBmaWVsZHNldCAtLQotICA+Ci0KLTwhRUxFTUVOVCBCVVRUT04gLSAtCi0gICAgICglZmxvdzspKiAtKEF8JWZvcm1jdHJsO3xGT1JNfElTSU5ERVh8RklFTERTRVR8SUZSQU1FKQotICAgICAtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBCVVRUT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZW50IHRvIHNlcnZlciB3aGVuIHN1Ym1pdHRlZCAtLQotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0IC0tIGZvciB1c2UgYXMgZm9ybSBidXR0b24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBCT1JERVIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBGUkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSBWQUxJR04gYXR0cmlidXRlLgotCi0gVGhlIHZhbHVlICJib3JkZXIiIGlzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gPFRBQkxFIEJPUkRFUj4gd2hpY2ggeWllbGRzIGZyYW1lPWJvcmRlciBhbmQgYm9yZGVyPWltcGxpZWQKLSBGb3IgPFRBQkxFIEJPUkRFUj0xPiB5b3UgZ2V0IGJvcmRlcj0xIGFuZCBmcmFtZT1pbXBsaWVkLiBJbiB0aGlzCi0gY2FzZSwgaXQgaXMgYXBwcm9wcmlhdGUgdG8gdHJlYXQgdGhpcyBhcyBmcmFtZT1ib3JkZXIgZm9yIGJhY2t3YXJkcwotIGNvbXBhdGliaWxpdHkgd2l0aCBkZXBsb3llZCBicm93c2Vycy4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgUlVMRVMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgUlVMRVMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgQk9SREVSIGlzIGFic2VudCBvciBCT1JERVI9MCBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicgLS0KLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIgLS0iCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCBUQUJMRSAtIC0KLSAgICAgKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrKT4KLTwhRUxFTUVOVCBDQVBUSU9OICAtIC0gKCVpbmxpbmU7KSogICAgIC0tIHRhYmxlIGNhcHRpb24gLS0+Ci08IUVMRU1FTlQgVEhFQUQgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBoZWFkZXIgLS0+Ci08IUVMRU1FTlQgVEZPT1QgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBmb290ZXIgLS0+Ci08IUVMRU1FTlQgVEJPRFkgICAgTyBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBib2R5IC0tPgotPCFFTEVNRU5UIENPTEdST1VQIC0gTyAoY29sKSogICAgICAgICAgLS0gdGFibGUgY29sdW1uIGdyb3VwIC0tPgotPCFFTEVNRU5UIENPTCAgICAgIC0gTyBFTVBUWSAgICAgICAgICAgLS0gdGFibGUgY29sdW1uIC0tPgotPCFFTEVNRU5UIFRSICAgICAgIC0gTyAoVEh8VEQpKyAgICAgICAgLS0gdGFibGUgcm93IC0tPgotPCFFTEVNRU5UIChUSHxURCkgIC0gTyAoJWZsb3c7KSogICAgICAgLS0gdGFibGUgaGVhZGVyIGNlbGwsIHRhYmxlIGRhdGEgY2VsbC0tPgotCi08IUFUVExJU1QgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSBlbGVtZW50IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gcHVycG9zZS9zdHJ1Y3R1cmUgZm9yIHNwZWVjaCBvdXRwdXQtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgd2lkdGggLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGNvbnRyb2xzIGZyYW1lIHdpZHRoIGFyb3VuZCB0YWJsZSAtLQotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRCAgLS0gd2hpY2ggcGFydHMgb2YgZnJhbWUgdG8gcmVuZGVyIC0tCi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVEICAtLSBydWxpbmdzIGJldHdlZW4gcm93cyBhbmQgY29scyAtLQotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyBiZXR3ZWVuIGNlbGxzIC0tCi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBzcGFjaW5nIHdpdGhpbiBjZWxscyAtLQotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gd2luZG93IC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBjZWxscyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZGF0YXBhZ2VzaXplIENEQVRBICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIENBUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFsaWduICAgICAgICVDQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSByZWxhdGl2ZSB0byB0YWJsZSAtLQotICA+Ci0KLTwhLS0KLUNPTEdST1VQIGdyb3VwcyBhIHNldCBvZiBDT0wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIENPTEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucyBpbiBncm91cCAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gZGVmYXVsdCB3aWR0aCBmb3IgZW5jbG9zZWQgQ09McyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSBDT0wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIFdJRFRIIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIFNQQU4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBDT0wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIENPTCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY29sdW1uIGdyb3VwcyBhbmQgcHJvcGVydGllcyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIENPTCBhdHRyaWJ1dGVzIGFmZmVjdCBOIGNvbHVtbnMgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGNvbHVtbiB3aWR0aCBzcGVjaWZpY2F0aW9uIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotICAgIFVzZSBUSEVBRCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIFRGT09UIHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgVEJPRFkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIChUSEVBRHxUQk9EWXxURk9PVCkgICAgICAgICAgLS0gdGFibGUgc2VjdGlvbiAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IUFUVExJU1QgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBiYWNrZ3JvdW5kIGNvbG9yIGZvciByb3cgLS0KLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIChUSHxURCkgICAgICAgICAgICAgICAgICAgICAgLS0gaGVhZGVyIG9yIGRhdGEgY2VsbCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFiYnJldmlhdGlvbiBmb3IgaGVhZGVyIGNlbGwgLS0KLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVzIGdyb3VwcyBvZiByZWxhdGVkIGhlYWRlcnMtLQotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRCAgLS0gbGlzdCBvZiBpZCdzIGZvciBoZWFkZXIgY2VsbHMgLS0KLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQgIC0tIHNjb3BlIGNvdmVyZWQgYnkgaGVhZGVyIGNlbGxzIC0tCi0gIHJvd3NwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgY29sc3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiBjb2xzIHNwYW5uZWQgYnkgY2VsbCAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRCAgLS0gc3VwcHJlc3Mgd29yZCB3cmFwIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjZWxsIGJhY2tncm91bmQgY29sb3IgLS0KLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHdpZHRoIGZvciBjZWxsIC0tCi0gIGhlaWdodCAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERvY3VtZW50IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZSBjb250ZW50IG1vZGVsIGZvciBIVE1MIGRvY3VtZW50cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIEhFQUQgaXMKLSAgZm9sbG93ZWQgYnkgYSBGUkFNRVNFVCBvciBCT0RZIGVsZW1lbnQuIFRoZSB3aWRlc3ByZWFkIG9taXNzaW9uIG9mCi0gIHRoZSBCT0RZIHN0YXJ0IHRhZyBtYWtlcyBpdCBpbXByYWN0aWNhbCB0byBkZWZpbmUgdGhlIGNvbnRlbnQgbW9kZWwKLSAgd2l0aG91dCB0aGUgdXNlIG9mIGEgbWFya2VkIHNlY3Rpb24uCi0tLT4KLQotPCEtLSBGZWF0dXJlIFN3aXRjaCBmb3IgZnJhbWVzZXQgZG9jdW1lbnRzIC0tPgotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJR05PUkUiPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRUxFTUVOVCBGUkFNRVNFVCAtIC0gKChGUkFNRVNFVHxGUkFNRSkrICYgTk9GUkFNRVM/KSAtLSB3aW5kb3cgc3ViZGl2aXNpb24tLT4KLTwhQVRUTElTVCBGUkFNRVNFVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgcm93cyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEwMCUgKDEgcm93KSAtLQotICBjb2xzICAgICAgICAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBsZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMTAwJSAoMSBjb2wpIC0tCi0gIG9ubG9hZCAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhbGwgdGhlIGZyYW1lcyBoYXZlIGJlZW4gbG9hZGVkICAtLSAKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGFsbCB0aGUgZnJhbWVzIGhhdmUgYmVlbiByZW1vdmVkIC0tIAotICA+Ci1dXT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IS0tIHJlc2VydmVkIGZyYW1lIG5hbWVzIHN0YXJ0IHdpdGggIl8iIG90aGVyd2lzZSBzdGFydHMgd2l0aCBsZXR0ZXIgLS0+Ci08IUVMRU1FTlQgRlJBTUUgLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBzdWJ3aW5kb3cgLS0+Ci08IUFUVExJU1QgRlJBTUUKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyB0aXRsZSkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZnJhbWUgZm9yIHRhcmdldHRpbmcgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNvdXJjZSBvZiBmcmFtZSBjb250ZW50IC0tCi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgIDEgICAgICAgICAtLSByZXF1ZXN0IGZyYW1lIGJvcmRlcnM/IC0tCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gd2lkdGhzIGluIHBpeGVscyAtLQotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIGhlaWdodCBpbiBwaXhlbHMgLS0KLSAgbm9yZXNpemUgICAgKG5vcmVzaXplKSAgICAgI0lNUExJRUQgIC0tIGFsbG93IHVzZXJzIHRvIHJlc2l6ZSBmcmFtZXM/IC0tCi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgIGF1dG8gICAgICAtLSBzY3JvbGxiYXIgb3Igbm9uZSAtLQotICA+Ci1dXT4KLQotPCFFTEVNRU5UIElGUkFNRSAtIC0gKCVmbG93OykqICAgICAgICAgLS0gaW5saW5lIHN1YndpbmRvdyAtLT4KLTwhQVRUTElTVCBJRlJBTUUKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyB0aXRsZSkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZnJhbWUgZm9yIHRhcmdldHRpbmcgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNvdXJjZSBvZiBmcmFtZSBjb250ZW50IC0tCi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgIDEgICAgICAgICAtLSByZXF1ZXN0IGZyYW1lIGJvcmRlcnM/IC0tCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gd2lkdGhzIGluIHBpeGVscyAtLQotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIGhlaWdodCBpbiBwaXhlbHMgLS0KLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgYXV0byAgICAgIC0tIHNjcm9sbGJhciBvciBub25lIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gZnJhbWUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBmcmFtZSB3aWR0aCAtLQotICA+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBub2ZyYW1lcy5jb250ZW50ICIoQk9EWSkgLShOT0ZSQU1FUykiPgotXV0+Ci0KLTwhRU5USVRZICUgbm9mcmFtZXMuY29udGVudCAiKCVmbG93OykqIj4KLQotPCFFTEVNRU5UIE5PRlJBTUVTIC0gLSAlbm9mcmFtZXMuY29udGVudDsKLSAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBmcmFtZS1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9GUkFNRVMKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gJWhlYWQubWlzYzsgZGVmaW5lZCBlYXJsaWVyIG9uIGFzICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIgLS0+Ci08IUVOVElUWSAlIGhlYWQuY29udGVudCAiVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/Ij4KLQotPCFFTEVNRU5UIEhFQUQgTyBPICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgaGVhZCAtLT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGRpY3Rpb25hcnkgb2YgbWV0YSBpbmZvIC0tCi0gID4KLQotPCEtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgVElUTEUgLSAtICgjUENEQVRBKSAtKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCB0aXRsZSAtLT4KLTwhQVRUTElTVCBUSVRMRSAlaTE4bj4KLQotPCFFTEVNRU5UIElTSU5ERVggLSBPIEVNUFRZICAgICAgICAgICAgLS0gc2luZ2xlIGxpbmUgcHJvbXB0IC0tPgotPCFBVFRMSVNUIElTSU5ERVgKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvbXB0ICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHByb21wdCBtZXNzYWdlIC0tPgotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgdGhhdCBhY3RzIGFzIGJhc2UgVVJJIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBNRVRBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFBVFRMSVNUIE1FVEEKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIGNvbnRlbnQgLS0KLSAgaHR0cC1lcXVpdiAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgIC0tCi0gIG5hbWUgICAgICAgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBtZXRhaW5mb3JtYXRpb24gbmFtZSAtLQotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiAtLQotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VsZWN0IGZvcm0gb2YgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBTVFlMRSAtIC0gJVN0eWxlU2hlZXQgICAgICAgIC0tIHN0eWxlIGluZm8gLS0+Ci08IUFUVExJU1QgU1RZTEUKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIHRpdGxlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc3R5bGUgbGFuZ3VhZ2UgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB0aGVzZSBtZWRpYSAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0KLSAgPgotCi08IUVMRU1FTlQgU0NSSVBUIC0gLSAlU2NyaXB0OyAgICAgICAgICAtLSBzY3JpcHQgc3RhdGVtZW50cyAtLT4KLTwhQVRUTElTVCBTQ1JJUFQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc2NyaXB0IGxhbmd1YWdlIC0tCi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcmVkZWZpbmVkIHNjcmlwdCBsYW5ndWFnZSBuYW1lIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGFuIGV4dGVybmFsIHNjcmlwdCAtLQotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRCAgLS0gVUEgbWF5IGRlZmVyIGV4ZWN1dGlvbiBvZiBzY3JpcHQgLS0KLSAgZXZlbnQgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGZvciAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBOT1NDUklQVCAtIC0gKCVmbG93OykqCi0gIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9TQ1JJUFQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRU5USVRZICUgdmVyc2lvbiAidmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247JyI+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEZSQU1FU0VUIj4KLV1dPgotCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAiSEVBRCwgQk9EWSI+Ci0KLTwhRUxFTUVOVCBIVE1MIE8gTyAoJWh0bWwuY29udGVudDspICAgIC0tIGRvY3VtZW50IHJvb3QgZWxlbWVudCAtLT4KLTwhQVRUTElTVCBIVE1MCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgJXZlcnNpb247Ci0gID4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvc3RyaWN0LmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvc3RyaWN0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzNDM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL3N0cmljdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgSFRNTCA0LjAxIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQgaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3Igc3R5bGUgc2hlZXRzLCBzY3JpcHRpbmcsCi0gICAgZW1iZWRkaW5nIG9iamVjdHMsIGltcHJvdmVkIHN1cHBvcnQgZm9yIHJpZ2h0IHRvIGxlZnQgYW5kIG1peGVkCi0gICAgZGlyZWN0aW9uIHRleHQsIGFuZCBlbmhhbmNlbWVudHMgdG8gZm9ybXMgZm9yIGltcHJvdmVkCi0gICAgYWNjZXNzaWJpbGl0eSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzLgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAxOTk5LzEyLzI0IDIyOjQwOjM1ICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAxIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0Ci0KLQotICAgIFRoZSBIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhZGRpdGlvbmFsCi0gICAgc3ludGFjdGljIGNvbnN0cmFpbnRzIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCB3aXRoaW4KLSAgICB0aGUgRFREcy4KLQotLS0+Ci08IS0tCi0gICAgVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBUcmFuc2l0aW9uYWwgSFRNTCA0LjAxIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIHRyYW5zaXRpb25hbCBEVEQgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQKLQotICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIGRvY3VtZW50IHRoYXQgaW5jbHVkZXMgZnJhbWVzLCB1c2UgCi0gICAgdGhlIGZvbGxvd2luZyBGUEk6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIGZyYW1lc2V0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2ZyYW1lc2V0LmR0ZAotCi0gICAgVXNlIHRoZSBmb2xsb3dpbmcgKHJlbGF0aXZlKSBVUklzIHRvIHJlZmVyIHRvIAotICAgIHRoZSBEVERzIGFuZCBlbnRpdHkgZGVmaW5pdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uOgotCi0gICAgInN0cmljdC5kdGQiCi0gICAgImxvb3NlLmR0ZCIKLSAgICAiZnJhbWVzZXQuZHRkIgotICAgICJIVE1MbGF0MS5lbnQiCi0gICAgIkhUTUxzeW1ib2wuZW50IgotICAgICJIVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBGZWF0dXJlIFN3aXRjaCBmb3IgZnJhbWVzZXQgZG9jdW1lbnRzIC0tPgotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJR05PUkUiPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJIVE1MbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzLy9FTi8vSFRNTCIKLSAgICJIVE1Mc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwvL0VOLy9IVE1MIgotICAgIkhUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEICAtLSBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0IC0tIgotICA+Ci0KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkIC0tCi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZC0tCi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24gLS0KLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkIC0tCi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gLS0KLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgd2l0aGluIC0tCi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgLS0KLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZCAtLQotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgZG93biAtLQotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHJlbGVhc2VkIC0tIgotICA+Ci0KLTwhLS0gUmVzZXJ2ZWQgRmVhdHVyZSBTd2l0Y2ggLS0+Ci08IUVOVElUWSAlIEhUTUwuUmVzZXJ2ZWQgIklHTk9SRSI+Ci0KLTwhLS0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLT4KLTwhWyAlSFRNTC5SZXNlcnZlZDsgWwotPCFFTlRJVFkgJSByZXNlcnZlZAotICJkYXRhc3JjICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gYSBzaW5nbGUgb3IgdGFidWxhciBEYXRhIFNvdXJjZSAtLQotICBkYXRhZmxkICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gdGhlIHByb3BlcnR5IG9yIGNvbHVtbiBuYW1lIC0tCi0gIGRhdGFmb3JtYXRhcyAocGxhaW50ZXh0fGh0bWwpIHBsYWludGV4dCAtLSB0ZXh0IG9yIGh0bWwgLS0iCi0gID4KLV1dPgotCi08IUVOVElUWSAlIHJlc2VydmVkICIiPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBCSUcgfCBTTUFMTCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJFTSB8IFNUUk9ORyB8IERGTiB8IENPREUgfAotICAgICAgICAgICAgICAgICAgIFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIHwgQUJCUiB8IEFDUk9OWU0iID4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiQSB8IElNRyB8IE9CSkVDVCB8IEJSIHwgU0NSSVBUIHwgTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8iPgotCi08IUVOVElUWSAlIGZvcm1jdHJsICJJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04iPgotCi08IS0tICVpbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBpbmxpbmUgIiNQQ0RBVEEgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJXNwZWNpYWw7IHwgJWZvcm1jdHJsOyI+Ci0KLTwhRUxFTUVOVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspIC0gLSAoJWlubGluZTspKj4KLTwhQVRUTElTVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoU1VCfFNVUCkgLSAtICglaW5saW5lOykqICAgIC0tIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1QgKFNVQnxTVVApCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBTUEFOIC0gLSAoJWlubGluZTspKiAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIFNQQU4KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVyZXNlcnZlZDsJCQkgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQkRPIC0gLSAoJWlubGluZTspKiAgICAgICAgICAtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIEJETwotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVEIC0tIGRpcmVjdGlvbmFsaXR5IC0tCi0gID4KLQotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBOT1NDUklQVCB8Ci0gICAgICBCTE9DS1FVT1RFIHwgRk9STSB8IEhSIHwgVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MiPgotCi08IUVOVElUWSAlIGZsb3cgIiVibG9jazsgfCAlaW5saW5lOyI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAoJWJsb2NrO3xTQ1JJUFQpKyArKElOU3xERUwpIC0tIGRvY3VtZW50IGJvZHkgLS0+Ci08IUFUVExJU1QgQk9EWQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQgLS0KLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIC0tCi0gID4KLQotPCFFTEVNRU5UIEFERFJFU1MgLSAtICglaW5saW5lOykqIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhRUxFTUVOVCBBIC0gLSAoJWlubGluZTspKiAtKEEpICAgICAgIC0tIGFuY2hvciAtLT4KLTwhQVRUTElTVCBBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgbGluayBlbmQgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspIHwgQVJFQSkrIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVEICAtLSB0aGlzIHJlZ2lvbiBoYXMgbm8gYWN0aW9uIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIExJTksgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9c3R5bGVzaGVldCkKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9c2NyaXB0KQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD1hbHRlcm5hdGUgbWVkaWE9cHJpbnQpCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gYSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rIC0tPgotPCFBVFRMSVNUIExJTksKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGZvciByZW5kZXJpbmcgb24gdGhlc2UgbWVkaWEgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIiAtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgaW1hZ2UgZm9yIHNjcmlwdGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIG5hbWVkIHByb3BlcnR5IHZhbHVlIC0tPgotPCFBVFRMSVNUIFBBUkFNCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gcHJvcGVydHkgbmFtZSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJvcGVydHkgdmFsdWUgLS0KLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgREFUQSAgIC0tIEhvdyB0byBpbnRlcnByZXQgdmFsdWUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdmFsdWV0eXBlPXJlZiAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgLSBPICglaW5saW5lOykqICAgICAgICAgICAgLS0gcGFyYWdyYXBoIC0tPgotPCFBVFRMSVNUIFAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLS0gbG9uZyBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgQkxPQ0tRVU9URQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIChJTlN8REVMKSAtIC0gKCVmbG93OykqICAgICAgLS0gaW5zZXJ0ZWQgdGV4dCwgZGVsZXRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIChJTlN8REVMKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGluZm8gb24gcmVhc29uIGZvciBjaGFuZ2UgLS0KLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQgIC0tIGRhdGUgYW5kIHRpbWUgb2YgY2hhbmdlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gRFQgZm9yIHRlcm0sIEREIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIERMIC0gLSAoRFR8REQpKyAgICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBsaXN0IC0tPgotPCFBVFRMSVNUIERMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBEVCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgIC0tIGRlZmluaXRpb24gdGVybSAtLT4KLTwhRUxFTUVOVCBERCAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gZGVzY3JpcHRpb24gLS0+Ci08IUFUVExJU1QgKERUfEREKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLQotPCFFTEVNRU5UIExJIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgRk9STSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLShGT1JNKSAtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBzZXJ2ZXItc2lkZSBmb3JtIGhhbmRsZXIgLS0KLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgR0VUICAgICAgIC0tIEhUVFAgbWV0aG9kIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtLS0KLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZm9ybSBmb3Igc2NyaXB0aW5nIC0tCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgc3VibWl0dGVkIC0tCi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgcmVzZXQgLS0KLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQgIC0tIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJzZXRzIC0tCi0gID4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZCAtLT4KLTwhRUxFTUVOVCBMQUJFTCAtIC0gKCVpbmxpbmU7KSogLShMQUJFTCkgLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRCAgLS0gbWF0Y2hlcyBmaWVsZCBJRCB2YWx1ZSAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfAotICAgIFJBRElPIHwgU1VCTUlUIHwgUkVTRVQgfAotICAgIEZJTEUgfCBISURERU4gfCBJTUFHRSB8IEJVVFRPTikiCi0gICA+Ci0KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBTcGVjaWZ5IGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIC0tCi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVEICAtLSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2sgYm94ZXMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRCAgLS0gZm9yIHRleHQgYW5kIHBhc3N3ZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gIG1heGxlbmd0aCAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBtYXggY2hhcnMgZm9yIHRleHQgZmllbGRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgZmllbGRzIHdpdGggaW1hZ2VzIC0tCi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVEdST1VQfE9QVElPTikrIC0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBmaWVsZCBuYW1lIC0tCi0gIHNpemUgICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByb3dzIHZpc2libGUgLS0KLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHQgaXMgc2luZ2xlIHNlbGVjdGlvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQIC0gLSAoT1BUSU9OKSsgLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSAgICAgICAgIC0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIE9QVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHRzIHRvIGVsZW1lbnQgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpICAgICAgIC0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCBURVhUQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tCi0gICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgdGhlcmUhCi0gLS0+Ci08IUVMRU1FTlQgRklFTERTRVQgLSAtICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopIC0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgTEVHRU5EIC0gLSAoJWlubGluZTspKiAgICAgICAtLSBmaWVsZHNldCBsZWdlbmQgLS0+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxGSUVMRFNFVCkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKENPTCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLQotPCFBVFRMSVNUIENBUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLQotQ09MR1JPVVAgZ3JvdXBzIGEgc2V0IG9mIENPTCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgQ09MR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBkZWZhdWx0IG51bWJlciBvZiBjb2x1bW5zIGluIGdyb3VwIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBkZWZhdWx0IHdpZHRoIGZvciBlbmNsb3NlZCBDT0xzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotIENPTCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgV0lEVEggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgU1BBTiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIENPTCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjb2x1bW4gZ3JvdXBzIGFuZCBwcm9wZXJ0aWVzIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gQ09MIGF0dHJpYnV0ZXMgYWZmZWN0IE4gY29sdW1ucyAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gY29sdW1uIHdpZHRoIHNwZWNpZmljYXRpb24gLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gICAgVXNlIFRIRUFEIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgVEZPT1QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSBUQk9EWSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgKFRIRUFEfFRCT0RZfFRGT09UKSAgICAgICAgICAtLSB0YWJsZSBzZWN0aW9uIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhQVRUTElTVCBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlIHJvdyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIChUSHxURCkgICAgICAgICAgICAgICAgICAgICAgLS0gaGVhZGVyIG9yIGRhdGEgY2VsbCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFiYnJldmlhdGlvbiBmb3IgaGVhZGVyIGNlbGwgLS0KLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlbGF0ZWQgaGVhZGVycy0tCi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVEICAtLSBsaXN0IG9mIGlkJ3MgZm9yIGhlYWRlciBjZWxscyAtLQotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRCAgLS0gc2NvcGUgY292ZXJlZCBieSBoZWFkZXIgY2VsbHMgLS0KLSAgcm93c3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiByb3dzIHNwYW5uZWQgYnkgY2VsbCAtLQotICBjb2xzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIGNvbHMgc3Bhbm5lZCBieSBjZWxsIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAlaGVhZC5taXNjOyBkZWZpbmVkIGVhcmxpZXIgb24gYXMgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLT4KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIEJBU0U/Ij4KLQotPCFFTEVNRU5UIEhFQUQgTyBPICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgaGVhZCAtLT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGRpY3Rpb25hcnkgb2YgbWV0YSBpbmZvIC0tCi0gID4KLQotPCEtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgVElUTEUgLSAtICgjUENEQVRBKSAtKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCB0aXRsZSAtLT4KLTwhQVRUTElTVCBUSVRMRSAlaTE4bj4KLQotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBVUkkgdGhhdCBhY3RzIGFzIGJhc2UgVVJJIC0tCi0gID4KLQotPCFFTEVNRU5UIE1FVEEgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUFUVExJU1QgTUVUQQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggY29udGVudCAtLQotICBodHRwLWVxdWl2ICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gSFRUUCByZXNwb25zZSBoZWFkZXIgbmFtZSAgLS0KLSAgbmFtZSAgICAgICAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIG1ldGFpbmZvcm1hdGlvbiBuYW1lIC0tCi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIC0tCi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZWxlY3QgZm9ybSBvZiBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFNUWUxFIC0gLSAlU3R5bGVTaGVldCAgICAgICAgLS0gc3R5bGUgaW5mbyAtLT4KLTwhQVRUTElTVCBTVFlMRQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggdGl0bGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzdHlsZSBsYW5ndWFnZSAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZGVzaWduZWQgZm9yIHVzZSB3aXRoIHRoZXNlIG1lZGlhIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTQ1JJUFQgLSAtICVTY3JpcHQ7ICAgICAgICAgIC0tIHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotPCFBVFRMSVNUIFNDUklQVAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzY3JpcHQgbGFuZ3VhZ2UgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgYW4gZXh0ZXJuYWwgc2NyaXB0IC0tCi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVEICAtLSBVQSBtYXkgZGVmZXIgZXhlY3V0aW9uIG9mIHNjcmlwdCAtLQotICBldmVudCAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZm9yICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE5PU0NSSVBUIC0gLSAoJWJsb2NrOykrCi0gIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9TQ1JJUFQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4KLQotPCFFTEVNRU5UIEhUTUwgTyBPICglaHRtbC5jb250ZW50OykgICAgLS0gZG9jdW1lbnQgcm9vdCBlbGVtZW50IC0tPgotPCFBVFRMSVNUIEhUTUwKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL3N0cmljdDQwMC5kdGQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL3N0cmljdDQwMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGVkNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9zdHJpY3Q0MDAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODY4ICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIEhUTUwgNC4wIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQuMCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDE5OTgvMDQvMDIgMDA6MTc6MDAgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMCBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MAotLS0+Ci08IS0tCi0gICAgVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgIC4uLgotICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0KLSAgICBUaGUgVVJJIHVzZWQgYXMgYSBzeXN0ZW0gaWRlbnRpZmllciB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpZmllciBhbGxvd3MKLSAgICB0aGUgdXNlciBhZ2VudCB0byBkb3dubG9hZCB0aGUgRFREIGFuZCBlbnRpdHkgc2V0cyBhcyBuZWVkZWQuCi0KLSAgICBUaGUgRlBJIGZvciB0aGUgVHJhbnNpdGlvbmFsIEhUTUwgNC4wIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIKLQotICAgIGFuZCBpdHMgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkCi0KLSAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkb2N1bWVudCB0aGF0IGluY2x1ZGVzIGZyYW1lcywgdXNlIAotICAgIHRoZSBmb2xsb3dpbmcgRlBJOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iCi0KLSAgICB3aXRoIHRoZSBVUkk6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGQKLQotICAgIFRoZSBmb2xsb3dpbmcgVVJJcyBhcmUgc3VwcG9ydGVkIGluIHJlbGF0aW9uIHRvIEhUTUwgNC4wCi0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIiAoU3RyaWN0IERURCkKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiIChMb29zZSBEVEQpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIiAoRnJhbWVzZXQgRFREKQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL0hUTUxsYXQxLmVudCIgKExhdGluLTEgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHN5bWJvbC5lbnQiIChTeW1ib2wgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHNwZWNpYWwuZW50IiAoU3BlY2lhbCBlbnRpdGllcykKLQotICAgIFRoZXNlIFVSSXMgcG9pbnQgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggZmlsZS4gVG8gcmVmZXJlbmNlCi0gICAgdGhpcyBzcGVjaWZpYyByZXZpc2lvbiB1c2UgdGhlIGZvbGxvd2luZyBVUklzOgotCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9zdHJpY3QuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvbG9vc2UuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvZnJhbWVzZXQuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50IgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTHN5bWJvbC5lbnQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9IVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbiAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBNYXJrdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUKLSAiVFQgfCBJIHwgQiB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgT0JKRUNUIHwgQlIgfCBTQ1JJUFQgfCBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyI+Ci0KLTwhRU5USVRZICUgZm9ybWN0cmwgIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiI+Ci0KLTwhLS0gJWlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIGlubGluZSAiI1BDREFUQSB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybWN0cmw7Ij4KLQotPCFFTEVNRU5UICglZm9udHN0eWxlO3wlcGhyYXNlOykgLSAtICglaW5saW5lOykqPgotPCFBVFRMSVNUICglZm9udHN0eWxlO3wlcGhyYXNlOykKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIChTVUJ8U1VQKSAtIC0gKCVpbmxpbmU7KSogICAgLS0gc3Vic2NyaXB0LCBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCAoU1VCfFNVUCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIFNQQU4gLSAtICglaW5saW5lOykqICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgU1BBTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOwkJCSAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCRE8gLSAtICglaW5saW5lOykqICAgICAgICAgIC0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgQkRPCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQgLS0gZGlyZWN0aW9uYWxpdHkgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBCUiAtIE8gRU1QVFkgICAgICAgICAgICAgICAgIC0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIEJSCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSFRNTCBjb250ZW50IG1vZGVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgICBIVE1MIGhhcyB0d28gYmFzaWMgY29udGVudCBtb2RlbHM6Ci0KLSAgICAgICAgJWlubGluZTsgICAgIGNoYXJhY3RlciBsZXZlbCBlbGVtZW50cyBhbmQgdGV4dCBzdHJpbmdzCi0gICAgICAgICVibG9jazsgICAgICBibG9jay1saWtlIGVsZW1lbnRzIGUuZy4gcGFyYWdyYXBocyBhbmQgbGlzdHMKLS0tPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IE5PU0NSSVBUIHwKLSAgICAgIEJMT0NLUVVPVEUgfCBGT1JNIHwgSFIgfCBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUyI+Ci0KLTwhRU5USVRZICUgZmxvdyAiJWJsb2NrOyB8ICVpbmxpbmU7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJPRFkgTyBPICglYmxvY2s7fFNDUklQVCkrICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgPgotCi08IUVMRU1FTlQgQUREUkVTUyAtIC0gKCVpbmxpbmU7KSogLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotPCFBVFRMSVNUIEFERFJFU1MKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIERJViAtIC0gKCVmbG93OykqICAgICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgRElWCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgcmVjdCAgICAgIC0tIGZvciB1c2Ugd2l0aCBjbGllbnQtc2lkZSBpbWFnZSBtYXBzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgLSAtICgoJWJsb2NrOykrIHwgQVJFQSspIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVEICAtLSB0aGlzIHJlZ2lvbiBoYXMgbm8gYWN0aW9uIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIExJTksgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9c3R5bGVzaGVldCkKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9c2NyaXB0KQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD1hbHRlcm5hdGUgbWVkaWE9cHJpbnQpCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gYSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rIC0tPgotPCFBVFRMSVNUIExJTksKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGZvciByZW5kZXJpbmcgb24gdGhlc2UgbWVkaWEgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyAKLSAgIHRvIG1ha2UgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIAotICAgdG8gdXNlcnMgb2Ygbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUKLSAgIGEgZGVzY3JpcHRpb24gd2l0aCBBTFQsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzIC0tPgotPCFFTEVNRU5UIElNRyAtIE8gRU1QVFkgICAgICAgICAgICAgICAgLS0gRW1iZWRkZWQgaW1hZ2UgLS0+Ci08IUFUVExJU1QgSU1HCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gVVJJIG9mIGltYWdlIHRvIGVtYmVkIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgYWx0KSAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIG5hbWVkIHByb3BlcnR5IHZhbHVlIC0tPgotPCFBVFRMSVNUIFBBUkFNCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gcHJvcGVydHkgbmFtZSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJvcGVydHkgdmFsdWUgLS0KLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgREFUQSAgIC0tIEhvdyB0byBpbnRlcnByZXQgdmFsdWUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdmFsdWV0eXBlPXJlZiAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVldmVudHM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgLSBPICglaW5saW5lOykqICAgICAgICAgICAgLS0gcGFyYWdyYXBoIC0tPgotPCFBVFRMSVNUIFAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLS0gbG9uZyBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgQkxPQ0tRVU9URQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIChJTlN8REVMKSAtIC0gKCVmbG93OykqICAgICAgLS0gaW5zZXJ0ZWQgdGV4dCwgZGVsZXRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIChJTlN8REVMKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGluZm8gb24gcmVhc29uIGZvciBjaGFuZ2UgLS0KLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQgIC0tIGRhdGUgYW5kIHRpbWUgb2YgY2hhbmdlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gRFQgZm9yIHRlcm0sIEREIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIERMIC0gLSAoRFR8REQpKyAgICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBsaXN0IC0tPgotPCFBVFRMSVNUIERMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBEVCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgIC0tIGRlZmluaXRpb24gdGVybSAtLT4KLTwhRUxFTUVOVCBERCAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gZGVzY3JpcHRpb24gLS0+Ci08IUFUVExJU1QgKERUfEREKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLQotPCFFTEVNRU5UIExJIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgRk9STSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLShGT1JNKSAtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBzZXJ2ZXItc2lkZSBmb3JtIGhhbmRsZXIgLS0KLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgR0VUICAgICAgIC0tIEhUVFAgbWV0aG9kIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtLS0KLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQgLS0KLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyByZXNldCAtLQotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRCAgLS0gbGlzdCBvZiBzdXBwb3J0ZWQgY2hhcnNldHMgLS0KLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMIC0gLSAoJWlubGluZTspKiAtKExBQkVMKSAtLSBmb3JtIGZpZWxkIGxhYmVsIHRleHQgLS0+Ci08IUFUVExJU1QgTEFCRUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVEICAtLSBtYXRjaGVzIGZpZWxkIElEIHZhbHVlIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8Ci0gICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8Ci0gICAgRklMRSB8IEhJRERFTiB8IElNQUdFIHwgQlVUVE9OKSIKLSAgID4KLQotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXF1aXJlZCBmb3IgcmFkaW8gYW5kIGNoZWNrYm94ZXMgLS0KLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQgIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVEICAtLSBmb3IgdGV4dCBhbmQgcGFzc3dkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgZmllbGQgLS0KLSAgbWF4bGVuZ3RoICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIG1heCBjaGFycyBmb3IgdGV4dCBmaWVsZHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGZvciBmaWVsZHMgd2l0aCBpbWFnZXMgLS0KLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgU0VMRUNUIC0gLSAoT1BUR1JPVVB8T1BUSU9OKSsgLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIFNFTEVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGZpZWxkIG5hbWUgLS0KLSAgc2l6ZSAgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHJvd3MgdmlzaWJsZSAtLQotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdCBpcyBzaW5nbGUgc2VsZWN0aW9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUR1JPVVAgLSAtIChPUFRJT04pKyAtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1QgT1BUR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVElPTiAtIE8gKCNQQ0RBVEEpICAgICAgICAgLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1QgT1BUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdHMgdG8gZWxlbWVudCBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFRFWFRBUkVBIC0gLSAoI1BDREFUQSkgICAgICAgLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIFRFWFRBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHNvbWUgdGV4dCB3YXMgc2VsZWN0ZWQgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhLS0KLSAgI1BDREFUQSBpcyB0byBzb2x2ZSB0aGUgbWl4ZWQgY29udGVudCBwcm9ibGVtLAotICBwZXIgc3BlY2lmaWNhdGlvbiBvbmx5IHdoaXRlc3BhY2UgaXMgYWxsb3dlZCB0aGVyZSEKLSAtLT4KLTwhRUxFTUVOVCBGSUVMRFNFVCAtIC0gKCNQQ0RBVEEsTEVHRU5ELCglZmxvdzspKikgLS0gZm9ybSBjb250cm9sIGdyb3VwIC0tPgotPCFBVFRMSVNUIEZJRUxEU0VUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBMRUdFTkQgLSAtICglaW5saW5lOykqICAgICAgIC0tIGZpZWxkc2V0IGxlZ2VuZCAtLT4KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxGSUVMRFNFVCkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKGNvbCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0KLUNPTEdST1VQIGdyb3VwcyBhIHNldCBvZiBDT0wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIENPTEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucyBpbiBncm91cCAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gZGVmYXVsdCB3aWR0aCBmb3IgZW5jbG9zZWQgQ09McyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSBDT0wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIFdJRFRIIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIFNQQU4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBDT0wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIENPTCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY29sdW1uIGdyb3VwcyBhbmQgcHJvcGVydGllcyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIENPTCBhdHRyaWJ1dGVzIGFmZmVjdCBOIGNvbHVtbnMgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGNvbHVtbiB3aWR0aCBzcGVjaWZpY2F0aW9uIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotICAgIFVzZSBUSEVBRCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIFRGT09UIHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgVEJPRFkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIChUSEVBRHxUQk9EWXxURk9PVCkgICAgICAgICAgLS0gdGFibGUgc2VjdGlvbiAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IUFUVExJU1QgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gVEggaXMgZm9yIGhlYWRlcnMsIFREIGZvciBkYXRhLCBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSBURCAtLT4KLTwhQVRUTElTVCAoVEh8VEQpICAgICAgICAgICAgICAgICAgICAgIC0tIGhlYWRlciBvciBkYXRhIGNlbGwgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhYmJyZXZpYXRpb24gZm9yIGhlYWRlciBjZWxsIC0tCi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lcyBncm91cHMgb2YgcmVsYXRlZCBoZWFkZXJzLS0KLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQgIC0tIGxpc3Qgb2YgaWQncyBmb3IgaGVhZGVyIGNlbGxzIC0tCi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVEICAtLSBzY29wZSBjb3ZlcmVkIGJ5IGhlYWRlciBjZWxscyAtLQotICByb3dzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIHJvd3Mgc3Bhbm5lZCBieSBjZWxsIC0tCi0gIGNvbHNwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2YgY29scyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICVoZWFkLm1pc2M7IGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tPgotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQgIlRJVExFICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gKCVoZWFkLmNvbnRlbnQ7KSArKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCBoZWFkIC0tPgotPCFBVFRMSVNUIEhFQUQKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgZGljdGlvbmFyeSBvZiBtZXRhIGluZm8gLS0KLSAgPgotCi08IS0tIFRoZSBUSVRMRSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCBUSVRMRSAtIC0gKCNQQ0RBVEEpIC0oJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IHRpdGxlIC0tPgotPCFBVFRMSVNUIFRJVExFICVpMThuPgotCi0KLTwhRUxFTUVOVCBCQVNFIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotPCFBVFRMSVNUIEJBU0UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSB0aGF0IGFjdHMgYXMgYmFzZSBVUkkgLS0KLSAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCBjb250ZW50IC0tCi0gIGh0dHAtZXF1aXYgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAtLQotICBuYW1lICAgICAgICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gbWV0YWluZm9ybWF0aW9uIG5hbWUgLS0KLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gLS0KLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbGVjdCBmb3JtIG9mIGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgU1RZTEUgLSAtICVTdHlsZVNoZWV0ICAgICAgICAtLSBzdHlsZSBpbmZvIC0tPgotPCFBVFRMSVNUIFNUWUxFCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCB0aXRsZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHN0eWxlIGxhbmd1YWdlIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggdGhlc2UgbWVkaWEgLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNDUklQVCAtIC0gJVNjcmlwdDsgICAgICAgICAgLS0gc2NyaXB0IHN0YXRlbWVudHMgLS0+Ci08IUFUVExJU1QgU0NSSVBUCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHNjcmlwdCBsYW5ndWFnZSAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBhbiBleHRlcm5hbCBzY3JpcHQgLS0KLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQgIC0tIFVBIG1heSBkZWZlciBleGVjdXRpb24gb2Ygc2NyaXB0IC0tCi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBmb3IgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgTk9TQ1JJUFQgLSAtICglYmxvY2s7KSsKLSAgLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLTwhQVRUTElTVCBOT1NDUklQVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gKCVodG1sLmNvbnRlbnQ7KSAgICAtLSBkb2N1bWVudCByb290IGVsZW1lbnQgLS0+Ci08IUFUVExJU1QgSFRNTAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gID4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvQW5jaG9yVW5kZXJBbmNob3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0FuY2hvclVuZGVyQW5jaG9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ1ZDY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvQW5jaG9yVW5kZXJBbmNob3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEFuY2hvckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgRXJyb3JIYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgQW5jaG9yVW5kZXJBbmNob3JIYW5kbGVyIGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQW5jaG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50Ci0JCQkJfHwgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIG5vZGUuZ2V0Tm9kZU5hbWUoKQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoIkEiKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChjb2RlID09IElMTEVHQUxfQ0hJTEQgJiYgaXNBbmNob3IoZXJyb3JOb2RlKSkgewotCQkJZm9yIChOb2RlIG5vZGUgPSBwYXJzZXIuZ2V0Q29udGV4dCgpOyBub2RlIGluc3RhbmNlb2YgRWxlbWVudDsgbm9kZSA9IG5vZGUKLQkJCQkJLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmIChpc0FuY2hvcihub2RlKSkgewotCQkJCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVycm9yTm9kZSwgbnVsbCk7Ci0JCQkJCXBhcnNlci5zZXRDb250ZXh0KChFbGVtZW50KSBlcnJvck5vZGUpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Gb3JtRXhwYW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRm9ybUV4cGFuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTA1NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Gb3JtRXhwYW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLkVuZFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwudXRpbC5TZ21sVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogRXJyb3JIYW5kbGVyIGltcGxlbWVudGF0aW9uIGZvciBpbGxlZ2FsbHkgY2xvc2VkIGZvcm0gY29udGV4dC4gVXN1YWxseSB0byBhZGQKLSAqIGFuIGVycm9yIGhhbmRsZXIsIHlvdSB1c2VzIHtAbGluawotICogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyI2FkZEVycm9ySGFuZGxlcihvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyKX0uCi0gKiBIb3dldmVyLCB0aGlzIGVycm9yIGhhbmRsZXIgY29uZmxpY3RzIHdpdGgge0BsaW5rIEhUTUxFcnJvckhhbmRsZXJ9IGluc3RhbGxlZAotICogdG8gcGFyc2VycyBieSBkZWZhdWx0LiBUaHVzLCBpbnN0ZWFkIG9mIHRoYXQgbWV0aG9kIHVzZSB7QGxpbmsgCi0gKiAjYWRkVG8oSFRNTFBhcnNlcil9LiBBbmQgdG8gcmVtb3ZlIHRoaXMsIHVzZSB7QGxpbmsgI3JlbW92ZSgpfS4gTm90ZTogVGhpcwotICogZXJyb3IgaGFuZGxlciBpcyA8ZW0+ZXhwZXJpbWVudGFsPC9lbT4uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZvcm1FeHBhbmRlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCXByaXZhdGUgSFRNTEVycm9ySGFuZGxlciBodG1sRXJyb3JIYW5kbGVyOwotCi0JcHJpdmF0ZSBIVE1MUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEFkZCB0aGlzIGVycm9yIGhhbmRsZXIgdG8gPGNvZGU+cGFyc2VyPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyI2FkZEVycm9ySGFuZGxlcihvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvKEhUTUxQYXJzZXIgcGFyc2VyKSB7Ci0JCUlFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyc1tdID0gcGFyc2VyLmdldEVycm9ySGFuZGxlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyc1tpXSBpbnN0YW5jZW9mIEhUTUxFcnJvckhhbmRsZXIpIHsKLQkJCQlodG1sRXJyb3JIYW5kbGVyID0gKEhUTUxFcnJvckhhbmRsZXIpIGVycm9ySGFuZGxlcnNbaV07Ci0JCQkJaHRtbEVycm9ySGFuZGxlci5zZXRLZWVwRm9ybShmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcGFyc2VyLmFkZEVycm9ySGFuZGxlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBlcnJvciBoYW5kbGVyIGZyb20gdGhlIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmIChodG1sRXJyb3JIYW5kbGVyICE9IG51bGwpIHsKLQkJCWh0bWxFcnJvckhhbmRsZXIuc2V0S2VlcEZvcm0odHJ1ZSk7Ci0JCQlwYXJzZXIucmVtb3ZlRXJyb3JIYW5kbGVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbGFzdCA8Y29kZT5GT1JNPC9jb2RlPiBlbGVtZW50IGFuZCByZWxpbmsgaXQgdG8gdGhlIGxvd2VzdAotCSAqIHBvc2l0aW9uIHdoZXJlYXMgaXQgY292ZXJzIGl0cyBzdGFydCBhbmQgZW5kIHRhZy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgZXJyb3JOb2RlKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gZXJyb3JOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCWlmIChjb2RlID09IEZMT0FUSU5HX0VORFRBRyAmJiBlcnJvck5vZGUgaW5zdGFuY2VvZiBFbmRUYWcKLQkJCQkmJiBub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJGT1JNIikpIHsKLQkJCS8vIEVsZW1lbnQgY29udGV4dCA9IHBhcnNlci5nZXRDb250ZXh0KCk7Ci0JCQlOb2RlTGlzdCBmb3JtcyA9IHBhcnNlci5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGT1JNIik7Ci0JCQlFbGVtZW50IHRhcmdldEZvcm0gPSAoRWxlbWVudCkgZm9ybXMuaXRlbShmb3Jtcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJaWYgKHRhcmdldEZvcm0gPT0gbnVsbCB8fCBwYXJzZXIuaGFzRW5kVGFnKHRhcmdldEZvcm0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIENoZWNrcyBpZiB0YXJnZXQgZm9ybSBpcyB1bmRlciB0aGUgY29udGV4dC4KLQkJCUVsZW1lbnQgdGFyZ2V0Rmlyc3ROb2RlID0gdGFyZ2V0Rm9ybTsKLQkJCUVsZW1lbnQgY29udGV4dHNbXSA9IHBhcnNlci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQkJCW91dGVyOiB3aGlsZSAodGFyZ2V0Rmlyc3ROb2RlLmdldFBhcmVudE5vZGUoKSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KSB0YXJnZXRGaXJzdE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmICh0YXJnZXRGaXJzdE5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZPUk0iKS5nZXRMZW5ndGgoKSA+IDEpCi0JCQkJCWJyZWFrOwotCQkJCWZvciAoaW50IGMgPSBjb250ZXh0cy5sZW5ndGggLSAxOyBjID49IDA7IGMtLSkgewotCQkJCQlpZiAoY29udGV4dHNbY10gPT0gcGFyZW50KSB7Ci0JCQkJCQlmb3IgKE5vZGUgY2hpbGQgPSB0YXJnZXRGaXJzdE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQKLQkJCQkJCQkJCSYmICgoRWxlbWVudCkgY2hpbGQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKAotCQkJCQkJCQkJCQkiRk9STSIpLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlTZ21sVXRpbC5yZW1vdmUodGFyZ2V0Rm9ybSk7Ci0JCQkJCQlTZ21sVXRpbC5hZGQocGFyZW50LCB0YXJnZXRGb3JtLCB0YXJnZXRGaXJzdE5vZGUsIHBhcmVudAotCQkJCQkJCQkuZ2V0TGFzdENoaWxkKCkpOwotCQkJCQkJaWYgKGMgIT0gY29udGV4dHMubGVuZ3RoIC0gMSkKLQkJCQkJCQlwYXJzZXIuc2V0Q29udGV4dChwYXJlbnQpOwotCQkJCQkJKChFbmRUYWcpIGVycm9yTm9kZSkuc2V0RWxlbWVudCh0YXJnZXRGb3JtKTsKLQkJCQkJCXBhcnNlci5zZXRIYXNFbmRUYWcodGFyZ2V0Rm9ybSk7Ci0JCQkJCQlwYXJzZXIuZXJyb3IoY29kZSwgIkV4cGFuZGVkICIgKyB0YXJnZXRGb3JtKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRhcmdldEZpcnN0Tm9kZSA9IHBhcmVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Gb3JtSW5zZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRm9ybUluc2VydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0N2EwZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Gb3JtSW5zZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuRW5kVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEVycm9ySGFuZGxlciBpbXBsZW1lbnRhdGlvbiBmb3IgaWxsZWdhbGx5IGNsb3NlZCBmb3JtIGNvbnRleHQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZvcm1JbnNlcnRlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAoY29kZSAhPSBGTE9BVElOR19FTkRUQUcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChlcnJvck5vZGUgaW5zdGFuY2VvZiBFbmRUYWcKLQkJCQkmJiBlcnJvck5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJGT1JNIikpIHsKLQkJCUVsZW1lbnQgY29udGV4dCA9IHBhcnNlci5nZXRDb250ZXh0KCk7Ci0JCQlWZWN0b3I8Tm9kZT4gbm9kZXMgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCQlib29sZWFuIGluY2x1ZGVGb3JtQ3RybCA9IGZhbHNlOwotCQkJZm9yIChOb2RlIG5vZGUgPSBjb250ZXh0LmdldExhc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlCi0JCQkJCS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgewotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJaWYgKGhhc0VsZW1lbnQoZWxlbWVudCwgZm9ybU5hbWUpKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIGlmIChoYXNGb3JtQ3RybChlbGVtZW50KSkgewotCQkJCQkJaW5jbHVkZUZvcm1DdHJsID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlub2Rlcy5pbnNlcnRFbGVtZW50QXQobm9kZSwgMCk7Ci0JCQl9Ci0JCQlpZiAoIWluY2x1ZGVGb3JtQ3RybCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlFbGVtZW50IGZvcm0gPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KAotCQkJCQlwYXJzZXIuY2hhbmdlRGVmYXVsdFRhZ0Nhc2UoIkZPUk0iKSk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBub2Rlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJY29udGV4dC5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQlmb3JtLmluc2VydEJlZm9yZShub2RlLCBudWxsKTsKLQkJCX0KLQkJCWNvbnRleHQuaW5zZXJ0QmVmb3JlKGZvcm0sIG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZvcm1OYW1lW10gPSB7ICJGT1JNIiB9OwotCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybUN0cmxzW10gPSB7ICJJTlBVVCIsICJTRUxFQ1QiLCAiVEVYVEFSRUEiLCAiTEFCRUwiLAotCQkJIkJVVFRPTiIgfTsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb3JtQ3RybChFbGVtZW50IHRvcCkgewotCQlyZXR1cm4gaGFzRWxlbWVudCh0b3AsIGZvcm1DdHJscyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0VsZW1lbnQoRWxlbWVudCB0b3AsIFN0cmluZyBlbGVtZW50TmFtZXNbXSkgewotCQlOb2RlIHRtcDEsIHRtcDI7Ci0JCXRtcDEgPSB0b3A7Ci0JCXdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0bXAxLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50TmFtZXNbaV0pKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRtcDEgIT0gdG9wKSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAodG1wMSAhPSB0b3ApIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJdG1wMSA9IHRtcDI7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRnJhbWVzZXRFcnJvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRnJhbWVzZXRFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Zjg4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0ZyYW1lc2V0RXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi0KLS8qKgotICogSWYgYSBwYXJzZXIgdXNpbmcgU3RyaWN0IG9yIHNvbWUgRFREIHdoaWNoIGRvZXMgbm90IGRlZmluZSBGUkFNRVNFVCwgdGhpcwotICogZXJyb3IgaGFuZGxlciBtYWtlIHRoZSBwYXJzZXIgdXNlIEZSQU1FU0VUIHdoaWxlIHBhcnNpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmFtZXNldEVycm9ySGFuZGxlciBleHRlbmRzIFVua25vd25FbGVtZW50RXJyb3JIYW5kbGVyIHsKLQlwdWJsaWMgRnJhbWVzZXRFcnJvckhhbmRsZXIoKSB7Ci0JCXN1cGVyKCJGUkFNRVNFVCIsICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9IVE1MRXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0hUTUxFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYzBkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0hUTUxFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuRWxlbWVudERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5FbmRUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSFRNTEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCS8qKgotCSAqIFNlYXJjaGVzIHByb3BlciBhIHBhcmVudCBub2RlIG9mIG5vZGUuIEJlaGF2aWVyIGlzIGRlc2NyaWJlZCBhcyBmb2xsb3dzLgotCSAqIDxvbD4KLQkgKiA8bGk+IElmIDxjb2RlPm5vZGU8L2NvZGU+IGlzIExJTkssIFNUWUxFIEJBU0UsIElTSU5ERVggb3IgTUVUQSBlbGVtZW50LAotCSAqIGFkZCBpdCB0byBsYXN0IEhFQUQgZWxlbWVudC4KLQkgKiA8bGk+IElmIGNvbnRleHQgYW5kIDxjb2RlPm5vZGU8L2NvZGU+IGFyZSBlcXVhbCBub2RlcywgQ2hhbmdlcyBDb250ZXh0Ci0JICogdG8gaXRzIHBhcmVudCBhbmQgYXBwZW5kIDxjb2RlPm5vZGU8L2NvZGU+IHRvIGNvbnRleHQuIDwhLS0KLQkgKiA8bGk+IElmIGNvbnRleHQgaXMgSFRNTCBlbGVtZW50LAotCSAqIDxvbD4KLQkgKiA8bGk+SWYgPGNvZGU+bm9kZTxjb2RlPiBpcyBCT0RZCi0JICogZWxlbWVudCwgYXBwZW5kIDxjb2RlPm5vZGU8L2NvZGU+IHRvIGNvbnRleHQgYW5kIGNoYW5nZSBpdCB0bwotCSAqIDxjb2RlPm5vZGU8L2NvZGU+IChUaGlzIHN0cmFuZ2UgY2FzZSBvY2N1cnMgd2hlbiBmcmFtZXNldCBkdGQgaXMgdXNlZCkuCi0JICogPGxpPiBJZiBjb250ZXh0IGhhcyBvbmx5IGEgSEVBRCBlbGVtZW50LCBtYWtlcyBCT0RZIGVsZW1lbnQgYXMKLQkgKiBhIG5leHQgc2libGluZyBvZiB0aGUgSEVBRCBhbmQgYXBwZW5kcyA8Y29kZT5ub2RlPC9jb2RlPiBhbmQgY2hhbmdlcyAKLQkgKiBjb250ZXh0IHRvIGl0LgotCSAqIDwvb2w+Ci0JICogLS0+Ci0JICogPC9vbD4KLQkgKiBAcGFyYW0gbm9kZSBpbGxlZ2FsIGNoaWxkIG5vZGUuCi0JICogQHJldHVybiB0cnVlIGlmIGZvdW5kLiAgT3RoZXJ3aXNlIGZhbHNlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyI2dldENvbnRleHQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyI3NldENvbnRleHQob3JnLnczYy5kb20uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgZXJyb3JOb2RlKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGNvZGUgPT0gSUxMRUdBTF9BVFRSSUJVVEUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgbm9kZU5hbWUgPSBlcnJvck5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJRWxlbWVudCBjb250ZXh0ID0gcGFyc2VyLmdldENvbnRleHQoKTsKLQkJTm9kZSBjb250ZXh0UGFyZW50ID0gY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCVN0cmluZyBjb250ZXh0TmFtZSA9IGNvbnRleHQuZ2V0Tm9kZU5hbWUoKTsKLQkJTm9kZUxpc3QgYm9kaWVzOwotCQlpZiAoZXJyb3JOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJRWxlbWVudERlZmluaXRpb24gZWQgPSBwYXJzZXIuZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24oCi0JCQkJCW5vZGVOYW1lKTsKLQkJCWlmIChlZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkxJTksiKQotCQkJCQl8fCBub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTVFlMRSIpCi0JCQkJCXx8IG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEiKQotCQkJCQl8fCBub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJCQVNFIikKLQkJCQkJfHwgbm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSVNJTkRFWCIpKSB7Ci0JCQkJRWxlbWVudCBodG1sID0gcGFyc2VyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJZm9yIChOb2RlIGNoaWxkID0gaHRtbC5nZXRMYXN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcnJvckhhbmRsZXI6ICIrY2hpbGQuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiSEVBRCIpKSB7Ci0JCQkJCQljaGlsZC5pbnNlcnRCZWZvcmUoZXJyb3JOb2RlLCBudWxsKTsKLQkJCQkJCXBhcnNlci5lcnJvcihjb2RlLCBlcnJvck5vZGUgKyAiIG11c3QgYmUgdW5kZXIgIgotCQkJCQkJCQkrIGNoaWxkKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJCT0RZIikpIHsKLQkJCQlFbGVtZW50IHRvcCA9IHBhcnNlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCWZvciAoTm9kZSBjaGlsZCA9IHRvcC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQKLQkJCQkJCQkmJiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJCT0RZIikgfHwgY2hpbGQKLQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIkZSQU1FU0VUIikpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdG9wLmluc2VydEJlZm9yZShlcnJvck5vZGUsIG51bGwpOwotCQkJCXBhcnNlci5zZXRDb250ZXh0KChFbGVtZW50KSBlcnJvck5vZGUpOwotCQkJCXBhcnNlci5lcnJvcihjb2RlLCBlcnJvck5vZGUgKyAiIG11c3QgYmUgdW5kZXIgIiArIHRvcCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkhFQUQiKSkgewotCQkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5nZXREb2N1bWVudCgpOwotCQkJCWlmIChjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJIRUFEIikuZ2V0TGVuZ3RoKCkgPT0gMAotCQkJCQkJJiYgKChib2RpZXMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkJPRFkiKSkKLQkJCQkJCQkJLmdldExlbmd0aCgpID4gMCB8fCAoYm9kaWVzID0gZG9jCi0JCQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRlJBTUVTRVQiKSkuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCQlFbGVtZW50IGJvZHkgPSAoRWxlbWVudCkgYm9kaWVzLml0ZW0oMCk7Ci0JCQkJCWJvZHkuZ2V0UGFyZW50Tm9kZSgpLmluc2VydEJlZm9yZShlcnJvck5vZGUsIGJvZHkpOwotCQkJCQlwYXJzZXIuc2V0Q29udGV4dCgoRWxlbWVudCkgZXJyb3JOb2RlKTsKLQkJCQkJcGFyc2VyLmVycm9yKGNvZGUsIGVycm9yTm9kZSArICIgbXVzdCBiZSBiZWZvcmUgIiArIGJvZHkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJCT0RZIikuZ2V0TGVuZ3RoKCkgPiAwCi0JCQkJCQkJfHwgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGUkFNRVNFVCIpLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJcGFyc2VyLmVycm9yKGNvZGUsCi0JCQkJCQkJCSJIVE1MRXJyb3JIYW5kbGVyIG1ha2VzIHBhcnNlciBpZ25vcmUgIgotCQkJCQkJCQkJCSsgZXJyb3JOb2RlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjb250ZXh0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIVE1MIikpIHsKLQkJCQlmb3IgKE5vZGUgY2hpbGQgPSBjb250ZXh0LmdldExhc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJCQkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiQk9EWSIpKSB7Ci0JCQkJCQlwYXJzZXIuZXJyb3IoY29kZSwKLQkJCQkJCQkJIkJPRFkgY29udGV4dCBpcyBhbHJlYWR5IGNsb3NlZC4gIFJlb3BlbiBpdC4iKTsKLQkJCQkJCXBhcnNlci5yZW9wZW5Db250ZXh0KDEpOwotCQkJCQkJcGFyc2VyLmdldENvbnRleHQoKS5pbnNlcnRCZWZvcmUoZXJyb3JOb2RlLCBudWxsKTsKLQkJCQkJCXBhcnNlci5zZXRDb250ZXh0KChFbGVtZW50KSBlcnJvck5vZGUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21tZW50Ci0JCQkJCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkJCQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFRleHQKLQkJCQkJCQkmJiB3aGl0ZXNwYWNlVGV4dCgoVGV4dCkgY2hpbGQpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNvbnRleHROYW1lKQotCQkJCQkmJiBlZC5lbmRUYWdPbWl0dGFibGUoKSAmJiBjb250ZXh0UGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCS8vIHBhcnNlci5zZXRDb250ZXh0KChFbGVtZW50KWNvbnRleHRQYXJlbnQpOwotCQkJCWNvbnRleHRQYXJlbnQuaW5zZXJ0QmVmb3JlKGVycm9yTm9kZSwgbnVsbCk7Ci0JCQkJcGFyc2VyLnNldENvbnRleHQoKEVsZW1lbnQpIGVycm9yTm9kZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY29kZSA9PSBTVURERU5fRU5EVEFHKSB7Ci0JCQl0cnkgewotCQkJCWphdmEudXRpbC5WZWN0b3IgbWlzc2VkRW5kdGFncyA9IChqYXZhLnV0aWwuVmVjdG9yKSBwYXJzZXIKLQkJCQkJCS5nZXRFeHRyYUVyckluZm8oKTsKLQkJCQlmb3IgKGphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWlzc2VkRW5kdGFncy5lbGVtZW50cygpOyBlCi0JCQkJCQkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCUVuZFRhZyBtaXNzZWRFdGFnID0gKEVuZFRhZykgZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbWlzc2VkRXRhZ05hbWUgPSBtaXNzZWRFdGFnLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWlmIChtaXNzZWRFdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJUQUJMRSIpKSB7Ci0JCQkJCQkvLyBpZ25vcmUgdGhlIGVuZHRhZwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSBpZiAoa2VlcEZvcm0KLQkJCQkJCQkmJiBtaXNzZWRFdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJGT1JNIikKLQkJCQkJCQkmJiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVEQiKSB8fCBub2RlTmFtZQotCQkJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoIlRSIikpKSB7Ci0JCQkJCQkvLyBURCBpcyBub3QgYWJsZSB0byBjbG9zZSBGT1JNCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBrZWVwRm9ybSA9IHRydWU7Ci0KLQl2b2lkIHNldEtlZXBGb3JtKGJvb2xlYW4ga2VlcCkgewotCQl0aGlzLmtlZXBGb3JtID0ga2VlcDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2hpdGVzcGFjZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0IGluc3RhbmNlb2YgU0dNTFRleHQpIHsKLQkJCXJldHVybiAoKFNHTUxUZXh0KSB0ZXh0KS5nZXRJc1doaXRlc3BhY2VJbkVsZW1lbnRDb250ZW50KCk7Ci0JCX0KLQkJY2hhciBzdHJbXSA9IHRleHQuZ2V0RGF0YSgpLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9JZ25vcmVGb250LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0lnbm9yZUZvbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmOWM2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0lnbm9yZUZvbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXIuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBJZiBhIHBhcnNlciB1c2luZyBTdHJpY3Qgb3Igc29tZSBEVEQgd2hpY2ggZG9lcyBub3QgZGVmaW5lIEZSQU1FU0VULCB0aGlzCi0gKiBlcnJvciBoYW5kbGVyIG1ha2VzIHRoZSBwYXJzZXIgdXNlIEZSQU1FU0VUIHdoaWxlIHBhcnNpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBJZ25vcmVGb250IGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkgewotCQlpZiAoY29kZSA9PSBJTExFR0FMX0NISUxEICYmIGVycm9yTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQKLQkJCQkmJiBlcnJvck5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJGT05UIikpIHsKLQkJCXBhcnNlci5lcnJvcihjb2RlLCBlcnJvck5vZGUgKyAiIGlzIGlsbGVnYWwgdW5kZXIgIgotCQkJCQkrIHBhcnNlci5nZXRDb250ZXh0KCkgKyAiLiAgU28gaWdub3JlIGl0LiIpOwotCQkJcmV0dXJuIHRydWU7IC8vIGlnbm9yZSB0aGUgZXJyb3JOb2RlLgotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9UUkVycm9ySGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9UUkVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI5OTE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvVFJFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5FbGVtZW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBJZiBzdGFydCB0YWcgb2YgVFIgaXMgbWlzc2VkIGFuZCBvbmx5IGl0cyBlbmQgdGFnIGV4aXN0cywgcHJvdmlkZSBzdGFydCB0YWcuCi0gKi8KLXB1YmxpYyBjbGFzcyBUUkVycm9ySGFuZGxlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlFbGVtZW50IGNvbnRleHQ7Ci0JCVN0cmluZyBjb250ZXh0TmFtZTsKLQkJaWYgKGNvZGUgPT0gSUxMRUdBTF9DSElMRCAmJiBlcnJvck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJJiYgZXJyb3JOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEQiKSkgewotCQkJY29udGV4dCA9IHBhcnNlci5nZXRDb250ZXh0KCk7Ci0JCQljb250ZXh0TmFtZSA9IGNvbnRleHQuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChjb250ZXh0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJUQk9EWSIpCi0JCQkJCXx8IGNvbnRleHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlRBQkxFIikpIHsKLQkJCQlFbGVtZW50IHRyID0gcGFyc2VyLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJCXBhcnNlci5jaGFuZ2VEZWZhdWx0VGFnQ2FzZSgiVFIiKSk7Ci0JCQkJRWxlbWVudERlZmluaXRpb24gZWQgPSBwYXJzZXIuZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24oCi0JCQkJCQljb250ZXh0TmFtZSk7Ci0JCQkJaWYgKGVkLmNvbnRlbnRNYXRjaChwYXJzZXIsIGNvbnRleHQsIHRyKSkgewotCQkJCQl0ci5pbnNlcnRCZWZvcmUoZXJyb3JOb2RlLCBudWxsKTsKLQkJCQkJcGFyc2VyLnNldENvbnRleHQoKEVsZW1lbnQpIGVycm9yTm9kZSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Vbmtub3duRWxlbWVudEVycm9ySGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Vbmtub3duRWxlbWVudEVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjM2Yzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvVW5rbm93bkVsZW1lbnRFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXIuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBJZiBhIHBhcnNlciB1c2luZyBhIERURCB3aGljaCBkb2VzIG5vdCBkZWZpbmUgc29tZSBlbGVtZW50LiB0aGlzIGVycm9yCi0gKiBoYW5kbGVyIG1ha2UgdGhlIHBhcnNlciB1c2Ugc3BlY2lmaWVkIGR0ZCB3aGljaCBkZWZpbmVzIGl0LgotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkVsZW1lbnRFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBJRXJyb3JIYW5kbGVyIHsKLQlwcml2YXRlIFN0cmluZyB1bmtub3duRWxlbWVudHNbXTsKLQotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lEOwotCi0JLyoqCi0JICogQHBhcmFtIHVua25vd25FbGVtZW50Ci0JICogQHBhcmFtIERURCdzCi0JICogICAgICAgICAgICBwdWJsaWMgSUQgd2hpY2ggZGVmaW5lcyA8Y29kZT51bmtub3duRWxlbWVudDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVW5rbm93bkVsZW1lbnRFcnJvckhhbmRsZXIoU3RyaW5nIHVua25vd25FbGVtZW50LCBTdHJpbmcgcHVibGljSUQpIHsKLQkJdGhpcy51bmtub3duRWxlbWVudHMgPSBuZXcgU3RyaW5nWzFdOwotCQl1bmtub3duRWxlbWVudHNbMF0gPSB1bmtub3duRWxlbWVudDsKLQkJdGhpcy5wdWJsaWNJRCA9IHB1YmxpY0lEOwotCX0KLQotCXB1YmxpYyBVbmtub3duRWxlbWVudEVycm9ySGFuZGxlcihTdHJpbmcgdW5rbm93bkVsZW1lbnRzW10sIFN0cmluZyBwdWJsaWNJRCkgewotCQl0aGlzLnVua25vd25FbGVtZW50cyA9IHVua25vd25FbGVtZW50czsKLQkJdGhpcy5wdWJsaWNJRCA9IHB1YmxpY0lEOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNvZGUgPT0gVU5LTk9XTl9FTEVNRU5UICYmIGVycm9yTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVycm9yTm9kZS5nZXROb2RlTmFtZSgpCi0JCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSh1bmtub3duRWxlbWVudHNbaV0pKSB7Ci0JCQkJCXBhcnNlci5lcnJvcihVTktOT1dOX0VMRU1FTlQsIHBhcnNlci5nZXREVEQoKQotCQkJCQkJCSsgIiBkb2VzIG5vdCBkZWZpbmUgRlJBTUVTRVQuICIKLQkJCQkJCQkrICIgVHJ5IHRvIGNoYW5nZSBEVEQgdG8gIiArIHB1YmxpY0lEKTsKLQkJCQkJcGFyc2VyLnNldHVwRFREKHB1YmxpY0lEKTsKLQkJCQkJcGFyc2VyLnB1c2hCYWNrTm9kZShlcnJvck5vZGUpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL0NvbnN0cnVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9Db25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmU2ODFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL0NvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RydWN0b3IgewotCWFic3RyYWN0IFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hBTGlua0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQUxpbmtFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGU4ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hBTGlua0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1hYnN0cmFjdCBjbGFzcyBTSEFMaW5rRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCB7Ci0JU0hBTGlua0VsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NLZXkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2Vzc2tleSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0tleShTdHJpbmcgYWNjZXNzS2V5KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWNjZXNzS2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvb3JkcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY29vcmRzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29vcmRzKFN0cmluZyBjb29yZHMpIHsKLQkJc2V0QXR0cmlidXRlKCJjb29yZHMiLCBjb29yZHMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJc2V0QXR0cmlidXRlKCJocmVmIiwgaHJlZik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic2hhcGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZShTdHJpbmcgc2hhcGUpIHsKLQkJc2V0QXR0cmlidXRlKCJzaGFwZSIsIHNoYXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IHRhYkluZGV4KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKHRhYkluZGV4KSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInRhcmdldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFyZ2V0IiwgdGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEFuY2hvckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQW5jaG9yRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJiYTNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQW5jaG9yRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxBbmNob3JFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hBbmNob3JFbGVtZW50IGV4dGVuZHMgU0hBTGlua0VsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MQW5jaG9yRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIQW5jaG9yRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNoYXJzZXQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyc2V0KFN0cmluZyBjaGFyc2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhcnNldCIsIGNoYXJzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZmxhbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhyZWZsYW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHJlZmxhbmcoU3RyaW5nIGhyZWZsYW5nKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaHJlZmxhbmciLCBocmVmbGFuZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgicmVsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVsKFN0cmluZyByZWwpIHsKLQkJc2V0QXR0cmlidXRlKCJyZWwiLCByZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmV2KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJyZXYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXYoU3RyaW5nIHJldikgewotCQlzZXRBdHRyaWJ1dGUoInJldiIsIHJldik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBibHVyKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGZvY3VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQXBwbGV0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hBcHBsZXRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWViMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hBcHBsZXRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxBcHBsZXRFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hBcHBsZXRFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEFwcGxldEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEFwcGxldEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWx0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx0KFN0cmluZyBhbHQpIHsKLQkJc2V0QXR0cmlidXRlKCJhbHQiLCBhbHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYXJjaGl2ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoU3RyaW5nIGFyY2hpdmUpIHsKLQkJc2V0QXR0cmlidXRlKCJhcmNoaXZlIiwgYXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2RlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgY29kZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGUiLCBjb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvZGVCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlYmFzZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvZGVCYXNlKFN0cmluZyBjb2RlQmFzZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGViYXNlIiwgY29kZUJhc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQlzZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIc3BhY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhzcGFjZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhzcGFjZShTdHJpbmcgaHNwYWNlKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaHNwYWNlIiwgaHNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJvYmplY3QiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoU3RyaW5nIG9iamVjdCkgewotCQlzZXRBdHRyaWJ1dGUoIm9iamVjdCIsIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWc3BhY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZzcGFjZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZzcGFjZShTdHJpbmcgdnNwYWNlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidnNwYWNlIiwgdnNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQXJlYUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQXJlYUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiYTU2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEFyZWFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEFyZWFFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hBcmVhRWxlbWVudCBleHRlbmRzIFNIQUxpbmtFbGVtZW50IGltcGxlbWVudHMgSFRNTEFyZWFFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hBcmVhRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWx0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx0KFN0cmluZyBhbHQpIHsKLQkJc2V0QXR0cmlidXRlKCJhbHQiLCBhbHQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldE5vSHJlZigpIHsKLQkJU3RyaW5nIG5vaHJlZiA9IGdldEF0dHJpYnV0ZSgibm9ocmVmIik7Ci0JCXJldHVybiBub2hyZWYgIT0gbnVsbCAmJiBub2hyZWYuZXF1YWxzKCJub2hyZWYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb0hyZWYoYm9vbGVhbiBub0hyZWYpIHsKLQkJc2V0QXR0cmlidXRlKCJub2hyZWYiLCAobm9IcmVmID8gIm5vaHJlZiIgOiBudWxsKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCUkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQlJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGZjYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCUkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQlJFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hCUkVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MQlJFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hCUkVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGVhcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2xlYXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhcihTdHJpbmcgY2xlYXIpIHsKLQkJc2V0QXR0cmlidXRlKCJjbGVhciIsIGNsZWFyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjJiYzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCYXNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxCYXNlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIQmFzZUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MQmFzZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSEJhc2VFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJc2V0QXR0cmlidXRlKCJocmVmIiwgaHJlZik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInRhcmdldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFyZ2V0IiwgdGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VGb250RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCYXNlRm9udEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhYjRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VGb250RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxCYXNlRm9udEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSEJhc2VGb250RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxCYXNlRm9udEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEJhc2VGb250RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2xvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgewotCQlzZXRBdHRyaWJ1dGUoImNvbG9yIiwgY29sb3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiZmFjZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZhY2UoU3RyaW5nIGZhY2UpIHsKLQkJc2V0QXR0cmlidXRlKCJmYWNlIiwgZmFjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBzaXplKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEJvZHlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEJvZHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjE4ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCb2R5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxCb2R5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIQm9keUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MQm9keUVsZW1lbnQgewotCXByb3RlY3RlZCBTSEJvZHlFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QUxpbmsoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaW5rIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJiYWNrZ3JvdW5kIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZ0NvbG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJiZ2NvbG9yIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5rKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsaW5rIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0ZXh0Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWTGluaygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmxpbmsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBTGluayhTdHJpbmcgYUxpbmspIHsKLQkJc2V0QXR0cmlidXRlKCJhbGluayIsIGFMaW5rKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBiYWNrZ3JvdW5kKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYmFja2dyb3VuZCIsIGJhY2tncm91bmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnQ29sb3IoU3RyaW5nIGJnQ29sb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJiZ2NvbG9yIiwgYmdDb2xvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbGluaykgewotCQlzZXRBdHRyaWJ1dGUoImxpbmsiLCBsaW5rKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGV4dCIsIHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZMaW5rKFN0cmluZyB2TGluaykgewotCQlzZXRBdHRyaWJ1dGUoInZsaW5rIiwgdkxpbmspOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIQnV0dG9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCdXR0b25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZmUyMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hCdXR0b25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQnV0dG9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIQnV0dG9uRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxCdXR0b25FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hCdXR0b25FbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MRm9ybUVsZW1lbnQgZ2V0Rm9ybSgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldFBhcmVudE5vZGUoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpCi0JCQkJcmV0dXJuIChIVE1MRm9ybUVsZW1lbnQpIHJldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc0tleSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzS2V5KFN0cmluZyBhY2Nlc3NLZXkpIHsKLQkJc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBhY2Nlc3NLZXkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgewotCQlzZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwgZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IHRhYkluZGV4KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKHRhYkluZGV4KSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERMaXN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hETGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3NTEyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERMaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxETGlzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSERMaXN0RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxETGlzdEVsZW1lbnQgewotCXByb3RlY3RlZCBTSERMaXN0RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb21wYWN0KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjb21wYWN0Iik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYWN0KGJvb2xlYW4gY29tcGFjdCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCBjb21wYWN0ID8gImNvbXBhY3QiIDogbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hET01JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERPTUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4OWVmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERPTUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MRE9NSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxEb2NUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNIRE9NSW1wbCBleHRlbmRzIFNHTUxET01JbXBsIHsKLQkvKioKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnQgY3JlYXRlSFRNTERvY3VtZW50KFN0cmluZyB0aXRsZSkgewotCQlyZXR1cm4gbmV3IFNIRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQuCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWUKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLQkJCURvY3VtZW50VHlwZSBkb2N0eXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTSERvY3VtZW50KHRoaXMpOwotCQl9IGVsc2UgaWYgKGRvY3R5cGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG51bGwKLQkJCQl8fCAhKGRvY3R5cGUgaW5zdGFuY2VvZiBTR01MRG9jVHlwZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLldST05HX0RPQ1VNRU5UX0VSUiwgZG9jdHlwZQotCQkJCQkrICIgaGFzIGJlZW4gYWxyZWFkeSBvd25lZC4iKSB7Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJRG9jdW1lbnQgcmV0ID0gY3JlYXRlSFRNTERvY3VtZW50KG51bGwpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCXJldC5pbnNlcnRCZWZvcmUoZG9jdHlwZSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNIRE9NSW1wbCgpIHsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTSERPTUltcGwgaW5zdGFuY2UgPSBuZXcgU0hET01JbXBsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIERPTUltcGxlbWVudGF0aW9uIGdldERPTUltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hEaXJlY3RvcnlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERpcmVjdG9yeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiNDkzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERpcmVjdG9yeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRGlyZWN0b3J5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRGlyZWN0b3J5RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxEaXJlY3RvcnlFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hEaXJlY3RvcnlFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbXBhY3QoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImNvbXBhY3QiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXBhY3QoYm9vbGVhbiBjb21wYWN0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29tcGFjdCIsIGNvbXBhY3QgPyAiY29tcGFjdCIgOiBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERpdkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRGl2RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYwM2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRGl2RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxEaXZFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hEaXZFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTERpdkVsZW1lbnQgewotCXByb3RlY3RlZCBTSERpdkVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERvY3VtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Y2EyMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW50ZXJuYWwudXRpbC5VbnN5bmNocm9uaXplZEhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLkVsZW1lbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUaXRsZUVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU0hEb2N1bWVudCBleHRlbmRzIFNHTUxEb2N1bWVudCBpbXBsZW1lbnRzIEhUTUxEb2N1bWVudCB7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIFNIRE9NSW1wbCNjcmVhdGVEb2N1bWVudChqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcsb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlKQotCSAqLwotCXB1YmxpYyBTSERvY3VtZW50KCkgewotCQl0aGlzKChTSERPTUltcGwpIFNIRE9NSW1wbC5nZXRET01JbXBsZW1lbnRhdGlvbigpKTsKLQl9Ci0KLQlTSERvY3VtZW50KFNIRE9NSW1wbCBpbXBsZSkgewotCQlzdXBlcihpbXBsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvb2tpZTsKLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgeyAvKiBkbyBub3Qgc3VwcG9ydCAqLwotCX0KLQotCUhUTUxDb2xsZWN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24oZmluYWwgTm9kZUxpc3QgbGlzdCkgewotCQlyZXR1cm4gbmV3IEhUTUxDb2xsZWN0aW9uKCkgewotCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJcmV0dXJuIGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGxpc3QuaXRlbShpbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIG5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChFbGVtZW50KSBub2RlKQotCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoRWxlbWVudCkgbm9kZSkKLQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJuYW1lIikpKSB7Ci0JCQkJCQlFbGVtZW50RGVmaW5pdGlvbiBkZWYgPSBnZXREVEQoKS5nZXRFbGVtZW50RGVmaW5pdGlvbigKLQkJCQkJCQkJbm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCWlmIChkZWYgIT0gbnVsbCAmJiBkZWYuZ2V0QXR0cmlidXRlRGVmKCJuYW1lIikgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBub2RlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBsaXN0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JSFRNTENvbGxlY3Rpb24gY3JlYXRlQ29sbGVjdGlvbihmaW5hbCBOb2RlIG5vZGVzW10sIGZpbmFsIGludCBsZW4pIHsKLQkJcmV0dXJuIG5ldyBIVE1MQ29sbGVjdGlvbigpIHsKLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBsZW47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIDAgPD0gaW5kZXggJiYgaW5kZXggPCBsZW4gPyBub2Rlc1tpbmRleF0gOiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBuYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IG5vZGVzW2ldOwotCQkJCQlpZiAoIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKEVsZW1lbnQpIG5vZGUpCi0JCQkJCQkJLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKLQkJCQkJCXJldHVybiBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQkJTm9kZSBub2RlID0gbm9kZXNbaV07Ci0JCQkJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoRWxlbWVudCkgbm9kZSkKLQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJuYW1lIikpKSB7Ci0JCQkJCQlFbGVtZW50RGVmaW5pdGlvbiBkZWYgPSBnZXREVEQoKS5nZXRFbGVtZW50RGVmaW5pdGlvbigKLQkJCQkJCQkJbm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCWlmIChkZWYgIT0gbnVsbCAmJiBkZWYuZ2V0QXR0cmlidXRlRGVmKCJuYW1lIikgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBub2RlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFVuc3luY2hyb25pemVkSGFzaHRhYmxlIGNvbnN0cnVjdG9yczsKLQlzdGF0aWMgewotCQljb25zdHJ1Y3RvcnMgPSBuZXcgVW5zeW5jaHJvbml6ZWRIYXNodGFibGUoKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQ09MIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGFibGVDb2xFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJDT0xHUk9VUCIsIGNvbnN0cnVjdG9ycy5nZXQoIkNPTCIpKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVEhFQUQiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hUYWJsZVNlY3Rpb25FbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJURk9PVCIsIGNvbnN0cnVjdG9ycy5nZXQoIlRIRUFEIikpOwotCQljb25zdHJ1Y3RvcnMucHV0KCJDQVBUSU9OIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGFibGVDYXB0aW9uRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVEgiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hUYWJsZUNlbGxFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJIVE1MIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISHRtbEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkJBU0UiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hCYXNlRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiU1RZTEUiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hTdHlsZUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlRJVExFIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGl0bGVFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJCT0RZIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQm9keUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkg2IiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISGVhZGluZ0VsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkhFQUQiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hIZWFkRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiU0NSSVBUIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIU2NyaXB0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiTElOSyIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSExpbmtFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJGUkFNRVNFVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEZyYW1lU2V0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQkFTRUZPTlQiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hCYXNlRm9udEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIklOUyIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSE1vZEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkRFTCIsIGNvbnN0cnVjdG9ycy5nZXQoIklOUyIpKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSUZSQU1FIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISUZyYW1lRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiRklFTERTRVQiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hGaWVsZFNldEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkRJUiIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSERpcmVjdG9yeUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIk1FVEEiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hNZXRhRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSFIiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hIUkVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIk1FTlUiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hNZW51RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiT0JKRUNUIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIT2JqZWN0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQVBQTEVUIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQXBwbGV0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiUEFSQU0iLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hQYXJhbUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIk1BUCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSE1hcEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkFSRUEiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hBcmVhRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiTEVHRU5EIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNITGVnZW5kRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSVNJTkRFWCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSElzSW5kZXhFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJPUFRHUk9VUCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSE9wdEdyb3VwRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVEVYVEFSRUEiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hUZXh0QXJlYUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkZPUk0iLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hGb3JtRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiU0VMRUNUIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIU2VsZWN0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiTEFCRUwiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hMYWJlbEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkg1IiwgY29uc3RydWN0b3JzLmdldCgiSDYiKSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkJVVFRPTiIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEJ1dHRvbkVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIklOUFVUIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISW5wdXRFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJPUFRJT04iLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hPcHRpb25FbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJRVU9URSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFF1b3RlRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSDQiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJINiIpKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiUFJFIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIUHJlRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSDMiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJINiIpKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQlIiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hCUkVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlRBQkxFIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGFibGVFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJUQk9EWSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFRhYmxlU2VjdGlvbkVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkRMIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIRExpc3RFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJIMiIsIGNvbnN0cnVjdG9ycy5nZXQoIkg2IikpOwotCQljb25zdHJ1Y3RvcnMucHV0KCJVTCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFVMaXN0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiT0wiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hPTGlzdEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlRSIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGFibGVSb3dFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJMSSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSExJRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSU1HIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISW1hZ2VFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnN0cnVjdG9ycy5wdXQoIkRJViIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSERpdkVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkgxIiwgY29uc3RydWN0b3JzLmdldCgiSDYiKSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlAiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hQYXJhZ3JhcGhFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJGT05UIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIRm9udEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkEiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hBbmNob3JFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJURCIsIGNvbnN0cnVjdG9ycy5nZXQoIlRIIikpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHsKLQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnMuZ2V0KHRhZ05hbWUpOwotCQlyZXR1cm4gY29uc3RydWN0b3IgIT0gbnVsbCA/IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHRhZ05hbWUsIHRoaXMpCi0JCQkJOiBuZXcgU0hFbGVtZW50KHRhZ05hbWUsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRMaW5rcygpIHsKLQkJaW50IGxlbiA9IDA7Ci0JCU5vZGUgbGlua3NbXSA9IG5ldyBOb2RlWzMyXTsKLQkJTm9kZSB0bXAxLCB0bXAyOwotCQlOb2RlIHJvb3QgPSBnZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdG1wMSA9IHJvb3Q7Ci0JCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQlpZiAodG1wMSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHRtcDEuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJBUkVBIikKLQkJCQkJCXx8IChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkEiKSAmJiAoKEVsZW1lbnQpIHRtcDEpCi0JCQkJCQkJCS5nZXRBdHRyaWJ1dGVOb2RlKCJocmVmIikgIT0gbnVsbCkpIHsKLQkJCQkJaWYgKGxlbiA9PSBsaW5rcy5sZW5ndGgpIHsKLQkJCQkJCU5vZGUgYnVmW10gPSBuZXcgTm9kZVtsZW4gKiAyXTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkobGlua3MsIDAsIGJ1ZiwgMCwgbGVuKTsKLQkJCQkJCWxpbmtzID0gYnVmOwotCQkJCQl9Ci0JCQkJCWxpbmtzW2xlbisrXSA9IHRtcDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQlpZiAodG1wMSA9PSByb290KSB7Ci0JCQkJCWJyZWFrIG91dGVyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHRtcDIgPT0gbnVsbCAmJiB0bXAxICE9IG51bGwpIHsKLQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmICh0bXAxICE9IHJvb3QpIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhayBvdXRlcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0bXAxID0gdG1wMjsKLQkJfQotCQlyZXR1cm4gY3JlYXRlQ29sbGVjdGlvbihsaW5rcywgbGVuKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0QXBwbGV0cygpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbGxlY3Rpb24oZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFQUExFVCIpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvb2tpZSgpIHsKLQkJcmV0dXJuIGNvb2tpZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGVsZW1lbnRJZCkgewotCQlOb2RlIHRtcDEsIHRtcDI7Ci0JCU5vZGUgcm9vdCA9IGdldERvY3VtZW50RWxlbWVudCgpOwotCQl0bXAxID0gcm9vdDsKLQkJd2hpbGUgKHRtcDEgIT0gbnVsbCkgewotCQkJaWYgKHRtcDEgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCSYmIGVsZW1lbnRJZC5lcXVhbHMoKChFbGVtZW50KSB0bXAxKS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJcmV0dXJuIChFbGVtZW50KSB0bXAxOwotCQkJfQotCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQlpZiAodG1wMSA9PSByb290KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHRtcDIgPT0gbnVsbCAmJiB0bXAxICE9IG51bGwpIHsKLQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmICh0bXAxICE9IHJvb3QpIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQl0bXAxID0gdG1wMjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeU5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoIioiKSkgewotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdCgpIHsKLQkJCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRFbGVtZW50c0J5VGFnTmFtZShlbGVtZW50TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0Rm9ybXMoKSB7Ci0JCXJldHVybiBjcmVhdGVDb2xsZWN0aW9uKGdldEVsZW1lbnRzQnlOYW1lKCJGT1JNIikpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRJbWFnZXMoKSB7Ci0JCXJldHVybiBjcmVhdGVDb2xsZWN0aW9uKGdldEVsZW1lbnRzQnlOYW1lKCJJTUciKSk7Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldEFuY2hvcnMoKSB7Ci0JCWludCBsZW4gPSAwOwotCQlOb2RlIGxpbmtzW10gPSBuZXcgTm9kZVszMl07Ci0JCU5vZGUgdG1wMSwgdG1wMjsKLQkJTm9kZSByb290ID0gZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXRtcDEgPSByb290OwotCQlvdXRlcjogd2hpbGUgKHRtcDEgIT0gbnVsbCkgewotCQkJaWYgKHRtcDEgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB0bXAxLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkEiKSAmJiAoKEVsZW1lbnQpIHRtcDEpCi0JCQkJCQkuZ2V0QXR0cmlidXRlTm9kZSgibmFtZSIpICE9IG51bGwpKSB7Ci0JCQkJCWlmIChsZW4gPT0gbGlua3MubGVuZ3RoKSB7Ci0JCQkJCQlOb2RlIGJ1ZltdID0gbmV3IE5vZGVbbGVuICogMl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxpbmtzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCQlsaW5rcyA9IGJ1ZjsKLQkJCQkJfQotCQkJCQlsaW5rc1tsZW4rK10gPSB0bXAxOwotCQkJCX0KLQkJCX0KLQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRtcDEgPT0gcm9vdCkgewotCQkJCQlicmVhayBvdXRlcjsKLQkJCQl9IGVsc2UgewotCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAodG1wMSAhPSByb290KSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJfQotCQkJfQotCQkJdG1wMSA9IHRtcDI7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUNvbGxlY3Rpb24obGlua3MsIGxlbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcnJlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKG51bGwgPT0gZ2V0RG9jdW1lbnRFbGVtZW50KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3QgdGl0bGVzID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRJVExFIik7Ci0JCWlmICh0aXRsZXMuZ2V0TGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MVGl0bGVFbGVtZW50IHRlID0gKEhUTUxUaXRsZUVsZW1lbnQpIHRpdGxlcy5pdGVtKDApOwotCQlOb2RlIHRpdGxlID0gdGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAodGl0bGUgPT0gbnVsbCB8fCAhKHRpdGxlIGluc3RhbmNlb2YgVGV4dCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRpdGxlLmdldE5vZGVWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgVVJMIHVybDsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsICE9IG51bGwgPyB1cmwudG9TdHJpbmcoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVVJMIG9mIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsgLyogZG8gbm90IHN1cHBvcnQgKi8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGlmIHRoaXMgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSA8Y29kZT5CT0RZPC9jb2RlPiBvcgotCSAqICAgICAgICAgPGNvZGU+RlJBTUVTRVQKLQkgKiA8L2NvZGU+LCBudWxsLgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudCBnZXRCb2R5KCkgewotCQlpZiAoZ2V0RG9jdW1lbnRFbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlTGlzdCBib2RpZXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiRlJBTUVTRVQiKTsKLQkJaWYgKGJvZGllcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlib2RpZXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiQk9EWSIpOwotCQl9Ci0JCWlmIChib2RpZXMuZ2V0TGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50KSBib2RpZXMuaXRlbSgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCb2R5KEhUTUxFbGVtZW50IGJvZHkpIHsKLQkJSFRNTEVsZW1lbnQgb2xkQm9keSA9IGdldEJvZHkoKTsKLQkJaWYgKG9sZEJvZHkgPT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnRFbGVtZW50KCkuaW5zZXJ0QmVmb3JlKGJvZHksIG51bGwpOwotCQl9IGVsc2UgewotCQkJb2xkQm9keS5nZXRQYXJlbnROb2RlKCkucmVwbGFjZUNoaWxkKGJvZHksIG9sZEJvZHkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29va2llKFN0cmluZyBjb29raWUpIHsKLQkJdGhpcy5jb29raWUgPSBjb29raWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCU5vZGVMaXN0IHRpdGxlcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJUSVRMRSIpOwotCQlpZiAodGl0bGVzLmdldExlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCUhUTUxUaXRsZUVsZW1lbnQgdGUgPSAoSFRNTFRpdGxlRWxlbWVudCkgdGl0bGVzLml0ZW0oMCk7Ci0JCXRlLnNldFRleHQodGl0bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyB0ZXh0KSB7IC8qIGRvIG5vdCBzdXBwb3J0ICovCi0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVsbihTdHJpbmcgdGV4dCkgeyAvKiBkbyBub3Qgc3VwcG9ydCAqLwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGlzIGRvY3VtZW50IGFzIFhIVE1MIGZvcm1hdC4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQKLQkgKiB0aGlzIG1ldGhvZCBnZW5lcmF0ZXMgaXMgYSBET0NUWVBFIGRlY2xhcmF0aW9uLiBJdHMgY29udGVudHMgaXMKLQkgKiBkZXRlcm1pbmVkIGFzIGZvbGxvd3MuCi0JICogPHVsPgotCSAqIDxsaT4gaWYgdGhpcyBkb2N1bWVudCdzIGRvY3R5cGUgaXMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiIsCi0JICogdGhlbiAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLQkgKiA8bGk+IGVsc2UgaWYgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiIgdGhlbiAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wCi0JICogU3RyaWN0Ly9FTiIKLQkgKiA8bGk+IE90aGVyd2lzZSwgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCSAqIDwvdWw+Ci0JICogCi0JICogQHBhcmFtIHB3Ci0JICogICAgICAgICAgICBQcmludFdyaXRlciB0byB3cml0ZQotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBpbmRlbnRzCi0JICogQHBhcmFtIGVuYwotCSAqICAgICAgICAgICAgZW5jb2Rpbmcgb2Ygb3V0cHV0Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBc1hIVE1MKFByaW50V3JpdGVyIHB3LCBib29sZWFuIGluZGVudCwgU3RyaW5nIGVuYykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBkdGRJRCA9IGdldERURCgpLnRvU3RyaW5nKCk7Ci0JCWlmIChkdGRJRC5lcXVhbHMoIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiIpKSB7Ci0JCQlwcmludEFzWE1MKCItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIiwgbmV3IFVSTCgKLQkJCQkJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCIpLCBwdywKLQkJCQkJaW5kZW50LCBlbmMpOwotCQl9IGVsc2UgaWYgKGR0ZElELmVxdWFscygiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIikpIHsKLQkJCXByaW50QXNYTUwoIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiwgbmV3IFVSTCgKLQkJCQkJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiKSwgcHcsCi0JCQkJCWluZGVudCwgZW5jKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50QXNYTUwoIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiwgbmV3IFVSTCgKLQkJCQkJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiKSwKLQkJCQkJcHcsIGluZGVudCwgZW5jKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZGJmNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU0hFbGVtZW50IGV4dGVuZHMgU0dNTEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRWxlbWVudChTdHJpbmcgbmFtZSwgRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImRpciIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsYW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidGl0bGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXIoU3RyaW5nIGRpcikgewotCQlzZXRBdHRyaWJ1dGUoImRpciIsIGRpcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbGFuZykgewotCQlzZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRpdGxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZpZWxkU2V0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hGaWVsZFNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5NTk4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZpZWxkU2V0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZpZWxkU2V0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRmllbGRTZXRFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEZpZWxkU2V0RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRmllbGRTZXRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MRm9ybUVsZW1lbnQgZ2V0Rm9ybSgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldFBhcmVudE5vZGUoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpCi0JCQkJcmV0dXJuIChIVE1MRm9ybUVsZW1lbnQpIHJldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZvbnRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZvbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGI2YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hGb250RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb250RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRm9udEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MRm9udEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEZvbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNvbG9yIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29sb3IiLCBjb2xvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGYWNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJmYWNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmFjZShTdHJpbmcgZmFjZSkgewotCQlzZXRBdHRyaWJ1dGUoImZhY2UiLCBmYWNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNpemUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInNpemUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXplKFN0cmluZyBzaXplKSB7Ci0JCXNldEF0dHJpYnV0ZSgic2l6ZSIsIHNpemUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRm9ybUN0cmxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZvcm1DdHJsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc1ODdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRm9ybUN0cmxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRm9ybUVsZW1lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIFNIRm9ybUN0cmxFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IHsKLQlTSEZvcm1DdHJsRWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlZCgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsIGRpc2FibGVkID8gImRpc2FibGVkIiA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRUYWJJbmRleCgpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJJbmRleChpbnQgdGFiSW5kZXgpIHsKLQkJc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIEludGVnZXIudG9TdHJpbmcodGFiSW5kZXgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZvcm1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZvcm1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZDg1YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hGb3JtRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRm9ybUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MRm9ybUVsZW1lbnQgewotCXByb3RlY3RlZCBTSEZvcm1FbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRFbGVtZW50cygpIHsKLQkJaW50IGxlbiA9IDA7Ci0JCUhUTUxFbGVtZW50IGVsZW1lbnRzW10gPSBuZXcgSFRNTEVsZW1lbnRbOF07Ci0JCU5vZGUgdG1wMSwgdG1wMjsKLQkJdG1wMSA9IHRoaXM7Ci0JCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQlpZiAodG1wMSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHRtcDEuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJJTlBVVCIpCi0JCQkJCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpCi0JCQkJCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlRFWFRBUkVBIikKLQkJCQkJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiTEFCRUwiKQotCQkJCQkJfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJCVVRUT04iKSkgewotCQkJCQlpZiAobGVuID09IGVsZW1lbnRzLmxlbmd0aCkgewotCQkJCQkJSFRNTEVsZW1lbnQgYnVmW10gPSBuZXcgSFRNTEVsZW1lbnRbbGVuICogMl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCQllbGVtZW50cyA9IGJ1ZjsKLQkJCQkJfQotCQkJCQllbGVtZW50c1tsZW4rK10gPSAoSFRNTEVsZW1lbnQpIHRtcDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQlpZiAodG1wMSA9PSB0aGlzKSB7Ci0JCQkJCWJyZWFrIG91dGVyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHRtcDIgPT0gbnVsbCAmJiB0bXAxICE9IG51bGwpIHsKLQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmICh0bXAxICE9IHRoaXMpIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhayBvdXRlcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0bXAxID0gdG1wMjsKLQkJfQotCQlyZXR1cm4gKChTSERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpCi0JCQkJLmNyZWF0ZUNvbGxlY3Rpb24oZWxlbWVudHMsIGxlbik7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50cygpLmdldExlbmd0aCgpOwotCX07Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXB0LWNoYXJzZXQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY2NlcHRDaGFyc2V0KFN0cmluZyBhY2NlcHRDaGFyc2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXB0LWNoYXJzZXQiLCBhY2NlcHRDaGFyc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWN0aW9uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLQkJc2V0QXR0cmlidXRlKCJhY3Rpb24iLCBhY3Rpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jdHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiZW5jdHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY3R5cGUoU3RyaW5nIGVuY3R5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJlbmN0eXBlIiwgZW5jdHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1ldGhvZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWV0aG9kIiwgbWV0aG9kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidGFyZ2V0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KFN0cmluZyB0YXJnZXQpIHsKLQkJc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIGRvIG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdWJtaXQoKSB7IC8qIGRvIG5vdGhpbmc7ICovCi0JfQotCi0JLyoqCi0JICogZG8gbm90aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgeyAvKiBkbyBub3RoaW5nOyAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRnJhbWVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZyYW1lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVjZjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIRnJhbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZyYW1lRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRnJhbWVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEZyYW1lRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRnJhbWVFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnJhbWVCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImZyYW1lYm9yZGVyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnJhbWVCb3JkZXIoU3RyaW5nIGZyYW1lQm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZnJhbWVib3JkZXIiLCBmcmFtZUJvcmRlcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb25nRGVzYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibG9uZ2Rlc2MiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb25nRGVzYyhTdHJpbmcgbG9uZ0Rlc2MpIHsKLQkJc2V0QXR0cmlidXRlKCJsb25nZGVzYyIsIGxvbmdEZXNjKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkhlaWdodCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibWFyZ2luaGVpZ2h0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KFN0cmluZyBtYXJnaW5IZWlnaHQpIHsKLQkJc2V0QXR0cmlidXRlKCJtYXJnaW5oZWlnaHQiLCBtYXJnaW5IZWlnaHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luV2lkdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1hcmdpbndpZHRoIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luV2lkdGgoU3RyaW5nIG1hcmdpbldpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWFyZ2lud2lkdGgiLCBtYXJnaW5XaWR0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXROb1Jlc2l6ZSgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgibm9yZXNpemUiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vUmVzaXplKGJvb2xlYW4gbm9SZXNpemUpIHsKLQkJc2V0QXR0cmlidXRlKCJub3Jlc2l6ZSIsIG5vUmVzaXplID8gIm5vcmVzaXplIiA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2Nyb2xsaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzY3JvbGxpbmciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY3JvbGxpbmcoU3RyaW5nIHNjcm9sbGluZykgewotCQlzZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIHNjcm9sbGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcmMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInNyYyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNyYyhTdHJpbmcgc3JjKSB7Ci0JCXNldEF0dHJpYnV0ZSgic3JjIiwgc3JjKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGNvbnRlbnREb2M7Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0Q29udGVudERvY3VtZW50KCkgewotCQlyZXR1cm4gY29udGVudERvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50IGRvY3VtZW50IHRoaXMgZnJhbWUgY29udGFpbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudERvY3VtZW50KERvY3VtZW50IGNvbnRlbnREb2MpIHsKLQkJdGhpcy5jb250ZW50RG9jID0gY29udGVudERvYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZyYW1lU2V0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hGcmFtZVNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1NzdlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEZyYW1lU2V0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGcmFtZVNldEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSEZyYW1lU2V0RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxGcmFtZVNldEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEZyYW1lU2V0RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNvbHMiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJvd3MoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInJvd3MiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2xzKFN0cmluZyBjb2xzKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29scyIsIGNvbHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvd3MoU3RyaW5nIHJvd3MpIHsKLQkJc2V0QXR0cmlidXRlKCJyb3dzIiwgcm93cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hIUkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISFJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzBmM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hIUkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MSFJFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hIUkVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MSFJFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hIUkVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXROb1NoYWRlKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJub3NoYWRlIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb1NoYWRlKGJvb2xlYW4gbm9TaGFkZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5vc2hhZGUiLCBub1NoYWRlID8gIm5vc2hhZGUiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISGVhZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISGVhZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiYTFkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEhlYWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEhlYWRFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hIZWFkRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxIZWFkRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNISGVhZEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJwcm9maWxlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZSkgewotCQlzZXRBdHRyaWJ1dGUoInByb2ZpbGUiLCBwcm9maWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEhlYWRpbmdFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSEhlYWRpbmdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjFjZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hIZWFkaW5nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxIZWFkaW5nRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNISGVhZGluZ0VsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MSGVhZGluZ0VsZW1lbnQgewotCXByb3RlY3RlZCBTSEhlYWRpbmdFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hIdG1sRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hIdG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUzM2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISHRtbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MSHRtbEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSEh0bWxFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEh0bWxFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hIdG1sRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZlcnNpb24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmVyc2lvbiIsIHZlcnNpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISUZyYW1lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJRnJhbWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZWFkMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJRnJhbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxJRnJhbWVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hJRnJhbWVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTElGcmFtZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSElGcmFtZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZyYW1lQm9yZGVyKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJmcmFtZWJvcmZlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZyYW1lQm9yZGVyKFN0cmluZyBmcmFtZUJvcmRlcikgewotCQlzZXRBdHRyaWJ1dGUoImZyYW1lYm9yZGVyIiwgZnJhbWVCb3JkZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQlzZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb25nRGVzYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibG9uZ2Rlc2MiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb25nRGVzYyhTdHJpbmcgbG9uZ0Rlc2MpIHsKLQkJc2V0QXR0cmlidXRlKCJsb25nRGVzYyIsIGxvbmdEZXNjKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkhlaWdodCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibWFyZ2luaGVpZ2h0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KFN0cmluZyBtYXJnaW5IZWlnaHQpIHsKLQkJc2V0QXR0cmlidXRlKCJtYXJnaW5oZWlnaHQiLCBtYXJnaW5IZWlnaHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luV2lkdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1hcmdpbndpZHRoIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luV2lkdGgoU3RyaW5nIG1hcmdpbldpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWFyZ2lud2lkdGgiLCBtYXJnaW5XaWR0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjcm9sbGluZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Nyb2xsaW5nKFN0cmluZyBzY3JvbGxpbmcpIHsKLQkJc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCBzY3JvbGxpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3JjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzcmMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgewotCQlzZXRBdHRyaWJ1dGUoInNyYyIsIHNyYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCk7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBjb250ZW50RG9jOwotCi0JcHVibGljIERvY3VtZW50IGdldENvbnRlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnREb2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCBkb2N1bWVudCB0aGlzIGludGVybmFsIGZyYW1lIGNvbnRhaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnREb2N1bWVudChEb2N1bWVudCBjb250ZW50RG9jKSB7Ci0JCXRoaXMuY29udGVudERvYyA9IGNvbnRlbnREb2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJbWFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISW1hZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWUxMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJbWFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEltYWdlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNISW1hZ2VFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEltYWdlRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNISW1hZ2VFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG93U3JjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsb3dzcmMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb3dTcmMoU3RyaW5nIGxvd1NyYykgewotCQlzZXRBdHRyaWJ1dGUoImxvd3NyYyIsIGxvd1NyYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHQoU3RyaW5nIGFsdCkgewotCQlzZXRBdHRyaWJ1dGUoImFsdCIsIGFsdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJvcmRlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYm9yZGVyIiwgYm9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaGVpZ2h0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KFN0cmluZyBoZWlnaHQpIHsKLQkJc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoZWlnaHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHNwYWNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoc3BhY2UiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIc3BhY2UoU3RyaW5nIGhzcGFjZSkgewotCQlzZXRBdHRyaWJ1dGUoImhzcGFjZSIsIGhzcGFjZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNNYXAoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImlzbWFwIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc01hcChib29sZWFuIGlzTWFwKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaXNtYXAiLCBpc01hcCA/ICJpc21hcCIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsb25nZGVzYyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvbmdEZXNjKFN0cmluZyBsb25nRGVzYykgewotCQlzZXRBdHRyaWJ1dGUoImxvbmdkZXNjIiwgbG9uZ0Rlc2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3JjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzcmMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgewotCQlzZXRBdHRyaWJ1dGUoInNyYyIsIHNyYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VNYXAoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInVzZW1hcCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZU1hcChTdHJpbmcgdXNlTWFwKSB7Ci0JCXNldEF0dHJpYnV0ZSgidXNlbWFwIiwgdXNlTWFwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZzcGFjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidnNhcGNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VnNwYWNlKFN0cmluZyB2c3BhY2UpIHsKLQkJc2V0QXR0cmlidXRlKCJ2c3BhY2UiLCB2c3BhY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIndpZHRoIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJbnB1dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NISW5wdXRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTY2NDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJbnB1dEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTElucHV0RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNISW5wdXRFbGVtZW50IGV4dGVuZHMgU0hGb3JtQ3RybEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MSW5wdXRFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hJbnB1dEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdENoZWNrZWQ7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Q2hlY2tlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENoZWNrZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbGVhbiBkZWZhdWx0Q2hlY2tlZCkgewotCQl0aGlzLmRlZmF1bHRDaGVja2VkID0gZGVmYXVsdENoZWNrZWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2NlcHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2VwdCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2VwdChTdHJpbmcgYWNjZXB0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXB0IiwgYWNjZXB0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc0tleSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzS2V5KFN0cmluZyBhY2Nlc3NLZXkpIHsKLQkJc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBhY2Nlc3NLZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsdCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsdChTdHJpbmcgYWx0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWx0IiwgYWx0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDaGVja2VkKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjaGVja2VkIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgewotCQlzZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCBjaGVja2VkID8gImNoZWNrZWQiIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heExlbmd0aCgpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4TGVuZ3RoKGludCBtYXhMZW5ndGgpIHsKLQkJc2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiLCBJbnRlZ2VyLnRvU3RyaW5nKG1heExlbmd0aCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFJlYWRPbmx5KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJyZWFkb25seSIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQlzZXRBdHRyaWJ1dGUoInJlYWRvbmx5IiwgcmVhZE9ubHkgPyAicmVhZG9ubHkiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNyYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLQkJc2V0QXR0cmlidXRlKCJzcmMiLCBzcmMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VNYXAoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInVzZW1hcCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZU1hcChTdHJpbmcgdXNlTWFwKSB7Ci0JCXNldEF0dHJpYnV0ZSgidXNlbWFwIiwgdXNlTWFwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlzZXRBdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBibHVyKCkgewotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0KCkgewotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGljaygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSElzSW5kZXhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSElzSW5kZXhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyODU1ZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hJc0luZGV4RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZvcm1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTElzSW5kZXhFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hJc0luZGV4RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxJc0luZGV4RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNISXNJbmRleEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIEhUTUxGb3JtRWxlbWVudCBnZXRGb3JtKCkgewotCQlmb3IgKE5vZGUgcmV0ID0gZ2V0UGFyZW50Tm9kZSgpOyByZXQgIT0gbnVsbDsgcmV0ID0gcmV0LmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHJldCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkKLQkJCQlyZXR1cm4gKEhUTUxGb3JtRWxlbWVudCkgcmV0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvbXB0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJwcm9tcHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9tcHQoU3RyaW5nIHByb21wdCkgewotCQlzZXRBdHRyaWJ1dGUoInByb21wdCIsIHByb21wdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hMSUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITElFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDAxMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hMSUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MTElFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hMSUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTElFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hMSUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidmFsdWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hMYWJlbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITGFiZWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjI0MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hMYWJlbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxMYWJlbEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSExhYmVsRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxMYWJlbEVsZW1lbnQgewotCXByb3RlY3RlZCBTSExhYmVsRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NLZXkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2Vzc2tleSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0tleShTdHJpbmcgYWNjZXNzS2V5KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWNjZXNzS2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh0bWxGb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImZvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh0bWxGb3IoU3RyaW5nIGh0bWxGb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJmb3IiLCBodG1sRm9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSExlZ2VuZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITGVnZW5kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI4MjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITGVnZW5kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZvcm1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTExlZ2VuZEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSExlZ2VuZEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTGVnZW5kRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITGVnZW5kRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NLZXkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2Vzc2tleSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0tleShTdHJpbmcgYWNjZXNzS2V5KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWNjZXNzS2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITGlua0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITGlua0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyOGNlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSExpbmtFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTExpbmtFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hMaW5rRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxMaW5rRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITGlua0VsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRpc2FibGVkOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2FibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhcnNldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIGNoYXJzZXQpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyc2V0IiwgY2hhcnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgewotCQlzZXRBdHRyaWJ1dGUoImhyZWYiLCBocmVmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWZsYW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJocmVmbGFuZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWZsYW5nKFN0cmluZyBocmVmbGFuZykgewotCQlzZXRBdHRyaWJ1dGUoImhyZWZsYW5nIiwgaHJlZmxhbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVkaWEoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1lZGlhIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVkaWEoU3RyaW5nIG1lZGlhKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWVkaWEiLCBtZWRpYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWwoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInJlbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbChTdHJpbmcgcmVsKSB7Ci0JCXNldEF0dHJpYnV0ZSgicmVsIiwgcmVsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJldigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgicmV2Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmV2KFN0cmluZyByZXYpIHsKLQkJc2V0QXR0cmlidXRlKCJyZXYiLCByZXYpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotCQlzZXRBdHRyaWJ1dGUoInRhcmdldCIsIHRhcmdldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSE1hcEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITWFwRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFhNjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITWFwRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1hcEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSE1hcEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTWFwRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITWFwRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0QXJlYXMoKSB7Ci0JCXJldHVybiAoKFNIRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKSkKLQkJCQkuY3JlYXRlQ29sbGVjdGlvbihnZXRFbGVtZW50c0J5VGFnTmFtZSgiQVJFQSIpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITWVudUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITWVudUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1M2MxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSE1lbnVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1lbnVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hNZW51RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxNZW51RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITWVudUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcGFjdCgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgiY29tcGFjdCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFjdChib29sZWFuIGNvbXBhY3QpIHsKLQkJc2V0QXR0cmlidXRlKCJjb21wYWN0IiwgY29tcGFjdCA/ICJjb21wYWN0IiA6IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITWV0YUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITWV0YUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwNzEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSE1ldGFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1ldGFFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hNZXRhRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxNZXRhRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITWV0YUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIdHRwRXF1aXYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImh0dHAtZXF1aXYiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic2NoZW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCBjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIdHRwRXF1aXYoU3RyaW5nIGh0dHBFcXVpdikgewotCQlzZXRBdHRyaWJ1dGUoImh0dHAtZXF1aXYiLCBodHRwRXF1aXYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NoZW1lKFN0cmluZyBzY2hlbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJzY2hlbWUiLCBzY2hlbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NITW9kRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hNb2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmFhZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hNb2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1vZEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSE1vZEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTW9kRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITW9kRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENpdGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNpdGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaXRlKFN0cmluZyBjaXRlKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2l0ZSIsIGNpdGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0ZVRpbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImRhdGV0aW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0ZVRpbWUoU3RyaW5nIGRhdGVUaW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGF0ZXRpbWUiLCBkYXRlVGltZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPTGlzdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIT0xpc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDdjNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPTGlzdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT0xpc3RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hPTGlzdEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MT0xpc3RFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hPTGlzdEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcGFjdCgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgiY29tcGFjdCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFjdChib29sZWFuIGNvbXBhY3QpIHsKLQkJc2V0QXR0cmlidXRlKCJjb21wYWN0IiwgY29tcGFjdCA/ICJjb21wYWN0IiA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJzdGFydCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKLQkJc2V0QXR0cmlidXRlKCJzdGFydCIsIEludGVnZXIudG9TdHJpbmcoc3RhcnQpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIT2JqZWN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPYmplY3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGI5ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPYmplY3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZvcm1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE9iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSE9iamVjdEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MT2JqZWN0RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIT2JqZWN0RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2RlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgY29kZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGUiLCBjb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYXJjaGl2ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoU3RyaW5nIGFyY2hpdmUpIHsKLQkJc2V0QXR0cmlidXRlKCJhcmNoaXZlIiwgYXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJvcmRlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYm9yZGVyIiwgYm9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvZGVCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlYmFzZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvZGVCYXNlKFN0cmluZyBjb2RlQmFzZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGViYXNlIiwgY29kZUJhc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNvZGV0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29kZVR5cGUoU3RyaW5nIGNvZGVUeXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29kZXR5cGUiLCBjb2RlVHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJkYXRhIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgewotCQlzZXRBdHRyaWJ1dGUoImRhdGEiLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWNsYXJlKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJkZWNsYXJlIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gZGVjbGFyZSkgewotCQlzZXRBdHRyaWJ1dGUoImRlY2xhcmUiLCBkZWNsYXJlID8gImRlY2xhcmUiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhlaWdodCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlaWdodChTdHJpbmcgaGVpZ2h0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgaGVpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhzcGFjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaHNwYWNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHNwYWNlKFN0cmluZyBoc3BhY2UpIHsKLQkJc2V0QXR0cmlidXRlKCJoc3BhY2UiLCBoc3BhY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFuZGJ5KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzdGFuZGJ5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhbmRieShTdHJpbmcgc3RhbmRieSkgewotCQlzZXRBdHRyaWJ1dGUoInN0YW5kYnkiLCBzdGFuZGJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IHRhYkluZGV4KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKHRhYkluZGV4KSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZU1hcCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidXNlbWFwIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlTWFwKFN0cmluZyB1c2VNYXApIHsKLQkJc2V0QXR0cmlidXRlKCJ1c2VtYXAiLCB1c2VNYXApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VnNwYWNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ2c2FwY2UiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWc3BhY2UoU3RyaW5nIHZzcGFjZSkgewotCQlzZXRBdHRyaWJ1dGUoInZzYXBjZSIsIHZzcGFjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgid2lkdGgiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGNvbnRlbnREb2M7Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0Q29udGVudERvY3VtZW50KCkgewotCQlyZXR1cm4gY29udGVudERvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50IGRvY3VtZW50IHRoaXMgb2JqZWN0IGNvbnRhaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnREb2N1bWVudChEb2N1bWVudCBjb250ZW50RG9jKSB7Ci0JCXRoaXMuY29udGVudERvYyA9IGNvbnRlbnREb2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPcHRHcm91cEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIT3B0R3JvdXBFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMWY5NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPcHRHcm91cEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT3B0R3JvdXBFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hPcHRHcm91cEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MT3B0R3JvdXBFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hPcHRHcm91cEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImRpc2FibGVkIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCBkaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlzZXRBdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIT3B0aW9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPcHRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTM4ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hPcHRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRm9ybUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT3B0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIT3B0aW9uRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxPcHRpb25FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hPcHRpb25FbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MRm9ybUVsZW1lbnQgZ2V0Rm9ybSgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldFBhcmVudE5vZGUoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpCi0JCQkJcmV0dXJuIChIVE1MRm9ybUVsZW1lbnQpIHJldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFNlbGVjdGVkOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNlbGVjdGVkKCkgewotCQlyZXR1cm4gZGVmYXVsdFNlbGVjdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3RlZChib29sZWFuIGRlZmF1bHRTZWxlY3RlZCkgewotCQl0aGlzLmRlZmF1bHRTZWxlY3RlZCA9IGRlZmF1bHRTZWxlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCU5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXJldHVybiBjaGlsZCA9PSBudWxsID8gbnVsbCA6IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaWYgYSBTRUxFQ1Qgbm9kZSBpcyBub3QgZm91bmQgaW4gYW5jZXN0ZXIsIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCVNIU2VsZWN0RWxlbWVudCBzZWw7Ci0JCWZvciAoTm9kZSBhbmMgPSBnZXRQYXJlbnROb2RlKCk7IGFuYyAhPSBudWxsOyBhbmMgPSBhbmMuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAoYW5jIGluc3RhbmNlb2YgU0hTZWxlY3RFbGVtZW50KSB7Ci0JCQkJc2VsID0gKFNIU2VsZWN0RWxlbWVudCkgYW5jOwotCQkJCUhUTUxDb2xsZWN0aW9uIG9wdGlvbnMgPSBzZWwuZ2V0T3B0aW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChvcHRpb25zLml0ZW0oaSkgPT0gdGhpcykgewotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJU0hTZWxlY3RFbGVtZW50IHNlbDsKLQkJZm9yIChOb2RlIGFuYyA9IGdldFBhcmVudE5vZGUoKTsgYW5jICE9IG51bGw7IGFuYyA9IGFuYy5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChhbmMgaW5zdGFuY2VvZiBTSFNlbGVjdEVsZW1lbnQpIHsKLQkJCQlzZWwgPSAoU0hTZWxlY3RFbGVtZW50KSBhbmM7Ci0JCQkJSFRNTENvbGxlY3Rpb24gb3B0aW9ucyA9IHNlbC5nZXRPcHRpb25zKCk7Ci0JCQkJaWYgKGluZGV4IDwgMCB8fCBvcHRpb25zLmdldExlbmd0aCgpIDw9IGluZGV4KQotCQkJCQlyZXR1cm47Ci0JCQkJU0hPcHRpb25FbGVtZW50IG5leHRTaWJsaW5nID0gKFNIT3B0aW9uRWxlbWVudCkgb3B0aW9ucwotCQkJCQkJLml0ZW0oaW5kZXgpOwotCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV4dFNpYmxpbmcuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJCQluZXdQYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIG5leHRTaWJsaW5nKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNlbGVjdGVkKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQlzZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgc2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImRpc2FibGVkIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCBkaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlzZXRBdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hQYXJhZ3JhcGhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFBhcmFncmFwaEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwMDM2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFBhcmFncmFwaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MUGFyYWdyYXBoRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIUGFyYWdyYXBoRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxQYXJhZ3JhcGhFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hQYXJhZ3JhcGhFbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hQYXJhbUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIUGFyYW1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGFhMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hQYXJhbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MUGFyYW1FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hQYXJhbUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MUGFyYW1FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hQYXJhbUVsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbHVldHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlVHlwZShTdHJpbmcgdmFsdWVUeXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWV0eXBlIiwgdmFsdWVUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFByZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIUHJlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDlmOWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIUHJlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxQcmVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hQcmVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFByZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSFByZUVsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRBdHRyaWJ1dGUoIndpZHRoIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKGludCB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgSW50ZWdlci50b1N0cmluZyh3aWR0aCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIUXVvdGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFF1b3RlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU3ZmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIUXVvdGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFF1b3RlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIUXVvdGVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFF1b3RlRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIUXVvdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2l0ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2l0ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENpdGUoU3RyaW5nIGNpdGUpIHsKLQkJc2V0QXR0cmlidXRlKCJjaXRlIiwgY2l0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hTY3JpcHRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFNjcmlwdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3MzM1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFNjcmlwdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFNjcmlwdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFNjcmlwdEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MU2NyaXB0RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIU2NyaXB0RWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCU5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXJldHVybiBjaGlsZCA9PSBudWxsID8gbnVsbCA6IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCWFwcGVuZENoaWxkKGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDREFUQVNlY3Rpb24odGV4dCkpOwotCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJKChDaGFyYWN0ZXJEYXRhKSBjaGlsZCkuc2V0RGF0YSh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCWluc2VydEJlZm9yZShnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ0RBVEFTZWN0aW9uKHRleHQpLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh0bWxGb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImZvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh0bWxGb3IoU3RyaW5nIGh0bWxGb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJmb3IiLCBodG1sRm9yKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV2ZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJldmVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV2ZW50KFN0cmluZyBldmVudCkgewotCQlzZXRBdHRyaWJ1dGUoImV2ZW50IiwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhcnNldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIGNoYXJzZXQpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyc2V0IiwgY2hhcnNldCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmZXIoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImRlZmVyIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZlcihib29sZWFuIGRlZmVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGVmZXIiLCBkZWZlciA/ICJkZWZlciIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNyYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLQkJc2V0QXR0cmlidXRlKCJzcmMiLCBzcmMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hTZWxlY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFNlbGVjdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwODMwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFNlbGVjdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxPcHRpb25FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFNlbGVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFNlbGVjdEVsZW1lbnQgZXh0ZW5kcyBTSEZvcm1DdHJsRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxTZWxlY3RFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hTZWxlY3RFbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICgoKFNIT3B0aW9uRWxlbWVudCkgb3B0aW9ucy5pdGVtKGkpKS5nZXRTZWxlY3RlZCgpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBzZWxlY3RlZEluZGV4KSB7Ci0JCU5vZGVMaXN0IG9wdGlvbnMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiT1BUSU9OIik7Ci0JCWlmIChzZWxlY3RlZEluZGV4IDwgMCB8fCBvcHRpb25zLmdldExlbmd0aCgpIDw9IHNlbGVjdGVkSW5kZXgpCi0JCQlyZXR1cm47Ci0JCSgoU0hPcHRpb25FbGVtZW50KSBvcHRpb25zLml0ZW0oc2VsZWN0ZWRJbmRleCkpLnNldEF0dHJpYnV0ZSgKLQkJCQkic2VsZWN0ZWQiLCAic2VsZWN0ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlOb2RlTGlzdCBvcHRpb25zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk9QVElPTiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJU0hPcHRpb25FbGVtZW50IG9wdCA9IChTSE9wdGlvbkVsZW1lbnQpIG9wdGlvbnMuaXRlbShpKTsKLQkJCWlmIChvcHQuZ2V0U2VsZWN0ZWQoKSkgewotCQkJCXJldHVybiBvcHQuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCVNIT3B0aW9uRWxlbWVudCBvcHQgPSAoU0hPcHRpb25FbGVtZW50KSBvcHRpb25zLml0ZW0oaSk7Ci0JCQlpZiAob3B0LmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCW9wdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgInNlbGVjdGVkIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0T3B0aW9ucygpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJcmV0dXJuICgoU0hEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVDb2xsZWN0aW9uKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldE11bHRpcGxlKCkgewotCQlTdHJpbmcgbXVsID0gZ2V0QXR0cmlidXRlKCJtdWx0aXBsZSIpOwotCQlyZXR1cm4gbXVsICE9IG51bGwgJiYgbXVsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGUoYm9vbGVhbiBtdWx0aXBsZSkgewotCQlzZXRBdHRyaWJ1dGUoIm11bHRpcGxlIiwgbXVsdGlwbGUgPyAibXVsdGlwbGUiIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCVN0cmluZyBzaXplID0gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JCWlmIChzaXplICE9IG51bGwgJiYgc2l6ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHNpemUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKHNpemUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSFRNTEVsZW1lbnQgZWxlbWVudCwgSFRNTEVsZW1lbnQgYmVmb3JlKSB7Ci0JCWlmIChiZWZvcmUgPT0gbnVsbCkgewotCQkJaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGdldEZpcnN0Q2hpbGQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnNlcnRCZWZvcmUoZWxlbWVudCwgYmVmb3JlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBvcHRpb25zLmdldExlbmd0aCgpIDw9IGluZGV4KQotCQkJcmV0dXJuOwotCQlIVE1MT3B0aW9uRWxlbWVudCBvcHQgPSAoSFRNTE9wdGlvbkVsZW1lbnQpIG9wdGlvbnMuaXRlbShpbmRleCk7Ci0JCW9wdC5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQob3B0KTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgYmx1cigpIHsKLQl9Ci0KLQkvKioKLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hTdHlsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIU3R5bGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYzk3ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hTdHlsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MU3R5bGVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hTdHlsZUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MU3R5bGVFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hTdHlsZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgZmFsc2UgKEZvciBhbiBhcHBsaWNhdGlvbiwgb3ZlcnJpZGUgdGhpcyBtZXRob2QpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lZGlhKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJtZWRpYSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lZGlhKFN0cmluZyBtZWRpYSkgewotCQlzZXRBdHRyaWJ1dGUoIm1lZGlhIiwgbWVkaWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUYWJsZUNhcHRpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2FwdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwZGM2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2FwdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVDYXB0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGFibGVDYXB0aW9uRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxUYWJsZUNhcHRpb25FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hUYWJsZUNhcHRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUYWJsZUNlbGxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2VsbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViOGY5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2VsbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVDZWxsRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZVJvd0VsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFRhYmxlQ2VsbEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MVGFibGVDZWxsRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIVGFibGVDZWxsRWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENlbGxJbmRleCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KSB7Ci0JCQlpbnQgcmV0ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbDsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKQotCQkJCXJldCsrOwotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIHsgLy8gZXJyb3IuCi0JCQlpbnQgcmV0ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbAotCQkJCQkmJiAhKHByZXYgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KTsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKQotCQkJCXJldCsrOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxJbmRleChpbnQgY2VsbEluZGV4KSB7Ci0JCWlmIChjZWxsSW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJCU5vZGVMaXN0IHNpYmxpbmdzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChzaWJsaW5ncy5nZXRMZW5ndGgoKSA8PSBjZWxsSW5kZXgpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIHNpYmxpbmdzLml0ZW0oY2VsbEluZGV4KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGVycm9yLgotCQkJTm9kZSBsZWZ0TW9zdCA9IHRoaXM7Ci0JCQlpbnQgY3VycmVudEluZGV4ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbAotCQkJCQkmJiAhKHByZXYgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KTsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQkJbGVmdE1vc3QgPSBwcmV2OwotCQkJCWN1cnJlbnRJbmRleCsrOwotCQkJfQotCQkJcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwotCQkJTm9kZSBiZWZvcmUgPSBsZWZ0TW9zdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2VsbEluZGV4OyBpKyspIHsKLQkJCQlOb2RlIG5leHQgPSBiZWZvcmUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsIHx8IG5leHQgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KSB7IC8vIG91dAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gYm91bmRzCi0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUodGhpcywgbnVsbCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQliZWZvcmUgPSBiZWZvcmUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIGJlZm9yZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFiYnIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFiYnIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBYmJyKFN0cmluZyBhYmJyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWJiciIsIGFiYnIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpbmciLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBeGlzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJheGlzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpcyhTdHJpbmcgYXhpcykgewotCQlzZXRBdHRyaWJ1dGUoImF4aXMiLCBheGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJnQ29sb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJnY29sb3IiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZ0NvbG9yKFN0cmluZyBiZ0NvbG9yKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYmdjb2xvciIsIGJnQ29sb3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2goKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNoYXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaChTdHJpbmcgY2gpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyIiwgY2gpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hPZmYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNoYXJvZmYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaE9mZihTdHJpbmcgY2hPZmYpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyb2ZmIiwgY2hPZmYpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xTcGFuKCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRBdHRyaWJ1dGUoImNvbHNwYW4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sU3BhbihpbnQgY29sU3BhbikgewotCQlzZXRBdHRyaWJ1dGUoImNvbHNwYW4iLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbFNwYW4pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlYWRlcnMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhlYWRlcnMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXJzKFN0cmluZyBoZWFkZXJzKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaGVhZGVycyIsIGhlYWRlcnMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQlzZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Tm9XcmFwKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJub3dyYXAiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vV3JhcChib29sZWFuIG5vV3JhcCkgewotCQlzZXRBdHRyaWJ1dGUoIm5vd3JhcCIsIG5vV3JhcCA/ICJub3dyYXAiIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd1NwYW4oKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgicm93c3BhbiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb3dTcGFuKGludCByb3dTcGFuKSB7Ci0JCXNldEF0dHJpYnV0ZSgicm93c3BhbiIsIEludGVnZXIudG9TdHJpbmcocm93U3BhbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInNjb3BlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCXNldEF0dHJpYnV0ZSgic2NvcGUiLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWQWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZBbGlnbihTdHJpbmcgdkFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsaWduIiwgdkFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIVGFibGVDb2xFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ29sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzY3ZTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIVGFibGVDb2xFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlQ29sRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGFibGVDb2xFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFRhYmxlQ29sRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIVGFibGVDb2xFbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDaCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoKFN0cmluZyBjaCkgewotCQlzZXRBdHRyaWJ1dGUoImNoYXIiLCBjaCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDaE9mZigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhcm9mZiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoT2ZmKFN0cmluZyBjaE9mZikgewotCQlzZXRBdHRyaWJ1dGUoImNoYXJvZmYiLCBjaE9mZik7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYW4oKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgic3BhbiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGFuKGludCBzcGFuKSB7Ci0JCXNldEF0dHJpYnV0ZSgic3BhbiIsIEludGVnZXIudG9TdHJpbmcoc3BhbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VkFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ2YWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWQWxpZ24oU3RyaW5nIHZBbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoInZhbGlnbiIsIHZBbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgid2lkdGgiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2Y2UyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVDYXB0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFRhYmxlRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxUYWJsZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSFRhYmxlRWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgZ2V0Q2FwdGlvbigpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldEZpcnN0Q2hpbGQoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KSByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FwdGlvbihIVE1MVGFibGVDYXB0aW9uRWxlbWVudCBjYXB0aW9uKSB7Ci0JCWluc2VydEJlZm9yZShjYXB0aW9uLCBnZXRGaXJzdENoaWxkKCkpOwotCX0KLQotCXB1YmxpYyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCBnZXRUSGVhZCgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldEZpcnN0Q2hpbGQoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQKLQkJCQkJJiYgcmV0LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEhFQUQiKSkgewotCQkJCXJldHVybiAoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQpIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUSGVhZChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCB0SGVhZCkgewotCQlmb3IgKE5vZGUgYWZ0ZXIgPSBnZXRGaXJzdENoaWxkKCk7IGFmdGVyICE9IG51bGw7IGFmdGVyID0gYWZ0ZXIKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGFmdGVyIGluc3RhbmNlb2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQpIHsKLQkJCQlpbnNlcnRCZWZvcmUodEhlYWQsIGFmdGVyKTsKLQkJCX0KLQkJfQotCQlpbnNlcnRCZWZvcmUodEhlYWQsIGdldExhc3RDaGlsZCgpKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgZ2V0VEZvb3QoKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRGaXJzdENoaWxkKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKHJldCBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIHJldC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIlRGT09UIikpIHsKLQkJCQlyZXR1cm4gKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KSByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VEZvb3QoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgdEZvb3QpIHsKLQkJZm9yIChOb2RlIGFmdGVyID0gZ2V0Rmlyc3RDaGlsZCgpOyBhZnRlciAhPSBudWxsOyBhZnRlciA9IGFmdGVyCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChhZnRlciBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIGFmdGVyLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEJPRFkiKSkgewotCQkJCWluc2VydEJlZm9yZSh0Rm9vdCwgYWZ0ZXIpOwotCQkJfQotCQl9Ci0JCWluc2VydEJlZm9yZSh0Rm9vdCwgZ2V0TGFzdENoaWxkKCkpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRSb3dzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJSFRNTFRhYmxlUm93RWxlbWVudCByb3dzW10gPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudFsxNl07Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCkgewotCQkJCWZvciAoTm9kZSByb3cgPSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7IHJvdyAhPSBudWxsOyByb3cgPSByb3cKLQkJCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChyb3cgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KSB7Ci0JCQkJCQlpZiAocm93cy5sZW5ndGggPT0gbGVuKSB7Ci0JCQkJCQkJSFRNTFRhYmxlUm93RWxlbWVudCBidWZbXSA9IG5ldyBIVE1MVGFibGVSb3dFbGVtZW50W2xlbiAqIDJdOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocm93cywgMCwgYnVmLCAwLCBsZW4pOwotCQkJCQkJCXJvd3MgPSBidWY7Ci0JCQkJCQl9Ci0JCQkJCQlyb3dzW2xlbisrXSA9IChIVE1MVGFibGVSb3dFbGVtZW50KSByb3c7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJCWlmIChyb3dzLmxlbmd0aCA9PSBsZW4pIHsKLQkJCQkJSFRNTFRhYmxlUm93RWxlbWVudCBidWZbXSA9IG5ldyBIVE1MVGFibGVSb3dFbGVtZW50W2xlbiAqIDJdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJvd3MsIDAsIGJ1ZiwgMCwgbGVuKTsKLQkJCQkJcm93cyA9IGJ1ZjsKLQkJCQl9Ci0JCQkJcm93c1tsZW4rK10gPSAoSFRNTFRhYmxlUm93RWxlbWVudCkgY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoU0hEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVDb2xsZWN0aW9uKHJvd3MsIGxlbik7Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldFRCb2RpZXMoKSB7Ci0JCWludCBsZW4gPSAwOwotCQlIVE1MVGFibGVTZWN0aW9uRWxlbWVudCB0Ym9kaWVzW10gPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnRbMTZdOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQKLQkJCQkJJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJUQk9EWSIpKSB7Ci0JCQkJaWYgKHRib2RpZXMubGVuZ3RoID09IGxlbikgewotCQkJCQlIVE1MVGFibGVTZWN0aW9uRWxlbWVudCBidWZbXSA9IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudFtsZW4gKiAyXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0Ym9kaWVzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCXRib2RpZXMgPSBidWY7Ci0JCQkJfQotCQkJCXRib2RpZXNbbGVuKytdID0gKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KSBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChTSERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpLmNyZWF0ZUNvbGxlY3Rpb24odGJvZGllcywgbGVuKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmdDb2xvcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYmdjb2xvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnQ29sb3IoU3RyaW5nIGJnQ29sb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJiZ2NvbG9yIiwgYmdDb2xvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJvcmRlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYm9yZGVyIiwgYm9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENlbGxQYWRkaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjZWxscGFkZGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxQYWRkaW5nKFN0cmluZyBjZWxsUGFkZGluZykgewotCQlzZXRBdHRyaWJ1dGUoImNlbGxwYWRkaW5nIiwgY2VsbFBhZGRpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2VsbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNlbGxzcGFjaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbFNwYWNpbmcoU3RyaW5nIGNlbGxTcGFjaW5nKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2VsbHNwYWNpbmciLCBjZWxsU3BhY2luZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGcmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiZnJhbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGcmFtZShTdHJpbmcgZnJhbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJmcmFtZSIsIGZyYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bGVzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJydWxlcyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bGVzKFN0cmluZyBydWxlcykgewotCQlzZXRBdHRyaWJ1dGUoInJ1bGVzIiwgcnVsZXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3VtbWFyeSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIHN1bW1hcnkpIHsKLQkJc2V0QXR0cmlidXRlKCJzdW1tYXJ5Iiwgc3VtbWFyeSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgid2lkdGgiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgVEhFQUQgZWxlbWVudCB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50IGNyZWF0ZVRIZWFkKCkgewotCQlyZXR1cm4gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgiVEhFQUQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVUSGVhZCgpIHsKLQkJZm9yIChOb2RlIHRIZWFkID0gZ2V0Rmlyc3RDaGlsZCgpOyB0SGVhZCAhPSBudWxsOyB0SGVhZCA9IHRIZWFkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmICh0SGVhZCBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIHRIZWFkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEhFQUQiKSkgewotCQkJCXJlbW92ZUNoaWxkKHRIZWFkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgVEZPT1QgZWxlbWVudCB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50IGNyZWF0ZVRGb290KCkgewotCQlyZXR1cm4gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgiVEZPT1QiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVURm9vdCgpIHsKLQkJZm9yIChOb2RlIHRGb290ID0gZ2V0Rmlyc3RDaGlsZCgpOyB0Rm9vdCAhPSBudWxsOyB0Rm9vdCA9IHRGb290Ci0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmICh0Rm9vdCBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIHRGb290LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEZPT1QiKSkgewotCQkJCXJlbW92ZUNoaWxkKHRGb290KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgQ0FQVElPTiBlbGVtZW50IHdob3NlIHRhZ25hbWUgaXMgdXBwZXJjYXNlZC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnQgY3JlYXRlQ2FwdGlvbigpIHsKLQkJcmV0dXJuIChIVE1MRWxlbWVudCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoIkNBUFRJT04iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVDYXB0aW9uKCkgewotCQlmb3IgKE5vZGUgY2FwdGlvbiA9IGdldEZpcnN0Q2hpbGQoKTsgY2FwdGlvbiAhPSBudWxsOyBjYXB0aW9uID0gY2FwdGlvbgotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2FwdGlvbiBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIGNhcHRpb24uZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJDQVBUSU9OIikpIHsKLQkJCQlyZW1vdmVDaGlsZChjYXB0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRzIGEgbmV3IGVtcHR5IHJvdyB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50IGluc2VydFJvdyhpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MQ29sbGVjdGlvbiByb3dzID0gZ2V0Um93cygpOwotCQlpZiAocm93cy5nZXRMZW5ndGgoKSA8PSBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIGFmdGVyID0gcm93cy5pdGVtKGluZGV4KTsKLQkJCU5vZGUgcGFyZW50ID0gYWZ0ZXIuZ2V0UGFyZW50Tm9kZSgpOwotCQkJSFRNTEVsZW1lbnQgcmV0ID0gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJIlRSIik7Ci0JCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJldCwgYWZ0ZXIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZVJvdyhpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJSFRNTENvbGxlY3Rpb24gcm93cyA9IGdldFJvd3MoKTsKLQkJaWYgKHJvd3MuZ2V0TGVuZ3RoKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcm93ID0gcm93cy5pdGVtKGluZGV4KTsKLQkJcm93LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChyb3cpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIVGFibGVSb3dFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlUm93RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiZjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIVGFibGVSb3dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZVJvd0VsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFRhYmxlUm93RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxUYWJsZVJvd0VsZW1lbnQgewotCXByb3RlY3RlZCBTSFRhYmxlUm93RWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJvd0luZGV4KCkgewotCQlOb2RlIHRhYmxlID0gZ2V0UGFyZW50Tm9kZSgpLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHRhYmxlIGluc3RhbmNlb2YgSFRNTFRhYmxlRWxlbWVudCkgewotCQkJSFRNTENvbGxlY3Rpb24gcm93cyA9ICgoSFRNTFRhYmxlRWxlbWVudCkgdGFibGUpLmdldFJvd3MoKTsKLQkJCWZvciAoaW50IHJldCA9IDA7IHJldCA8IHJvd3MuZ2V0TGVuZ3RoKCk7IHJldCsrKSB7Ci0JCQkJaWYgKHJvd3MuaXRlbShyZXQpID09IHRoaXMpCi0JCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRE9NIEltcGxlbWVudGF0aW9uIEVycm9yLiIpOwotCQl9IGVsc2UgeyAvLyBpbnZhbGlkIGRvbSBzdHJ1Y3R1cmUuCi0JCQlpbnQgcmV0ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbDsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQkJaWYgKHByZXYgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KQotCQkJCQlyZXQrKzsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb3dJbmRleChpbnQgcm93SW5kZXgpIHsKLQkJaWYgKHJvd0luZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZSB0YWJsZSA9IGdldFBhcmVudE5vZGUoKS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmICh0YWJsZSBpbnN0YW5jZW9mIEhUTUxUYWJsZUVsZW1lbnQpIHsKLQkJCWdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJCUhUTUxDb2xsZWN0aW9uIHJvd3MgPSAoKEhUTUxUYWJsZUVsZW1lbnQpIHRhYmxlKS5nZXRSb3dzKCk7Ci0JCQlpZiAocm93cy5nZXRMZW5ndGgoKSA8IHJvd0luZGV4KQotCQkJCXJldHVybjsKLQkJCU5vZGUgYWZ0ZXIgPSByb3dzLml0ZW0ocm93SW5kZXgpOwotCQkJTm9kZSBuZXdQYXJlbnQgPSBhZnRlci5nZXRQYXJlbnROb2RlKCk7Ci0JCQluZXdQYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIGFmdGVyKTsKLQkJfSBlbHNlIHsgLy8gaW52YWxpZCBkb20gc3RydWN0dXJlLgotCQkJTm9kZSBhZnRlciA9IGdldFBhcmVudE5vZGUoKS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJd2hpbGUgKGNvdW50IDwgcm93SW5kZXggJiYgYWZ0ZXIgIT0gbnVsbCkgewotCQkJCWlmIChhZnRlciBpbnN0YW5jZW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQkJYWZ0ZXIgPSBhZnRlci5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJaWYgKGFmdGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKHRoaXMpOwotCQkJYWZ0ZXIuZ2V0UGFyZW50Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLCBhZnRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlY3Rpb25Sb3dJbmRleCgpIHsKLQkJaW50IHJldCA9IDA7Ci0JCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbDsgcHJldiA9IHByZXYKLQkJCQkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCWlmIChwcmV2IGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJCXJldCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvblJvd0luZGV4KGludCBzZWN0aW9uUm93SW5kZXgpIHsKLQkJaWYgKHNlY3Rpb25Sb3dJbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGUgYWZ0ZXIgPSBnZXRQYXJlbnROb2RlKCkuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQgPCBzZWN0aW9uUm93SW5kZXggJiYgYWZ0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGFmdGVyIGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCQlhZnRlciA9IGFmdGVyLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaWYgKGFmdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJYWZ0ZXIuZ2V0UGFyZW50Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLCBhZnRlcik7Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldENlbGxzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJSFRNTFRhYmxlQ2VsbEVsZW1lbnQgY2VsbHNbXSA9IG5ldyBIVE1MVGFibGVDZWxsRWxlbWVudFs4XTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxUYWJsZUNlbGxFbGVtZW50KSB7Ci0JCQkJaWYgKGNlbGxzLmxlbmd0aCA9PSBsZW4pIHsKLQkJCQkJSFRNTFRhYmxlQ2VsbEVsZW1lbnQgYnVmW10gPSBuZXcgSFRNTFRhYmxlQ2VsbEVsZW1lbnRbbGVuICogMl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoY2VsbHMsIDAsIGJ1ZiwgMCwgbGVuKTsKLQkJCQkJY2VsbHMgPSBidWY7Ci0JCQkJfQotCQkJCWNlbGxzW2xlbisrXSA9IChIVE1MVGFibGVDZWxsRWxlbWVudCkgY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoU0hEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVDb2xsZWN0aW9uKGNlbGxzLCBsZW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxzKEhUTUxDb2xsZWN0aW9uIGNlbGxzKSB7Ci0JCXdoaWxlIChoYXNDaGlsZE5vZGVzKCkpCi0JCQlyZW1vdmVDaGlsZChnZXRGaXJzdENoaWxkKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNlbGxzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWluc2VydEJlZm9yZShjZWxscy5pdGVtKGkpLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZ0NvbG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJiZ2NvbG9yIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmdDb2xvcihTdHJpbmcgYmdDb2xvcikgewotCQlzZXRBdHRyaWJ1dGUoImJnY29sb3IiLCBiZ0NvbG9yKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2goU3RyaW5nIGNoKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhciIsIGNoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoT2ZmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyb2ZmIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hPZmYoU3RyaW5nIGNoT2ZmKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhcm9mZiIsIGNoT2ZmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmFsaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VkFsaWduKFN0cmluZyB2QWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJ2YWxpbmciLCB2QWxpZ24pOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhbiBlbXB0eSA8Y29kZT5URDwvY29kZT4gY2VsbCB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQgaW50bwotCSAqIHRoaXMgcm93LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudCBpbnNlcnRDZWxsKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgYWZ0ZXIgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBpbmRleCAmJiBhZnRlciAhPSBudWxsKSB7Ci0JCQlhZnRlciA9IGFmdGVyLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpKys7Ci0JCX0KLQkJaWYgKGFmdGVyID09IG51bGwgJiYgaSAhPSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUhUTUxFbGVtZW50IHJldCA9IChIVE1MRWxlbWVudCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoIlREIik7Ci0JCWluc2VydEJlZm9yZShyZXQsIGFmdGVyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVDZWxsKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlIHRhcmdldCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCXJlbW92ZUNoaWxkKHRhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUYWJsZVNlY3Rpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlU2VjdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZDg2ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlU2VjdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hUYWJsZVNlY3Rpb25FbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMKLQkJSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgewotCXByb3RlY3RlZCBTSFRhYmxlU2VjdGlvbkVsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2goU3RyaW5nIGNoKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhciIsIGNoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoT2ZmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyb2ZmIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hPZmYoU3RyaW5nIGNoT2ZmKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhcm9mZiIsIGNoT2ZmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VkFsaWduKFN0cmluZyB2QWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJ2YWxpZ24iLCB2QWxpZ24pOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRSb3dzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJSFRNTFRhYmxlUm93RWxlbWVudCByb3dzW10gPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudFs4XTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQlpZiAocm93cy5sZW5ndGggPT0gbGVuKSB7Ci0JCQkJCUhUTUxUYWJsZVJvd0VsZW1lbnQgYnVmW10gPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudFtsZW4gKiAyXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyb3dzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCXJvd3MgPSBidWY7Ci0JCQkJfQotCQkJCXJvd3NbbGVuKytdID0gKEhUTUxUYWJsZVJvd0VsZW1lbnQpIGNoaWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiAoKFNIRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKSkuY3JlYXRlQ29sbGVjdGlvbihyb3dzLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIGluc2VydHMgYSBuZXcgcm93IGVsZW1lbnQgd2hvc2UgdGFnIG5hbWUgaXMgdXBwZXJjYXNlZC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnQgaW5zZXJ0Um93KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpID0gMDsKLQkJZm9yIChOb2RlIGFmdGVyID0gZ2V0Rmlyc3RDaGlsZCgpOyBhZnRlciAhPSBudWxsOyBhZnRlciA9IGFmdGVyCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChpID09IGluZGV4KSB7Ci0JCQkJSFRNTEVsZW1lbnQgcmV0ID0gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkKLQkJCQkJCS5jcmVhdGVFbGVtZW50KCJUUiIpOwotCQkJCWluc2VydEJlZm9yZShyZXQsIGFmdGVyKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkgPT0gMCkgewotCQkJSFRNTEVsZW1lbnQgcmV0ID0gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJIlRSIik7Ci0JCQlpbnNlcnRCZWZvcmUocmV0LCBudWxsKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlUm93KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoaSA9PSBpbmRleCkgewotCQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUZXh0QXJlYUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbXBsL1NIVGV4dEFyZWFFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTA1NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUZXh0QXJlYUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRleHRBcmVhRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGV4dEFyZWFFbGVtZW50IGV4dGVuZHMgU0hGb3JtQ3RybEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MVGV4dEFyZWFFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hUZXh0QXJlYUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc0tleSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzS2V5KFN0cmluZyBhY2Nlc3NLZXkpIHsKLQkJc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBhY2Nlc3NLZXkpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xzKCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRBdHRyaWJ1dGUoImNvbHMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29scyhpbnQgY29scykgewotCQlzZXRBdHRyaWJ1dGUoImNvbHMiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbHMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZWFkT25seSgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgicmVhZG9ubHkiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJc2V0QXR0cmlidXRlKCJyZWFkb25seSIsIHJlYWRPbmx5ID8gInJlYWRvbmx5IiA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Um93cygpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJyb3dzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvd3MoaW50IHJvd3MpIHsKLQkJc2V0QXR0cmlidXRlKCJyb3dzIiwgSW50ZWdlci50b1N0cmluZyhyb3dzKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gInRleHRhcmVhIjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLiBPdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBibHVyKCkgewotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4gT3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXMoKSB7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLiBPdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3QoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRpdGxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hUaXRsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmYTJhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFRpdGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRpdGxlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGl0bGVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFRpdGxlRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgdG1wUyA9ICIiOwotCQlpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJdG1wUyA9IGdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG1wUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWJvb2xlYW4gZmxhZyA9IGZhbHNlOwotCQlpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJZmlyc3RDaGlsZC5zZXROb2RlVmFsdWUodGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWZsYWcgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmxhZyA9IHRydWU7Ci0JCX0KLQkJaWYgKGZsYWcpIHsKLQkJCWluc2VydEJlZm9yZShnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoInRleHQiKSwKLQkJCQkJZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTSFRpdGxlRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFVMaXN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2ltcGwvU0hVTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxODg2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW1wbC9TSFVMaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxVTGlzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFVMaXN0RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxVTGlzdEVsZW1lbnQgewotCXByb3RlY3RlZCBTSFVMaXN0RWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb21wYWN0KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjb21wYWN0Iik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYWN0KGJvb2xlYW4gY29tcGFjdCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCBjb21wYWN0ID8gImNvbXBhY3QiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW50ZXJuYWwvdXRpbC9KYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbnRlcm5hbC91dGlsL0phcGFuZXNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmViZjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbnRlcm5hbC91dGlsL0phcGFuZXNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLy8KLS8vIG9uZS1ieXRlIGthdGFrYW5hCi0vLyBvbmUtYnl0ZSBrYXRha2FuYSB3aXRoIG5vdCBFVUMgY29kZSAtPiBtaWhndCBiZSBvbmUtYnl0ZSBrYXRha2FuYQotLy8KLS8vIEVVQzFzdD0weDhmIC0+IHR3byB0cmFpbGVycyAoc2FtZSBjb2RlIHJlZ2lvbikKLS8vCi0vLyBkdXBsaWNhdGVkIChvcmcuZWNsaXBzZS5hY3RmLnV0aWwuSkVEKQotCi0vKgotICogaW5mb3JtYXRpb24KLSAqIAotICogY3VycmVudGx5IGlnbm9yZSB2ZW5kb3Igc3BlY2lmaWMgRVVDIGNoYXJzIGN1cnJlbnRseSBpZ25vcmUgcmVzZXJ2ZWQgd29yZCBvZgotICogU0pJUyAoMHhGMC0weGZjKQotICogCi0gKiBPdGhlciBKSVMgRXNjYXBlIHNlcXVlbmNlKHN0YXJ0KSAiRVNDICQgQCIgMHgxYiAweDI0IDB4NDAgIkVTQyAmIEAgRVNDICQgQiIKLSAqIDB4MWIgMHgyNiAweDQwIDB4MWIgMHgyNCAweDQyICJFU0MgJCAoIEQiIDB4MWIgMHgyNCAweDI4IDB4NDQgZXRjLgotICogCi0gKiBFc2NhcGUgc2VxdWVuY2UoZmluKSAiRVNDICggSiIgIkVTQyAoIEgiICJFU0MgKCBCIiAiRVNDICggSSIgZXRjLgotICovCi0KLXB1YmxpYyBjbGFzcyBKYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpfU0pJUyA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKX0VVQyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKX0pJUyA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKX01JWCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKX1VURjggPSA0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFUSU4xID0gNTsKLQotCS8vIFRPRE8gU0pJUywgRVVDX0pQLCBJU08yMDIySlAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKSVMgPSAiSVNPLTIwMjItSlAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVVDID0gIkVVQy1KUCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSklTID0gIlNoaWZ0X0pJUyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU09fODg1OV8xID0gIklTTy04ODU5LTEiOwotCi0JLy8gSklTIGVzY2FwZSBzZXF1ZW5jZQotCS8vCi0JLy8gIkVzYyAkIEIiCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfRVNDQVBFID0gKGJ5dGUpIDB4MWI7Ly8gRXNjCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19ET1VCTEUgPSAoYnl0ZSkgMHgyNDsvLyAkIGRvdWJsZS1ieXRlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19TSU5HTEUgPSAoYnl0ZSkgMHgyODsvLyAoIHNpbmdsZS1ieXRlCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19CID0gKGJ5dGUpIDB4NDI7Ly8gQiBuZXctSklTCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19BVCA9IChieXRlKSAweDQwOy8vIEAgb2xkLUpJUwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfRCA9IChieXRlKSAweDQ0Oy8vIEQgSklTLXN1cAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfSiA9IChieXRlKSAweDRBOy8vIEogSklTLXJvbWEKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX0kgPSAoYnl0ZSkgMHg0OTsvLyBJIEpJUy1BU0NJSQotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfU19QQVlMT0FEX0JFR0lOID0gKGJ5dGUpMHgyMDsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19TX1BBWUxPQURfRU5EID0gKGJ5dGUpMHg3ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX0tBTkFfUEFZTE9BRF9CRUdJTiA9IChieXRlKSAweDIxOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfS0FOQV9QQVlMT0FEX0VORCA9IChieXRlKSAweDVmOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfRF9QQVlMT0FEX0JFR0lOID0gKGJ5dGUpIDB4MjE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19EX1BBWUxPQURfRU5EID0gKGJ5dGUpIDB4N0U7Ci0KLQkvLyBFVUMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfS0FOQV8xU1QgPSAoYnl0ZSkgMHg4ZTsgLy8gMm5kIGExLWRmCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfSE9KT18xU1QgPSAoYnl0ZSkgMHg4ZjsgLy8gMmJ5dGUgcGF5bG9hZAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFX0tJU1lVXzFTVCA9IChieXRlKSAweGEwOyAvLyAybmQsIDNyZCBwYXlsb2FkPwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFX0tBTkpJX0JFR0lOID0gKGJ5dGUpIDB4YTE7IC8vIDJuZCwzcmQgcGF5bG9hZAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFX0tBTkpJX0VORCA9IChieXRlKSAweGZlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFX0tBTkFfQkVHSU4gPSAoYnl0ZSkgMHhhMTsgLy8ga2FuYSBwYXlsb2FkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfS0FOQV9FTkQgPSAoYnl0ZSkgMHhkZjsgLy8ga2FuYSBwYXlsb2FkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfUEFZTE9BRF9CRUdJTiA9IChieXRlKSAweGEwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFX1BBWUxPQURfRU5EID0gKGJ5dGUpIDB4ZmY7Ci0KLQkvLyBTSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTMXN0MWJlZ2luID0gKGJ5dGUpIDB4ODE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFMxc3QxZW5kID0gKGJ5dGUpIDB4OWY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFMxc3QyYmVnaW4gPSAoYnl0ZSkgMHhlMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUzFzdDJlbmQgPSAoYnl0ZSkgMHhlZjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUzJuZDFiZWdpbiA9IChieXRlKSAweDQwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTMm5kMWVuZCA9IChieXRlKSAweDdlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTMm5kMmJlZ2luID0gKGJ5dGUpIDB4ODA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFMybmQyZW5kID0gKGJ5dGUpIDB4ZmM7Ci0KLQkvLyBTSklTIGthbmEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNrYW5hYmVnaW4gPSAoYnl0ZSkgMHhhMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU2thbmFlbmQgPSAoYnl0ZSkgMHhkZjsKLQotCS8vIFVURi04Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBBU0NJSV9CRUdJTiA9IChieXRlKSAweDAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBBU0NJSV9FTkQgPSAoYnl0ZSkgMHg3RjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVV8yQllURV9CRUdJTiA9IChieXRlKSAweGMwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBVXzJCWVRFX0VORCA9IChieXRlKSAweGRmOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBVXzNCWVRFX0JFR0lOID0gKGJ5dGUpIDB4ZTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFVfM0JZVEVfRU5EID0gKGJ5dGUpIDB4ZWY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFVfNEJZVEVfQkVHSU4gPSAoYnl0ZSkgMHhmMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVV80QllURV9FTkQgPSAoYnl0ZSkgMHhmNzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVV9QQVlMT0FEX0JFR0lOID0gKGJ5dGUpIDB4ODA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFVfUEFZTE9BRF9FTkQgPSAoYnl0ZSkgMHhiZjsKLQotCS8vIElTTy04ODU5LTEgKExhdGluMSkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIExBVElOX0JFR0lOID0gKGJ5dGUpIDB4YTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIExBVElOX0VORCA9IChieXRlKSAweGZmOwotCi0JcHJpdmF0ZSBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbODE5Ml07Ci0KLQlwcml2YXRlIGludCBsZW5ndGg7Ci0KLQlwcml2YXRlIGludCBlcnJvckpJUzsKLQotCXByaXZhdGUgaW50IGVycm9yVVRGODsKLQotCXByaXZhdGUgaW50IGVycm9yTEFUSU4xOwotCi0JcHJpdmF0ZSBpbnQgZXJyb3JTSklTOwotCi0JcHJpdmF0ZSBpbnQgZXJyb3JFVUM7Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIGlzOwotCi0JcHJpdmF0ZSBWZWN0b3I8SW50ZWdlcj4gZXVjUmVtb3ZlViA9IG5ldyBWZWN0b3I8SW50ZWdlcj4oKTsKLQotCXB1YmxpYyBKYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IoSW5wdXRTdHJlYW0gaXMpIHsKLQkJdGhpcy5pcyA9IGlzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGludCByZXQpIHsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSBKX1VURjg6Ci0JCQlyZXR1cm4gKFVURl84KTsKLQkJY2FzZSBKX0pJUzoKLQkJCXJldHVybiAoSklTKTsKLQkJY2FzZSBKX0VVQzoKLQkJCXJldHVybiAoRVVDKTsKLQkJY2FzZSBMQVRJTjE6Ci0JCQlyZXR1cm4gKElTT184ODU5XzEpOwotCQljYXNlIEpfU0pJUzoKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAoU0pJUyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7Ci0JCXJldHVybiAobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZiwgMCwgbGVuZ3RoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQnVmKCkgewotCQlieXRlIGJ5dGVidWZbXSA9IG5ldyBieXRlW2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBieXRlYnVmLCAwLCBsZW5ndGgpOwotCQlyZXR1cm4gKGJ5dGVidWYpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVLaXN5dUl6b25FVUMoKSB7Ci0JCWZvciAoaW50IGkgPSBldWNSZW1vdmVWLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlieXRlIGJ5dGVidWZbXSA9IG5ldyBieXRlW2xlbmd0aCAtIDJdOwotCQkJaW50IGluZGV4ID0gKChJbnRlZ2VyKSBldWNSZW1vdmVWLmdldChpKSkuaW50VmFsdWUoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBieXRlYnVmLCAwLCBpbmRleCk7Ci0JCQlTeXN0ZW0KLQkJCQkJLmFycmF5Y29weShidWYsIGluZGV4ICsgMiwgYnl0ZWJ1ZiwgaW5kZXgsIGxlbmd0aCAtIGluZGV4Ci0JCQkJCQkJLSAyKTsKLQkJCWJ1ZiA9IGJ5dGVidWY7Ci0JCQkvLyBsZW5ndGggPSBpbmRleDsKLQkJCWxlbmd0aCA9IGxlbmd0aCAtIDI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKSVMoYnl0ZVtdIHRhcmdldCwgaW50IGxlbmd0aCkgewotCQlpbnQgaW5kZXggPSAwOwotCQlieXRlIGI7Ci0KLQkJYm9vbGVhbiBpblNpbmdsZSA9IHRydWU7Ci0JCWJvb2xlYW4gaW5LYW5hID0gZmFsc2U7Ci0JCWJvb2xlYW4gaW5LYW5qaSA9IGZhbHNlOwotCQlib29sZWFuIGhhc0VzY2FwZSA9IGZhbHNlOwotCi0JCWZvciAoYiA9IGJ1ZltpbmRleF07IGluZGV4IDwgbGVuZ3RoOyBiID0gYnVmW2luZGV4XSkgewotCQkJaWYgKGIgPT0gSklTX0VTQ0FQRSAmJiBpbmRleCArIDIgPCBsZW5ndGgpIHsKLQkJCQlieXRlIGMgPSBidWZbaW5kZXggKyAxXTsKLQkJCQlieXRlIGQgPSBidWZbaW5kZXggKyAyXTsKLQkJCQlpZiAoYyA9PSBKSVNfU0lOR0xFKSB7Ci0JCQkJCXN3aXRjaCAoZCkgewotCQkJCQljYXNlIEpJU19COgotCQkJCQljYXNlIEpJU19KOgotCQkJCQkJaW5TaW5nbGUgPSB0cnVlOwotCQkJCQkJaW5LYW5hID0gZmFsc2U7Ci0JCQkJCQlpbkthbmppID0gZmFsc2U7Ci0JCQkJCQlpbmRleCArPSAzOwotCQkJCQkJaGFzRXNjYXBlID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEpJU19JOgotCQkJCQkJaW5LYW5hID0gdHJ1ZTsKLQkJCQkJCWluU2luZ2xlID0gZmFsc2U7Ci0JCQkJCQlpbkthbmppID0gZmFsc2U7Ci0JCQkJCQlpbmRleCArPSAzOwotCQkJCQkJaGFzRXNjYXBlID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJZXJyb3JKSVMrKzsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGMgPT0gSklTX0RPVUJMRSkgewotCQkJCQlzd2l0Y2ggKGQpIHsKLQkJCQkJY2FzZSBKSVNfQVQ6Ci0JCQkJCWNhc2UgSklTX0I6Ci0JCQkJCWNhc2UgSklTX0Q6Ci0JCQkJCQlpbkthbmppID0gdHJ1ZTsKLQkJCQkJCWluU2luZ2xlID0gZmFsc2U7Ci0JCQkJCQlpbkthbmEgPSBmYWxzZTsKLQkJCQkJCWluZGV4ICs9IDM7Ci0JCQkJCQloYXNFc2NhcGUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQllcnJvckpJUysrOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9ySklTKys7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaW5LYW5qaSAmJiBpbmRleCArIDEgPCBsZW5ndGggJiYgaXNQYXlsb2FkSklTa2FuamkoYikKLQkJCQkJCSYmIGlzUGF5bG9hZEpJU2thbmppKGJ1ZltpbmRleCArIDFdKSkgewotCQkJCQlpbmRleCArPSAyOwotCQkJCX0gZWxzZSBpZiAoaW5TaW5nbGUgJiYgaXNBU0NJSShiKSkgewotCQkJCQlpbmRleCsrOwotCQkJCX0gZWxzZSBpZiAoaW5LYW5hICYmIGlzUGF5bG9hZEpJU2thbmEoYikpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9IGVsc2UgewotCQkJCQllcnJvckpJUysrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSklTIDogIitlcnJvckpJUysiICIraGFzRXNjYXBlKTsKLQotCQlyZXR1cm4gKGVycm9ySklTID09IDAgJiYgaGFzRXNjYXBlKTsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVVRGOChieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWJ5dGUgYjsKLQkJZm9yIChiID0gYnVmW2luZGV4XTsgaW5kZXggPCBsZW5ndGg7IGIgPSBidWZbaW5kZXhdKSB7Ci0JCQlpZiAoaXNBU0NJSShiKSkgewotCQkJCWluZGV4Kys7Ci0JCQl9IGVsc2UgaWYgKGlzMmJ5dGVVVEY4KGIpICYmIGluZGV4ICsgMSA8IGxlbmd0aCkgewotCQkJCWlmIChpc1BheWxvYWRVVEY4KGJ1ZltpbmRleCArIDFdKSkgewotCQkJCQlpbmRleCArPSAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9yVVRGOCsrOwotCQkJCQlpbmRleCsrOwotCQkJCQkvLyByZXR1cm4gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzM2J5dGVVVEY4KGIpICYmIGluZGV4ICsgMiA8IGxlbmd0aCkgewotCQkJCWlmIChpc1BheWxvYWRVVEY4KGJ1ZltpbmRleCArIDFdKQotCQkJCQkJJiYgaXNQYXlsb2FkVVRGOChidWZbaW5kZXggKyAyXSkpIHsKLQkJCQkJaW5kZXggKz0gMzsKLQkJCQl9IGVsc2UgewotCQkJCQllcnJvclVURjgrKzsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJLy8gcmV0dXJuIChmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpczRieXRlVVRGOChiKSAmJiBpbmRleCArIDMgPCBsZW5ndGgpIHsKLQkJCQlpZiAoaXNQYXlsb2FkVVRGOChidWZbaW5kZXggKyAxXSkKLQkJCQkJCSYmIGlzUGF5bG9hZFVURjgoYnVmW2luZGV4ICsgMl0pCi0JCQkJCQkmJiBpc1BheWxvYWRVVEY4KGJ1ZltpbmRleCArIDNdKSkgewotCQkJCQlpbmRleCArPSA0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9yVVRGOCsrOwotCQkJCQlpbmRleCsrOwotCQkJCQkvLyByZXR1cm4gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yVVRGOCsrOwotCQkJCWluZGV4Kys7Ci0JCQkJLy8gcmV0dXJuIChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGVycm9yVVRGOCA9PSAwKTsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTEFUSU4xKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJYnl0ZSBiOwotCQlmb3IgKGIgPSBidWZbaW5kZXhdOyBpbmRleCA8IGxlbmd0aDsgYiA9IGJ1ZltpbmRleF0pIHsKLQkJCWlmIChpc0FTQ0lJKGIpIHx8IGlzTEFUSU4xKGIpKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQllcnJvckxBVElOMSsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChlcnJvckxBVElOMSA9PSAwKTsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU0pJUyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0KLQkJYnl0ZSBiOwotCQlmb3IgKGIgPSBidWZbaW5kZXhdOyBpbmRleCA8IGxlbmd0aDsgYiA9IGJ1ZltpbmRleF0pIHsKLQkJCWlmIChpc0FTQ0lJKGIpIHx8IGlzU0pJU2thbmEoYikpIHsKLQkJCQlpbmRleCsrOwotCQkJfSBlbHNlIGlmIChpc1NKSVMxc3QoYikgJiYgaW5kZXggKyAxIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGlzU0pJUzJuZChidWZbaW5kZXggKyAxXSkpIHsKLQkJCQkJaW5kZXggKz0gMjsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCQllcnJvclNKSVMrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQkJZXJyb3JTSklTKys7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGVycm9yU0pJUyA9PSAwKTsKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VVQyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0KLQkJYnl0ZSBiOwotCQlmb3IgKGIgPSBidWZbaW5kZXhdOyBpbmRleCA8IGxlbmd0aDsgYiA9IGJ1ZltpbmRleF0pIHsKLQkJCWlmIChpc0FTQ0lJKGIpKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0gZWxzZSBpZiAoaXNFVUNrYW5qaShiKSAmJiBpbmRleCArIDEgPCBsZW5ndGgpIHsKLQkJCQlpZiAoaXNQYXlsb2FkRVVDKGJ1ZltpbmRleCArIDFdKSkgewotCQkJCQlpbmRleCArPSAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhIik7Ci0JCQkJCWVycm9yRVVDKys7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpc0VVQ2thbmEoYikgJiYgaW5kZXggKyAxIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGlzS2FuYVBheWxvYWRFVUMoYnVmW2luZGV4ICsgMV0pKSB7Ci0JCQkJCWluZGV4ICs9IDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJiIik7Ci0JCQkJCWVycm9yRVVDKys7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpc0VVQ2hvam8oYikgJiYgaW5kZXggKyAyIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGlzUGF5bG9hZEVVQyhidWZbaW5kZXggKyAxXSkKLQkJCQkJCSYmIGlzUGF5bG9hZEVVQyhidWZbaW5kZXggKyAyXSkpIHsKLQkJCQkJaW5kZXggKz0gMzsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImMiKTsKLQkJCQkJZXJyb3JFVUMrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzRVVDS2lzeXUoYikgJiYgaW5kZXggKyAxIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGlzUGF5bG9hZEVVQyhidWZbaW5kZXggKyAxXSkpIHsKLQkJCQkJZXVjUmVtb3ZlVi5hZGQobmV3IEludGVnZXIoaW5kZXgpKTsKLQkJCQkJaW5kZXggKz0gMjsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImQiKTsKLQkJCQkJZXJyb3JFVUMrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJlOiIrYisiICIrYnVmW2luZGV4XSk7Ci0JCQkJZXJyb3JFVUMrKzsKLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvckVVQyk7Ci0KLQkJcmV0dXJuIChlcnJvckVVQyA9PSAwKTsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGV0ZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbGVuZ3RoID0gMDsKLQkJZXJyb3JKSVMgPSAwOwotCQllcnJvclVURjggPSAwOwotCQllcnJvckxBVElOMSA9IDA7Ci0JCWVycm9yU0pJUyA9IDA7Ci0JCWVycm9yRVVDID0gMDsKLQotCQlmb3IgKGludCBsZW4gPSBpcy5yZWFkKGJ1ZiwgbGVuZ3RoLCBidWYubGVuZ3RoIC0gbGVuZ3RoKTsgbGVuID4gMDspIHsKLQkJCWxlbmd0aCArPSBsZW47Ci0JCQlpZiAobGVuZ3RoID09IGJ1Zi5sZW5ndGgpIHsKLQkJCQlieXRlIG5ld0J1ZltdID0gbmV3IGJ5dGVbbGVuZ3RoICsgODE5Ml07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShidWYsIDAsIG5ld0J1ZiwgMCwgbGVuZ3RoKTsKLQkJCQlidWYgPSBuZXdCdWY7Ci0JCQl9Ci0JCQlsZW4gPSBpcy5yZWFkKGJ1ZiwgbGVuZ3RoLCBidWYubGVuZ3RoIC0gbGVuZ3RoKTsKLQkJfQotCQkvLyBieXRlIGMsIGQsIGU7Ci0JCWludCByZXQgPSBKX1NKSVM7Ci0KLQkJLy8gQ2hlY2sgS2FuamkgQ2hhcmFjdGVyIHNldCBTSklTL0pJUy9FVUMKLQkJLy8gYm9vbGVhbiBpc0ppcyA9IGZhbHNlOwotCQlpbnQgblNKaXNFcnJvciA9IDA7Ci0JCWludCBuRXVjRXJyb3IgPSAwOwotCi0JCS8vIGludCBuU0ppcyA9IDA7Ci0JCS8vIGludCBuRXVjID0gMDsKLQkJLy8gaW50IGNvdW50ID0gMDsKLQkJLy8KLQkJLy8gaW50IGluZGV4ID0gMDsKLQkJLy8gaW50IHRtcF9sZW5ndGggPSBsZW5ndGggLSAyOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dG9EZXRlY3Q6ICIrbGVuZ3RoKTsKLQotCQkvLyBUT0RPCi0JCS8vIGZvciAoYyA9IGJ1ZltpbmRleCsrXTsgaW5kZXggPCB0bXBfbGVuZ3RoOyBjID0gYnVmW2luZGV4KytdKSB7Ci0JCS8vCi0JCS8vIGlmICgoYyA9PSBKSVNfRVNDQVBFKQotCQkvLyAmJiAoKGQgPSBidWZbaW5kZXhdKSA9PSBKSVNfRE9VQkxFKQotCQkvLyAmJiAoKGUgPSBidWZbaW5kZXggKyAxXSkgPT0gSklTX0IpKSB7Ci0JCS8vIGlzSmlzID0gdHJ1ZTsKLQkJLy8gcmV0ID0gSl9KSVM7Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlpZiAoaXNKSVMoYnVmLCBsZW5ndGgpKSB7Ci0JCQlyZXQgPSBKX0pJUzsKLQkJCXJldHVybiAodG9TdHJpbmcocmV0KSk7Ci0JCX0KLQotCQlpZiAoaXNVVEY4KGJ1ZiwgbGVuZ3RoKSkgewotCQkJcmV0ID0gSl9VVEY4OwotCQkJcmV0dXJuICh0b1N0cmluZyhyZXQpKTsKLQkJfQotCi0JCWlmIChpc1NKSVMoYnVmLCBsZW5ndGgpKSB7Ci0JCQlyZXQgPSBKX1NKSVM7Ci0JCQlyZXR1cm4gKHRvU3RyaW5nKHJldCkpOwotCQl9IGVsc2UgaWYgKGlzRVVDKGJ1ZiwgbGVuZ3RoKSkgewotCQkJcmV0ID0gSl9FVUM7Ci0KLQkJCXJlbW92ZUtpc3l1SXpvbkVVQygpOwotCi0JCQlyZXR1cm4gKHRvU3RyaW5nKHJldCkpOwotCQl9IGVsc2UgaWYgKGlzTEFUSU4xKGJ1ZiwgbGVuZ3RoKSkgewotCQkJcmV0ID0gTEFUSU4xOwotCQkJcmV0dXJuICh0b1N0cmluZyhyZXQpKTsKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiU0pJUzogIiArIGVycm9yU0pJUyArICIoIiArIG5TSmlzRXJyb3IgKyAiKSBFVUM6ICIKLQkJCQkrIGVycm9yRVVDICsgIigiICsgbkV1Y0Vycm9yICsgIikgVVRGLTg6ICIgKyBlcnJvclVURjgKLQkJCQkrICIgTEFUSU4xOiAiICsgZXJyb3JMQVRJTjEgKyAiIEpJUzogIiArIGVycm9ySklTKTsKLQotCQlyZXQgPSBKX1VURjg7Ci0JCWlmIChlcnJvclNKSVMgPCAxMDAgJiYgZXJyb3JTSklTIDwgZXJyb3JFVUMgJiYgZXJyb3JTSklTIDwgZXJyb3JVVEY4Ci0JCQkJJiYgZXJyb3JTSklTIDwgZXJyb3JMQVRJTjEgJiYgZXJyb3JTSklTIDwgZXJyb3JKSVMpIHsKLQkJCXJldCA9IEpfU0pJUzsKLQkJfSBlbHNlIGlmIChlcnJvckVVQyA8IDEwMCAmJiBlcnJvckVVQyA8IGVycm9yU0pJUwotCQkJCSYmIGVycm9yRVVDIDwgZXJyb3JVVEY4ICYmIGVycm9yRVVDIDwgZXJyb3JMQVRJTjEKLQkJCQkmJiBlcnJvckVVQyA8IGVycm9ySklTKSB7Ci0KLQkJCXJlbW92ZUtpc3l1SXpvbkVVQygpOwotCi0JCQlyZXQgPSBKX0VVQzsKLQkJfSBlbHNlIGlmIChlcnJvckxBVElOMSA8IDEwMCAmJiBlcnJvckxBVElOMSA8IGVycm9yU0pJUwotCQkJCSYmIGVycm9yTEFUSU4xIDwgZXJyb3JFVUMgJiYgZXJyb3JMQVRJTjEgPCBlcnJvclVURjgKLQkJCQkmJiBlcnJvckxBVElOMSA8IGVycm9ySklTKSB7Ci0JCQlyZXQgPSBMQVRJTjE7Ci0JCX0gZWxzZSBpZiAoZXJyb3JKSVMgPCAxMDAgJiYgZXJyb3JKSVMgPCBlcnJvclNKSVMKLQkJCQkmJiBlcnJvckpJUyA8IGVycm9yRVVDICYmIGVycm9ySklTIDwgZXJyb3JVVEY4Ci0JCQkJJiYgZXJyb3JKSVMgPCBlcnJvckxBVElOMSkgewotCQkJcmV0ID0gSl9KSVM7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJlc3RpbWF0aW9uOiAiICsgdG9TdHJpbmcocmV0KSk7Ci0JCXJldHVybiAodG9TdHJpbmcocmV0KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF5bG9hZEpJU2thbmppKGJ5dGUgYykgewotCQlyZXR1cm4gKEpJU19EX1BBWUxPQURfQkVHSU4gPD0gYyAmJiBjIDw9IEpJU19EX1BBWUxPQURfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXlsb2FkSklTa2FuYShieXRlIGMpIHsKLQkJcmV0dXJuIChKSVNfS0FOQV9QQVlMT0FEX0JFR0lOIDw9IGMgJiYgYyA8PSBKSVNfS0FOQV9QQVlMT0FEX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRVVDa2FuYShieXRlIGMpIHsKLQkJcmV0dXJuIChjID09IEVfS0FOQV8xU1QpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VVQ2thbmppKGJ5dGUgYykgewotCQlyZXR1cm4gKEVfS0FOSklfQkVHSU4gPD0gYyAmJiBjIDw9IEVfS0FOSklfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFVUNob2pvKGJ5dGUgYykgewotCQlyZXR1cm4gKGMgPT0gRV9IT0pPXzFTVCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRVVDS2lzeXUoYnl0ZSBjKSB7Ci0JCXJldHVybiAoYyA9PSBFX0tJU1lVXzFTVCk7Ci0JfQotCi0vLwlwcml2YXRlIGJvb2xlYW4gaXNFVUMxc3QoYnl0ZSBjKSB7Ci0vLwkJcmV0dXJuIChjID09IEVfS0FOQV8xU1QgfHwgYyA9PSBFX0hPSk9fMVNUIHx8IChFX0tBTkpJX0JFR0lOIDw9IGMgJiYgYyA8PSBFX0tBTkpJX0VORCkpOwotLy8JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF5bG9hZEVVQyhieXRlIGMpIHsKLQkJcmV0dXJuIChFX1BBWUxPQURfQkVHSU4gPD0gYyAmJiBjIDw9IEVfUEFZTE9BRF9FTkQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0thbmFQYXlsb2FkRVVDKGJ5dGUgYykgewotCQlyZXR1cm4gKEVfS0FOQV9CRUdJTiA8PSBjICYmIGMgPD0gRV9LQU5BX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU0pJUzFzdChieXRlIGMpIHsKLQkJcmV0dXJuICgoUzFzdDFiZWdpbiA8PSBjICYmIGMgPD0gUzFzdDFlbmQpIHx8IChTMXN0MmJlZ2luIDw9IGMgJiYgYyA8PSBTMXN0MmVuZCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1NKSVNrYW5hKGJ5dGUgYykgewotCQlyZXR1cm4gKFNrYW5hYmVnaW4gPD0gYyAmJiBjIDw9IFNrYW5hZW5kKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTSklTMm5kKGJ5dGUgYykgewotCQlyZXR1cm4gKChTMm5kMWJlZ2luIDw9IGMgJiYgYyA8PSBTMm5kMWVuZCkgfHwgKFMybmQyYmVnaW4gPD0gYyAmJiBjIDw9IFMybmQyZW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQVNDSUkoYnl0ZSBjKSB7Ci0JCXJldHVybiAoQVNDSUlfQkVHSU4gPD0gYyAmJiBjIDw9IEFTQ0lJX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTEFUSU4xKGJ5dGUgYykgewotCQlyZXR1cm4gKExBVElOX0JFR0lOIDw9IGMgJiYgYyA8PSBMQVRJTl9FTkQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpczJieXRlVVRGOChieXRlIGMpIHsKLQkJcmV0dXJuIChVXzJCWVRFX0JFR0lOIDw9IGMgJiYgYyA8PSBVXzJCWVRFX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzM2J5dGVVVEY4KGJ5dGUgYykgewotCQlyZXR1cm4gKFVfM0JZVEVfQkVHSU4gPD0gYyAmJiBjIDw9IFVfM0JZVEVfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXM0Ynl0ZVVURjgoYnl0ZSBjKSB7Ci0JCXJldHVybiAoVV80QllURV9CRUdJTiA8PSBjICYmIGMgPD0gVV80QllURV9FTkQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BheWxvYWRVVEY4KGJ5dGUgYykgewotCQlyZXR1cm4gKFVfUEFZTE9BRF9CRUdJTiA8PSBjICYmIGMgPD0gVV9QQVlMT0FEX0VORCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCQlTdHJpbmcgdGFyZ2V0ID0gInRtcC9qZWQuaHRtbCI7Ci0KLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0YXJnZXQpOwotCQkJSmFwYW5lc2VFbmNvZGluZ0RldGVjdG9yIEpFRCA9IG5ldyBKYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IoaXMpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKEpFRC5kZXRlY3QoKSk7Ci0JCQkvLyBKRUQuZGV0ZWN0MigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW50ZXJuYWwvdXRpbC9SZXJlYWRhYmxlSW5wdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbnRlcm5hbC91dGlsL1JlcmVhZGFibGVJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGY1YWRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbnRlcm5hbC91dGlsL1JlcmVhZGFibGVJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBSZXJlYWRhYmxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbjsKLQotCXByaXZhdGUgYnl0ZSBidWZbXSA9IG5ldyBieXRlWzEwMDAwXTsKLQotCXByaXZhdGUgaW50IGJ1ZlNpeiA9IDAsIGluZGV4ID0gMDsKLQotCXByaXZhdGUgYm9vbGVhbiBidWZmZXJpbmcgPSB0cnVlLCBub3JtYWwgPSBmYWxzZTsKLQotCXB1YmxpYyBSZXJlYWRhYmxlSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcy5pbiA9IGluOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKG5vcm1hbCkgewotCQkJaW4uY2xvc2UoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZmZlcmluZykgewotCQkJaW50IHJldCA9IGluLnJlYWQoKTsKLQkJCWlmIChidWZTaXogPT0gYnVmLmxlbmd0aCkgewotCQkJCWJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJCW5vcm1hbCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWJ1ZltidWZTaXorK10gPSAoYnl0ZSkgcmV0OwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIGlmIChub3JtYWwpIHsKLQkJCXJldHVybiBpbi5yZWFkKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgcmV0ID0gYnVmW2luZGV4KytdOwotCQkJaWYgKGluZGV4ID09IGJ1ZlNpeikgewotCQkJCW5vcm1hbCA9IHRydWU7Ci0JCQkJYnVmID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiByZWFkKGIsIDAsIGIubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChidWZmZXJpbmcpIHsKLQkJCWludCByZXQgPSBpbi5yZWFkKGIsIG9mZiwgbGVuKTsKLQkJCWlmIChidWZTaXogKyByZXQgPCBidWYubGVuZ3RoKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXQ7IGkrKykKLQkJCQkJYnVmW2J1ZlNpeiArIGldID0gYltvZmYgKyBpXTsKLQkJCQlidWZTaXogKz0gcmV0OwotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXJpbmcgPSBmYWxzZTsKLQkJCQlub3JtYWwgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIGlmIChub3JtYWwpIHsKLQkJCXJldHVybiBpbi5yZWFkKGIsIG9mZiwgbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWludCByZXQ7Ci0JCQlmb3IgKHJldCA9IDA7IHJldCA8IGIubGVuZ3RoICYmIGluZGV4IDwgYnVmU2l6OyByZXQrKywgaW5kZXgrKykgewotCQkJCWJbcmV0XSA9IGJ1ZltpbmRleF07Ci0JCQl9Ci0JCQlpZiAoaW5kZXggPT0gYnVmU2l6KSB7Ci0JCQkJbm9ybWFsID0gdHJ1ZTsKLQkJCQlidWYgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZmZlcmluZyA9PSBmYWxzZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgcmVzZXQgIiArIHRoaXMpOwotCQl9Ci0JCWJ1ZmZlcmluZyA9IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbnRlcm5hbC91dGlsL1Vuc3luY2hyb25pemVkSGFzaHRhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvaW50ZXJuYWwvdXRpbC9VbnN5bmNocm9uaXplZEhhc2h0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjg2NjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9pbnRlcm5hbC91dGlsL1Vuc3luY2hyb25pemVkSGFzaHRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuaW1wbC5Db25zdHJ1Y3RvcjsKLQotcHVibGljIGNsYXNzIFVuc3luY2hyb25pemVkSGFzaHRhYmxlIHsKLQljbGFzcyBFbnRyeSB7Ci0JCVN0cmluZyBrZXk7Ci0KLQkJQ29uc3RydWN0b3IgdmFsOwotCi0JCUVudHJ5IG5leHQ7Ci0JfQotCi0JcHJpdmF0ZSBFbnRyeSB0YWJsZVtdID0gbmV3IEVudHJ5WzI1Nl07Ci0KLQlwcml2YXRlIGludCBoYXNoQ29kZShjaGFyIGtleVtdKSB7Ci0JCWludCByZXQgPSAwOwotCQlmb3IgKGludCBpID0ga2V5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlyZXQgPSAyNSAqIHJldCArIChrZXlbaV0gJiAweDFmKSAtIDE7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ29uc3RydWN0b3IgZ2V0KFN0cmluZyBrZXkpIHsKLQkJY2hhciBzdHJbXSA9IGtleS50b0NoYXJBcnJheSgpOwotCQlmb3IgKEVudHJ5IGVudHJ5ID0gdGFibGVbMHhmZiAmIGhhc2hDb2RlKHN0cildOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJ5Lm5leHQpIHsKLQkJCVN0cmluZyBlbnRyeUtleSA9IGVudHJ5LmtleTsKLQkJCWlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0JCQkJcmV0dXJuIGVudHJ5LnZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBwdXQoU3RyaW5nIGtleSwgQ29uc3RydWN0b3IgdmFsKSB7Ci0JCWNoYXIgc3RyW10gPSBrZXkudG9DaGFyQXJyYXkoKTsKLQkJRW50cnkgZW50cnkgPSBuZXcgRW50cnkoKTsKLQkJZW50cnkua2V5ID0ga2V5OwotCQllbnRyeS52YWwgPSB2YWw7Ci0JCWludCBpbmRleCA9IDB4ZmYgJiBoYXNoQ29kZShzdHIpOwotCQllbnRyeS5uZXh0ID0gdGFibGVbaW5kZXhdOwotCQl0YWJsZVtpbmRleF0gPSBlbnRyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvcHVibGljX2VudGl0aWVzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvcHVibGljX2VudGl0aWVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNmViNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL3B1YmxpY19lbnRpdGllcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBNYXAgb2YgcHVibGljIGVudGl0aWVzIHRvIGl0cyBmaWxlIAotIyBIVE1MNC4wMQotLS8vVzNDLy9EVERASFRNTEA0LjAxQFRyYW5zaXRpb25hbC8vRU49bG9vc2UuZHRkCi0tLy9XM0MvL0RUREBIVE1MQDQuMDFARnJhbWVzZXQvL0VOPWZyYW1lc2V0LmR0ZAotLS8vVzNDLy9EVERASFRNTEA0LjAxLy9FTj1zdHJpY3QuZHRkCi0tLy9XM0MvL0VOVElUSUVTQExhdGluMS8vRU4vL0hUTUw9SFRNTGxhdDEuZW50Ci0tLy9XM0MvL0VOVElUSUVTQFN5bWJvbHMvL0VOLy9IVE1MPUhUTUxzeW1ib2wuZW50Ci0tLy9XM0MvL0VOVElUSUVTQFNwZWNpYWwvL0VOLy9IVE1MPUhUTUxzcGVjaWFsLmVudAotIyBIVE1MNC4wCi0tLy9XM0MvL0RUREBIVE1MQDQuMEBUcmFuc2l0aW9uYWwvL0VOPWxvb3NlNDAwLmR0ZAotLS8vVzNDLy9EVERASFRNTEA0LjBARnJhbWVzZXQvL0VOPWZyYW1lc2V0NDAwLmR0ZAotLS8vVzNDLy9EVERASFRNTEA0LjAvL0VOPXN0cmljdDQwMC5kdGQKLSMgZW50aXRpZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhhdCBvZiA0LjAxCi0KLSMgSFRNTDMuMgotLS8vVzNDLy9EVERASFRNTEAzLjJARmluYWwvL0VOPUhUTUwzMi5kdGQKLS0vL1czQy8vRFREQEhUTUxAMy4yLy9FTj1IVE1MMzIuZHRkCi1JU09AODg3OS0xOTg2Ly9FTlRJVElFU0BBZGRlZEBMYXRpbkAxLy9FTi8vSFRNTD1JU09sYXQxLmVudAotCi0jIEhUTUwyLjAKLS0vL0lFVEYvL0RUREBIVE1MLy9FTj1odG1sLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAMi4wLy9FTj1odG1sLmR0ZAotLS8vSUVURi8vRFREQEhUTUxATGV2ZWxAMi8vRU49aHRtbC5kdGQKLS0vL0lFVEYvL0RUREBIVE1MQDIuMEBMZXZlbEAyLy9FTj1odG1sLmR0ZAotLS8vSUVURi8vRFREQEhUTUxATGV2ZWxAMS8vRU49aHRtbC0xLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAMi4wQExldmVsQDEvL0VOPWh0bWwtMS5kdGQKLS0vL0lFVEYvL0RUREBIVE1MQFN0cmljdC8vRU49aHRtbC1zLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAMi4wQFN0cmljdC8vRU49aHRtbC1zLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAU3RyaWN0QExldmVsQDIvL0VOPWh0bWwtcy5kdGQKLS0vL0lFVEYvL0RUREBIVE1MQDIuMEBTdHJpY3RATGV2ZWxAMi8vRU49aHRtbC1zLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAU3RyaWN0QExldmVsQDEvL0VOPWh0bWwtMXMuZHRkCi0tLy9JRVRGLy9EVERASFRNTEAyLjBAU3RyaWN0QExldmVsQDEvL0VOPWh0bWwtMXMuZHRkCi0jIGZyb20gSFRNTDIuMCwgaXQncyBvdmVybGFwcGVkCi0jIElTTyA4ODc5LTE5ODYvL0VOVElUSUVTIEFkZGVkIExhdGluIDEvL0VOLy9IVE1MPUlTT2xhdDEuc2dtbAotCi0jIENvbXBhY3QgSFRNTAotLS8vVzNDLy9EVERAQ29tcGFjdEBIVE1MQDEuMEBEcmFmdC8vRU49Y29tcGFjdC5kdGQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC91dGlsL0hUTUwyUGxhaW5UZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvdXRpbC9IVE1MMlBsYWluVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGMxZmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC91dGlsL0hUTUwyUGxhaW5UZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5IVE1MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQlJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTERMaXN0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxEaXJlY3RvcnlFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTERpdkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGaWVsZFNldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRm9ybUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MSFJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEhlYWRpbmdFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEltYWdlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxJc0luZGV4RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxMSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MTWVudUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT0xpc3RFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFBhcmFncmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MUHJlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFVMaXN0RWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgSFRNTDJQbGFpblRleHQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gIlxuIjsKLQotCXByaXZhdGUgSFRNTERvY3VtZW50IGh0ZG9jOwotCi0JcHJpdmF0ZSBib29sZWFuIGltYWdlID0gZmFsc2U7Ci0KLQlwdWJsaWMgdm9pZCBpbmNsdWRlSW1hZ2VzKGJvb2xlYW4gYikgewotCQl0aGlzLmltYWdlID0gYjsKLQl9Ci0KLQlwdWJsaWMgSFRNTDJQbGFpblRleHQoSFRNTERvY3VtZW50IGh0ZG9jKSB7Ci0JCXRoaXMuaHRkb2MgPSBodGRvYzsKLQl9Ci0KLQlwcml2YXRlIGludCBzdGFja1tdID0gbmV3IGludFsyNTZdOwotCi0JcHJpdmF0ZSBpbnQgc3AgPSAtMTsKLQotCXByaXZhdGUgdm9pZCBwcmUoSFRNTEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nV3JpdGVyIHdyaXRlcikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxPTGlzdEVsZW1lbnQpIHsKLQkJCXN0YWNrWysrc3BdID0gMTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTFVMaXN0RWxlbWVudCkgewotCQkJc3RhY2tbKytzcF0gPSAwOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MTElFbGVtZW50KSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlID0gbmV3IFN0cmluZ0J1ZmZlcihsaW5lU2VwYXJhdG9yKTsKLQkJCWZvciAoaW50IGkgPSBzcDsgaSA+IDA7IGktLSkKLQkJCQlwcmUuYXBwZW5kKCcgJyk7Ci0JCQl3cml0ZXIud3JpdGUocHJlLnRvU3RyaW5nKCkpOwotCQkJaWYgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgSFRNTE9MaXN0RWxlbWVudCkgewotCQkJCXdyaXRlci53cml0ZShzdGFja1tzcF0gKyAiLiAiKTsKLQkJCQlzdGFja1tzcF0rKzsKLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVyLndyaXRlKCItICIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSFJFbGVtZW50KSB7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcGFyYXRvcgotCQkJCQkrICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotCQkJCQkrIGxpbmVTZXBhcmF0b3IpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IGlzQmxvY2tFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcGFyYXRvcik7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsKLQkJCWlmIChpbWFnZSkgewotCQkJCXdyaXRlci53cml0ZShlbGVtZW50LnRvU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgYWx0ID0gKChIVE1MSW1hZ2VFbGVtZW50KSBlbGVtZW50KS5nZXRBbHQoKTsKLQkJCQlpZiAoYWx0ICE9IG51bGwgJiYgYWx0Lmxlbmd0aCgpID4gMCkgewotCQkJCQl3cml0ZXIud3JpdGUoYWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbG9ja0VsZW1lbnQoSFRNTEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxQYXJhZ3JhcGhFbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxIZWFkaW5nRWxlbWVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVUxpc3RFbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxPTGlzdEVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTERpcmVjdG9yeUVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTE1lbnVFbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxQcmVFbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxETGlzdEVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTERpdkVsZW1lbnQKLQkJCQl8fCBlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJDRU5URVIiKQotCQkJCXx8IGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIk5PU0NSSVBUIikKLQkJCQl8fCBlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJOT0ZSQU1FUyIpCi0JCQkJfHwgZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkxPQ0tRVU9URSIpCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSXNJbmRleEVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTEhSRWxlbWVudAotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGFibGVFbGVtZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxGaWVsZFNldEVsZW1lbnQKLQkJCQl8fCBlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJBRERSRVNTIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvc3QoSFRNTEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nV3JpdGVyIHdyaXRlcikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxVTGlzdEVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTE9MaXN0RWxlbWVudCkgewotCQkJc3AtLTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXBhcmF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIFJlYWRlciBnZXRQbGFpblRleHRSZWFkZXIoKSB7Ci0JCU5vZGUgdG1wMSwgdG1wMjsKLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdG1wMSA9IGh0ZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlvdXRlcjogd2hpbGUgKHRtcDEgIT0gbnVsbCAmJiB0bXAxICE9IGh0ZG9jKSB7Ci0JCQlpZiAodG1wMSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7Ci0JCQkJcHJlKChIVE1MRWxlbWVudCkgdG1wMSwgd3JpdGVyKTsKLQkJCX0KLQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRtcDEuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkvLyB3cml0ZXIud3JpdGUodG1wMS5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCXdyaXRlci53cml0ZSh0bXAxLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlpZiAodG1wMSAhPSBodGRvYykgewotCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrIG91dGVyOwotCQkJCX0KLQkJCQkvLyBwb3N0IHRtcDEKLQkJCQlpZiAodG1wMiAhPSBudWxsICYmIHRtcDEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgewotCQkJCQlwb3N0KChIVE1MRWxlbWVudCkgdG1wMSwgd3JpdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAodG1wMiA9PSBudWxsICYmIHRtcDEgIT0gbnVsbCkgewotCQkJCXRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQkvLyBwb3N0IHRtcDEKLQkJCQlpZiAodG1wMiAhPSBudWxsICYmIHRtcDEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgewotCQkJCQlwb3N0KChIVE1MRWxlbWVudCkgdG1wMSwgd3JpdGVyKTsKLQkJCQl9Ci0JCQkJdG1wMSA9IHRtcDI7Ci0JCQkJaWYgKHRtcDEgIT0gaHRkb2MpIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJLy8gcG9zdCB0bXAxCi0JCQkJCWlmICh0bXAyICE9IG51bGwgJiYgdG1wMSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7Ci0JCQkJCQlwb3N0KChIVE1MRWxlbWVudCkgdG1wMSwgd3JpdGVyKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrIG91dGVyOwotCQkJCX0KLQkJCX0KLQkJCXRtcDEgPSB0bXAyOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nUmVhZGVyKHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSFRNTFBhcnNlciBwYXJzZXI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJcGFyc2VyID0gbmV3IEhUTUxQYXJzZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGFyc2VyLnBhcnNlU3dpdGNoRW5jKG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1tpXSkpOwotCQkJfSBjYXRjaCAob3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUhUTUwyUGxhaW5UZXh0IGgydCA9IG5ldyBIVE1MMlBsYWluVGV4dCgoSFRNTERvY3VtZW50KSBwYXJzZXIKLQkJCQkJLmdldERvY3VtZW50KCkpOwotCQkJUmVhZGVyIHJlYWRlciA9IGgydC5nZXRQbGFpblRleHRSZWFkZXIoKTsKLQkJCWlmIChyZWFkZXIgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTnVsbCBUZXh0Iik7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCQkJZm9yIChTdHJpbmcgc3RyID0gYnIucmVhZExpbmUoKTsgc3RyICE9IG51bGw7IHN0ciA9IGJyLnJlYWRMaW5lKCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC91dGlsL0h0bWxQYXJzZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvdXRpbC9IdG1sUGFyc2VyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODEwOWU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC91dGlsL0h0bWxQYXJzZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLkhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbXBsLlNIRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5pbnRlcm5hbC51dGlsLkphcGFuZXNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLklFcnJvckxvZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgSHRtbFBhcnNlclV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiTVM5MzIiOwotCi0gICAgQXJyYXlMaXN0PElFcnJvckxvZ0xpc3RlbmVyPiBlcnJvckxvZ0xpc250ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJRXJyb3JMb2dMaXN0ZW5lcj4oKTsKLQotICAgIFNIRG9jdW1lbnQgZG9jOwotCi0gICAgU3RyaW5nIGVuY29kaW5nOwotCi0gICAgSFRNTFBhcnNlciBwMTsKLQotICAgIHB1YmxpYyBIdG1sUGFyc2VyVXRpbCgpIHsKLSAgICAgICAgZG9jID0gbnVsbDsKLSAgICAgICAgZW5jb2RpbmcgPSBERUZBVUxUX0VOQ09ESU5HOwotICAgIH0KLQotICAgIHByaXZhdGUgSFRNTFBhcnNlciBzZXR1cEhUTUxQYXJzZXIoKSB7Ci0gICAgICAgIEhUTUxQYXJzZXIgcDEgPSBuZXcgSFRNTFBhcnNlcigpOwotICAgICAgICBwMS5zZXRUYWdDYXNlKFNHTUxQYXJzZXIuTE9XRVJfQ0FTRSk7Ci0gICAgICAgIHAxLnNldEF0dHJOYW1lQ2FzZShTR01MUGFyc2VyLkxPV0VSX0NBU0UpOwotICAgICAgICBwMS5zZXREZWZhdWx0VGFnQ2FzZShTR01MUGFyc2VyLkxPV0VSX0NBU0UpOwotICAgICAgICBwMS5rZWVwVW5rbm93bkVsZW1lbnRzKHRydWUpOwotCi0KLSAgICAgICAgLy8gRXJyb3JIYW5kbGVyW10gZWhzID0gcDEuZ2V0RXJyb3JIYW5kbGVycygpOwotICAgICAgICAvLwotICAgICAgICAvLyBmb3IoaW50IGk9MDtpPGVocy5sZW5ndGg7aSsrKXsKLSAgICAgICAgLy8gRXJyb3JIYW5kbGVyIGVoID0gZWhzW2ldOwotICAgICAgICAvLyAvL2lmKGVoIGluc3RhbmNlb2YgRGVmYXVsdEVycm9ySGFuZGxlcil7Ci0gICAgICAgIC8vIHAxLnJlbW92ZUVycm9ySGFuZGxlcihlaCk7Ci0gICAgICAgIC8vIC8vfQotICAgICAgICAvLyB9Ci0gICAgICAgIC8vIGVocyA9IHAxLmdldEVycm9ySGFuZGxlcnMoKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gZm9yKGludCBpPTA7aTxlaHMubGVuZ3RoO2krKyl7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlaHNbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgIC8vIH0KLQotICAgICAgICBwMS5lbGVtZW50SGFuZGxlKGZhbHNlKTsgLy8gdG8gZ2V0IGxpbmUgbnVtYmVyCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVycm9yTG9nTGlzbnRlckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwMS5hZGRFcnJvckxvZ0xpc3RlbmVyKChJRXJyb3JMb2dMaXN0ZW5lcikgaS5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHAxLmtlZXBVbmtub3duRWxlbWVudHModHJ1ZSk7Ci0gICAgICAgIHJldHVybiAocDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yTG9nTGlzdGVuZXIoSUVycm9yTG9nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9yTG9nTGlzbnRlckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlV2l0aG91dEVuY29kaW5nKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcGFyc2UKLSAgICAgICAgcDEgPSBzZXR1cEhUTUxQYXJzZXIoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcDEucGFyc2VTd2l0Y2hFbmMoaXMsICJJU08tODg1OS0xIik7Ci0gICAgICAgICAgICBkb2MgPSAoU0hEb2N1bWVudCkgcDEuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGVuY29kaW5nID0gcDEuZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlbmNvZGluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBkb2MgPSBudWxsOwotICAgICAgICAgICAgZW5jb2RpbmcgPSBERUZBVUxUX0VOQ09ESU5HOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGVuY29kaW5nID0gREVGQVVMVF9FTkNPRElORzsKLSAgICAgICAgZG9jID0gbnVsbDsKLQotICAgICAgICBKYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IgSkVEID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBKRUQgPSBuZXcgSmFwYW5lc2VFbmNvZGluZ0RldGVjdG9yKGlzKTsKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9IEpFRC5kZXRlY3QoKTsKLSAgICAgICAgICAgICAgICAvLyBKRUQuZGV0ZWN0MigpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgLy8gZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKGUyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJEZXRlY3QgRW5jb2Rpbmc6ICIrZW5jb2RpbmcpOwotCi0gICAgICAgICAgICAvLyBwYXJzZQotICAgICAgICAgICAgcDEgPSBzZXR1cEhUTUxQYXJzZXIoKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwMS5wYXJzZShKRUQuZ2V0SW5wdXRTdHJlYW0oKSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJIUFU6IENhbid0IHBhcnNlIGFzICIgKyBlbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgcDEgPSBzZXR1cEhUTUxQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwMS5wYXJzZShKRUQuZ2V0SW5wdXRTdHJlYW0oKSwgIk1TOTMyIik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSFBVOiBDYW4ndCBwYXJzZSBhcyBNUzkzMiIpOwotICAgICAgICAgICAgICAgICAgICBwMSA9IHNldHVwSFRNTFBhcnNlcigpOwotICAgICAgICAgICAgICAgICAgICBwMS5wYXJzZVN3aXRjaEVuYyhKRUQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb2MgPSAoU0hEb2N1bWVudCkgcDEuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGVuY29kaW5nID0gcDEuZ2V0RW5jb2RpbmcoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2xvc2UgaXMiKTsKLSAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFNIRG9jdW1lbnQgZ2V0U0hEb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlSHRtbERvY3VtZW50QXNVVEY4KFNIRG9jdW1lbnQgcmVzdWx0LCBTdHJpbmcgdG1wRmlsZSwgU3RyaW5nIHRhcmdldEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIHNhdmVIdG1sRG9jdW1lbnRBc1VURjgocmVzdWx0LCBuZXcgRmlsZSh0bXBGaWxlKSwgbmV3IEZpbGUodGFyZ2V0RmlsZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlSHRtbERvY3VtZW50QXNVVEY4KFNIRG9jdW1lbnQgcmVzdWx0LCBGaWxlIHRtcEZpbGUsIEZpbGUgdGFyZ2V0RmlsZSkgewotICAgICAgICBTdHJpbmcgdG1wRW5jb2RpbmcgPSAiVVRGOCI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCB0bXBFbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG9zdyk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5wcmludEFzU0dNTChwdywgdHJ1ZSk7Ci0gICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBGaWxlKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHRtcEJSID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsIHRtcEVuY29kaW5nKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgICAgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsIHRtcEVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHcgPSBuZXcgUHJpbnRXcml0ZXIob3N3KTsKLSAgICAgICAgICAgIFN0cmluZyB0bXBTOwotICAgICAgICAgICAgd2hpbGUgKCh0bXBTID0gdG1wQlIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGZvciBNU04KLSAgICAgICAgICAgICAgICB0bXBTID0gdG1wUy5yZXBsYWNlQWxsKCImIzMyOyIsICIgIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGRlZCBvbiAyMDA0LzAzLzAzIGZvciBNU04KLSAgICAgICAgICAgICAgICB0bXBTID0gdG1wUy5yZXBsYWNlQWxsKCImI3gyMDsiLCAiICIpOwotCi0gICAgICAgICAgICAgICAgLy8gZm9yIGFtYXpvbgotICAgICAgICAgICAgICAgIHRtcFMgPSB0bXBTLnJlcGxhY2VBbGwoIiYjMDM5OyIsICInIikucmVwbGFjZUFsbCgiJiMzOTsiLCAiJyIpOwotCi0gICAgICAgICAgICAgICAgLy8gZm9yIGphdmEgc2NyaXB0Ci0gICAgICAgICAgICAgICAgdG1wUyA9IHRtcFMucmVwbGFjZUFsbCgiJiMwMDkxOyIsICJbIikucmVwbGFjZUFsbCgiJiMwMDkzOyIsICJdIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBmb3IgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICB0bXBTID0gdG1wUy5yZXBsYWNlQWxsKCImYW1wO2x0OyIsICImbHQ7IikucmVwbGFjZUFsbCgiJmFtcDtndDsiLCAiJmd0OyIpOwotCi0gICAgICAgICAgICAgICAgcHcucHJpbnRsbih0bXBTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICAgICAgLy8gT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLAotICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihmb3MpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wcmludEFzU0dNTChwdywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZm9zLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotICAgICAgICBIdG1sUGFyc2VyVXRpbCBocHUgPSBuZXcgSHRtbFBhcnNlclV0aWwoKTsKLSAgICAgICAgaHB1LmFkZEVycm9yTG9nTGlzdGVuZXIobmV3IElFcnJvckxvZ0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3JMb2coaW50IGVycm9yQ29kZSwgU3RyaW5nIG1zZykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvckNvZGUgKyAiOiAiICsgbXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gInNhbXBsZS1tYXAuaHRtbCI7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gYXJnc1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBocHUucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSkpOwotICAgICAgICAgICAgc2F2ZUh0bWxEb2N1bWVudEFzVVRGOChocHUuZ2V0U0hEb2N1bWVudCgpLCBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAiaHRtbCIsIG5ldyBGaWxlKCJ0bXAiKSksIG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICAidG1wLmh0bWwiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC91dGlsL0h0bWxVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvdXRpbC9IdG1sVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDVjNzU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC91dGlsL0h0bWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwudXRpbC5TZ21sVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci0KLQotcHVibGljIGNsYXNzIEh0bWxVdGlsIHsKLQlwdWJsaWMgc3RhdGljIE5vZGUgY29tbW9uQW5jZXN0ZXIoSFRNTENvbGxlY3Rpb24gYW5jZXN0ZXJzKSB7Ci0JCXN3aXRjaCAoYW5jZXN0ZXJzLmdldExlbmd0aCgpKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiBudWxsOwotCQljYXNlIDE6Ci0JCQlyZXR1cm4gYW5jZXN0ZXJzLml0ZW0oMCkuZ2V0UGFyZW50Tm9kZSgpOwotCQlkZWZhdWx0OgotCQkJTm9kZSByZXQgPSBTZ21sVXRpbAotCQkJCQkuY29tbW9uQW5jZXN0ZXIoYW5jZXN0ZXJzLml0ZW0oMCksIGFuY2VzdGVycy5pdGVtKDEpKTsKLQkJCWZvciAoaW50IGkgPSAyOyBpIDwgYW5jZXN0ZXJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIHRtcCA9IFNnbWxVdGlsLmNvbW1vbkFuY2VzdGVyKGFuY2VzdGVycy5pdGVtKGkgLSAxKSwgYW5jZXN0ZXJzCi0JCQkJCQkuaXRlbShpKSk7Ci0JCQkJaWYgKHJldCAhPSB0bXApIHsKLQkJCQkJcmV0ID0gU2dtbFV0aWwuY29tbW9uQW5jZXN0ZXIocmV0LCB0bXApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0F0dHJpYnV0ZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0MDYzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBBdHRyaWJ1dGUgZGVmaW5pdGlvbgotICogCi0gKiBAc2VlIEVsZW1lbnREZWZpbml0aW9uI2dldEF0dHJpYnV0ZURlZihqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRGVmaW5pdGlvbiB7Ci0JLy8gRGVjbGFyZWRWYWx1ZVR5cGUKLQlzdGF0aWMgZmluYWwgaW50IENEQVRBID0gMTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgSUQgPSAyOwotCi0Jc3RhdGljIGZpbmFsIGludCBJRFJFRiA9IDM7Ci0KLQlzdGF0aWMgZmluYWwgaW50IElEUkVGUyA9IDQ7Ci0KLQlzdGF0aWMgZmluYWwgaW50IE5VTUJFUiA9IDU7Ci0KLQlzdGF0aWMgZmluYWwgaW50IE5BTUUgPSA2OwotCi0Jc3RhdGljIGZpbmFsIGludCBOQU1FX1RPS0VOX0dST1VQID0gNzsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTk1UT0tFTiA9IDg7Ci0KLQlzdGF0aWMgZmluYWwgaW50IE5BTUVTID0gOTsKLQotCS8vIERlZmF1bHRWYWx1ZVR5cGUKLQlzdGF0aWMgZmluYWwgaW50IEZJWEVEID0gMTsKLQotCXN0YXRpYyBmaW5hbCBpbnQgUkVRVUlSRUQgPSAyOwotCi0Jc3RhdGljIGZpbmFsIGludCBJTVBMSUVEID0gMzsKLQotCXByaXZhdGUgaW50IGRlY2xhcmVkVHlwZSA9IDA7Ci0KLQlwcml2YXRlIGludCBkZWZhdWx0VHlwZSA9IDA7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gbmFtZVRva2VuczsKLQotCUF0dHJpYnV0ZURlZmluaXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQl2b2lkIGFkZE5hbWVUb2tlbihTdHJpbmcgdG9rZW4pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWNsYXJlZFR5cGUgIT0gTkFNRV9UT0tFTl9HUk9VUCkKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigpOwotCQlpZiAobmFtZVRva2VucyA9PSBudWxsKQotCQkJbmFtZVRva2VucyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQluYW1lVG9rZW5zLmFkZEVsZW1lbnQodG9rZW4pOwotCX0KLQotCWludCBnZXREZWNsYXJlZFR5cGUoKSB7Ci0JCXJldHVybiBkZWNsYXJlZFR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVjbGFyZWRUeXBlU3Ryc1tdID0geyBudWxsLCAiQ0RBVEEiLCAiSUQiLCAiSURSRUYiLAotCQkJIklEUkVGUyIsICJOVU1CRVIiLCAiTkFNRSIsICJOQU1FX1RPS0VOX0dST1VQIiwgIk5NVE9LRU4iLCAiTkFNRVMiIH07Ci0KLQlTdHJpbmcgZ2V0RGVjbGFyZWRUeXBlU3RyKCkgewotCQlyZXR1cm4gZGVjbGFyZWRUeXBlU3Ryc1tkZWNsYXJlZFR5cGVdOwotCX0KLQotCWludCBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUeXBlOwotCX0KLQotCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JYm9vbGVhbiBuYW1lVG9rZW5Hcm91cENvbnRhaW4oU3RyaW5nIHRva2VuKSB7Ci0JCXJldHVybiBuYW1lVG9rZW5zLmNvbnRhaW5zKHRva2VuKTsKLQl9Ci0KLQl2b2lkIHNldERlY2xhcmVkVHlwZShpbnQgdHlwZSkgewotCQlkZWNsYXJlZFR5cGUgPSB0eXBlOwotCX0KLQotCXZvaWQgc2V0RGVmYXVsdFR5cGUoaW50IHR5cGUpIHsKLQkJZGVmYXVsdFR5cGUgPSB0eXBlOwotCX0KLQotCXZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBzdHIpIHsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBzdHI7Ci0JfQotCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBhcmcpIHsKLQkJbmFtZSA9IGFyZzsKLQl9Ci0KLQkvLyBmb3IgZGVidWcuCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldCA9IG5hbWUgKyAnXHQnOwotCQlpZiAoZGVjbGFyZWRUeXBlID09IE5BTUVfVE9LRU5fR1JPVVApIHsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IG5hbWVUb2tlbnMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlyZXQgPSByZXQgKyAnICcgKyBlLm5leHRFbGVtZW50KCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSByZXQgKyBkZWNsYXJlZFZhbHVlVGFibGVbZGVjbGFyZWRUeXBlXTsKLQkJfQotCQlyZXQgPSByZXQgKyAnXHQnOwotCQlpZiAoZGVmYXVsdFZhbHVlVGFibGVbZGVmYXVsdFR5cGVdICE9IG51bGwpIHsKLQkJCXJldCA9IHJldCArIGRlZmF1bHRWYWx1ZVRhYmxlW2RlZmF1bHRUeXBlXSArICcgJzsKLQkJfQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldCA9IHJldCArIGRlZmF1bHRWYWx1ZTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNsYXJlZFZhbHVlVGFibGVbXSA9IHsgbnVsbCwgIkNEQVRBIiwgIklEIiwKLQkJCSJJRFJFRiIsICJJRFJFRlMiLCAiTlVNQkVSIiwgIk5BTUUiLCBudWxsLCAiTk1UT0tFTiIgfTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0VmFsdWVUYWJsZVtdID0geyBudWxsLCAiI0ZJWEVEIiwgIiNSRVFVSVJFRCIsCi0JCQkiI0lNUExJRUQiIH07Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvQXR0cmlidXRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9BdHRyaWJ1dGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmM0YWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9BdHRyaWJ1dGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci0KLWNsYXNzIEF0dHJpYnV0ZUxpc3RJbXBsIGltcGxlbWVudHMgQXR0cmlidXRlTGlzdCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNbXSA9IG5ldyBTdHJpbmdbOF07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbOF07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlc1tdID0gbmV3IFN0cmluZ1s4XTsKLQotICAgIHByaXZhdGUgaW50IG51bSA9IDA7Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kKCkgewotICAgICAgICBTdHJpbmcgbmV3QXJyYXlbXSA9IG5ldyBTdHJpbmdbbnVtICogMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmFtZXMsIDAsIG5ld0FycmF5LCAwLCBudW0pOwotICAgICAgICBuYW1lcyA9IG5ld0FycmF5OwotICAgICAgICBuZXdBcnJheSA9IG5ldyBTdHJpbmdbbnVtICogMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdBcnJheSwgMCwgbnVtKTsKLSAgICAgICAgdmFsdWVzID0gbmV3QXJyYXk7Ci0gICAgICAgIG5ld0FycmF5ID0gbmV3IFN0cmluZ1tudW0gKiAyXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0eXBlcywgMCwgbmV3QXJyYXksIDAsIG51bSk7Ci0gICAgICAgIHR5cGVzID0gbmV3QXJyYXk7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaW50IG51bSA9IHRoaXMubnVtOwotICAgICAgICBpZiAobmFtZXMubGVuZ3RoID09IG51bSkKLSAgICAgICAgICAgIGV4cGFuZCgpOwotICAgICAgICBuYW1lc1tudW1dID0gbmFtZTsKLSAgICAgICAgdHlwZXNbbnVtXSA9IHR5cGU7Ci0gICAgICAgIHZhbHVlc1tudW1dID0gdmFsdWU7Ci0gICAgICAgIHRoaXMubnVtID0gbnVtICsgMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIG51bTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lc1tpXTsKLSAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKGludCBpKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZXNbaV07Ci0gICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbaV07Ci0gICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gbnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChuYW1lc1tpXS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBudW0gLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKG5hbWVzW2ldLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0RURFBhcnNlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRFREUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyODI1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRFREUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotY2xhc3MgRFREUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBQYXJzZUV4Y2VwdGlvbiB7Ci0JcHVibGljIERURFBhcnNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0RURFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0RURFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjgwNmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9EVERQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cC5BbmRNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cC5JTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXAuT3B0TW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXAuT3JNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cC5QbHVzTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXAuUmVwTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXAuU2VxTW9kZWxHcm91cDsKLQotY2xhc3MgRFREUGFyc2VyIGltcGxlbWVudHMgSVNHTUxDb25zdGFudHMgewotCXByaXZhdGUgRFREVG9rZW5pemVyIHRva2VuaXplcjsKLQotCXByaXZhdGUgU3RhY2s8RFREVG9rZW5pemVyPiB0b2tlbml6ZXJTdGFjayA9IG5ldyBTdGFjazxEVERUb2tlbml6ZXI+KCk7Ci0KLQlwcml2YXRlIFNHTUxEb2NUeXBlRGVmIGR0ZDsKLQotCURURFBhcnNlcihEVERUb2tlbml6ZXIgdG9rZW5pemVyLCBTR01MRG9jVHlwZURlZiBkdGQpIHsKLQkJdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7Ci0JCXRoaXMuZHRkID0gZHRkOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGEgRFRELiBPbmx5IHN1cHBvcnRzIGluaXRpYWxseSBzZXR0ZWQgcHVibGljIGVudGl0eS4gUmVhbCBlbnRpdHkgaXMKLQkgKiBpZ25vcmVkLgotCSAqIAotCSAqIEByZXR1cm4gdG9wIEVsZW1lbnREZWZpbml0aW9uIGluc3RhbmNlLiBJZiBET0NUWVBFIGRlY2xhcmF0aW9uIGRvZXMgbm90Ci0JICogCi0JICovCi0JZmluYWwgRWxlbWVudERlZmluaXRpb24gcmVhZERURCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlFbGVtZW50RGVmaW5pdGlvbiBsYXN0RGVmID0gbnVsbDsKLQkJbG9vcDogd2hpbGUgKHRydWUpIHsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gRU9GKQotCQkJCWJyZWFrOwotCQkJd2hpbGUgKHRva2VuaXplci50dHlwZSA9PSBDT01NRU5UKQotCQkJCXRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCXN3aXRjaCAodG9rZW5pemVyLnR0eXBlKSB7Ci0JCQljYXNlIE1ETzogLy8gPCEKLQkJCQlzd2l0Y2ggKHRva2VuaXplci5uZXh0VG9rZW4oKSkgewotCQkJCWNhc2UgTkFNRV9DSEFSOgotCQkJCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnN2YWw7Ci0JCQkJCWlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiRUxFTUVOVCIpKSB7IC8vCi0JCQkJCQlsYXN0RGVmID0gcmVhZEVsZW1lbnREZWZpbml0aW9uKCk7Ci0JCQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIkFUVExJU1QiKSkgewotCQkJCQkJcmVhZEF0dHJpYnV0ZUxpc3QoKTsKLQkJCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiRU5USVRZIikpIHsKLQkJCQkJCXJlYWRFbnRpdHkoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiVW5rbm93biBEZWNsYXJhdGlvbjogIgotCQkJCQkJCQkrIHN0cik7Ci0JCQkJCX0KLQkJCQkJLy8gY29uc3VtZSAnPicKLQkJCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBUQUdDKQotCQkJCQkJOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERTTzogLy8gWwotCQkJCQlpZiAobWFyaygpKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICdbJykgewotCQkJCQkJCXRva2VuaXplci5zd2l0Y2hUbyhERUZBVUxUKTsKLQkJCQkJCQlsYXN0RGVmID0gcmVhZERURCgpOwotCQkJCQkJCXRva2VuaXplci5zd2l0Y2hUbyhUQUcpOwotCQkJCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ10nCi0JCQkJCQkJCQkmJiB0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ10nCi0JCQkJCQkJCQkmJiB0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJz4nKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ1snKSB7Ci0JCQkJCQkJdG9rZW5pemVyLnNraXBUb0RTQygpOwotCQkJCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ10nCi0JCQkJCQkJCQkmJiB0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJz4nKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oImludmFsaWQgbWFyayByZWdpb24uIik7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGRlY2xhcmF0aW9uIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnJSc6Ci0JCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQkJU0dNTEVudGl0eVJlZmVyZW5jZSByZWYgPSByZWFkRW50aXR5UmVmZXJlbmNlKCk7Ci0JCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gcmVmLmdldEVudGl0eURlY2xhcmF0aW9uKCk7Ci0JCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJdG9rZW5pemVyU3RhY2sucHVzaCh0b2tlbml6ZXIpOwotCQkJCQl0b2tlbml6ZXIgPSBuZXcgRFREVG9rZW5pemVyKGVkLmdldFJlcGxhY2VtZW50UmVhZGVyKCkpOwotCQkJCQlyZWFkRFREKCk7Ci0JCQkJCXRva2VuaXplciA9IChEVERUb2tlbml6ZXIpIHRva2VuaXplclN0YWNrLnBvcCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBR086IC8vIDwKLQkJCWNhc2UgRVRBR086IC8vIDwvCi0JCQljYXNlIE1JU0M6IC8vCi0JCQlkZWZhdWx0OgotCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCWJyZWFrIGxvb3A7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGFzdERlZjsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZWZpbml0aW9uIHJlYWRFbGVtZW50RGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJRWxlbWVudERlZmluaXRpb24gZGVmc1tdID0gcmVhZEVsZW1lbnRUeXBlKCk7Ci0JCWJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKLQkJYm9vbGVhbiBlbmQgPSBmYWxzZTsKLQkJYm9vbGVhbiBub3RYSFRNTCA9IGR0ZC50b1N0cmluZygpLmluZGV4T2YoIlhIVE1MIikgPCAwOwotCi0JCWlmIChub3RYSFRNTCkgewotCQkJc3RhcnQgPSBvbWl0KCk7Ci0JCQllbmQgPSBvbWl0KCk7Ci0JCX0KLQkJSU1vZGVsR3JvdXAgY29udGVudCA9IGV4cCgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWQ6ICIrZGVmc1swXS50b1N0cmluZygpKyIgIisKLQkJLy8gY29udGVudC50b1N0cmluZygpKTsKLQotCQkvLyBjYW4ndCBvbWl0Ci0JCWlmICghbm90WEhUTUwgJiYgY29udGVudC50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIkVNUFRZIikpIHsKLQkJCWVuZCA9IHRydWU7Ci0JCX0KLQotCQlFbGVtZW50RGVmaW5pdGlvbiBleGNlcHRpb25zW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmcy5sZW5ndGg7IGkrKykgewotCQkJZGVmc1tpXS5zZXRTdGFydFRhZyhzdGFydCk7Ci0JCQlkZWZzW2ldLnNldEVuZFRhZyhlbmQpOwotCQkJZGVmc1tpXS5zZXRDb250ZW50TW9kZWwoY29udGVudCk7Ci0JCX0KLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBJTkNPKSB7Ci0JCQlleGNlcHRpb25zID0gaW5jbHVzaW9uKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWZzW2ldLnNldEluY2x1c2lvbihleGNlcHRpb25zKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0b2tlbml6ZXIudHR5cGUgPT0gRVhDTykgewotCQkJZXhjZXB0aW9ucyA9IGluY2x1c2lvbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGVmc1tpXS5zZXRFeGNsdXNpb24oZXhjZXB0aW9ucyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJfQotCQlyZXR1cm4gZGVmc1swXTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZWZpbml0aW9uW10gcmVhZEVsZW1lbnRUeXBlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IExFRlRQQVIpIHsKLQkJCVZlY3RvcjxFbGVtZW50RGVmaW5pdGlvbltdPiB0bXBWZWN0b3IgPSBuZXcgVmVjdG9yPEVsZW1lbnREZWZpbml0aW9uW10+KCk7Ci0JCQl0bXBWZWN0b3IuYWRkRWxlbWVudChtYWtlRWxlbWVudEFycmF5KGF0b20oKSkpOwotCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnfCcpCi0JCQkJdG1wVmVjdG9yLmFkZEVsZW1lbnQobWFrZUVsZW1lbnRBcnJheShhdG9tKCkpKTsKLQkJCWlmICh0b2tlbml6ZXIudHR5cGUgIT0gJyknKQotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaW52YWxpZCBFTEVNRU5UIHR5cGUiKTsKLQkJCWludCBzaXplID0gMDsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IHRtcFZlY3Rvci5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykKLQkJCQlzaXplICs9ICgoRWxlbWVudERlZmluaXRpb25bXSkgKGUubmV4dEVsZW1lbnQoKSkpLmxlbmd0aDsKLQkJCUVsZW1lbnREZWZpbml0aW9uIHJldFtdID0gbmV3IEVsZW1lbnREZWZpbml0aW9uW3NpemVdOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gdG1wVmVjdG9yLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJRWxlbWVudERlZmluaXRpb24gZGVmc1tdID0gKEVsZW1lbnREZWZpbml0aW9uW10pIChlCi0JCQkJCQkubmV4dEVsZW1lbnQoKSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZzLmxlbmd0aDsgaisrKQotCQkJCQlyZXRbaSsrXSA9IGRlZnNbal07Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlyZXR1cm4gbWFrZUVsZW1lbnRBcnJheShhdG9tKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgRW50aXR5LgotCSAqIAotCSAqIDxQUkU+Ci0JICogCi0JICogPCFFTlRJVFkgLi4uLi4gPiBeIF4gYWxyZWFkeSByZWFkIGF0IHRoaXMgcG9pbnQuIFJlYWRzIHVudGlsIHRoaXMgcG9pbnQuCi0JICogCi0JICogPC9QUkU+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRFbnRpdHkoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVudGl0eU5hbWU7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJyUnKSB7Ci0JCQlpZiAodG9rZW5pemVyLnR0eXBlID09IE5BTUVfQ0hBUikgewotCQkJCWVudGl0eU5hbWUgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQlpbnQgbmV4dCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlpZiAobmV4dCA9PSBOQU1FX0NIQVIKLQkJCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIkNEQVRBIikpIHsKLQkJCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBTVFJJTkcpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlbnRpdHlOYW1lKyIgOiAiK3Rva2VuaXplci5zdmFsKTsKLQkJCQkJCWR0ZC5wdXRFbnRpdHlEZWNsYXJhdGlvbihlbnRpdHlOYW1lLCB0b2tlbml6ZXIuc3ZhbCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG5leHQgPT0gU1RSSU5HKSB7Ci0JCQkJCS8vIGFkZCAwNDA5MzAgdG8gc3VwcG9ydCB4aHRtbC0qLmVudAotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZW50aXR5TmFtZSsiIDogIisgdG9rZW5pemVyLnN2YWwpOwotCQkJCQlkdGQucHV0RW50aXR5RGVjbGFyYXRpb24oZW50aXR5TmFtZSwgdG9rZW5pemVyLnN2YWwpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGVudGl0eSIpOwotCQl9IGVsc2UgaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIpIHsKLQkJCWVudGl0eU5hbWUgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gU1RSSU5HKSB7Ci0JCQkJaWYgKHRva2VuaXplci50dHlwZSA9PSBOQU1FX0NIQVIKLQkJCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIlBVQkxJQyIpKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gU1RSSU5HKSB7Ci0JCQkJCQlTdHJpbmcgcHVibGljSUQgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkJCVN0cmluZyBlbnRpdHlGaWxlTmFtZSA9IChTdHJpbmcpIFNHTUxQYXJzZXIucHViRW50aXR5TWFwCi0JCQkJCQkJCS5nZXQocHVibGljSUQpOwotCQkJCQkJaWYgKGVudGl0eUZpbGVOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlkdGQucHV0UHVibGljRW50aXR5KGVudGl0eU5hbWUsIHB1YmxpY0lELAotCQkJCQkJCQkJZW50aXR5RmlsZU5hbWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50aXR5TmFtZSArICIgOiAiICsgcHVibGljSUQKLQkJCQkJCQkJCSsgIiA6ICIgKyBlbnRpdHlGaWxlTmFtZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGVudGl0eSIpOwotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICc+JykgewotCQkJCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09IFNUUklORykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7IC8vIGlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gU1RSSU5HKSB7Ci0JCQkJZHRkLnB1dEVudGl0eURlY2xhcmF0aW9uKGVudGl0eU5hbWUsIHRva2VuaXplci5zdmFsKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGVudGl0eSIpOwotCX0KLQotCXByaXZhdGUgU0dNTEVudGl0eVJlZmVyZW5jZSByZWFkRW50aXR5UmVmZXJlbmNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICclJykgewotCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIgfHwgdG9rZW5pemVyLnR0eXBlID09IFBDREFUQSkgewotCQkJCVN0cmluZyBzdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpICE9ICc7JykKLQkJCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQkJcmV0dXJuIGR0ZC5nZXRFbnRpdHlSZWZlcmVuY2Uoc3RyKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oImludmFsaWQgZW50aXR5IHJlZmVyZW5jZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVG9rZW4oQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSIHx8IHRva2VuaXplci50dHlwZSA9PSBOVU0pIHsKLQkJCWF0dHIuYWRkTmFtZVRva2VuKHRva2VuaXplci5zdmFsKTsKLQkJfSBlbHNlIGlmICh0b2tlbml6ZXIudHR5cGUgPT0gJyUnKSB7Ci0JCQl0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJCVNHTUxFbnRpdHlSZWZlcmVuY2UgZXIgPSByZWFkRW50aXR5UmVmZXJlbmNlKCk7Ci0JCQlTR01MRW50aXR5RGVjbGFyYXRpb24gZWQgPSBlci5nZXRFbnRpdHlEZWNsYXJhdGlvbigpOwotCQkJdG9rZW5pemVyU3RhY2sucHVzaCh0b2tlbml6ZXIpOwotCQkJdG9rZW5pemVyID0gbmV3IERURFRva2VuaXplcihlZC5nZXRSZXBsYWNlbWVudFJlYWRlcigpLCBUQUcpOwotCQkJcmVhZFRva2VuR3JvdXAoYXR0cik7Ci0JCQl0b2tlbml6ZXIgPSAoRFREVG9rZW5pemVyKSB0b2tlbml6ZXJTdGFjay5wb3AoKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaW52YWxpZCB0b2tlbiIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRUb2tlbkdyb3VwKEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cikKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZWFkVG9rZW4oYXR0cik7Ci0JCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJyknICYmIHRva2VuaXplci50dHlwZSAhPSBFT0YpIHsKLQkJCWlmICh0b2tlbml6ZXIudHR5cGUgIT0gJ3wnKQotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaW52YWxpZCB0b2tlbiBncm91cCIpOwotCQkJcmVhZFRva2VuKGF0dHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgYW4gZXhwIEVYUCAtPiBURVJNIFsoLCBURVJNKSogfCAofCBURVJNKSogfCAoJiBURVJNKSpdCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxHcm91cCBleHAoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSU1vZGVsR3JvdXAgcmV0OwotCQlyZXQgPSB0ZXJtKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwOiAiK3JldC50b1N0cmluZygpKTsKLQkJaW50IHRtcEMgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCXN3aXRjaCAodG1wQykgewotCQljYXNlICcsJzoKLQkJCVNlcU1vZGVsR3JvdXAgc2VxID0gbmV3IFNlcU1vZGVsR3JvdXAocmV0KTsKLQkJCXNlcS5hZGQodGVybSgpKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJywnKQotCQkJCXNlcS5hZGQodGVybSgpKTsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJaWYgKHNlcS5nZXRDaGlsZExlbmd0aCgpID4gZHRkLm1heFNlcUxlbmd0aCkgewotCQkJCWR0ZC5tYXhTZXFMZW5ndGggPSBzZXEuZ2V0Q2hpbGRMZW5ndGgoKTsKLQkJCX0KLQkJCXJldHVybiBzZXE7Ci0JCWNhc2UgJ3wnOgotCQkJcmV0ID0gbmV3IE9yTW9kZWxHcm91cChyZXQpOwotCQkJKChPck1vZGVsR3JvdXApIHJldCkuYWRkKHRlcm0oKSk7Ci0JCQl3aGlsZSAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICd8JykKLQkJCQkoKE9yTW9kZWxHcm91cCkgcmV0KS5hZGQodGVybSgpKTsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSAnJic6Ci0JCQlyZXQgPSBuZXcgQW5kTW9kZWxHcm91cChyZXQpOwotCQkJKChBbmRNb2RlbEdyb3VwKSByZXQpLmFkZCh0ZXJtKCkpOwotCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnJicpCi0JCQkJKChBbmRNb2RlbEdyb3VwKSByZXQpLmFkZCh0ZXJtKCkpOwotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQlkZWZhdWx0OgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBkOiAiK3RtcEMpOwotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogVEVSTSAtPiBGQUNUT1IgWz8gfCArIHwgKl0KLQkgKi8KLQlwcml2YXRlIElNb2RlbEdyb3VwIHRlcm0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSU1vZGVsR3JvdXAgcmV0ID0gZmFjdG9yKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVybSByZXQ6ICIrcmV0LnRvU3RyaW5nKCkpOwotCQlpbnQgdG1wQyA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXJtIG5leHQ6ICIrdG1wQysiICIrKGNoYXIpdG1wQyk7Ci0JCXN3aXRjaCAodG1wQykgewotCQljYXNlIFFVRVNUSU9OOgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXJtOiA/Iik7Ci0JCQlyZXQgPSBuZXcgT3B0TW9kZWxHcm91cChyZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUExVUzoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVybTogKyIpOwotCQkJcmV0ID0gbmV3IFBsdXNNb2RlbEdyb3VwKHJldCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNVUxUSToKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVybTogKiIpOwotCQkJcmV0ID0gbmV3IFJlcE1vZGVsR3JvdXAocmV0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXJtOiBlcnJvciIpOwotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBhIGZhY3RvciBGQUNUT1IgLT4gQVRPTSAoRVhQKSBQQ0RBVEEgQ0RBVEEgRU1QVFkKLQkgKi8KLQlwcml2YXRlIElNb2RlbEdyb3VwIGZhY3RvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzd2l0Y2ggKHRva2VuaXplci5uZXh0VG9rZW4oKSkgewotCQljYXNlIExFRlRQQVI6Ci0JCQlJTW9kZWxHcm91cCByZXQgPSBleHAoKTsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJyknKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmYWN0b3I6IGVycm9yIik7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJyZXQ6ICIgKyByZXQudG9TdHJpbmcoKQotCQkJCQkJKyAiIHN2YWw6ICIgKyB0b2tlbml6ZXIuc3ZhbCArICIgdHR5cGU6ICIKLQkJCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmYWN0b3I6ICIrcmV0LnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCWNhc2UgQ0RBVEE6Ci0JCQlyZXR1cm4gU0dNTFBhcnNlci5jZGF0YTsKLQkJY2FzZSBOVU06IC8vICNQQ0RBVEEKLQkJCWlmICh0b2tlbml6ZXIuc3ZhbC5lcXVhbHNJZ25vcmVDYXNlKCIjUENEQVRBIikpIHsKLQkJCQlyZXR1cm4gU0dNTFBhcnNlci5wY2RhdGE7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigic3ZhbDogIiArIHRva2VuaXplci5zdmFsCi0JCQkJCQkrICIgdHR5cGU6ICIgKyB0b2tlbml6ZXIudHR5cGUpOwotCQkJfQotCQlkZWZhdWx0OgotCQkJaWYgKHRva2VuaXplci50dHlwZSA9PSBOQU1FX0NIQVIKLQkJCQkJJiYgdG9rZW5pemVyLnN2YWwuZXF1YWxzSWdub3JlQ2FzZSgiRU1QVFkiKSkgewotCQkJCXJldHVybiBTR01MUGFyc2VyLmVtcHR5OwotCQkJfSBlbHNlIGlmICh0b2tlbml6ZXIudHR5cGUgPT0gTkFNRV9DSEFSCi0JCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIkNEQVRBIikpIHsKLQkJCQlyZXR1cm4gU0dNTFBhcnNlci5jZGF0YTsKLQkJCX0KLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJcmV0dXJuIGF0b20oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIGF0b20uIEFUT00gLT4gPE5BTUVfQ0hBUj4gRU5USVRZX1JFRkVSRU5DRQotCSAqLwotCXByaXZhdGUgSU1vZGVsR3JvdXAgYXRvbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IE5BTUVfQ0hBUikgewotCQkJcmV0dXJuIGR0ZC5jcmVhdGVFbGVtZW50RGVmaW5pdGlvbih0b2tlbml6ZXIuc3ZhbCk7Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICclJykgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJCUlNb2RlbEdyb3VwIHJldCA9IGVkLmdldFJlcGxhY2VtZW50U3VidHJlZSgpOwotCQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQkJdG9rZW5pemVyU3RhY2sucHVzaCh0b2tlbml6ZXIpOwotCQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIoZWQuZ2V0UmVwbGFjZW1lbnRSZWFkZXIoKSwgVEFHKTsKLQkJCQlyZXQgPSBleHAoKTsKLQkJCQllZC5zZXRSZXBsYWNlbWVudFN1YnRyZWUocmV0KTsKLQkJCQl0b2tlbml6ZXIgPSAoRFREVG9rZW5pemVyKSB0b2tlbml6ZXJTdGFjay5wb3AoKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oInN2YWw6ICIgKyB0b2tlbml6ZXIuc3ZhbCArICIgdHR5cGU6ICIKLQkJCQkJKyB0b2tlbml6ZXIudHR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY2xhcmVkVmFsdWUoQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSKSB7Ci0JCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnN2YWw7Ci0JCQlpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIkNEQVRBIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLkNEQVRBKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIklEIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLklEKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIklEUkVGIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLklEUkVGKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIklEUkVGUyIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5JRFJFRlMpOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiTkFNRSIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OQU1FKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIk5VTUJFUiIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OVU1CRVIpOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiTk1UT0tFTiIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OTVRPS0VOKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIk5BTUVTIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLk5BTUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKHRva2VuaXplci5nZXRDdXJyZW50TGluZSgpCi0JCQkJCQkrICI6IHVua25vd24gZGVjbGFyZWQgdmFsdWUgIiArIHN0cik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICcoJykgewotCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OQU1FX1RPS0VOX0dST1VQKTsKLQkJCXJlYWRUb2tlbkdyb3VwKGF0dHIpOwotCQl9IGVsc2UgaWYgKHRva2VuaXplci50dHlwZSA9PSAnJScpIHsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJU0dNTEVudGl0eVJlZmVyZW5jZSBlciA9IHJlYWRFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCVNHTUxFbnRpdHlEZWNsYXJhdGlvbiBlZCA9IGVyLmdldEVudGl0eURlY2xhcmF0aW9uKCk7Ci0JCQl0b2tlbml6ZXJTdGFjay5wdXNoKHRva2VuaXplcik7Ci0JCQl0b2tlbml6ZXIgPSBuZXcgRFREVG9rZW5pemVyKGVkLmdldFJlcGxhY2VtZW50UmVhZGVyKCksIFRBRyk7Ci0JCQlkZWNsYXJlZFZhbHVlKGF0dHIpOwotCQkJdG9rZW5pemVyID0gKERURFRva2VuaXplcikgdG9rZW5pemVyU3RhY2sucG9wKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oImF0ICIgKyB0b2tlbml6ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlZmF1bHRWYWx1ZShBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJY2FzZSBOQU1FX0NIQVI6Ci0JCQlhdHRyLnNldERlZmF1bHRWYWx1ZSh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFJJTkc6Ci0JCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnN2YWw7Ci0JCQlicmVhazsKLQkJY2FzZSBOVU06Ci0JCQlzdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCWlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiI1JFUVVJUkVEIikpIHsKLQkJCQlhdHRyLnNldERlZmF1bHRUeXBlKEF0dHJpYnV0ZURlZmluaXRpb24uUkVRVUlSRUQpOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiI0lNUExJRUQiKSkgewotCQkJCWF0dHIuc2V0RGVmYXVsdFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5JTVBMSUVEKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIiNGSVhFRCIpKSB7Ci0JCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBFT0YpIHsKLQkJCQkJdG9rZW5pemVyID0gKERURFRva2VuaXplcikgdG9rZW5pemVyU3RhY2sucGVlaygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCX0KLQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpICE9IFNUUklORykgewotCQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24odG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkKLQkJCQkJCQkrICI6IFNUUklORyBtdXN0IGZvbGxvdyAjRklYRUQiKTsKLQkJCQl9Ci0JCQkJYXR0ci5zZXREZWZhdWx0VHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLkZJWEVEKTsKLQkJCQlzdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkvLyBkYXRhIGlzIGVudGl0eT8KLQkJCQl0b2tlbml6ZXJTdGFjay5wdXNoKHRva2VuaXplcik7Ci0JCQkJdG9rZW5pemVyID0gbmV3IERURFRva2VuaXplcihuZXcgU3RyaW5nUmVhZGVyKHN0ciksIFRBRyk7Ci0JCQkJU0dNTEVudGl0eVJlZmVyZW5jZSByZWY7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVmID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJCQlhdHRyLnNldERlZmF1bHRWYWx1ZShyZWYuZ2V0RW50aXR5RGVjbGFyYXRpb24oKQotCQkJCQkJCS5nZXRSZXBsYWNlbWVudFN0cmluZygpKTsKLQkJCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWF0dHIuc2V0RGVmYXVsdFZhbHVlKHN0cik7Ci0JCQkJfQotCQkJCXRva2VuaXplciA9IChEVERUb2tlbml6ZXIpIHRva2VuaXplclN0YWNrLnBvcCgpOwotCQkJfSBlbHNlIHsKLQkJCQlhdHRyLnNldERlZmF1bHRWYWx1ZShzdHIpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEF0dHJpYnV0ZUxpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmVhZEF0dHJpYnV0ZUxpc3QocmVhZEVsZW1lbnRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIHJlYWQgbGluZXMgaW4gYXR0bGlzdC4KLQkgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZURlZmluaXRpb25bXSByZWFkQXR0cmlidXRlTGlzdChFbGVtZW50RGVmaW5pdGlvbiBkZWZzW10pCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJVmVjdG9yPEF0dHJpYnV0ZURlZmluaXRpb24+IHYgPSBuZXcgVmVjdG9yPEF0dHJpYnV0ZURlZmluaXRpb24+KCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJz4nICYmIHRva2VuaXplci50dHlwZSAhPSBFT0YpIHsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJQXR0cmlidXRlRGVmaW5pdGlvbltdIGFkcyA9IGF0dHJpYnV0ZURlZmluaXRpb25MaXN0KGRlZnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZHMubGVuZ3RoOyBpKyspCi0JCQkJdi5hZGRFbGVtZW50KGFkc1tpXSk7Ci0JCX0KLQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCUF0dHJpYnV0ZURlZmluaXRpb24gcmV0W10gPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvblt2LnNpemUoKV07Ci0JCXYuY29weUludG8ocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGVhY2ggbGluZSBpbiBhdHRsaXN0LgotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbltdIGF0dHJpYnV0ZURlZmluaXRpb25MaXN0KAotCQkJRWxlbWVudERlZmluaXRpb24gZGVmc1tdKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIpIHsKLQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYWQgPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvbih0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlkZWNsYXJlZFZhbHVlKGFkKTsKLQkJCWRlZmF1bHRWYWx1ZShhZCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZnMubGVuZ3RoOyBpKyspCi0JCQkJZGVmc1tpXS5hZGRBdHRyaWJ1dGVEZWZpbml0aW9uKGFkKTsKLQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYWRzW10gPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvbltdIHsgYWQgfTsKLQkJCXJldHVybiBhZHM7Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICclJykgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJCXRva2VuaXplclN0YWNrLnB1c2godG9rZW5pemVyKTsKLQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIoZWQuZ2V0UmVwbGFjZW1lbnRSZWFkZXIoKSwgVEFHKTsKLQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYWRzW10gPSByZWFkQXR0cmlidXRlTGlzdChkZWZzKTsKLQkJCXRva2VuaXplciA9IChEVERUb2tlbml6ZXIpIHRva2VuaXplclN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIGFkczsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaWxsZWdhbCBhdHRsaXN0LiIpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWFyaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IE5BTUVfQ0hBUikgewotCQkJaWYgKHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIklOQ0xVREUiKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmICh0b2tlbml6ZXIuc3ZhbC5lcXVhbHNJZ25vcmVDYXNlKCJJR05PUkUiKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJsYXN0IHN2YWw6ICIgKyB0b2tlbml6ZXIuc3ZhbCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICclJykgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJCXRva2VuaXplclN0YWNrLnB1c2godG9rZW5pemVyKTsKLQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIoZWQuZ2V0UmVwbGFjZW1lbnRSZWFkZXIoKSwgVEFHKTsKLQkJCWJvb2xlYW4gcmV0ID0gbWFyaygpOwotCQkJdG9rZW5pemVyID0gKERURFRva2VuaXplcikgdG9rZW5pemVyU3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJzdmFsOiAiICsgdG9rZW5pemVyLnN2YWwgKyAiIHR0eXBlOiAiCi0JCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRWxlbWVudERlZmluaXRpb25bXSBtYWtlRWxlbWVudEFycmF5KElNb2RlbEdyb3VwIG1vZGVsKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgRWxlbWVudERlZmluaXRpb24pIHsKLQkJCUVsZW1lbnREZWZpbml0aW9uIHJldFtdID0geyAoRWxlbWVudERlZmluaXRpb24pIG1vZGVsIH07Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT3JNb2RlbEdyb3VwKSB7Ci0JCQlyZXR1cm4gKChPck1vZGVsR3JvdXApIG1vZGVsKS5nZXRDaGlsZHJlbigpOwotCQl9Ci0JCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigic3ZhbDogIiArIHRva2VuaXplci5zdmFsICsgIiB0dHlwZTogIgotCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBhIHRva2VuIHRoYXQgcmVwcmVzZW50cyB3aGV0aGVyIHRhZyBpcyBvbWl0dGFibGUgb3Igbm90LiBPTUlUIC0+IC0KLQkgKiBPCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG9taXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJY2FzZSBPTUlUVEFCTEU6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJY2FzZSBNSU5VUzoKLQkJCXJldHVybiBmYWxzZTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiJ08nIG9yICctJyBpcyByZXF1aXJlZCBhdCAiCi0JCQkJCSsgdG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbltdIGluY2x1c2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlWZWN0b3I8RWxlbWVudERlZmluaXRpb25bXT4gdG1wVmVjdG9yID0gbmV3IFZlY3RvcjxFbGVtZW50RGVmaW5pdGlvbltdPigpOwotCQl0bXBWZWN0b3IuYWRkRWxlbWVudChtYWtlRWxlbWVudEFycmF5KGF0b20oKSkpOwotCQl3aGlsZSAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICd8JykKLQkJCXRtcFZlY3Rvci5hZGRFbGVtZW50KG1ha2VFbGVtZW50QXJyYXkoYXRvbSgpKSk7Ci0JCWlmICh0b2tlbml6ZXIudHR5cGUgIT0gJyknKQotCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJzdmFsOiAiICsgdG9rZW5pemVyLnN2YWwgKyAiIHR0eXBlOiAiCi0JCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQkJaW50IHNpemUgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSB0bXBWZWN0b3IuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspCi0JCQlzaXplICs9ICgoRWxlbWVudERlZmluaXRpb25bXSkgKGUubmV4dEVsZW1lbnQoKSkpLmxlbmd0aDsKLQkJRWxlbWVudERlZmluaXRpb24gcmV0W10gPSBuZXcgRWxlbWVudERlZmluaXRpb25bc2l6ZV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gdG1wVmVjdG9yLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlFbGVtZW50RGVmaW5pdGlvbiBkZWZzW10gPSAoRWxlbWVudERlZmluaXRpb25bXSkgKGUubmV4dEVsZW1lbnQoKSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlZnMubGVuZ3RoOyBqKyspCi0JCQkJcmV0W2krK10gPSBkZWZzW2pdOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0RURFRva2VuaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0RURFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2IxMDBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9EVERUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1jbGFzcyBEVERUb2tlbml6ZXIgZXh0ZW5kcyBTR01MVG9rZW5pemVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIFNHTUxUb2tlbml6ZXIgaW5zdGFuY2UuCi0JICogQHBhcmFtIHJlYWRlciByZWFkZXIgdGhhdCByZWFkIFNHTUwgRG9jdW1lbnRzLgotCSAqLwotCURURFRva2VuaXplcihSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKHJlYWRlciwgREVGQVVMVCk7Ci0JfQotCURURFRva2VuaXplcihSZWFkZXIgcmVhZGVyLCBpbnQgc3RhdGUpIHsKLQkJc3VwZXIocmVhZGVyLCBzdGF0ZSk7Ci0JfQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdFN0YXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0JCWludCBjaDsKLQkJY2ggPSByZWFkKCk7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSkKLQkJCWNoID0gcmVhZCgpOwotCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICclJyA6Ci0JCQkJcmV0dXJuICh0dHlwZSA9ICclJyk7Ci0JCQljYXNlICc8JyA6Ci0JCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy8nKSB7Ci0JCQkJCXN0YXRlID0gVEFHOwotCQkJCQlyZXR1cm4gKHR0eXBlID0gRVRBR08pOwotCQkJCX0gZWxzZSBpZiAoY2ggPT0gJz8nKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBkYXRhID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnPicgJiYgY2ggIT0gRU9GKSB7Ci0JCQkJCQlkYXRhLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCX0KLQkJCQkJc3ZhbCA9IGRhdGEudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IFBJKTsKLQkJCQl9IGVsc2UgaWYgKGNoID09ICchJykgeyAvLyBkZWNsYXJhdGlvbi4KLQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIDwhLQotCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIDwhLS0gZW50ZXIgY29tbWVudAotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnLScgJiYgY2ggIT0gRU9GKQotCQkJCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIC0tCi0JCQkJCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSA9PSAnLScpCi0JCQkJCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJCQkJCVN0cmluZ0J1ZmZlciB3cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSkgewotCQkJCQkJCQkJCXdzLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQkJCQkJY2ggPSByZWFkKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJCQkJCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCQkJCQkJCXN2YWwgPSBuZXcgU3RyaW5nKHNiKTsKLQkJCQkJCQkJCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXNiLmFwcGVuZCgiLS0iKTsKLQkJCQkJCQkJCQlzYi5hcHBlbmQod3MpOwotCQkJCQkJCQkJCXVucmVhZChjaCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY2ggPT0gRU9GKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oCi0JCQkJCQkJCQkJIlVuZXhwZWNldGVkIEVPRiBpbiBjb21tZW50LiBhdCAiCi0JCQkJCQkJCQkJCSsgZ2V0UmVhZGVyKCkKLQkJCQkJCQkJCQkJKyAnOicKLQkJCQkJCQkJCQkJKyBnZXRDdXJyZW50TGluZSgpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXNiLmFwcGVuZCgnLScpOwotCQkJCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7IC8vIDwhLSAKLQkJCQkJCQl1bnJlYWQoY2gpOwotCQkJCQkJCXVucmVhZCgnLScpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJfQotCQkJCQlzdGF0ZSA9IFRBRzsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IE1ETyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJc3RhdGUgPSBUQUc7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBTVEFHTyk7Ci0JCQkJfQotCQkJY2FzZSBFT0YgOgotCQkJCXJldHVybiAodHR5cGUgPSBFT0YpOwotCQkJY2FzZSAnOycgOgotCQkJCXJldHVybiAodHR5cGUgPSAnOycpOwotCQkJY2FzZSAnXScgOgotCQkJCXJldHVybiAodHR5cGUgPSAnXScpOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcigoY2hhciljaCkpIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJcmV0dXJuIHJlYWROYW1lQ2hhcigpOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oCi0JCQkJCSJVbmtub3duIGNoYXJhY3RlciAnIgotCQkJCQkJKyAoY2hhciljaAotCQkJCQkJKyAiYXQgIgotCQkJCQkJKyBnZXRSZWFkZXIoKQotCQkJCQkJKyAnOicKLQkJCQkJCSsgZ2V0Q3VycmVudExpbmUoKSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2tpcFRvRFNDKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHJlYWQoKSAhPSAnXScpOwotCX0KLQlwcm90ZWN0ZWQgaW50IHRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0aHJvdWdoKCk7Ci0JCXN3aXRjaCAoY2ggPSByZWFkKCkpIHsKLQkJCWNhc2UgJy0nIDoKLQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgKGNoID0gcmVhZCgpKSkpIHsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IE1JTlVTKTsKLQkJCQl9IGVsc2UgaWYgKGNoID09ICcoJykgewotCQkJCQlyZXR1cm4gKHR0eXBlID0gRVhDTyk7Ci0JCQkJfSBlbHNlIGlmIChjaCA9PSAnKScpIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IE1JTlVTKTsKLQkJCQl9IGVsc2UgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJd2hpbGUgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSAmJiBjaCAhPSAnPicpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJfQotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBNSVNDKTsKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCctJyk7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIChjaCA9IHJlYWQoKSkpKQotCQkJCQlzYi5hcHBlbmQoKGNoYXIpY2gpOwotCQkJCWlmIChjaCA9PSAnJScpIHsKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1bnJlYWQoY2gpOwotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IE5VTSk7Ci0JCQljYXNlICcrJyA6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIChjaCA9IHJlYWQoKSkpKSB7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBQTFVTKTsKLQkJCQl9IGVsc2UgaWYgKGNoID09ICcoJykgewotCQkJCQlyZXR1cm4gKHR0eXBlID0gSU5DTyk7Ci0JCQkJCS8vYWRkIDA0MDcwMyB0byBoYW5kbGUgKHRib2R5K3x0cispCi0JCQkJCS8vYWRkIDA0MDkyOSB0byBoYW5kbGUgKHRyKSs+Ci0JCQkJfSBlbHNlIGlmIChjaCA9PSAnKScgfHwgY2g9PSd8JyB8fCBjaD09Jz4nKSB7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBQTFVTKTsKLQkJCQl9IGVsc2UgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJd2hpbGUgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSAmJiBjaCAhPSAnPicpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJfQotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBNSVNDKTsKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCcrJyk7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIChjaCA9IHJlYWQoKSkpKQotCQkJCQlzYi5hcHBlbmQoKGNoYXIpY2gpOwotCQkJCWlmIChjaCA9PSAnJScpIHsKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1bnJlYWQoY2gpOwotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IE5VTSk7Ci0JCQljYXNlICcjJyA6Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzTGV0dGVyKChjaGFyKSAoY2ggPSByZWFkKCkpKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpCi0JCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJdW5yZWFkKGNoKTsKLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IE5VTSk7Ci0JCQljYXNlICdcJycgOgotCQkJY2FzZSAnIicgOgotCQkJCWludCBjbG9zaW5nID0gY2g7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gY2xvc2luZykgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAoY2ggPT0gRU9GKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkJIlVuZXhwZWN0ZWQgRU9GIGF0ICIKLQkJCQkJCQkJKyBnZXRSZWFkZXIoKQotCQkJCQkJCQkrICc6JwotCQkJCQkJCQkrIGdldEN1cnJlbnRMaW5lKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IFNUUklORyk7Ci0JCQljYXNlICc+JyA6Ci0JCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCXJldHVybiAodHR5cGUgPSAnPicpOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcigoY2hhciljaCkpIHsKLQkJCQkJaWYgKGNoID09ICdPJykgewotCQkJCQkJaW50IGNoMTsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSAoY2gxID0gcmVhZCgpKSkpCi0JCQkJCQkJcmV0dXJuICh0dHlwZSA9IE9NSVRUQUJMRSk7Ci0JCQkJCQl1bnJlYWQoY2gxKTsKLQkJCQkJfQotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlyZXR1cm4gcmVhZE5hbWVDaGFyKCk7Ci0JCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJY2ggPSByZWFkKCk7Ci0JCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJfQotCQkJCQlpZiAoY2ggPT0gJyUnKSB7Ci0JCQkJCQlzYi5hcHBlbmQoKGNoYXIpY2gpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJfQotCQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBOVU0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBjaCk7Ci0JCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgaW50IHJlYWROYW1lQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaCA9IHJlYWQoKTsKLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcigoY2hhciljaCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQljaCA9IHJlYWQoKTsKLQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNMZXR0ZXIoKGNoYXIpY2gpCi0JCQkJfHwgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpY2gpCi0JCQkJfHwgY2ggPT0gJy4nCi0JCQkJfHwgY2ggPT0gJy0nCi0JCQkJfHwgY2ggPT0gJzonCi0JCQkJfHwgY2ggPT0gJyMnKSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQljaCA9IHJlYWQoKTsKLQkJCX0KLQkJCXVucmVhZChjaCk7Ci0JCQlzdmFsID0gc2IudG9TdHJpbmcoKTsKLQkJCXJldHVybiAodHR5cGUgPSBOQU1FX0NIQVIpOwotCQl9IGVsc2UgewotCQkJdW5yZWFkKGNoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRocm91Z2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2g7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IHJlYWQoKTsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhciljaCkpIHsKLQkJCQlpZiAoY2ggPT0gJy0nKSB7Ci0JCQkJCWlmICgoY2ggPSByZWFkKCkpID09ICctJykgeyAvLyBnZXR0aW5nIGludG8gYSBjb21tZW50LgotCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnLScgJiYgY2ggIT0gRU9GKTsgLy8gLQotCQkJCQkJCWlmIChjaCA9PSBFT0YpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIEVPRiBpbiBjb21tZW50Iik7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChyZWFkKCkgPT0gJy0nKSB7IC8vIC0tIGdldHRpbmcgb3V0IG9mIGEgY29tbWVudAotCQkJCQkJCQl0aHJvdWdoKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVucmVhZChjaCk7Ci0JCQkJCQl1bnJlYWQoJy0nKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRGVmYXVsdERvY3VtZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0RlZmF1bHREb2N1bWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYmFkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRGVmYXVsdERvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIERlZmF1bHQgRG9jdW1lbnRIYW5kbGVyIGNsYXNzLiBUaGlzIGNsYXNzIG1ha2VzIGxpbmtlZCBsaXN0IG9mIGRvY3VtZW50Ci0gKiBoYW5kbGVycy4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHREb2N1bWVudEhhbmRsZXIgaW1wbGVtZW50cyBEb2N1bWVudEhhbmRsZXIgewotCS8qKgotCSAqIE5leHQgRG9jdW1lbnRIYW5kbGVyIG1lc3NhZ2VzIGFyZSBmb3J3YXJkZWQgdG8uCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50SGFuZGxlciBhbm90aGVyOwotCi0JLyoqCi0JICogUGFyc2VyIGluc3RhbmNlIHdoaWNoIHRoaXMgaW5zdGFuY2UgaXMgYWRkZWQgdG8gYW5kIGhvbGRpbmcgYSBuZXh0Ci0JICogaGFuZGxlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU0dNTFBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIERlZmF1bHREb2N1bWVudEhhbmRsZXIgdGhhdCBwb2ludHMgbmV4dCBEb2N1bWVudEhhbmRsZXIgaG9sZAotCSAqIGJ5IHRoZSBwYXJzZXIuCi0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqICAgICAgICAgICAgcGFyc2VyIGluc3RhbmNlIHRoYXQgaG9sZHMgYSBuZXh0IGhhbmRsZXIuCi0JICovCi0JcHVibGljIERlZmF1bHREb2N1bWVudEhhbmRsZXIoU0dNTFBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcy5hbm90aGVyID0gcGFyc2VyLmdldERvY3VtZW50SGFuZGxlcigpOwotCQl0aGlzLnBhcnNlciA9IHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGZvcndhcmRzIHRoaXMgbWV0aG9kIGludm9rYXRpb24gd2l0aCA8Y29kZT5sb2NhdG9yPC9jb2RlPiB0byB0aGUKLQkgKiBuZXh0IGhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikgewotCQlpZiAoYW5vdGhlciAhPSBudWxsKQotCQkJYW5vdGhlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGFub3RoZXIgIT0gbnVsbCkKLQkJCWFub3RoZXIuc3RhcnREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEp1c3QgZm9yd2FyZHMgdGhpcyBtZXRob2QgaW52b2thdGlvbiB3aXRoIDxjb2RlPmxvY2F0b3I8L2NvZGU+IHRvIHRoZQotCSAqIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoYW5vdGhlciAhPSBudWxsKQotCQkJYW5vdGhlci5lbmREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEp1c3QgZm9yd2FyZHMgdGhpcyBtZXRob2QgaW52b2thdGlvbiB3aXRoIDxjb2RlPmxvY2F0b3I8L2NvZGU+IHRvIHRoZQotCSAqIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoYW5vdGhlciAhPSBudWxsKQotCQkJYW5vdGhlci5zdGFydEVsZW1lbnQobmFtZSwgYXR0cyk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoYW5vdGhlciAhPSBudWxsKQotCQkJYW5vdGhlci5lbmRFbGVtZW50KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEp1c3QgZm9yd2FyZHMgdGhpcyBtZXRob2QgaW52b2thdGlvbiB3aXRoIDxjb2RlPmxvY2F0b3I8L2NvZGU+IHRvIHRoZQotCSAqIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChhbm90aGVyICE9IG51bGwpCi0JCQlhbm90aGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEp1c3QgZm9yd2FyZHMgdGhpcyBtZXRob2QgaW52b2thdGlvbiB3aXRoIDxjb2RlPmxvY2F0b3I8L2NvZGU+IHRvIHRoZQotCSAqIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChhbm90aGVyICE9IG51bGwpCi0JCQlhbm90aGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEp1c3QgZm9yd2FyZHMgdGhpcyBtZXRob2QgaW52b2thdGlvbiB3aXRoIDxjb2RlPmxvY2F0b3I8L2NvZGU+IHRvIHRoZQotCSAqIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGFub3RoZXIgIT0gbnVsbCkKLQkJCWFub3RoZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0VsZW1lbnREZWZpbml0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRWxlbWVudERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzZWViMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRWxlbWVudERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXAuSU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgbWFkZSBmcm9tIERURC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZWZpbml0aW9uIGltcGxlbWVudHMgSU1vZGVsR3JvdXAgewotCXByaXZhdGUgYm9vbGVhbiBzdGFydCwgZW5kOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSU1vZGVsR3JvdXAgY29udGVudE1vZGVsOwotCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbiBpbmNsdXNpb25zW107Ci0KLQlwcml2YXRlIEVsZW1lbnREZWZpbml0aW9uIGV4Y2x1c2lvbnNbXTsKLQotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVEZWZzW10gPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvblszMl07Ci0KLQlwcml2YXRlIGludCBhdHRyaWJ1dGVEZWZIYXNoZXNbXSA9IG5ldyBpbnRbMzJdOwotCi0JcHJpdmF0ZSBpbnQgYXR0ck51bSA9IDA7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudERlZmluaXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudERlZmluaXRpb24oU3RyaW5nIG5hbWUsIElNb2RlbEdyb3VwIGNvbnRlbnRNb2RlbCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNvbnRlbnRNb2RlbCA9IGNvbnRlbnRNb2RlbDsKLQl9Ci0KLQlmaW5hbCB2b2lkIGFkZEF0dHJpYnV0ZURlZmluaXRpb24oQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYpIHsKLQkJaWYgKGRlZiAhPSBudWxsKSB7Ci0JCQlpZiAoYXR0ck51bSA9PSBhdHRyaWJ1dGVEZWZzLmxlbmd0aCkgewotCQkJCUF0dHJpYnV0ZURlZmluaXRpb24gbmV3RGVmc1tdID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb25bYXR0ck51bSAqIDJdOwotCQkJCWludCBuZXdIYXNoZXNbXSA9IG5ldyBpbnRbYXR0ck51bSAqIDJdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck51bTsgaSsrKSB7Ci0JCQkJCW5ld0RlZnNbaV0gPSBhdHRyaWJ1dGVEZWZzW2ldOwotCQkJCQluZXdIYXNoZXNbaV0gPSBhdHRyaWJ1dGVEZWZIYXNoZXNbaV07Ci0JCQkJfQotCQkJCWF0dHJpYnV0ZURlZnMgPSBuZXdEZWZzOwotCQkJCWF0dHJpYnV0ZURlZkhhc2hlcyA9IG5ld0hhc2hlczsKLQkJCX0KLQkJCWF0dHJpYnV0ZURlZnNbYXR0ck51bV0gPSBkZWY7Ci0JCQlhdHRyaWJ1dGVEZWZIYXNoZXNbYXR0ck51bSsrXSA9IGhhc2hDb2RlKGRlZi5nZXROYW1lKCkKLQkJCQkJLnRvQ2hhckFycmF5KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgYW4gZW5kIHRhZyBpcyBvbWl0dGFibGUgb3Igbm90Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGFuIGVuZCB0YWcgaXMgb21pdHRhYmxlLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZW5kVGFnT21pdHRhYmxlKCkgewotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIE1hdGNoZXMgPGNvZGU+Y2hpbGQ8L2NvZGU+IHRvIDxjb2RlPnBhcmVudDwvY29kZT4gYnkKLQkgKiA8Y29kZT5wYXJzZXI8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VlZGVkLiBPdGhlcndpc2UsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHN0YXJ0KSB7Ci0JCQlFbGVtZW50IHRtcCA9IHBhcnNlci5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoCi0JCQkJCXBhcnNlci5jaGFuZ2VEZWZhdWx0VGFnQ2FzZShuYW1lKSk7Ci0JCQkvLyBjaGVjayBleGNlcGl0b24KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVjID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCWlmIChleGNsdXNpb24oZWMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKGluY2x1c2lvbihlYykpIHsKLQkJCQkJdG1wLmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQkJcGFyZW50LmFwcGVuZENoaWxkKHRtcCk7Ci0JCQkJCXBhcnNlci5hZGRBdXRvR2VuZXJhdGVkKHRtcCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJvb2xlYW4gcmV0ID0gY29udGVudE1vZGVsLm1hdGNoKHBhcnNlciwgdG1wLCBjaGlsZCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHRtcCk7Ci0JCQkJcGFyc2VyLmFkZEF1dG9HZW5lcmF0ZWQodG1wKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjb250ZW50IG1vZGVsCi0JICogCi0JICogQHJldHVybiBjb250ZW50IG1vZGVsCi0JICovCi0JZmluYWwgSU1vZGVsR3JvdXAgZ2V0Q29udGVudE1vZGVsKCkgewotCQlyZXR1cm4gY29udGVudE1vZGVsOwotCX0KLQotCS8qKgotCSAqIE1hdGNoZXMgPGNvZGU+Y2hpbGQ8L2NvZGU+IHRvIDxjb2RlPnBhcmVudDwvY29kZT4gYnkKLQkgKiA8Y29kZT5wYXJzZXI8L2NvZGU+IGFzIGEgY29uZW50LiBTdXBwb3NlIHRoaXMgaW5zdGFuY2UgaXMgYSBkZWZpbml0aW9uCi0JICogZGVyaXZlZCBmcm9tIDxjb2RlPiZsdDshRUxFTUVOVCBUQk9EWSBPIE8gKFRSKSsmZ3Q7LAotCSAqICZsdDtUUiZndDsgZG9lc24ndCBtYXRjaCAmbHQ7VEJPRFkmZ3Q7IGluIHRoaXMgbWV0aG9kIGJ1dCBpbiB0aGUge0BsaW5rCi0JICogI21hdGNoKFNHTUxQYXJzZXIsb3JnLnczYy5kb20uTm9kZSxvcmcudzNjLmRvbS5Ob2RlKX0gbWV0aG9kLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VlZGVkLiBPdGhlcndpc2UsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRlbnRNYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGNvbnRlbnRNb2RlbC5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIGdldHMgZGVmYXVsdCB2YWx1ZSBvZiBhIHNwZWNpZmllZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gZGVmYXVsdCB2YWx1ZS4gSWYgPGNvZGU+YXR0ck5hbWU8L2NvZGU+IGlzIG5vdCBhbiBhdHRyaWJ1dGUgb2YKLQkgKiAgICAgICAgIHRoaXMgb2JqZWN0LCBudWxsLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFN0cmluZyBhdHRyTmFtZSkgewotCQlpbnQgaGFzaCA9IGhhc2hDb2RlKGF0dHJOYW1lLnRvQ2hhckFycmF5KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOdW07IGkrKykgewotCQkJaWYgKGF0dHJpYnV0ZURlZkhhc2hlc1tpXSA9PSBoYXNoKSB7Ci0JCQkJQXR0cmlidXRlRGVmaW5pdGlvbiBhZCA9IGF0dHJpYnV0ZURlZnNbaV07Ci0JCQkJaWYgKGFkLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCQlyZXR1cm4gYWQuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCWZpbmFsIGJvb2xlYW4gZXhjbHVzaW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZXhjbHVzaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gZXhjbHVzaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGV4Y2x1c2lvbnNbaV0ubmFtZS5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JZmluYWwgYm9vbGVhbiBpbmNsdXNpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpbmNsdXNpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSBpbmNsdXNpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaW5jbHVzaW9uc1tpXS5uYW1lLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROb2RlTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGVsZW1lbnQgZGVmaW5lZCBieSB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIG5hbWUuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlmaW5hbCBib29sZWFuIGluc3RhbmNlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQKLQkJCQkmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgY29udGVudCBtb2RlbAotCSAqLwotCWZpbmFsIHZvaWQgc2V0Q29udGVudE1vZGVsKElNb2RlbEdyb3VwIGFyZykgewotCQljb250ZW50TW9kZWwgPSBhcmc7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRFbmRUYWcoYm9vbGVhbiBlbmQpIHsKLQkJdGhpcy5lbmQgPSBlbmQ7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRFeGNsdXNpb24oRWxlbWVudERlZmluaXRpb24gZXhjbHVzaW9uc1tdKSB7Ci0JCXRoaXMuZXhjbHVzaW9ucyA9IGV4Y2x1c2lvbnM7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRJbmNsdXNpb24oRWxlbWVudERlZmluaXRpb24gaW5jbHVzaW9uc1tdKSB7Ci0JCXRoaXMuaW5jbHVzaW9ucyA9IGluY2x1c2lvbnM7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRTdGFydFRhZyhib29sZWFuIHN0YXJ0KSB7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVja3MgaWYgZGVmaW5pbmcgZWxlbWVudCdzIHN0YXJ0IHRhZyBpcyBvbWl0dGFibGUgb3Igbm90Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0YWcgaXMgb21pdHRhYmxlLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc3RhcnRUYWdPbWl0dGFibGUoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgZGVidWcuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldCA9ICI8IUVMRU1FTlQgIiArIG5hbWUgKyAnICcgKyAoc3RhcnQgPyAnTycgOiAnLScpICsgJyAnCi0JCQkJKyAoZW5kID8gJ08nIDogJy0nKSArICcgJyArICc+JzsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRBdHRyaWJ1dGVEZWYoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWludCBoYXNoID0gaGFzaENvZGUoYXR0ck5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChhdHRyaWJ1dGVEZWZIYXNoZXNbaV0gPT0gaGFzaAotCQkJCQkmJiBhdHRyaWJ1dGVEZWZzW2ldLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGVEZWZzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGhhc2hDb2RlKGNoYXIga2V5W10pIHsKLQkJaW50IHJldCA9IDA7Ci0JCWZvciAoaW50IGkgPSBrZXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCXJldCA9IDI1ICogcmV0ICsgKGtleVtpXSAmIDB4MWYpIC0gMTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVmZXJjb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBTZXRzIHJlZmVyZW5jZSBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBpbmZpbml0ZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmZXJlbmNlZCBpbmZpbml0ZWx5LiBPdGhlcndpc2UsCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JCWlmIChpbmZpbml0ZSkgewotCQkJdGhpcy5pbmZpbml0ZSA9IGluZmluaXRlOwotCQl9IGVsc2UgewotCQkJcmVmZXJjb3VudCsrOwotCQl9Ci0JCWlmIChpbmNsdXNpb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVzaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWluY2x1c2lvbnNbaV0ucmVmZXIodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQljb250ZW50TW9kZWwucmVmZXIoaW5maW5pdGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluZmluaXRlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBpcyBhIHNpbmdsZXRvbiBlbGVtZW50IGluIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgc2luZ2xldG9uLiBPdGhlcndpc2UKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQlyZXR1cm4gIWluZmluaXRlOwotCX0KLQotCWludCBudW1iZXI7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNYWdpYyBOdW1iZXIgb2YgdGhpcyBkZWZpbml0aW9uLiBBIE1hZ2ljIE51bWJlciBpcyB1c2VkIGZvcgotCSAqIGNvbXBhcmlzb24gdG8gbm9kZXMuCi0JICovCi0JcHVibGljIGludCBnZXRNYWdpY051bWJlcigpIHsKLQkJcmV0dXJuIHRoaXMubnVtYmVyOwotCX0KLQotCS8qKgotCSAqIEp1c3QgY2hlY2tzIGEgbm9kZSB3aXRoIDxjb2RlPm51bWJlcjwvY29kZT4gYXMgTWFnaWMgTnVtYmVyIGNhbiBtYXRjaAotCSAqIHRvIGEgcGFyZW50IGRlZmluZWQgYnkgdGhpcyBpbnN0YW5jZS4gUmF0aGVyIHRoYW4ge0BsaW5rCi0JICogI21hdGNoKFNHTUxQYXJzZXIsb3JnLnczYy5kb20uTm9kZSxvcmcudzNjLmRvbS5Ob2RlKX0gb3Ige0BsaW5rCi0JICogI2NvbnRlbnRNYXRjaChTR01MUGFyc2VyLG9yZy53M2MuZG9tLk5vZGUsb3JnLnczYy5kb20uTm9kZSl9LCB0aGlzIGhhcyBubwotCSAqIHNpZGUgZWZmZWN0cy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCXJldHVybiBoYXNoW251bWJlcl07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1c2lvblZlY3RvcltdOwotCi0JZmluYWwgYm9vbGVhbltdIGdldEluY2x1c2lvblZlY3RvcigpIHsKLQkJcmV0dXJuIGluY2x1c2lvblZlY3RvcjsKLQl9Ci0KLQlmaW5hbCBib29sZWFuIGluY2x1c2lvbihpbnQgZWxlbWVudE51bWJlcikgewotCQlyZXR1cm4gaW5jbHVzaW9uVmVjdG9yW2VsZW1lbnROdW1iZXJdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleGNsdXNpb25WZWN0b3JbXTsKLQotCWZpbmFsIGJvb2xlYW5bXSBnZXRFeGNsdXNpb25WZWN0b3IoKSB7Ci0JCXJldHVybiBleGNsdXNpb25WZWN0b3I7Ci0JfQotCi0JZmluYWwgYm9vbGVhbiBleGNsdXNpb24oaW50IGVsZW1lbnROdW1iZXIpIHsKLQkJcmV0dXJuIGV4Y2x1c2lvblZlY3RvcltlbGVtZW50TnVtYmVyXTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzaFtdID0gbnVsbDsKLQotCS8qKgotCSAqIFJlaGFzaGVzIE1hZ2ljIE51bWJlciB2ZWN0b3JzLgotCSAqIAotCSAqIEBwYXJhbSB0b3RhbFNpemUKLQkgKiAgICAgICAgICAgIHNpemUgb2YgdGhlIHZlY3RvcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotCQlpZiAodGhpcy5oYXNoICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5oYXNoOwotCQlpbmNsdXNpb25WZWN0b3IgPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQlpZiAoaW5jbHVzaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1c2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbmNsdXNpb25WZWN0b3JbaW5jbHVzaW9uc1tpXS5udW1iZXJdID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlleGNsdXNpb25WZWN0b3IgPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQlpZiAoZXhjbHVzaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1c2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlleGNsdXNpb25WZWN0b3JbZXhjbHVzaW9uc1tpXS5udW1iZXJdID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQl0aGlzLmhhc2ggPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQlib29sZWFuIGNvbnRlbnRNb2RlbEhhc2hbXSA9IGNvbnRlbnRNb2RlbC5yZWhhc2godG90YWxTaXplKTsKLQkJaWYgKHN0YXJ0KSB7Ci0JCQlpZiAoY29udGVudE1vZGVsSGFzaCA9PSBudWxsKSB7Ci0JCQkJY29udGVudE1vZGVsSGFzaCA9IG5ldyBib29sZWFuW3RvdGFsU2l6ZV07Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gdG90YWxTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQloYXNoW2ldID0gKGluY2x1c2lvblZlY3RvcltpXSB8IGNvbnRlbnRNb2RlbEhhc2hbaV0pCi0JCQkJCQkmICFleGNsdXNpb25WZWN0b3JbaV07Ci0JCQl9Ci0JCX0KLQkJaGFzaFt0aGlzLm51bWJlcl0gPSB0cnVlOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRW5kVGFnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvRW5kVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Zjg5ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0VuZFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBpbnRlcm1lZGlhdGUgZGF0YSBvZiBlbmQgdGFnLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcwotICogYXJlIHVzZWQgaW50ZXJtZWRpYXRlbHkgYnkgcGFyc2Vycywgc28gdGhleSBhcmUgbm90IGluY2x1ZGVkIGluIERPTSB0cmVlCi0gKiBnZW5lcmF0ZWQgYnkgcGFyc2Vycy4KLSAqLwotcHVibGljIGNsYXNzIEVuZFRhZyBleHRlbmRzIFNHTUxOb2RlIHsKLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lOwotCi0JRW5kVGFnKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0YWdOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsd2F5cyAtMQotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzICIiCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyB2YWx1ZSkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiPC8iICsgdGFnTmFtZSArICc+JzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlIGluc3RhbmNlb2YgRW5kVGFnCi0JCQkJJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBHZXRzIGFuIGVsZW1lbnQgdGhpcyBlbmQgdGFnIGNsb3Nlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgdGhpcyBlbmQgdGFnIGNsb3Nlcy4gPGNvZGU+bnVsbDwvY29kZT5pZiB0aGlzIGVuZAotCSAqICAgICAgICAgdGFnIGlzIGFuIGVycm9yIG5vZGUuCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIGVsZW1lbnQgdGhpcyBlbmQgdGFnIGNsb3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYW4KLQkgKiAgICAgICAgICAgIGVsZW1lbnQgdGhpcyBlbmQgdGFnIGNsb3Nlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiBlbGVtZW50ID09IG51bGwgPyBudWxsIDogZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0lFcnJvckxvZ0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSUVycm9yTG9nTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4ZGVhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSUVycm9yTG9nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotLyoqCi0gKiAgSW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhpcyBpbnRlcmZhY2UgaXMgYWRkZWQgdG8ge0BsaW5rIFNHTUxQYXJzZXIgCi0gKiBTR01MUGFyc2VyfSBpbnN0YW5jZSBieSB7QGxpbmsgCi0gKiBTR01MUGFyc2VyI2FkZEVycm9yTG9nTGlzdGVuZXIoRXJyb3JMb2dMaXN0ZW5lcikgCi0gKiBhZGRFcnJvckxvZ0xpc3RlbmVyfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRXJyb3JMb2dMaXN0ZW5lciB7Ci0gICAgLyoqCi0gICAgICogIFJlY29yZHMgZXJyb3IgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3JMb2coaW50IGVycm9yQ29kZSwgU3RyaW5nIG1zZyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSVByaW50WE1MLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSVByaW50WE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTVlYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0lQcmludFhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW50ZXJmYWNlIElQcmludFhNTCB7Ci0Jdm9pZCBwcmludEFzWE1MKFByaW50V3JpdGVyIHB3LCBpbnQgaW5kZW50TGV2ZWwsIGJvb2xlYW4gaW5kZW50KTsKLQotCXZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL0lTR01MQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSVNHTUxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5N2ZkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSVNHTUxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNHTUxDb25zdGFudHMgewotICAgIGludCBFT0YgPSAtMTsKLSAgICBpbnQgTURPID0gMTsgICAgICAgICAvLyA8IQotICAgIGludCBDREFUQSA9IDI7IAotICAgIGludCBJTkNPID0gMzsgICAgICAvLyArKAotICAgIGludCBFWENPID0gNDsgICAgICAvLyAtKAotICAgIGludCBTVFJJTkcgPSA1OwotICAgIGludCBEUVNUUiA9IDY7ICAgICAgIC8vICIuLi4uLiIKLSAgICBpbnQgUVNUUiA9IDc7ICAgICAgICAvLyAnLi4uLi4nCi0gICAgaW50IEVUQUdPID0gODsgICAgICAgLy8gPC8KLSAgICBpbnQgTEVUVEVSID0gOTsKLSAgICBpbnQgRElHSVQgPSAxMDsKLSAgICBpbnQgTkFNRV9DSEFSID0gMTE7Ci0gICAgaW50IE5VTSA9IDEyOwotICAgIGludCBDT01NRU5UID0gMTM7ICAgLy8gPCEtLSAuLi4uIC0tPgotICAgIGludCBQQ0RBVEEgPSAxNDsKLSAgICBpbnQgV0hJVEVTUEFDRSA9IDE1OwotICAgIGludCBQSSA9IDE3OwotICAgIGludCBNSVNDID0gMTAwMDsKLSAgICAKLSAgICBpbnQgRVEgPSAnPSc7ICAgICAgICAvLyA9Ci0gICAgaW50IFRBR0MgPSAnPic7ICAgICAgLy8gPgotICAgIGludCBTVEFHTyA9ICc8JzsgICAgIC8vIDwKLSAgICBpbnQgRFNPID0gJ1snOyAgICAgICAvLyBbCi0gICAgaW50IERTQyA9ICddJzsgICAgICAgLy8gXQotICAgIGludCBQRVJDRU5UID0gJyUnOyAgIC8vICUKLSAgICBpbnQgTEVGVFBBUiA9ICcoJzsgICAvLyAoCi0gICAgaW50IFJJR0hUUEFSID0gJyknOyAgLy8gKQotICAgIGludCBNSU5VUyA9ICctJzsgICAgIC8vIC0KLSAgICBpbnQgT01JVFRBQkxFID0gJ08nOyAvLyBPCi0gICAgaW50IENPTU1BID0gJywnOyAgICAgLy8gLAotICAgIGludCBCQVIgPSAnfCc7ICAgICAgIC8vIHwKLSAgICBpbnQgQU1QQSA9ICcmJzsgICAgICAvLyAmCi0gICAgaW50IFFVRVNUSU9OID0gJz8nOyAgLy8gPwotICAgIGludCBQTFVTID0gJysnOyAgICAgIC8vICsKLSAgICBpbnQgTVVMVEkgPSAnKic7ICAgICAvLyAqCi0gICAgCi0gICAgaW50IERFRkFVTFQgPSAwOyAgICAKLSAgICBpbnQgVEFHID0gMTsKLSAgICBpbnQgRVRBRyA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiAgUmVwcmVzZW50cyBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLkVuZFRhZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORFRBRyA9IC0xOwotCi0gICAgLyoqCi0gICAgICogIEVycm9yIGNvZGUgZm9yIG1pc3NpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbi4gIFRoaXMga2luZCBvZiBlcnJvciBpcyBub3QKLSAgICAgKiBkZWFsdCB3aXRoIGVycm9yIGhhbmRsZXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9DVFlQRV9NSVNTRUQgPSAxOwotICAgIC8qKgotICAgICAqICBFcnJvciBjb2RlIGZvciBzeW50YXggZXJyb3Igb2YgRE9DVFlQRSBkZWNsYXJhdGlvbi4gIFRoaXMga2luZCBvZiBlcnJvcgotICAgICAqIGlzIG5vdCBkZWFsdCB3aXRoIGVycm9yIGhhbmRsZXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9ET0NUWVBFID0gMjsKLSAgICAvKioKLSAgICAgKiAgRXJyb3IgY29kZSBmb3IgYW4gaWxsZWdhbCB0b3AgZWxlbWVudC4gIEZvciBIVE1MIGV4YW1wbGUsICBpZiBhbiBIVE1MCi0gICAgICogZG9jdW1lbnQgc3RhcnRzIHdpdGggJmx0O0xJJmd0OyBhcyBmb2xsb3dzLCB0aGlzIGlzIGFuIGlsbGVnYWwgdG9wIGVsZW1lbnQuCi0gICAgICogQmVjYXVzZSBvZiB0aGUgZG9jdHlwZSBkZWNsYXJhdGlvbiB0aGUgZG9jdW1lbnQgbXVzdCBzdGFydCB3aXRoICZsdDtIVE1MJmd0OwotICAgICAqIDxwcmU+Ci0gICAgICogICAmbHQ7IURPQ1RZUEUgPGVtPkhUTUw8L2VtPiBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiImZ3Q7Ci0gICAgICogICA8ZW0+Jmx0O0xJJmd0OzwvZW0+Ci0gICAgICogPC9wcmU+Ci0gICAgICogICBUaGlzIGtpbmQgb2YgZXJyb3IgaXMgbm90IGRlYWx0IHdpdGggZXJyb3IgaGFuZGxlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTExFR0FMX1RPUF9FTEVNRU5UID0gMzsKLSAgICAvKioKLSAgICAgKiAgRXJyb3IgY29kZSBmb3IgYW4gaWxsZWdhbCBhdHRyaWJ1dGUuICBJZiBhbiBlbGVtZW50IGhhcyBhbiB1bmtub3duCi0gICAgICogYXR0cmlidXRlLCAgdGhhdCBpcyBhbiBpbGxlZ2FsIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTExFR0FMX0FUVFJJQlVURSA9IDQ7Ci0gICAgLyoqCi0gICAgICogIEVycm9yIGNvZGUgZm9yIGEgZmxvYXRpbmcgZW5kdGFnLiAgRW5kdGFncyB3aG9zZSBjb3JyZXNwb25kaW5nIHN0YXJ0IHRhZwotICAgICAqIGlzIG1pc3NpbmcgYXJlIGRlZmluZWQgYXMgPGVtPmZsb2F0aW5nPC9lbT4uICBGb3IgSFRNTCBleGFtcGxlLCBmb2xsb3dpbmcKLSAgICAgKiAmbHQ7L1AmZ3Q7IGlzIGZsb2F0aW5nIGJlY2F1c2UgdGhlIFAgZWxlbWVudCBpcyBjbG9zZWQgYmVmb3JlIEhSLgotICAgICAqIDxwcmU+Ci0gICAgICogICAmbHQ7UCZndDsKLSAgICAgKiAgICAgLi4uCi0gICAgICogICAmbHQ7IS0tIEhlcmUgaXMgYW4gb21pdHRlZCBlbmQgdGFnIG9mIFAgYmVjYXNlIGZvbGxvd2luZyBIUiBpcyBub3cgYWxsb3dlZAotICAgICAqICAgICAgICAgICBhcyBhIGNoaWxkIG9mIFAgLS0mZ3Q7Ci0gICAgICogICAmbHQ7SFImZ3Q7Ci0gICAgICogICAgIC4uLgotICAgICAqICAgJmx0Oy9QJmd0OyAgIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUSU5HX0VORFRBRyA9IDU7Ci0gICAgLyoqCi0gICAgICogIEVycm9yIGNvZGUgZm9yIHN1ZGRlbiBlbmR0YWcuICBBIHN0cmFuZ2UgZW5kdGFnIHRoYXQgYXBwZWFycyBpbiBzb21lCi0gICAgICogY29udGV4dCBpcyBkZWZpbmVkIGFzIDxlbT5zdWRkZW48L2VtPi4gIEZvciBIVE1MIGV4YW1wbGUsIGZvbGxvd2luZyA8ZW0+Ci0gICAgICogJmx0Oy9JJmd0OzwvZW0+IGlzIHN1ZGRlbi4KLSAgICAgKiA8cHJlPgotICAgICAqICAgICZsdDtJJmd0OyAuLi4gJmx0O0ImZ3Q7IC4uLiA8ZW0+Jmx0Oy9JJmd0OzwvZW0+IC4uLiAmbHQ7L0ImZ3Q7Ci0gICAgICogPC9wcmU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VEREVOX0VORFRBRyA9IDY7Ci0gICAgLyoqCi0gICAgICogIEVycm9yIGNvZGUgZm9yIGlsbGVnYWwgY2hpbGQuICBBIG5vZGUgdGhhdCBpcyBub3QgYWxsb3dlZCBhcyBhIGNoaWxkIG9mCi0gICAgICogY29udGV4dCdzIGVsZW1lbnQgaXMgZGVmaW5lZCBhcyBhbiBpbGxlZ2FsIGNoaWxkLiAgRm9yIEhUTUwgZXhhbXBsZSwKLSAgICAgKiBmb2xsb3dpbmcgPGVtPlA8L2VtPiBlbGVtZW50IGlzIGFuIGlsbGVnYWwgY2hpbGQgb2YgSEVBRAotICAgICAqIDxwcmU+Ci0gICAgICogICZsdDtIVE1MJmd0OwotICAgICAqICAgJmx0O0hFQUQmZ3Q7Ci0gICAgICogICAgPGVtPiZsdDtQJmd0OyBJbGxlZ2FsICZsdDsvUCZndDsgPC9lbT4KLSAgICAgKiAgICAmbHQ7VElUTEUmZ3Q7Ci0gICAgICogIC4uLgotICAgICAqIDwvcHJlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElMTEVHQUxfQ0hJTEQgPSA3OwotICAgIC8qKgotICAgICAqICBFcnJvciBjb2RlIGZvciB1bmtub3duIGVsZW1lbnRzIChub3QgZGVmaW5lZCBpbiBwcmUtcmVhZCBEVEQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9FTEVNRU5UID0gODsKLSAgICAvKioKLSAgICAgKiAgRXJyb3IgY29kZSBmb3Igc3ludGF4IGVycm9yIG9mIHN0YXJ0IHRhZyB0ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUVEFHX1NZTlRBWF9FUlIgPSA5OwotICAgIC8qKgotICAgICAqICBFcnJvciBjb2RlIGZvciBtaXNjZWxsZW5pb3VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTQ19FUlIgPSAxMDsKLQotICAgIC8qKgotICAgICAqICBFcnJvciBjb2RlIGZvciB0b2tlbi1sZXZlbCBlcnJvciBvZiBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUl9WQUxVRSA9IDExOwotICAgIC8qKgotICAgICAqICBFcnJvciBjb2RlIGZvciB0b2tlbi1sZXZlbCBlcnJvciBiZWZvcmUgYXR0cmlidXRlJ3MgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUZPUkVfQVRUUk5BTUUgPSAxMjsKLSAgICAvKioKLSAgICAgKiAgRXJyb3IgY29kZSBmb3IgdG9rZW4tbGV2ZWwgZXJyb3Igb2YgdGFnIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFHX05BTUUgPSAxMzsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9JbnNUb2tlbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9JbnNUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyOTBkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvSW5zVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVG9rZW5pemVyIGZvciBkb2N1bWVudCBpbnN0YW5jZS4KLSAqLwotY2xhc3MgSW5zVG9rZW5pemVyIGltcGxlbWVudHMgSVNHTUxDb25zdGFudHMsIExvY2F0b3IgewotCXByaXZhdGUgYm9vbGVhbiBleHRyYWN0Q2hhciA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXh0cmFjdE51bSA9IHRydWU7Ci0KLQlwcml2YXRlIGludCBzdGF0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBwdXNoQmFja2VkOwotCi0JcHVibGljIFN0cmluZyBzdmFsOwotCi0JcHVibGljIGludCB0dHlwZTsKLQotCXByaXZhdGUgUmVhZGVyIHJlYWRlcjsKLQotCXZvaWQgZXh0cmFjdENoYXJFbnRpdHkoYm9vbGVhbiBiKSB7Ci0JCWV4dHJhY3RDaGFyID0gYjsKLQl9Ci0KLQl2b2lkIGV4dHJhY3ROdW1FbnRpdHkoYm9vbGVhbiBiKSB7Ci0JCWV4dHJhY3ROdW0gPSBiOwotCX0KLQotCXByaXZhdGUgU0dNTFBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIEluc1Rva2VuaXplciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICByZWFkZXIgdGhhdCByZWFkIFNHTUwgRG9jdW1lbnRzLgotCSAqLwotCXB1YmxpYyBJbnNUb2tlbml6ZXIoUmVhZGVyIHJlYWRlciwgU0dNTFBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcyhyZWFkZXIsIERFRkFVTFQsIHBhcnNlcik7Ci0JfQotCi0JSW5zVG9rZW5pemVyKFJlYWRlciByZWFkZXIsIGludCBzdGF0ZSwgU0dNTFBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0JCXB1c2hCYWNrZWQgPSBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yd2FyZChTdHJpbmcgc3RyLCBib29sZWFuIGlnbm9yZUNhc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBidWZbXSA9IG5ldyBpbnRbc3RyLmxlbmd0aCgpXTsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlpbnQgaTsKLQkJaWYgKCFpZ25vcmVDYXNlKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmW2ldID0gcmVhZCgpOwotCQkJCWlmIChidWZbaV0gIT0gc3RyLmNoYXJBdChpKSkgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaSsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmW2ldID0gcmVhZCgpOwotCQkJCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpIGJ1ZltpXSkgIT0gQ2hhcmFjdGVyCi0JCQkJCQkudG9VcHBlckNhc2Uoc3RyLmNoYXJBdChpKSkKLQkJCQkJCSYmIENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgYnVmW2ldKSAhPSBDaGFyYWN0ZXIKLQkJCQkJCQkJLnRvTG93ZXJDYXNlKHN0ci5jaGFyQXQoaSkpKSB7Ci0JCQkJCXJldCA9IGZhbHNlOwotCQkJCQlpKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAoaSA+IDApCi0JCQl1bnJlYWQoYnVmWy0taV0pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgaW50IGVhdENvbW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQkJaW50IGNoOwotCQltaXNjSW5kZXggPSAwOwotCQlpZiAoKGNoID0gcmVhZCgpKSA9PSAnLScpIHsgLy8gPCEtCi0KLQkJCWlmICgoY2ggPSByZWFkKCkpID09ICctJykgeyAvLyA8IS0tIGVudGVyIGNvbW1lbnQKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnLScgJiYgY2ggIT0gRU9GKSB7Ci0JCQkJCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgKGNoYXIpIGNoKTsKLQkJCQkJCW1pc2NJbmRleCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoY2ggPSByZWFkKCkpID09ICctJykgeyAvLyAtLQotCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7Ci0JCQkJCQkJLy8gVGhpcyBpcyBhIHZlcnkgbmFzdHkgY2FzZS4gPCEtLSAuLi4gLS0tLi4uPgotCQkJCQkJCS8vIGVhdCBjb21tZW50IHVudGlsICc+JyBhcHBlYXJzLgotCQkJCQkJCWlmIChtaXNjQnVmZmVyLmxlbmd0aCA8PSBtaXNjSW5kZXggKyAyKSB7Ci0JCQkJCQkJCWV4cGFuZE1pc2NCdWZmZXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbWlzY0J1ZmZlclttaXNjSW5kZXhdID0gbWlzY0J1ZmZlclttaXNjSW5kZXggKyAxXSA9IG1pc2NCdWZmZXJbbWlzY0luZGV4ICsgMl0gPSAnLSc7Ci0JCQkJCQkJbWlzY0luZGV4ICs9IDM7Ci0JCQkJCQkJc3RvcmVVbnRpbCgnPicpOwotCQkJCQkJCWlmIChDaGFyYWN0ZXIKLQkJCQkJCQkJCS5pc1doaXRlc3BhY2UobWlzY0J1ZmZlclttaXNjSW5kZXggLSAxXSkKLQkJCQkJCQkJCXx8IG1pc2NCdWZmZXJbbWlzY0luZGV4IC0gMV0gPT0gJy0nCi0JCQkJCQkJCQl8fCBtaXNjQnVmZmVyW21pc2NJbmRleCAtIDFdID09ICchJykgewotCQkJCQkJCQlpZiAobWlzY0J1ZmZlclttaXNjSW5kZXggLSAyXSA9PSAnLScKLQkJCQkJCQkJCQkmJiBtaXNjQnVmZmVyW21pc2NJbmRleCAtIDFdID09ICctJykgewotCQkJCQkJCQkJbWlzY0luZGV4IC09IDI7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCQkJCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQkJCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJCQkJCXJldHVybiAodHR5cGUgPSBDT01NRU5UKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgJz4nKTsKLQkJCQkJCQkJbWlzY0luZGV4Kys7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoY2ggPT0gJyEnKSB7IC8vIGRvZXNuJ3QgbWVldCBzcGVjaWZpY2F0aW9uLAotCQkJCQkJCQkJCQkJLy8gYnV0Li4uCi0JCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJz4nKSB7Ci0JCQkJCQkJCXN0YXRlID0gREVGQVVMVDsKLQkJCQkJCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQkJCQkJcGFyc2VyLnNldENoYXJhY3RlcihtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQkJCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKG1pc2NCdWZmZXIubGVuZ3RoIDw9IG1pc2NJbmRleCArIDIpIHsKLQkJCQkJCQkJCWV4cGFuZE1pc2NCdWZmZXIoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQltaXNjQnVmZmVyW21pc2NJbmRleF0gPSBtaXNjQnVmZmVyW21pc2NJbmRleCArIDFdID0gJy0nOwotCQkJCQkJCQltaXNjQnVmZmVyW21pc2NJbmRleCArIDJdID0gJyEnOwotCQkJCQkJCQltaXNjSW5kZXggKz0gMzsKLQkJCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaW50IHdzSW5kZXggPSAwOwotCQkJCQkJY2hhciB3c1tdID0gbnVsbDsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpIHsKLQkJCQkJCQkvLyBDb21wcmVzc2VkIFJlcHJlc2VudGF0aW9uLgotCQkJCQkJCXdzID0gbmV3IGNoYXJbMjU2XTsKLQkJCQkJCQl3c1swXSA9IChjaGFyKSBjaDsKLQkJCQkJCQl3c1sxXSA9IDE7Ci0JCQkJCQkJd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSkgewotCQkJCQkJCQlpZiAoY2ggPT0gd3Nbd3NJbmRleF0pIHsKLQkJCQkJCQkJCXdzW3dzSW5kZXggKyAxXSsrOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJd3NJbmRleCArPSAyOwotCQkJCQkJCQkJd3Nbd3NJbmRleF0gPSAoY2hhcikgY2g7Ci0JCQkJCQkJCQl3c1t3c0luZGV4ICsgMV0gPSAxOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNoID0gcmVhZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChjaCA9PSAnPicpIHsKLQkJCQkJCQlzdGF0ZSA9IERFRkFVTFQ7Ci0JCQkJCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQkJCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJCQkJcmV0dXJuICh0dHlwZSA9IENPTU1FTlQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAobWlzY0J1ZmZlci5sZW5ndGggPD0gbWlzY0luZGV4ICsgMikgewotCQkJCQkJCQlleHBhbmRNaXNjQnVmZmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCW1pc2NCdWZmZXJbbWlzY0luZGV4XSA9IG1pc2NCdWZmZXJbbWlzY0luZGV4ICsgMV0gPSAnLSc7Ci0JCQkJCQkJbWlzY0luZGV4ICs9IDI7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c0luZGV4OyBpICs9IDIpIHsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3c1tpICsgMV07IGorKykKLQkJCQkJCQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCB3c1tpXSk7Ci0JCQkJCQkJCW1pc2NJbmRleCsrOwotCQkJCQkJCX0KLQkJCQkJCQl1bnJlYWQoY2gpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGNoID09IEVPRikgewotCQkJCQkJcGFyc2VyLmVycm9yKE1JU0NfRVJSLCAiVW5leHBlY3RlZCBFT0YgaW4gY29tbWVudC4iKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlzY0J1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChtaXNjQnVmZmVyW2ldID09ICc+JykgewotCQkJCQkJCQl1bnJlYWQobWlzY0J1ZmZlciwgaSArIDEsIG1pc2NJbmRleCAtIGkgLSAxKTsKLQkJCQkJCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCQkJCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBpKTsKLQkJCQkJCQkJcGFyc2VyLnNldENoYXJhY3RlcihtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQkJCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIEVPRiBpbiBjb21tZW50LiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsICctJyk7Ci0JCQkJCQltaXNjSW5kZXgrKzsKLQkJCQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCAoY2hhcikgY2gpOwotCQkJCQkJbWlzY0luZGV4Kys7Ci0JCQkJCX0KLQkJCQl9IC8vIHdoaWxlICh0cnVlKSB7Ci0JCQl9IGVsc2UgeyAvLyA8IS0KLQkJCQkvLyBpZiBmaW5pc2hlZCByZWFkaW5nIGR0ZCwgZGVhbHMgd2l0aCA8IS0gLi4uID4gYXMgYSBjb21tZW50Ci0JCQkJc3ZhbCA9ICItIiArIChjaGFyKSBjaCArIGVhdFVudGlsKCc+Jyk7Ci0JCQkJY2hhciBzdmFsQ2hhcltdID0gc3ZhbC50b0NoYXJBcnJheSgpOwotCQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIoc3ZhbENoYXIsIDAsIHN2YWxDaGFyLmxlbmd0aCk7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IENPTU1FTlQpOwotCQkJfQotCQl9IGVsc2UgaWYgKChjaCA9PSAnRCcgfHwgY2ggPT0gJ2QnKSAmJiBmb3J3YXJkKCJPQ1RZUEUiLCB0cnVlKSkgeyAvLyBjaGVjaAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlmCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gPCFET0NUWVBFCi0JCQl1bnJlYWQoY2gpOwotCQkJc3RhdGUgPSBUQUc7Ci0JCQlyZXR1cm4gKHR0eXBlID0gTURPKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIGZpbmlzaGVkIHJlYWRpbmcgZHRkLCBkZWFscyB3aXRoIDwhIC4uLiA+IGFzIGEgY29tbWVudAotCQkJc3ZhbCA9IChjaGFyKSBjaCArIGVhdFVudGlsKCc+Jyk7Ci0JCQljaGFyIHN2YWxDaGFyW10gPSBzdmFsLnRvQ2hhckFycmF5KCk7Ci0JCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKHN2YWxDaGFyLCAwLCBzdmFsQ2hhci5sZW5ndGgpOwotCQkJcmV0dXJuICh0dHlwZSA9IENPTU1FTlQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZXRhZ1N0YXJ0SW5kZXg7Ci0KLQlwcml2YXRlIGludCBkZWZhdWx0U3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQltaXNjSW5kZXggPSAwOwotCQlpbnQgY2ggPSByZWFkKCk7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpIHsKLQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCWNoID0gcmVhZCgpOwotCQl9Ci0JCWlmIChtaXNjSW5kZXggPiAwKSB7Ci0JCQlpZiAocHJzdldTKSB7Ci0JCQkJdW5yZWFkKGNoKTsKLQkJCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQlyZXR1cm4gKHR0eXBlID0gV0hJVEVTUEFDRSk7Ci0JCQl9Ci0JCX0KLQkJc3dpdGNoIChjaCkgewotCQljYXNlICc8JzoKLQkJCWlmIChtaXNjSW5kZXggPiAwICYmICFwcnN2V1MpIHsKLQkJCQlEb2N1bWVudEhhbmRsZXIgZG9jSGFuZGxlciA9IHBhcnNlci5nZXREb2N1bWVudEhhbmRsZXIoKTsKLQkJCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCWRvY0hhbmRsZXIuaWdub3JhYmxlV2hpdGVzcGFjZShtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQlyZWFkKCk7Ci0JCQkJfQotCQkJfQotCQkJbWlzY0luZGV4ID0gMDsKLQkJCWlmICgoY2ggPSByZWFkKCkpID09ICcvJykgewotCQkJCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoKGNoYXIpIChjaCA9IHJlYWQoKSkpCi0JCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIGNoKSkgewotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlzdGF0ZSA9IEVUQUc7Ci0JCQkJCWV0YWdTdGFydEluZGV4ID0gbWlzY0luZGV4OwotCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCc8Jyk7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJy8nKTsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IEVUQUdPKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCc8Jyk7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJy8nKTsKLQkJCQkJcmV0dXJuIHJlYWRQQ0RBVEEoY2gpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2ggPT0gJz8nKSB7Ci0JCQkJbWlzY0luZGV4ID0gMDsKLQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnPicgJiYgY2ggIT0gRU9GKSB7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCQl9Ci0JCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQlyZXR1cm4gKHR0eXBlID0gUEkpOwotCQkJfSBlbHNlIGlmIChjaCA9PSAnIScpIHsgLy8gZGVjbGFyYXRpb24uCi0JCQkJcmV0dXJuIGVhdENvbW1lbnQoKTsKLQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKChjaGFyKSBjaCkKLQkJCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBjaCkpIHsKLQkJCQl1bnJlYWQoY2gpOwotCQkJCXN0YXRlID0gVEFHOwotCQkJCXJldHVybiAodHR5cGUgPSBTVEFHTyk7Ci0JCQl9IGVsc2UgewotCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJzwnKTsKLQkJCQlyZXR1cm4gcmVhZFBDREFUQShjaCk7Ci0JCQl9Ci0JCWNhc2UgRU9GOgotCQkJcmV0dXJuICh0dHlwZSA9IEVPRik7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gcmVhZFBDREFUQShjaCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBlbnRpdHlCdWZbXSA9IG5ldyBpbnRbNjRdOwotCi0JcHJpdmF0ZSBpbnQgZW50aXR5QnVmSW5kZXg7Ci0KLQlwcml2YXRlIGludCByc2x2Q2hhckVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWVudGl0eUJ1ZkluZGV4ID0gMDsKLQkJaW50IGNoID0gZW50aXR5QnVmW2VudGl0eUJ1ZkluZGV4KytdID0gcmVhZCgpOwotCQlpZiAoY2ggPT0gJyMnKSB7Ci0JCQljaCA9IGVudGl0eUJ1ZltlbnRpdHlCdWZJbmRleCsrXSA9IHJlYWQoKTsKLQkJCWludCByYWRpeCA9IDEwOwotCQkJaWYgKGNoID09ICd4JyB8fCBjaCA9PSAnWCcpIHsKLQkJCQlyYWRpeCA9IDE2OwotCQkJCWNoID0gZW50aXR5QnVmW2VudGl0eUJ1ZkluZGV4KytdID0gcmVhZCgpOwotCQkJfQotCQkJaW50IGsgPSBDaGFyYWN0ZXIuZGlnaXQoKGNoYXIpIGNoLCByYWRpeCk7Ci0JCQlpZiAoayA+PSAwKSB7Ci0JCQkJaW50IG51bSA9IGs7Ci0JCQkJY2ggPSBlbnRpdHlCdWZbZW50aXR5QnVmSW5kZXgrK10gPSByZWFkKCk7Ci0JCQkJd2hpbGUgKChrID0gQ2hhcmFjdGVyLmRpZ2l0KChjaGFyKSBjaCwgcmFkaXgpKSA+PSAwKSB7Ci0JCQkJCW51bSA9IG51bSAqIHJhZGl4ICsgazsKLQkJCQkJY2ggPSBlbnRpdHlCdWZbZW50aXR5QnVmSW5kZXgrK10gPSByZWFkKCk7Ci0JCQkJfQotCQkJCWlmIChjaCA9PSAnOycpIHsKLQkJCQkJY2hhciBvcmlnW10gPSBuZXcgY2hhcltlbnRpdHlCdWZJbmRleCAtIDFdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudGl0eUJ1ZkluZGV4IC0gMTsgaSsrKSB7Ci0JCQkJCQlvcmlnW2ldID0gKGNoYXIpIGVudGl0eUJ1ZltpXTsKLQkJCQkJfQotCQkJCQlwYXJzZXIucHV0Q2hhck51bUVudGl0eShuZXcgQ2hhcmFjdGVyKChjaGFyKSBudW0pLAotCQkJCQkJCW5ldyBTdHJpbmcob3JpZykpOwotCQkJCQlyZXR1cm4gbnVtOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoKGNoYXIpIGNoKQotCQkJCXx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgY2gpKSB7Ci0JCQlkbyB7Ci0JCQkJY2ggPSBlbnRpdHlCdWZbZW50aXR5QnVmSW5kZXgrK10gPSByZWFkKCk7Ci0JCQl9IHdoaWxlIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoKGNoYXIpIGNoKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIGNoKSk7Ci0JCQlpZiAoY2ggPT0gJzsnKSB7Ci0JCQkJY2hhciBvcmlnW10gPSBuZXcgY2hhcltlbnRpdHlCdWZJbmRleCAtIDFdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50aXR5QnVmSW5kZXggLSAxOyBpKyspCi0JCQkJCW9yaWdbaV0gPSAoY2hhcikgZW50aXR5QnVmW2ldOwotCQkJCVN0cmluZyBvcmdTdHIgPSBuZXcgU3RyaW5nKG9yaWcpOwotCQkJCWludCBjaGFyRW50aXR5ID0gcGFyc2VyLmdldENoYXJFbnRpdHkob3JnU3RyKTsKLQkJCQlpZiAoY2hhckVudGl0eSAhPSAtMSkgewotCQkJCQlwYXJzZXIucHV0Q2hhck51bUVudGl0eShuZXcgQ2hhcmFjdGVyKChjaGFyKSBjaGFyRW50aXR5KSwKLQkJCQkJCQlvcmdTdHIpOwotCQkJCQlyZXR1cm4gY2hhckVudGl0eTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGVudGl0eUJ1ZkluZGV4IC0gMTsgaSA+PSAwOyBpLS0pCi0JCQl1bnJlYWQoZW50aXR5QnVmW2ldKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDaGFyVG9NaXNjQnVmZmVyKGludCBtaXNjSW5kZXgsIGNoYXIgYykgewotCQlpZiAobWlzY0J1ZmZlci5sZW5ndGggPD0gbWlzY0luZGV4KSB7Ci0JCQlleHBhbmRNaXNjQnVmZmVyKCk7Ci0JCX0KLQkJbWlzY0J1ZmZlclttaXNjSW5kZXhdID0gYzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2hhclRvTWlzY0J1ZmZlcihjaGFyIGMpIHsKLQkJaWYgKG1pc2NCdWZmZXIubGVuZ3RoIDw9IG1pc2NJbmRleCkgewotCQkJZXhwYW5kTWlzY0J1ZmZlcigpOwotCQl9Ci0JCW1pc2NCdWZmZXJbbWlzY0luZGV4KytdID0gYzsKLQl9Ci0KLQlwcml2YXRlIGludCByZWFkUENEQVRBKGludCBjdXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sCi0JCQlTQVhFeGNlcHRpb24gewotCQlpbnQgc3VjY2VlZGluZzsKLQkJaW50IGZpcnN0TEZpbmRleCA9IHRoaXMubGFzdExGaW5kZXg7Ci0JCWlmICghZXh0cmFjdENoYXIgJiYgIWV4dHJhY3ROdW0pIHsKLQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCAoY2hhcikgY3VyKTsKLQkJCW1pc2NJbmRleCsrOwotCi0JCQl3aGlsZSAoKChjdXIgPSByZWFkKCkpICE9ICc8JyB8fCAhQ2hhcmFjdGVyCi0JCQkJCS5pc0xvd2VyQ2FzZSgoY2hhcikgKHN1Y2NlZWRpbmcgPSBzZW5jZSgpKSkKLQkJCQkJJiYgIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgc3VjY2VlZGluZykKLQkJCQkJJiYgc3VjY2VlZGluZyAhPSAnIScKLQkJCQkJJiYgc3VjY2VlZGluZyAhPSAnPycKLQkJCQkJJiYgKHN1Y2NlZWRpbmcgIT0gJy8nIHx8ICFDaGFyYWN0ZXIKLQkJCQkJCQkuaXNMb3dlckNhc2UoKGNoYXIpIChzdWNjZWVkaW5nID0gc2VuY2UoMSkpKQotCQkJCQkJCSYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIHN1Y2NlZWRpbmcpKSkKLQkJCQkJJiYgY3VyICE9IEVPRikgewotCQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCAoY2hhcikgY3VyKTsKLQotCQkJCWlmIChtaXNjQnVmZmVyW21pc2NJbmRleCAtIDFdID09ICdcbicgJiYgY3VyICE9ICdcbicpIHsKLQkJCQkJZmlyc3RMRmluZGV4ID0gdGhpcy5pbmRleCAtIDE7Ci0JCQkJfQotCQkJCW1pc2NJbmRleCsrOwotCQkJfQotCQl9IGVsc2UgaWYgKGN1ciAhPSBFT0YpIHsKLQkJCWRvIHsKLQkJCQlpZiAoY3VyID09ICcmJykgewotCQkJCQlpZiAoIWV4dHJhY3ROdW0pIHsKLQkJCQkJCWlmICgoY3VyID0gcmVhZCgpKSA9PSAnIycpIHsKLQkJCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCcmJyk7Ci0JCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignIycpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl1bnJlYWQoY3VyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnQgY2hhckVudGl0eSA9IHJzbHZDaGFyRW50KCk7Ci0JCQkJCWlmIChjaGFyRW50aXR5ID09IC0xKSB7Ci0JCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCcmJyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaGFyRW50aXR5KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCAoY2hhcikgY3VyKTsKLQkJCQkJaWYgKG1pc2NJbmRleCA+IDAgJiYgbWlzY0J1ZmZlclttaXNjSW5kZXggLSAxXSA9PSAnXG4nCi0JCQkJCQkJJiYgY3VyICE9ICdcbicpIHsKLQkJCQkJCWZpcnN0TEZpbmRleCA9IHRoaXMuaW5kZXggLSAyOwotCQkJCQl9Ci0JCQkJCW1pc2NJbmRleCsrOwotCQkJCX0KLQkJCX0gd2hpbGUgKCgoY3VyID0gcmVhZCgpKSAhPSAnPCcgfHwgIUNoYXJhY3RlcgotCQkJCQkuaXNMb3dlckNhc2UoKGNoYXIpIChzdWNjZWVkaW5nID0gc2VuY2UoKSkpCi0JCQkJCSYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIHN1Y2NlZWRpbmcpCi0JCQkJCSYmIHN1Y2NlZWRpbmcgIT0gJyEnCi0JCQkJCSYmIHN1Y2NlZWRpbmcgIT0gJz8nCi0JCQkJCSYmIChzdWNjZWVkaW5nICE9ICcvJyB8fCAhQ2hhcmFjdGVyCi0JCQkJCQkJLmlzTG93ZXJDYXNlKChjaGFyKSAoc3VjY2VlZGluZyA9IHNlbmNlKDEpKSkKLQkJCQkJCQkmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBzdWNjZWVkaW5nKSkpCi0JCQkJCSYmIGN1ciAhPSBFT0YpOwotCQl9Ci0JCWlmIChjdXIgIT0gRU9GKQotCQkJdW5yZWFkKGN1cik7Ci0JCWlmICghcHJzdldTKSB7Ci0JCQlpbnQgYmVnaW4gPSAwOwotCQkJd2hpbGUgKChjdXIgPSBtaXNjQnVmZmVyW2JlZ2luXSkgPT0gJ1xyJyB8fCBjdXIgPT0gJ1xuJykKLQkJCQliZWdpbisrOwotCQkJaW50IGVuZCA9IG1pc2NJbmRleCAtIDE7Ci0JCQl0cnkgewotCQkJCXdoaWxlICgoY3VyID0gbWlzY0J1ZmZlcltlbmRdKSA9PSAnXHInIHx8IGN1ciA9PSAnXG4nKQotCQkJCQllbmQtLTsKLQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IFBDREFUQSk7Ci0JCQl9Ci0JCQlpbnQgbGVuID0gZW5kICsgMSAtIGJlZ2luOwotCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgYmVnaW4sIGxlbik7Ci0JCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKG1pc2NCdWZmZXIsIGJlZ2luLCBsZW4pOwotCQkJaWYgKGVuZCAhPSBtaXNjSW5kZXggLSAxKSB7Ci0JCQkJdW5yZWFkKG1pc2NCdWZmZXIsIGVuZCArIDEsIG1pc2NJbmRleCAtIGVuZCAtIDEpOwotCQkJCWxhc3RMRmluZGV4ID0gZmlyc3RMRmluZGV4OwotCQkJfQotCQl9IGVsc2UgewotCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCXJldHVybiAodHR5cGUgPSBXSElURVNQQUNFKTsKLQkJfQotCQlyZXR1cm4gKHR0eXBlID0gUENEQVRBKTsKLQl9Ci0KLQlwcml2YXRlIGNoYXIgZW5kVGFnQnVmZmVyW10gPSBuZXcgY2hhcls2NF07Ci0KLQkvKioKLQkgKiBHZXRzIHJhdyB0ZXh0IHVwIHRvIGVuZCB0YWcgc3BlY2lmaWVkKCZsdDs8Y29kZT5lbmQ8L2NvZGU+Jmd0OykKLQkgKiAKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBzcGVjaWZlZCBlbmQgdGFncyBuYW1lCi0JICogQHJldHVybiByYXcgdGV4dCB1cCB0byBzcGVjaWZpZWQgZW5kIHRhZy4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgcmF3VGV4dChTdHJpbmcgZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQkJY2hhciBlbmRUYWdBcnJheVtdID0gZW5kLnRvVXBwZXJDYXNlKCkudG9DaGFyQXJyYXkoKTsKLQkJaW50IGNoOwotCQltaXNjSW5kZXggPSAwOwotCQlpbnQgbGltaXRDYW5kaWRhdGUgPSAwOwotCi0JCWJvb2xlYW4gaW5Db21tZW50ID0gZmFsc2U7Ci0KLQkJb3V0ZXI6IHdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IHJlYWQoKTsKLQkJCWlmICghaW5Db21tZW50ICYmIGNoID09ICc8JykgewotCQkJCWNoID0gcmVhZCgpOwotCQkJCWlmIChjaCA9PSAnLycpIHsKLQkJCQkJaWYgKGxpbWl0Q2FuZGlkYXRlID09IDApIHsKLQkJCQkJCWxpbWl0Q2FuZGlkYXRlID0gbWlzY0luZGV4OwotCQkJCQl9Ci0JCQkJCWVuZFRhZ0J1ZmZlckluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQubGVuZ3RoKCk7IGkrKykgewotCQkJCQkJZW5kVGFnQnVmZmVyW2VuZFRhZ0J1ZmZlckluZGV4XSA9IChjaGFyKSByZWFkKCk7Ci0JCQkJCQlpZiAoKGVuZFRhZ0J1ZmZlcltlbmRUYWdCdWZmZXJJbmRleF0gJiAweGZmZGYpID09IGVuZFRhZ0FycmF5W2VuZFRhZ0J1ZmZlckluZGV4XSkgewotCQkJCQkJCWVuZFRhZ0J1ZmZlckluZGV4Kys7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVuZFRhZ0J1ZmZlckluZGV4Kys7Ci0JCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignPCcpOwotCQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJy8nKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVuZFRhZ0J1ZmZlckluZGV4OyBqKyspIHsKLQkJCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcihlbmRUYWdCdWZmZXJbal0pOwotCQkJCQkJCX0KLQkJCQkJCQljb250aW51ZSBvdXRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgKGNoID0gcmVhZCgpKSkpIHsKLQkJCQkJCWVuZFRhZ0J1ZmZlcltlbmRUYWdCdWZmZXJJbmRleCsrXSA9IChjaGFyKSBjaDsKLQkJCQkJfQotCQkJCQlpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJCQllbmRUYWdCdWZmZXJJbmRleCArPSAzOwotCQkJCQkJdW5yZWFkKGVuZFRhZ0J1ZmZlciwgMCwgZW5kVGFnQnVmZmVySW5kZXgpOwotCQkJCQkJcmV0dXJuIG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVuZFRhZ0J1ZmZlcltlbmRUYWdCdWZmZXJJbmRleCsrXSA9IChjaGFyKSBjaDsKLQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJzwnKTsKLQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJy8nKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kVGFnQnVmZmVySW5kZXg7IGkrKykgewotCQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoZW5kVGFnQnVmZmVyW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoY2ggPT0gJyEnKSB7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJzwnKTsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCQlpZiAoY2ggPT0gJy0nKSB7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCQkJCWlmIChjaCA9PSAnLScpIHsKLQkJCQkJCQlpbkNvbW1lbnQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCc8Jyk7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoID09IEVPRikgewotCQkJCXBhcnNlci5lcnJvcihNSVNDX0VSUiwgIlVuZXhwZWN0ZWQgRU9GIGluIENEQVRBIGFmdGVyICIgKyBlbmQpOwotCQkJCWVuZFRhZ0J1ZmZlckluZGV4ID0gMDsKLQkJCQlpZiAobGltaXRDYW5kaWRhdGUgIT0gMCkgewotCQkJCQl1bnJlYWQobWlzY0J1ZmZlciwgbGltaXRDYW5kaWRhdGUsIG1pc2NJbmRleAotCQkJCQkJCS0gbGltaXRDYW5kaWRhdGUpOwotCQkJCQlyZXR1cm4gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBsaW1pdENhbmRpZGF0ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGluQ29tbWVudCAmJiBjaCA9PSAnLScpIHsKLQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCQkJY2ggPSByZWFkKCk7Ci0JCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCWlmIChjaCA9PSAnLScpIHsKLQkJCQkJY2ggPSByZWFkKCk7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCQkJaWYgKGNoID09ICc+JykgewotCQkJCQkJaW5Db21tZW50ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKWNoKTsKLQkJCQkvLyBtaXNjSW5kZXgrKzsKLQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBlbmRUYWdCdWZmZXJJbmRleCA9IDA7Ci0KLQl2b2lkIGVhdENEQVRBRW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IGVuZFRhZ0J1ZmZlckluZGV4OyBpID4gMDsgaS0tKQotCQkJcmVhZCgpOwotCX0KLQotCXByaXZhdGUgY2hhciBhdHRyVmFsQnVmZmVyW10gPSBuZXcgY2hhcls4MTkyXTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5jbHVkZUFuZ2xlQnJhY2tldChjaGFyIGNoYXJzW10sIGludCBiZWdpbiwgaW50IGVuZCkgewotCQl3aGlsZSAoYmVnaW4gPCBlbmQpIHsKLQkJCWNoYXIgY2ggPSBjaGFyc1tiZWdpbisrXTsKLQkJCWlmIChjaCA9PSAnPicgfHwgY2ggPT0gJzwnKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyVmFsQnVmZmVyKGludCBpbmRleCkgewotCQlpbnQgY3VyU2l6ZSA9IGF0dHJWYWxCdWZmZXIubGVuZ3RoOwotCQlpZiAoY3VyU2l6ZSA8IGluZGV4ICsgMTI4KSB7Ci0JCQljaGFyIHRtcEJ1ZmZlcltdID0gbmV3IGNoYXJbY3VyU2l6ZSArIDgxOTJdOwotCQkJU3lzdGVtLmFycmF5Y29weShhdHRyVmFsQnVmZmVyLCAwLCB0bXBCdWZmZXIsIDAsIGN1clNpemUpOwotCQkJYXR0clZhbEJ1ZmZlciA9IHRtcEJ1ZmZlcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIGF0dHJpYnV0ZSB2YWx1ZXMuIE5hc3R5IGF0dHJpYnV0ZSB2YWx1ZSBleGFtcGxlczoKLQkgKiA8dWw+Ci0JICogPGxpPndpZHRoPTxlbT4mcXVvdDsxMDAmcXVvdDslPC9lbT4KLQkgKiA8bGk+d2lkdGg9PGVtPiZxdW90OzEwMCU8L2VtPiBoZWlnaHQ9Li4uCi0JICogPC91bD4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgcmVhZEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZURlZmluaXRpb24gYWQsIEVsZW1lbnREZWZpbml0aW9uIGVkKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJaW50IGNoOwotCQl3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgKGNoID0gcmVhZCgpKSkpCi0JCQk7Ci0JCW1pc2NJbmRleCA9IDA7Ci0JCWludCBhdHRyVmFsQnVmZmVySW5kZXggPSAwOwotCi0JCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQotCQlpZiAoY2ggPT0gJ1wnJyB8fCBjaCA9PSAnIicpIHsKLQkJCWludCBlbmRDaGFyID0gY2g7Ci0JCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSBFT0YgJiYgY2ggIT0gZW5kQ2hhcikgewotCQkJCWNoZWNrQXR0clZhbEJ1ZmZlcihhdHRyVmFsQnVmZmVySW5kZXgpOwotCi0JCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjaCk7Ci0JCQkJbWlzY0luZGV4Kys7Ci0JCQkJaWYgKGNoID09ICcmJyAmJiAoZXh0cmFjdENoYXIgfHwgZXh0cmFjdE51bSkpIHsKLQkJCQkJaWYgKCFleHRyYWN0TnVtKSB7Ci0JCQkJCQlpZiAoKGNoID0gcmVhZCgpKSA9PSAnIycpIHsKLQkJCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcmJzsKLQkJCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcjJzsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnQgY2hhckVudGl0eSA9IHJzbHZDaGFyRW50KCk7Ci0JCQkJCWlmIChjaGFyRW50aXR5ID09IC0xKSB7Ci0JCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcmJzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWF0dHJWYWxCdWZmZXJbYXR0clZhbEJ1ZmZlckluZGV4KytdID0gKGNoYXIpIGNoYXJFbnRpdHk7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50aXR5QnVmSW5kZXg7IGkrKykgewotCQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGVudGl0eUJ1ZltpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXhdID0gKGNoYXIpIGNoOwotCQkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQkJY2hhciBuZXdBdHRyVmFsQnVmZmVyW10gPSBuZXcgY2hhclthdHRyVmFsQnVmZmVyLmxlbmd0aCAqIDJdOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weShhdHRyVmFsQnVmZmVyLCAwLCBuZXdBdHRyVmFsQnVmZmVyLCAwLAotCQkJCQkJCQlhdHRyVmFsQnVmZmVySW5kZXgpOwotCQkJCQkJYXR0clZhbEJ1ZmZlciA9IG5ld0F0dHJWYWxCdWZmZXI7Ci0JCQkJCX0KLQkJCQkJYXR0clZhbEJ1ZmZlckluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoICE9IEVPRikgewotCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyc2VyLmVycm9yKEFUVFJfVkFMVUUsICJFT0YgaW4gYXR0cmlidXRlIHZhbHVlLiIpOwotCQkJfQotCQkJaWYgKG1pc2NJbmRleCA+IDEKLQkJCQkJJiYgKGluY2x1ZGVBbmdsZUJyYWNrZXQobWlzY0J1ZmZlciwgMSwgbWlzY0luZGV4IC0gMSkgfHwgbWlzY0J1ZmZlclttaXNjSW5kZXggLSAyXSA9PSAnPScpCi0JCQkJCSYmIHBhcnNlci5oYW5kbGVFcnJvcihBVFRSX1ZBTFVFLCBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsCi0JCQkJCQkJbWlzY0luZGV4KSkpIHsKLQkJCQlyZXR1cm4gcmVhZEF0dHJpYnV0ZVZhbHVlKGFkLCBlZCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0JCQl1bnJlYWQoY2gpOwotCQkJcmV0dXJuICIiOwotCQl9IGVsc2UgewotCQkJaW50IGNoMSA9IC0xOwotCQkJaWYgKCFpc1VucXVvdGVkQ2hhcigoY2hhcikgY2gpICYmIChjaDEgPSBzZW5jZSgpKSA9PSAnIicKLQkJCQkJfHwgY2gxID09ICdcJycgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY2gxKSkgewotCQkJCXJldHVybiByZWFkQXR0cmlidXRlVmFsdWUoYWQsIGVkKTsKLQkJCX0KLQkJCWF0dHJWYWxCdWZmZXJbYXR0clZhbEJ1ZmZlckluZGV4KytdID0gKGNoYXIpIGNoOwotCQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gRU9GICYmIGNoICE9ICc+JwotCQkJCQkmJiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY2gpKSB7Ci0KLQkJCQljaGVja0F0dHJWYWxCdWZmZXIoYXR0clZhbEJ1ZmZlckluZGV4KTsKLQotCQkJCWlmIChjaCA9PSAnJicgJiYgKGV4dHJhY3RDaGFyIHx8IGV4dHJhY3ROdW0pKSB7Ci0JCQkJCWlmICghZXh0cmFjdE51bSkgewotCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJyMnKSB7Ci0JCQkJCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXgrK10gPSAnJic7Ci0JCQkJCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXgrK10gPSAnIyc7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXVucmVhZChjaCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaW50IGNoYXJFbnRpdHkgPSByc2x2Q2hhckVudCgpOwotCQkJCQlpZiAoY2hhckVudGl0eSA9PSAtMSkgewotCQkJCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXgrK10gPSAnJic7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9IChjaGFyKSBjaGFyRW50aXR5OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXgrK10gPSAoY2hhcikgY2g7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoID09ICc+JykKLQkJCQl1bnJlYWQoY2gpOwotCQl9Ci0JCWNoID0gcmVhZCgpOwotCQlTdHJpbmcgcmV0ID0gbmV3IFN0cmluZyhhdHRyVmFsQnVmZmVyLCAwLCBhdHRyVmFsQnVmZmVySW5kZXgpOwotCQlpZiAoY2ggPT0gJyInIHx8IGNoID09ICdcJycpIHsKLQkJCWlmICghcGFyc2VyLmhhbmRsZUVycm9yKEJFRk9SRV9BVFRSTkFNRSwgIlwiIikpIHsKLQkJCQlwYXJzZXIuZXJyb3IoU1RBUlRUQUdfU1lOVEFYX0VSUiwKLQkJCQkJCSJyZXF1aXJlcyBhdHRyaWJ1dGUgbmFtZSBhZnRlciBcIiIgKyByZXQgKyAnIicpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdW5yZWFkKGNoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgaW50IHNlbmNlKGludCBmb3J3YXJkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzd2l0Y2ggKGZvcndhcmQpIHsKLQkJY2FzZSAwOgotCQkJaW50IGNoID0gcmVhZCgpOwotCQkJdW5yZWFkKGNoKTsKLQkJCXJldHVybiBjaDsKLQkJY2FzZSAxOgotCQkJaW50IGNoMCA9IHJlYWQoKTsKLQkJCWNoID0gcmVhZCgpOwotCQkJdW5yZWFkKGNoKTsKLQkJCXVucmVhZChjaDApOwotCQkJcmV0dXJuIGNoOwotCQlkZWZhdWx0OgotCQkJaW50IGJ1ZltdID0gbmV3IGludFtmb3J3YXJkXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZm9yd2FyZDsgaSsrKSB7Ci0JCQkJYnVmW2ldID0gcmVhZCgpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IGZvcndhcmQgLSAxOyBpID49IDA7IGktLSkgewotCQkJCXVucmVhZChidWZbaV0pOwotCQkJfQotCQkJcmV0dXJuIGJ1Zltmb3J3YXJkIC0gMV07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBzZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaCA9IHJlYWQoKTsKLQkJdW5yZWFkKGNoKTsKLQkJcmV0dXJuIGNoOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1VucXVvdGVkQ2hhcihjaGFyIGNoKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjaCkKLQkJCQl8fCBDaGFyYWN0ZXIuaXNEaWdpdChjaCkgfHwgY2ggPT0gJy0nIHx8IGNoID09ICcuJzsKLQl9Ci0KLQlwcml2YXRlIGludCBldGFnKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaDsKLQkJLy8gd2hpbGUgKENoYXJhY3RlcgotCQkvLyAuaXNXaGl0ZXNwYWNlKG1pc2NCdWZmZXJbbWlzY0luZGV4KytdID0gKGNoYXIpIChjaCA9IHJlYWQoKSkpKTsKLQkJd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIChjaCA9IHJlYWQoKSkpKSB7Ci0JCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCX0KLQkJOwotCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0KLQkJaWYgKGNoID09ICc+JykgewotCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJc3ZhbCA9ICI+IjsKLQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIobWlzY0J1ZmZlciwgZXRhZ1N0YXJ0SW5kZXgsIG1pc2NJbmRleAotCQkJCQktIGV0YWdTdGFydEluZGV4KTsKLQkJCXJldHVybiAodHR5cGUgPSAnPicpOwotCQl9IGVsc2UgaWYgKGNoID09IEVPRikgewotCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJc3ZhbCA9ICIiOwotCQkJcmV0dXJuICh0dHlwZSA9IEVPRik7Ci0JCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKChjaGFyKSBjaCkKLQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIGNoKSkgewotCQkJaW50IHN0YXJ0SW5kZXggPSBtaXNjSW5kZXggLSAxOwotCQkJZG8gewotCQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCAoY2hhcikgKGNoID0gcmVhZCgpKSk7Ci0JCQkJbWlzY0luZGV4Kys7Ci0JCQl9IHdoaWxlIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoKGNoYXIpIGNoKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIGNoKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhcikgY2gpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScKLQkJCQkJfHwgY2ggPT0gJzonIHx8IGNoID09ICcjJyk7Ci0JCQl1bnJlYWQoY2gpOwotCQkJbWlzY0luZGV4LS07Ci0JCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCBzdGFydEluZGV4LCBtaXNjSW5kZXggLSBzdGFydEluZGV4KTsKLQkJCXJldHVybiAodHR5cGUgPSBOQU1FX0NIQVIpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGV0YWcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHRhZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpbnQgY2g7Ci0JCW1pc2NJbmRleCA9IDA7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSAoY2ggPSByZWFkKCkpKSkKLQkJCTsKLQotCQlpZiAoY2ggPT0gJyEnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbW1lbnQgYmV0d2VlbiBET0NUWVBFIGFuZCBIVE1MICEhISIpOwotCQkJcmV0dXJuIGVhdENvbW1lbnQoKTsKLQkJfQotCi0JCWlmIChjaCA9PSAnPicpIHsKLQkJCXN0YXRlID0gREVGQVVMVDsKLQkJCXN2YWwgPSAiPiI7Ci0JCQlyZXR1cm4gKHR0eXBlID0gJz4nKTsKLQkJfSBlbHNlIGlmIChjaCA9PSBFT0YpIHsKLQkJCXN0YXRlID0gREVGQVVMVDsKLQkJCXN2YWwgPSAiIjsKLQkJCXJldHVybiAodHR5cGUgPSBFT0YpOwotCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhcikgY2gpCi0JCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBjaCkpIHsKLQotCQkJZG8gewotCQkJCXNldENoYXJUb01pc2NCdWZmZXIobWlzY0luZGV4LCAoY2hhcikgY2gpOwotCQkJCW1pc2NJbmRleCsrOwotCQkJCWNoID0gcmVhZCgpOwotCQkJfSB3aGlsZSAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKChjaGFyKSBjaCkKLQkJCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBjaCkKLQkJCQkJfHwgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIGNoKSB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJy0nCi0JCQkJCXx8IGNoID09ICc6JyB8fCBjaCA9PSAnIycpOwotCQkJdW5yZWFkKGNoKTsKLQkJCXN2YWwgPSBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQlyZXR1cm4gKHR0eXBlID0gTkFNRV9DSEFSKTsKLQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhcikgY2gpKSB7Ci0JCQlkbyB7Ci0JCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCWNoID0gcmVhZCgpOwotCQkJfSB3aGlsZSAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIGNoKSk7Ci0JCQlpZiAoY2ggPT0gJyUnKSB7Ci0JCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJfSBlbHNlIHsKLQkJCQl1bnJlYWQoY2gpOwotCQkJfQotCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCXJldHVybiAodHR5cGUgPSBOVU0pOwotCQl9IGVsc2UgaWYgKGNoID09ICc8JykgewotCQkJY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gJy8nKSB7Ci0JCQkJc3ZhbCA9ICI8LyI7Ci0JCQkJbWlzY0J1ZmZlclswXSA9ICc8JzsKLQkJCQltaXNjQnVmZmVyWzFdID0gJy8nOwotCQkJCWV0YWdTdGFydEluZGV4ID0gMDsKLQkJCQlzdGF0ZSA9IEVUQUdPOwotCQkJCXJldHVybiAodHR5cGUgPSBFVEFHTyk7Ci0JCQl9IGVsc2UgewotCQkJCXVucmVhZChjaCk7Ci0JCQkJc3ZhbCA9ICI8IjsKLQkJCQlyZXR1cm4gKHR0eXBlID0gJzwnKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAodHR5cGUgPSBjaCk7Ci0JCX0KLQl9Ci0KLQlmaW5hbCB2b2lkIGNvbnN1bWVVbnRpbChjaGFyIGxpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3aGlsZSAobGltaXQgIT0gcmVhZCgpKQotCQkJOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcnN2V1MgPSBmYWxzZTsKLQotCXZvaWQgc2V0UHJlc2VydmVXaGl0ZXNwYWNlKGJvb2xlYW4gcHJlc2VydikgewotCQl0aGlzLnByc3ZXUyA9IHByZXNlcnY7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZXggPSAwOwotCi0JcHJpdmF0ZSBjaGFyIGNoYXJCdWZmZXJbXSA9IG5ldyBjaGFyW0lOSVRJQUxfQlVGX1NJWl07Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kQnVmZmVyKGludCBpbmNyZWFzZSkgewotCQlpZiAoYnVmTGltaXQgIT0gaW5kZXgpIHsKLQkJCWluY3JlYXNlICs9IGluZGV4IDwgYnVmTGltaXQgPyAoYnVmTGltaXQgKyBpbmRleCkKLQkJCQkJOiAoY2hhckJ1ZmZlci5sZW5ndGggLSBpbmRleCArIGJ1ZkxpbWl0KTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gY2hhckJ1ZmZlci5sZW5ndGggKiAyOwotCQl3aGlsZSAobGVuZ3RoIDwgaW5jcmVhc2UpCi0JCQlsZW5ndGggKj0gMjsKLQkJY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWlmIChpbmRleCA8IGJ1ZkxpbWl0KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGNoYXJCdWZmZXIsIGluZGV4LCBuZXdCdWZmZXIsIGluZGV4LCBidWZMaW1pdAotCQkJCQktIGluZGV4KTsKLQkJfSBlbHNlIGlmIChpbmRleCAhPSBidWZMaW1pdCkgewotCQkJU3lzdGVtLmFycmF5Y29weShjaGFyQnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIGJ1ZkxpbWl0KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoY2hhckJ1ZmZlciwgaW5kZXgsIG5ld0J1ZmZlciwgbGVuZ3RoCi0JCQkJCS0gY2hhckJ1ZmZlci5sZW5ndGggKyBpbmRleCwgY2hhckJ1ZmZlci5sZW5ndGggLSBpbmRleCk7Ci0JCQlpbmRleCA9IGxlbmd0aCAtIGNoYXJCdWZmZXIubGVuZ3RoICsgaW5kZXg7Ci0JCX0KLQkJY2hhckJ1ZmZlciA9IG5ld0J1ZmZlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTklUSUFMX0JVRl9TSVogPSA4MTkyOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVBRF9VTklUID0gMTAyNDsKLQotCXByaXZhdGUgaW50IGJ1ZkxpbWl0ID0gMDsKLQotCXByaXZhdGUgY2hhciBtaXNjQnVmZmVyW10gPSBuZXcgY2hhcltJTklUSUFMX0JVRl9TSVpdOwotCi0JcHJpdmF0ZSBpbnQgbWlzY0luZGV4ID0gMDsKLQotCXByaXZhdGUgdm9pZCBleHBhbmRNaXNjQnVmZmVyKCkgewotCQljaGFyIG5ld0J1ZmZlcltdOwotCQlpZiAobWlzY0J1ZmZlci5sZW5ndGggPCAzMjc2OCkgewotCQkJbmV3QnVmZmVyID0gbmV3IGNoYXJbbWlzY0J1ZmZlci5sZW5ndGggKiAyXTsKLQkJfSBlbHNlIHsKLQkJCW5ld0J1ZmZlciA9IG5ldyBjaGFyW21pc2NCdWZmZXIubGVuZ3RoICsgMzI3NjhdOwotCQl9Ci0KLQkJU3lzdGVtLmFycmF5Y29weShtaXNjQnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCW1pc2NCdWZmZXIgPSBuZXdCdWZmZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVW50aWwoY2hhciBsaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGNoID0gcmVhZCgpOwotCQl3aGlsZSAoY2ggIT0gbGltaXQgJiYgY2ggIT0gRU9GKSB7Ci0JCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgKGNoYXIpIGNoKTsKLQkJCW1pc2NJbmRleCsrOwotCQkJY2ggPSByZWFkKCk7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBTdHJpbmcgZWF0VW50aWwoY2hhciBsaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbWlzY0luZGV4ID0gMDsKLQkJaW50IGNoID0gcmVhZCgpOwotCQl3aGlsZSAoY2ggIT0gbGltaXQgJiYgY2ggIT0gRU9GKSB7Ci0JCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgKGNoYXIpIGNoKTsKLQkJCW1pc2NJbmRleCsrOwotCQkJY2ggPSByZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2tpcExGOwotCi0JcHJpdmF0ZSBib29sZWFuIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmTGltaXQgPT0gY2hhckJ1ZmZlci5sZW5ndGgpIHsKLQkJCWluZGV4ID0gMDsKLQkJCWJ1ZkxpbWl0ID0gcmVhZGVyLnJlYWQoY2hhckJ1ZmZlciwgMCwgUkVBRF9VTklUKTsKLQkJCWlmIChidWZMaW1pdCA9PSAtMSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoYnVmTGltaXQgKyBSRUFEX1VOSVQgPCBjaGFyQnVmZmVyLmxlbmd0aCkgewotCQkJaW50IGNvdW50ID0gcmVhZGVyLnJlYWQoY2hhckJ1ZmZlciwgYnVmTGltaXQsIFJFQURfVU5JVCk7Ci0JCQlpZiAoY291bnQgPT0gLTEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYnVmTGltaXQgKz0gY291bnQ7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgY291bnQgPSByZWFkZXIucmVhZChjaGFyQnVmZmVyLCBidWZMaW1pdCwgY2hhckJ1ZmZlci5sZW5ndGgKLQkJCQkJLSBidWZMaW1pdCk7Ci0JCQlpZiAoY291bnQgPT0gLTEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYnVmTGltaXQgKz0gY291bnQ7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIHByaW50Q2hhckJ1ZmZlcigpIHsKLQkvLyBpZiAoYnVmTGltaXQgPCBpbmRleCkgewotCS8vIFN5c3RlbS5lcnIucHJpbnQoCi0JLy8gbmV3IFN0cmluZyhjaGFyQnVmZmVyLCBpbmRleCwgY2hhckJ1ZmZlci5sZW5ndGggLSBpbmRleCkpOwotCS8vIFN5c3RlbS5lcnIucHJpbnRsbihuZXcgU3RyaW5nKGNoYXJCdWZmZXIsIDAsIGJ1ZkxpbWl0KSk7Ci0JLy8gfSBlbHNlIGlmIChidWZMaW1pdCA9PSBpbmRleCkgewotCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiRW1wdHkiKTsKLQkvLyB9IGVsc2UgewotCS8vIFN5c3RlbS5lcnIucHJpbnRsbihuZXcgU3RyaW5nKGNoYXJCdWZmZXIsIGluZGV4LCBidWZMaW1pdCAtIGluZGV4KSk7Ci0JLy8gfQotCS8vIH0KLQotCXByaXZhdGUgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmTGltaXQgPT0gaW5kZXgpIHsKLQkJCWlmICghZmlsbEJ1ZmZlcigpKQotCQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBjaGFyQnVmZmVyLmxlbmd0aCkgewotCQkJaW5kZXggPSAwOwotCQl9Ci0JCWludCByZXQgPSBjaGFyQnVmZmVyW2luZGV4KytdOwotCQlpZiAoc2tpcExGKSB7Ci0JCQlpZiAocmV0ID09ICdcbicpIHsKLQkJCQlpZiAoYnVmTGltaXQgPT0gaW5kZXgpIHsKLQkJCQkJaWYgKCFmaWxsQnVmZmVyKCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA9PSBjaGFyQnVmZmVyLmxlbmd0aCkgewotCQkJCQlpbmRleCA9IDA7Ci0JCQkJfQotCQkJCWxhc3RMRmluZGV4Kys7Ci0JCQkJcmV0ID0gY2hhckJ1ZmZlcltpbmRleCsrXTsKLQkJCX0KLQkJCXNraXBMRiA9IGZhbHNlOwotCQl9Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgJ1xyJzoKLQkJCXNraXBMRiA9IHRydWU7Ci0JCWNhc2UgJ1xuJzoKLQkJCWxpbmVOdW1iZXIrKzsKLQkJCWxhc3RMRmluZGV4ID0gaW5kZXggLSAxOwotCQkJcmV0dXJuICdcbic7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIGludCBsYXN0TEZpbmRleCA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgbGluZU51bWJlciA9IDA7Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWFkKGludCBjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNoID09ICdcbicpCi0JCQlsaW5lTnVtYmVyLS07Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQljaGFyQnVmZmVyW2luZGV4ID0gY2hhckJ1ZmZlci5sZW5ndGggLSAxXSA9IChjaGFyKSBjaDsKLQkJfSBlbHNlIHsKLQkJCWNoYXJCdWZmZXJbLS1pbmRleF0gPSAoY2hhcikgY2g7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVucmVhZChTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl1bnJlYWQoc3RyLnRvQ2hhckFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bnJlYWQoY2hhciBzdHJbXSwgaW50IGJlZ2luLCBpbnQgbGVuKSB7Ci0JCWlmIChidWZMaW1pdCA+PSBpbmRleCkgewotCQkJaWYgKGNoYXJCdWZmZXIubGVuZ3RoIC0gKGJ1ZkxpbWl0IC0gaW5kZXgpIDwgbGVuKSB7Ci0JCQkJZXhwYW5kQnVmZmVyKGxlbik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5kZXggLSBidWZMaW1pdCA8IGxlbikgewotCQkJZXhwYW5kQnVmZmVyKGxlbik7Ci0JCX0KLQkJaWYgKGluZGV4IDwgbGVuKSB7Ci0JCQlpbnQgaSA9IGJlZ2luICsgbGVuIC0gMTsKLQkJCWludCBqOwotCQkJZm9yIChqID0gaW5kZXggLSAxOyBqID49IDA7IGotLSkgewotCQkJCWlmICgoY2hhckJ1ZmZlcltqXSA9IHN0cltpLS1dKSA9PSAnXG4nKQotCQkJCQlsaW5lTnVtYmVyLS07Ci0JCQl9Ci0JCQlqID0gY2hhckJ1ZmZlci5sZW5ndGggLSAxOwotCQkJZm9yICg7IGkgPj0gYmVnaW47IGotLSkgewotCQkJCWlmICgoY2hhckJ1ZmZlcltqXSA9IHN0cltpLS1dKSA9PSAnXG4nKQotCQkJCQlsaW5lTnVtYmVyLS07Ci0JCQl9Ci0JCQlpbmRleCA9IGogKyAxOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGJlZ2luICsgbGVuIC0gMTsgaSA+PSBiZWdpbjsgaS0tKSB7Ci0JCQkJaWYgKChjaGFyQnVmZmVyWy0taW5kZXhdID0gc3RyW2ldKSA9PSAnXG4nKQotCQkJCQlsaW5lTnVtYmVyLS07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWFkKGNoYXIgc3RyW10pIHsKLQkJdW5yZWFkKHN0ciwgMCwgc3RyLmxlbmd0aCk7Ci0JfQotCi0JZmluYWwgaW50IG5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChwdXNoQmFja2VkKSB7Ci0JCQlwdXNoQmFja2VkID0gZmFsc2U7Ci0JCQlyZXR1cm4gdHR5cGU7Ci0JCX0KLQotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgREVGQVVMVDoKLQkJCXJldHVybiBkZWZhdWx0U3RhdGUoKTsKLQkJY2FzZSBUQUc6Ci0JCQlyZXR1cm4gdGFnKCk7Ci0JCWNhc2UgRVRBRzoKLQkJCXJldHVybiBldGFnKCk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlmaW5hbCB2b2lkIHB1c2hCYWNrKCkgewotCQlwdXNoQmFja2VkID0gdHJ1ZTsKLQl9Ci0KLQlmaW5hbCBpbnQgZ2V0Q3VycmVudExpbmUoKSB7Ci0JCXJldHVybiBsaW5lTnVtYmVyICsgMTsKLQl9Ci0KLQlmaW5hbCBpbnQgZ2V0Q3VycmVudENvbCgpIHsKLQkJcmV0dXJuIGdldENvbHVtbk51bWJlcigpOwotCX0KLQotCWZpbmFsIHZvaWQgc3dpdGNoVG8oaW50IHN0YXRlKSB7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQl9Ci0KLQlmaW5hbCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5yZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBsaW5lTnVtYmVyICsgMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLQkJaW50IHJldDsKLQkJaWYgKGluZGV4ID49IGxhc3RMRmluZGV4KSB7Ci0JCQlyZXQgPSBpbmRleCAtIGxhc3RMRmluZGV4OwotCQl9IGVsc2UgewotCQkJcmV0ID0gY2hhckJ1ZmZlci5sZW5ndGggLSBsYXN0TEZpbmRleCArIGluZGV4OwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhZDM5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotLyoqCi0gKiBXaGVuIGEgcGFyc2VyIG1lZXRzIGFuIHVuZXhwZWN0ZWQgYW5kIHVucmVjb3ZlcmFibGUgZXJyb3IsIFBhcnNlRXhjZXB0aW9uIGlzCi0gKiB0aHJvd24KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEF0dHJpYnV0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2MmVjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UeXBlSW5mbzsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLWNsYXNzIFNHTUxBdHRyaWJ1dGUgaW1wbGVtZW50cyBBdHRyLCBTZXJpYWxpemFibGUgewotCS8vIE5vZGUgaW50ZXJmYWNlOwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aGlzLnZhbHVlID0gbm9kZVZhbHVlOwotCQl0aGlzLmlzU3BlY2lmaWVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSSUJVVEVfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTGlzdCgpIHsKLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19EQVRBX0FMTE9XRURfRVJSLAotCQkJCSJhdHRyaWJ1dGVzIGNhbid0IGhhdmUgc2libGluZ3MuIikgewotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fREFUQV9BTExPV0VEX0VSUiwKLQkJCQkiYXR0cmlidXRlcyBjYW4ndCBoYXZlIHNpYmxpbmdzLiIpIHsKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fREFUQV9BTExPV0VEX0VSUiwKLQkJCQkiYXR0cmlidXRlcyBjYW4ndCBoYXZlIHNpYmxpbmdzLiIpIHsKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fREFUQV9BTExPV0VEX0VSUiwKLQkJCQkiYXR0cmlidXRlcyBjYW4ndCBoYXZlIHNpYmxpbmdzLiIpIHsKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IFNHTUxBdHRyaWJ1dGUodGhpcyk7Ci0JfQotCi0JLy8gQXR0ciBpbnRlcmZhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIE5vdCBzdXBwb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BlY2lmaWVkKCkgewotCQlyZXR1cm4gaXNTcGVjaWZpZWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaXNTcGVjaWZpZWQgPSB0cnVlOwotCX0KLQotCVN0cmluZyBuYW1lLCB2YWx1ZTsKLQotCWJvb2xlYW4gaXNTcGVjaWZpZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgRG9jdW1lbnQgb3duZXJEb2N1bWVudDsKLQotCVNHTUxBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgRG9jdW1lbnQgZG9jKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gZG9jOwotCX0KLQotCS8vIGNvcHkgY29uc3RydWN0b3IKLQlTR01MQXR0cmlidXRlKFNHTUxBdHRyaWJ1dGUgYW5vdGhlcikgewotCQl0aGlzLm5hbWUgPSBhbm90aGVyLm5hbWU7Ci0JCXRoaXMudmFsdWUgPSBhbm90aGVyLnZhbHVlOwotCQl0aGlzLmlzU3BlY2lmaWVkID0gYW5vdGhlci5pc1NwZWNpZmllZDsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gYW5vdGhlci5vd25lckRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVNHTUxEb2N1bWVudCBkb2MgPSAoU0dNTERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciBxdW90ZSA9ICciJzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotCQkJU3RyaW5nIGVudGl0eU9yaWdpbiA9IGRvYy5nZXRFbnRpdHlPcmlnaW4obmV3IENoYXJhY3RlcihjaCkpOwotCQkJaWYgKGVudGl0eU9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKCcmJyArIGVudGl0eU9yaWdpbiArICc7Jyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjaCA9PSAnIicpCi0JCQkJCXF1b3RlID0gJ1wnJzsKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiAnICcgKyBuYW1lICsgJz0nICsgcXVvdGUgKyBzYiArIHF1b3RlOwotCX0KLQotCVN0cmluZyB0b1hNTFN0cmluZygpIHsKLQkJU0dNTERvY3VtZW50IGRvYyA9IChTR01MRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQljaGFyIHF1b3RlID0gJyInOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7Ci0JCQlTdHJpbmcgZW50aXR5T3JpZ2luID0gZG9jLmdldEVudGl0eU9yaWdpbihuZXcgQ2hhcmFjdGVyKGNoKSk7Ci0JCQlpZiAoZW50aXR5T3JpZ2luICE9IG51bGwpIHsKLQkJCQlzYi5hcHBlbmQoIiYjIiArIChpbnQpIGNoICsgJzsnKTsKLQkJCX0gZWxzZSBpZiAoY2ggPT0gJyYnKSB7Ci0JCQkJc2IuYXBwZW5kKCImYW1wOyIpOwotCQkJfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKLQkJCQlzYi5hcHBlbmQoIiZsdDsiKTsKLQkJCX0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJc2IuYXBwZW5kKCImZ3Q7Iik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjaCA9PSAnIicpCi0JCQkJCXF1b3RlID0gJ1wnJzsKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiAnICcgKyBuYW1lICsgJz0nICsgcXVvdGUgKyBzYiArIHF1b3RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIG51bGwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgc2FtZSBhcyA8Y29kZT5nZXROYW1lKCk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIG51bGwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnQgb3duZXJFbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBFbGVtZW50IGdldE93bmVyRWxlbWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRWxlbWVudDsKLQl9Ci0KLQl2b2lkIHNldE93bmVyRWxlbWVudChFbGVtZW50IG93bmVyKSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgZmFsc2UgYmVjYXVzZSB0aGlzIGlzIG5vdCBYTUwgaW1wbGVtZW50YXRpb24gYnV0IFNHTUwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBET00gTGV2ZWwgMwotCSAqLwotCi0JcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRlbnQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MQ0RBVEFTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTENEQVRBU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDBhNzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MQ0RBVEFTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgU0dNTENEQVRBU2VjdGlvbiBleHRlbmRzIFNHTUxUZXh0IGltcGxlbWVudHMgQ0RBVEFTZWN0aW9uLAotCQlJUHJpbnRYTUwgewotCXB1YmxpYyBTR01MQ0RBVEFTZWN0aW9uKFN0cmluZyBzdHIsIERvY3VtZW50IGRvYykgewotCQlzdXBlcihzdHIsIGRvYyk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0RBVEFfU0VDVElPTl9OT0RFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NkYXRhLXNlY3Rpb24iOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJaWYgKGluZGVudCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50TGV2ZWw7IGkrKykKLQkJCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludCgiPCFbQ0RBVEFbIiArIHRleHQgKyAiXV0+Iik7Ci0JCWlmIChpbmRlbnQpCi0JCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxDaGFyYWN0ZXJEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTENoYXJhY3RlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwYzgxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTENoYXJhY3RlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1hYnN0cmFjdCBjbGFzcyBTR01MQ2hhcmFjdGVyRGF0YSBleHRlbmRzIFNHTUxOb2RlIGltcGxlbWVudHMgQ2hhcmFjdGVyRGF0YSB7Ci0JcHJvdGVjdGVkIFNHTUxDaGFyYWN0ZXJEYXRhKFN0cmluZyBzdHIsIERvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCQl0ZXh0ID0gc3RyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgewotCQl0ZXh0ID0gbm9kZVZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGV4dCA9IGRhdGE7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0ZXh0Lmxlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKG9mZnNldCwgY291bnQpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBlLmdldE1lc3NhZ2UoKSkgewotCQkJfTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRleHQgPSB0ZXh0ICsgYXJnOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydERhdGEoaW50IG9mZnNldCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGFyZyArIHRleHQuc3Vic3RyaW5nKG9mZnNldCk7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIGUuZ2V0TWVzc2FnZSgpKSB7Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0cnkgewotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyB0ZXh0LnN1YnN0cmluZyhvZmZzZXQgKyBjb3VudCk7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIGUuZ2V0TWVzc2FnZSgpKSB7Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50LCBTdHJpbmcgYXJnKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAodGV4dC5sZW5ndGgoKSA8IG9mZnNldCArIGNvdW50KSB7Ci0JCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcuc3Vic3RyaW5nKDAsIGNvdW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcuc3Vic3RyaW5nKDAsIGNvdW50KQotCQkJCQkJKyB0ZXh0LnN1YnN0cmluZyhvZmZzZXQgKyBjb3VudCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIGUuZ2V0TWVzc2FnZSgpKSB7Ci0JCQl9OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxDb21tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTENvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmM2IxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTENvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgU0dNTENvbW1lbnQgZXh0ZW5kcyBTR01MQ2hhcmFjdGVyRGF0YSBpbXBsZW1lbnRzIENvbW1lbnQsCi0JCUlQcmludFhNTCB7Ci0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ09NTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NvbW1lbnQiOwotCX0KLQotCXB1YmxpYyBTR01MQ29tbWVudChTdHJpbmcgZGF0YSwgRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKGRhdGEsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICI8IS0tIiArIHRleHQgKyAiLS0+IjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFzWE1MKFByaW50V3JpdGVyIHB3LCBpbnQgaW5kZW50TGV2ZWwsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKSB7Ci0JCQlpZiAodGV4dC5jaGFyQXQoaSkgPT0gJy0nICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PSAnLScpIHsKLQkJCQlpKys7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxlbiAtIDIgPj0gMCkgewotCQkJaWYgKHRleHQuY2hhckF0KGxlbiAtIDEpICE9ICctJykgewotCQkJCXNiLmFwcGVuZCh0ZXh0LmNoYXJBdChsZW4gLSAyKSk7Ci0JCQkJc2IuYXBwZW5kKHRleHQuY2hhckF0KGxlbiAtIDEpKTsKLQkJCX0gZWxzZSBpZiAodGV4dC5jaGFyQXQobGVuIC0gMikgIT0gJy0nKSB7Ci0JCQkJc2IuYXBwZW5kKHRleHQuY2hhckF0KGxlbiAtIDIpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChsZW4gLSAxID49IDAgJiYgdGV4dC5jaGFyQXQobGVuIC0gMSkgIT0gJy0nKSB7Ci0JCQlzYi5hcHBlbmQodGV4dC5jaGFyQXQobGVuIC0gMSkpOwotCQl9Ci0JCXB3LnByaW50KCI8IS0tIiArIHNiICsgIi0tPiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNTR01MKFByaW50V3JpdGVyIHB3LCBpbnQgaW5kZW50TGV2ZWwsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCXB3LnByaW50KCI8IS0tIiArIHRleHQgKyAiLS0+Iik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxET01JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTERPTUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiYjVjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTERPTUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLS8qKgotICogTGlnaHQtd2VpZ2h0IGltcGxlbWVudGF0aW9uIG9mIERPTTwvYT4uCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRocmVhZC11bnNhZmUuIElmIHlvdSByZXF1aXJlIHRocmVhZC1zYWZlCi0gKiBpbXBsZW1lbnRhdGlvbiwgdXNlIFhlcmNlcyBET00uCi0gKiBUaGlzIHN1cHBvcnRzOgotICogPHVsPgotICogPGxpPkxldmVsIDEgQ29yZQotICogPGxpPkxldmVsIDEgSFRNTAotICogPGxpPkxldmVsIDIgQ29yZSAoTm8gbmFtZXNwYWNlcykKLSAqIDxsaT5MZXZlbCAyIEhUTUwKLSAqIDwvdWw+Ci0gKiAKLSAqIEBzZWUgU0dNTFBhcnNlciNzZXRET01JbXBsZW1lbnRhdGlvbihvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbikKLSAqLwotcHVibGljIGNsYXNzIFNHTUxET01JbXBsIGltcGxlbWVudHMgRE9NSW1wbGVtZW50YXRpb24gewotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIGZhbHNlIGJlY2F1c2UgdGhpcyBpcyBub3QgWE1MIGltcGxlbWVudGF0aW9uIGJ1dCBTR01MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3VtZW50VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLQkJCVN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBuZXcgU0dNTERvY1R5cGUocXVhbGlmaWVkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZC4KLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLAotCQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoZG9jdHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNHTUxEb2N1bWVudCh0aGlzKTsKLQkJfSBlbHNlIGlmIChkb2N0eXBlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBudWxsCi0JCQkJfHwgIShkb2N0eXBlIGluc3RhbmNlb2YgU0dNTERvY1R5cGUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKAotCQkJCQlET01FeGNlcHRpb24uV1JPTkdfRE9DVU1FTlRfRVJSLAotCQkJCQlkb2N0eXBlCi0JCQkJCQkJKyAiIGhhcyBiZWVuIGFscmVhZHkgb3duZWQgb3IgY3JlYXRlZCBieSBhIGRpZmZlcmVudCBET01JbXBsZW1lbnRhdGlvbiIpIHsKLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQlEb2N1bWVudCByZXQgPSBuZXcgU0dNTERvY3VtZW50KHRoaXMpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCXJldC5hcHBlbmRDaGlsZChkb2N0eXBlKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU0dNTERPTUltcGwoKSB7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU0dNTERPTUltcGwgaW5zdGFuY2UgPSBuZXcgU0dNTERPTUltcGwoKTsKLQotCXB1YmxpYyBzdGF0aWMgRE9NSW1wbGVtZW50YXRpb24gZ2V0RE9NSW1wbGVtZW50YXRpb24oKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIERPTSBMZXZlbCAzCi0JICovCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbiNnZXRGZWF0dXJlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MRG9jVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzFlZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFNHTUxEb2NUeXBlIGV4dGVuZHMgU0dNTE5vZGUgaW1wbGVtZW50cyBEb2N1bWVudFR5cGUgewotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogSUQuIEZvciBIVE1MNC4wIHN0cmljdCwgaXQgaXMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiIuCi0JICogCi0JICogQHNlcmlhbAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlEOwotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlEOwotCX0KLQotCVNHTUxEb2NUeXBlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQsIERvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsU3Vic2V0OwotCi0JcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbFN1YnNldCgpIHsKLQkJcmV0dXJuIGludGVybmFsU3Vic2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludGVybmFsU3Vic2V0KFN0cmluZyBzdHIpIHsKLQkJaW50ZXJuYWxTdWJzZXQgPSBzdHI7Ci0JfQotCi0JcHVibGljIFNHTUxEb2NUeXBlKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5pZCA9IHB1YmxpY0lEOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JfQotCi0JLy8gU0dNTE5vZGUgYWJzdHJhY3QgbWV0aG9kIGltcGxlbWVudGF0aW9uLgotCXZvaWQgY2hlY2soTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgdGhpcwotCQkJCSsgImNhbm5vdCBoYXZlIGNoaWxkcmVuLiIpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gRG9jdW1lbnRUeXBlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi4KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8vIE5vZGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9UWVBFX05PREU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3Qgc3VwcG9ydCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0Tm90YXRpb25zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKLQkJCQkiY2Fubm90IHNldCB2YWx1ZSBvbiAiICsgdGhpcykgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByYXdTdHJpbmc7Ci0KLQlwdWJsaWMgdm9pZCBzZXRSYXdTdHJpbmcoU3RyaW5nIHN0cikgewotCQl0aGlzLnJhd1N0cmluZyA9IHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJhdyBzdHJpbmcgZnJvbSBvcmlnaW5hbCBkb2N1bWVudCBpZiB7QGxpbmsgCi0JICogICAgICAgICAjc2V0UmF3U3RyaW5nKGphdmEubGFuZy5TdHJpbmcpfSBoYXMgYmVlbiBpbnZva2VkLiBPdGhlcndpc2UsCi0JICogICAgICAgICA8Y29kZT4mbHQ7IURPQ1RZUEUgbmFtZSBQVUJMSUMgImlkIiAmZ3Q7PC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiByYXdTdHJpbmcgIT0gbnVsbCA/IHJhd1N0cmluZyA6ICI8IURPQ1RZUEUgIiArIG5hbWUKLQkJCQkrICIgUFVCTElDIFwiIiArIGlkICsgIlwiPiI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2NUeXBlRGVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTERvY1R5cGVEZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxYmQ1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTERvY1R5cGVEZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbiBhbmQgaG9sZHMgPGNvZGU+Ci0gKiBFbGVtZW50bnREZWZpbml0aW9uIDwvY29kZT4KLSAqIGluc3RhbmNlcyBjcmVhdGVkIGJ5IHRoZSBEVEQsIGVudGl0eSBkZWNsYXJhdGlvbnMgYW5kIHNvIG9uLgotICovCi1wdWJsaWMgY2xhc3MgU0dNTERvY1R5cGVEZWYgewotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIFNHTUxEb2NUeXBlRGVmPiB0YWJsZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTR01MRG9jVHlwZURlZj4oKTsKLQotCXByaXZhdGUgU0dNTFBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBrZXk6IGVsZW1lbnQgbmFtZSB2YWx1ZTogRWxlbWVudERlZmluaXRpb24gaW5zdGFuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgVW5zeW5jaHJvbml6ZWRIYXNodGFibGUgZWxlbWVudERlZnMgPSBuZXcgVW5zeW5jaHJvbml6ZWRIYXNodGFibGUoKTsKLQotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU0dNTEVudGl0eVJlZmVyZW5jZT4gZW50aXR5UmVmcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTR01MRW50aXR5UmVmZXJlbmNlPigpOwotCi0JcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTR01MRW50aXR5RGVjbGFyYXRpb24+IGVudGl0eURlY2xzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFNHTUxFbnRpdHlEZWNsYXJhdGlvbj4oKTsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJvdGVjdGVkIFNHTUxEb2NUeXBlRGVmKFNHTUxQYXJzZXIgcGFyc2VyLCBTdHJpbmcgaWQpIHsKLQkJdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlzdGF0aWMgU0dNTERvY1R5cGVEZWYgY3JlYXRlQW5vbnltb3VzKFNHTUxQYXJzZXIgcGFyc2VyKSB7Ci0JCXJldHVybiBuZXcgU0dNTERvY1R5cGVEZWYocGFyc2VyLCAiYW5vbnltb3VzIik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBFbGVtZW50RGVmaW5pdGlvbiBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGVyZSBpcyBvbmx5IG9uZQotCSAqIEVsZW1lbnREZWZpbml0aW9uIGluc3RhbmNlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUuIFNvIGlmIGEgZGVmaW5pdGlvbgotCSAqIHRoYXQgaGFzIHNwZWNpZmllZCBuYW1lIGFscmVhZHkgZXhpc3RzLCByZXR1cm4gdGhhdCB2YXJpYWJsZS4gSWYgbm90IG1ha2UKLQkgKiBuZXcgaW5zdGFuY2UuIFVzaW5nIHNpbmdsZXRvbiBwYXR0ZXJuLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIGVsZW1lbnQgZGVmaW5lZCBieSBhIG9iamVjdC4KLQkgKiBAcmV0dXJuIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERlZmluaXRpb24gY3JlYXRlRWxlbWVudERlZmluaXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJRWxlbWVudERlZmluaXRpb24gcmV0ID0gZWxlbWVudERlZnMuZ2V0KG5hbWUpOwotCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCXJldCA9IG5ldyBFbGVtZW50RGVmaW5pdGlvbihuYW1lKTsKLQkJCWVsZW1lbnREZWZzLnB1dChuYW1lLCByZXQpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBwdWJsaWMgPGNvZGU+U0dNTERvY1R5cGVEZWY8L2NvZGU+IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJRAotCSAqICAgICAgICAgICAgaWQgcmVsYXRlZCB0byBwdWJsaWMgZW50aXR5LiBGb3IgZXhhbXBsZSA8Y29kZT4KLQkgKiAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIgPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU0dNTERvY1R5cGVEZWYgY3JlYXRlUHVibGljKFN0cmluZyBwdWJsaWNJRCwgU0dNTFBhcnNlciBwYXJzZXIpIHsKLQkJcmV0dXJuIG5ldyBTR01MRG9jVHlwZURlZihwYXJzZXIsIHB1YmxpY0lEKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBwdXRQdWJsaWMoU3RyaW5nIHB1YmxpY0lELCBTR01MRG9jVHlwZURlZiBkdGQpIHsKLQkJdGFibGUucHV0KHB1YmxpY0lELCBkdGQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEVsZW1lbnREZWZpbml0aW9uIGluc3RhbmNlIHJlbGF0ZWQgdG8gdGhlIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBFbGVtZW50RGVmaW5pdGlvbidzIG5hbWUuCi0JICogQHJldHVybiBFbGVtZW50RGVmaW5pdGlvbiBuYW1lZCBuYW1lLiBJZiBubyBpbnN0YW5jZSwgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIEVsZW1lbnREZWZpbml0aW9uIGdldEVsZW1lbnREZWZpbml0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBlbGVtZW50RGVmcy5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgRWxlbWVudERlZmluaXRpb24gaW5zdGFuY2Ugd2hvc2UgTWFnaWMgTnVtYmVyIGlzIHNwZWNpZmVkLgotCSAqIAotCSAqIEBwYXJhbSBudW0KLQkgKiAgICAgICAgICAgIEVsZW1lbnREZWZpbml0aW9uJ3MgTWFnaWMgTnVtYmVyLgotCSAqIEByZXR1cm4gRWxlbWVudERlZmluaXRpb24gbmFtZWQgbmFtZS4gSWYgbm8gaW5zdGFuY2UsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVmaW5pdGlvbiBnZXRFbGVtZW50RGVmaW5pdGlvbihpbnQgbnVtKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudERlZnMuZ2V0KG51bSk7Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCVNHTUxFbnRpdHlEZWNsYXJhdGlvbiBnZXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlyZXR1cm4gKFNHTUxFbnRpdHlEZWNsYXJhdGlvbikgZW50aXR5RGVjbHMuZ2V0KGVudGl0eU5hbWUpOwotCX0KLQotCVNHTUxFbnRpdHlSZWZlcmVuY2UgZ2V0RW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCQlTR01MRW50aXR5UmVmZXJlbmNlIHJldCA9IChTR01MRW50aXR5UmVmZXJlbmNlKSBlbnRpdHlSZWZzLmdldChuYW1lKTsKLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlTR01MRW50aXR5RGVjbGFyYXRpb24gZWQgPSBnZXRFbnRpdHlEZWNsYXJhdGlvbihuYW1lKTsKLQkJCWlmIChlZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJObyBFbnRpdHkgRGVmaW5pdGlvbjogIiArIG5hbWUpOwotCQkJfQotCQkJcmV0ID0gbmV3IFNHTUxFbnRpdHlSZWZlcmVuY2UobmFtZSwgZWQpOwotCQkJZW50aXR5UmVmcy5wdXQobmFtZSwgcmV0KTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEdldHMgcHVibGljIDxjb2RlPlNHTUxEb2NUeXBlRGVmPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIGlkIHJlbGF0ZWQgdG8gcHVibGljIGVudGl0eS4gRm9yIGV4YW1wbGUgPGNvZGU+Ci0JICogIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNHTUxEb2NUeXBlRGVmIGdldFB1YmxpYyhTdHJpbmcgcHVibGljSUQpIHsKLQkJcmV0dXJuIChTR01MRG9jVHlwZURlZikgdGFibGUuZ2V0KHB1YmxpY0lEKTsKLQl9Ci0KLQl2b2lkIHB1dEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5U3RyaW5nKSB7Ci0JCWlmIChlbnRpdHlEZWNscy5nZXQoZW50aXR5TmFtZSkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGRlYyA9IG5ldyBTR01MRW50aXR5RGVjbGFyYXRpb24oZW50aXR5TmFtZSwKLQkJCQllbnRpdHlTdHJpbmcsIHRoaXMpOwotCQllbnRpdHlEZWNscy5wdXQoZW50aXR5TmFtZSwgZGVjKTsKLQl9Ci0KLQl2b2lkIHB1dFB1YmxpY0VudGl0eShTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVN0cmluZywgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCWlmIChlbnRpdHlEZWNscy5nZXQoZW50aXR5TmFtZSkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY2xhc3MgUFVCTElDRW50aXR5IGV4dGVuZHMgU0dNTEVudGl0eURlY2xhcmF0aW9uIHsKLQkJCVN0cmluZyBmaWxlbmFtZTsKLQotCQkJUmVhZGVyIGdldFJlcGxhY2VtZW50UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gcGFyc2VyLmdldFJlc291cmNlKGZpbGVuYW1lKTsKLQkJCX0KLQotCQkJUFVCTElDRW50aXR5KFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5U3RyaW5nLAotCQkJCQlTdHJpbmcgZmlsZW5hbWUsIFNHTUxEb2NUeXBlRGVmIGR0ZCkgewotCQkJCXN1cGVyKGVudGl0eU5hbWUsIGVudGl0eVN0cmluZywgZHRkKTsKLQkJCQl0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCQl9Ci0JCX0KLQkJOwotCQllbnRpdHlEZWNscy5wdXQoZW50aXR5TmFtZSwgbmV3IFBVQkxJQ0VudGl0eShlbnRpdHlOYW1lLCBlbnRpdHlTdHJpbmcsCi0JCQkJZmlsZW5hbWUsIHRoaXMpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGl0cyBwdWJsaWMgaWQuIEZvciBleGFtcGxlICItLy9XM0MvL0RURCBIVE1MIDQuMAotCSAqIFRyYW5zaXRpb25hbC8vRU4iLgotCSAqIAotCSAqIEByZXR1cm4gcHVibGljIGlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgYSBlbGVtZW50IGlzIHNpbmdsZXRvbiBvciBub3QuIEEgc2luZ2xldG9uIGVsZW1lbnQgYXBwZWFycyBvbmx5Ci0JICogb25jZSBpbiBhIGRvY3VtZW50LiBGb3IgZXhhbXBsZSwgSFRNTCwgSEVBRCBhbmQgQk9EWSBhcmUgc2luZ2xldG9uIGluCi0JICogSFRNTCwgYnV0IG5vdCBUQUJMRSwgTEkuCi0JICogCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgbmFtZSB0byBiZSBjaGVja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNpbmdsZXRvbihTdHJpbmcgdGFnTmFtZSkgewotCQlFbGVtZW50RGVmaW5pdGlvbiBlZCA9IGdldEVsZW1lbnREZWZpbml0aW9uKHRhZ05hbWUpOwotCQlyZXR1cm4gZWQgIT0gbnVsbCAmJiBlZC5pc1NpbmdsZXRvbigpOwotCX0KLQotCXByaXZhdGUgaW50IGVsZW1lbnROdW07Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyB0aGlzIERURCBkZWZpbmVzCi0JICovCi0JcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoKSB7Ci0JCXJldHVybiBlbGVtZW50TnVtOwotCX0KLQotCXZvaWQgcmVoYXNoKCkgewotCQllbGVtZW50TnVtID0gZWxlbWVudERlZnMuc2l6ZSgpOwotCQlpbnQgc2l6ZSA9IGVsZW1lbnROdW0gKyAyOyAvLyBUaGUgc2Vjb25kIGxhc3QgZWxlbWVudCBpcyBmb3IgI1BDREFUQS4KLQkJLy8gVGhlIGxhc3QgZWxlbWVudCBpcyBmb3IgQU5PTllNT1VTLgotCQlmb3IgKGludCBpID0gZWxlbWVudE51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQllbGVtZW50RGVmcy5nZXQoaSkucmVoYXNoKHNpemUpOwotCQl9Ci0JfQotCi0JaW50IG1heFNlcUxlbmd0aCA9IDA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmY2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFJvb3Qgbm9kZSBpcyBhIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTR01MRG9jdW1lbnQgZXh0ZW5kcyBTR01MUGFyZW50Tm9kZSBpbXBsZW1lbnRzIERvY3VtZW50IHsKLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IG51bGw7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsOwotCi0JLyoqCi0JICogQHNlZSBTR01MRE9NSW1wbCNjcmVhdGVEb2N1bWVudChqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcsb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlKQotCSAqLwotCXB1YmxpYyBTR01MRG9jdW1lbnQoKSB7Ci0JCXRoaXMoU0dNTERPTUltcGwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNHTUxEb2N1bWVudChET01JbXBsZW1lbnRhdGlvbiBpbXBsZSkgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5kb21JbXBsID0gaW1wbGU7Ci0JfQotCi0Jdm9pZCBjaGVjayhOb2RlIG5vZGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gdGhpcyAmJiAhKG5vZGUgaW5zdGFuY2VvZiBTR01MRG9jVHlwZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLldST05HX0RPQ1VNRU5UX0VSUiwgbm9kZQotCQkJCQkrICIgY3JlYXRlZCBmcm9tICIgKyBub2RlLmdldE93bmVyRG9jdW1lbnQoKSArICIgdGhpcy4iKSB7Ci0JCQl9OwotCQl9Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgRUxFTUVOVF9OT0RFOgotCQkJaWYgKGRvY3VtZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJZG9jdW1lbnRFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwKLQkJCQkJCSIgZG9jdW1lbnQgY2Fubm90IGhhdmUgcm9vdHMuIikgewotCQkJCX07Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCWNhc2UgQ09NTUVOVF9OT0RFOgotCQkJYnJlYWs7Ci0JCWNhc2UgRE9DVU1FTlRfVFlQRV9OT0RFOgotCQkJZG9jdHlwZSA9IChEb2N1bWVudFR5cGUpIG5vZGU7Ci0JCQkoKFNHTUxOb2RlKSBub2RlKS5vd25lckRvY3VtZW50ID0gdGhpczsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBub2RlCi0JCQkJCSsgIiBpcyBub3QgYWxsb3dlZCBhcyBhIGNoaWxkIG9mICIgKyB0aGlzKSB7Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlTR01MRG9jdW1lbnQgcmV0ID0gKFNHTUxEb2N1bWVudCkgc3VwZXIuY2xvbmVOb2RlKHRydWUpOwotCQlzZXRPd25lckRvY3VtZW50KHJldCwgcmV0KTsKLQkJZm9yIChOb2RlIGNoaWxkID0gcmV0LmZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXJldC5kb2N1bWVudEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlKSB7Ci0JCQkJcmV0LmRvY3R5cGUgPSAoRG9jdW1lbnRUeXBlKSBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPd25lckRvY3VtZW50KFNHTUxOb2RlIHJldCwgRG9jdW1lbnQgZG9jKSB7Ci0JCXJldC5vd25lckRvY3VtZW50ID0gZG9jOwotCQlmb3IgKFNHTUxOb2RlIGNoaWxkID0gKFNHTUxOb2RlKSByZXQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChTR01MTm9kZSkgY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc2V0T3duZXJEb2N1bWVudChjaGlsZCwgZG9jKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmV3IFNHTUxBdHRyaWJ1dGUobmFtZSwgbmFtZSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIENEQVRBU2VjdGlvbiBjcmVhdGVDREFUQVNlY3Rpb24oU3RyaW5nIGMpIHsKLQkJcmV0dXJuIG5ldyBTR01MQ0RBVEFTZWN0aW9uKGMsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBDb21tZW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIGRhdGEpIHsKLQkJcmV0dXJuIG5ldyBTR01MQ29tbWVudChkYXRhLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgewotCQlyZXR1cm4gbmV3IFNHTUxEb2N1bWVudEZyYWdtZW50KHRoaXMpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIG5ldyBTR01MRWxlbWVudCh0YWdOYW1lLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgYSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLAotCQkJCSJjYW5ub3QgY3JlYXRlIEVudGl0eSBSZWYuIikgewotCQl9OwotCX0KLQotCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsCi0JCQlTdHJpbmcgZGF0YSkgewotCQlyZXR1cm4gbmV3IFNHTUxQSSh0YXJnZXQsIGRhdGEsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCXJldHVybiBuZXcgU0dNTFRleHQoZGF0YSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N0eXBlKCkgewotCQlyZXR1cm4gZG9jdHlwZTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb2N1bWVudEVsZW1lbnQ7Ci0JfQotCi0JLy8gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnQgaW50ZXJmYWNlOwotCXB1YmxpYyBOb2RlIGdldERvY3VtZW50VHlwZSgpIHsKLQkJcmV0dXJuIGRvY3R5cGU7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWduYW1lKSB7Ci0JCWZpbmFsIGJvb2xlYW4gYWxsID0gdGFnbmFtZS5lcXVhbHMoIioiKTsKLQkJZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSB0YWduYW1lOwotCQlyZXR1cm4gbmV3IE5vZGVMaXN0KCkgewotCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJaW50IHJldCA9IDA7Ci0JCQkJTm9kZSB0bXAxLCB0bXAyOwotCQkJCXRtcDEgPSBkb2N1bWVudEVsZW1lbnQ7Ci0JCQkJb3V0ZXI6IHdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCQkJaWYgKHRtcDEgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCQkJJiYgKGFsbCB8fCB0YXJnZXROYW1lLmVxdWFsc0lnbm9yZUNhc2UodG1wMQotCQkJCQkJCQkJLmdldE5vZGVOYW1lKCkpKSkgewotCQkJCQkJcmV0Kys7Ci0JCQkJCX0KLQkJCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQkJCWlmICh0bXAxID09IGRvY3VtZW50RWxlbWVudCkgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRtcDEgIT0gZG9jdW1lbnRFbGVtZW50KSB7Ci0JCQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdG1wMSA9IHRtcDI7Ci0JCQkJfQotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJTm9kZSB0bXAxLCB0bXAyOwotCQkJCXRtcDEgPSBkb2N1bWVudEVsZW1lbnQ7Ci0JCQkJb3V0ZXI6IHdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCQkJaWYgKHRtcDEgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCQkJJiYgKGFsbCB8fCB0YXJnZXROYW1lLmVxdWFsc0lnbm9yZUNhc2UodG1wMQotCQkJCQkJCQkJLmdldE5vZGVOYW1lKCkpKSkgewotCQkJCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQkJCQlyZXR1cm4gdG1wMTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW5kZXgtLTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKHRtcDIgPSB0bXAxLmdldEZpcnN0Q2hpbGQoKSkgPT0gbnVsbCkgewotCQkJCQkJaWYgKHRtcDEgPT0gZG9jdW1lbnRFbGVtZW50KSB7Ci0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJd2hpbGUgKHRtcDIgPT0gbnVsbCAmJiB0bXAxICE9IG51bGwpIHsKLQkJCQkJCXRtcDEgPSB0bXAyID0gdG1wMS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAodG1wMSAhPSBkb2N1bWVudEVsZW1lbnQpIHsKLQkJCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0bXAxID0gdG1wMjsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIERPTUltcGxlbWVudGF0aW9uIGdldEltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kb21JbXBsOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNkb2N1bWVudCI7Ci0JfQotCi0JLy8gaW1wbGVtZW50YXRpb24gb2YgTm9kZSBpbnRlcmZhY2UKLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQSBEb2N1bWVudCBvYmplY3QgaXMgdGhlIHJvb3Qgbm9kZS4gU28gdGhpcyBoYXZlIG5vIHNpYmxpbmdzLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgaW4gVmlzdWFsQWdlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IGRvY3VtZW50RWxlbWVudCkgewotCQkJZG9jdW1lbnRFbGVtZW50ID0gbnVsbDsKLQkJfSBlbHNlIGlmIChvbGRDaGlsZCA9PSBkb2N0eXBlKSB7Ci0JCQlkb2N0eXBlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLAotCQkJCSIjZG9jdW1lbnQgaXMgYWx3YXlzIG51bGwiKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBEb2N1bWVudFR5cGUgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY1R5cGVOYW1lCi0JICogICAgICAgICAgICBkb2N1bWVudCB0eXBlIG5hbWUKLQkgKiBAYXByYW0gaWQgcHVibGljIElELgotCSAqIEBkZXByZWNhdGVkIFNlZQotCSAqICAgICAgICAgICAgIHtAbGluayBTR01MRE9NSW1wbCNjcmVhdGVEb2N1bWVudFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyl9LgotCSAqLwotCXB1YmxpYyBTR01MRG9jVHlwZSBjcmVhdGVEb2N1bWVudFR5cGUoU3RyaW5nIGRvY1R5cGVOYW1lLCBTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBTR01MRG9jVHlwZShkb2NUeXBlTmFtZSwgaWQsIHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoU3RyaW5nIHB1YmxpY0lELCBVUkwgbG9jYXRpb24sIFByaW50V3JpdGVyIHB3LAotCQkJYm9vbGVhbiBpbmRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXByaW50QXNYTUwocHVibGljSUQsIGxvY2F0aW9uLCBwdywgaW5kZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBEb2N1bWVudCBhcyBYTUwKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljCi0JICogICAgICAgICAgICBJRAotCSAqIEBwYXJhbSBEVEQncwotCSAqICAgICAgICAgICAgbG9jYXRpb24KLQkgKiBAcGFyYW0gcHcKLQkgKiAgICAgICAgICAgIHN0cmVhbSB0byB3cml0ZSB0aGlzIGRvY3VtZW50LgotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIGluZGVudCBpZiB0cnVlLiBPdGhlcndpc2UsIG5vdCBpbmRlbnQuCi0JICogQHBhcmFtIGVuYwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoU3RyaW5nIHB1YmxpY0lELCBVUkwgbG9jYXRpb24sIFByaW50V3JpdGVyIHB3LAotCQkJYm9vbGVhbiBpbmRlbnQsIFN0cmluZyBlbmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChlbmMgPT0gbnVsbCkgewotCQkJcHcucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iKTsKLQkJfSBlbHNlIHsKLQkJCXB3LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBlbmMgKyAiXCI/PiIpOwotCQl9Ci0JCWlmIChwdWJsaWNJRCAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgiPCFET0NUWVBFICIgKyBkb2N1bWVudEVsZW1lbnQuZ2V0VGFnTmFtZSgpICsgIiBQVUJMSUMgXCIiCi0JCQkJCSsgcHVibGljSUQgKyAnIicpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlwdy5wcmludGxuKCIgXCIiICsgbG9jYXRpb24gKyAiXCI+Iik7Ci0JCQl9IGVsc2UgewotCQkJCXB3LnByaW50bG4oJz4nKTsKLQkJCX0KLQkJfQotCQkoKFNHTUxFbGVtZW50KSBkb2N1bWVudEVsZW1lbnQpLnByaW50QXNYTUwocHcsIDAsIGluZGVudCk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcuZmx1c2goKTsKLQkJLy8gY2hhckVudGl0aWVzNFhtbCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1hNTChQcmludFdyaXRlciBwdywgYm9vbGVhbiBpbmRlbnQsIFN0cmluZyBlbmMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwcmludEFzWE1MKG51bGwsIG51bGwsIHB3LCBpbmRlbnQsIGVuYyk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgRG9jdW1lbnQgYXMgU0dNTC4gc3RhcnR0YWcncyBzdHJpbmcgaW4gdGhpcyBkb2N1bWVudCBhcmUgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBkb2N1bWVudCAoc2VlIHtAbGluayBTR01MRWxlbWVudCN0b1N0cmluZygpfS4gRXZlbiBpZgotCSAqIGF0dHJpYnV0ZXMgaW4gZWxlbWVudHMgYXJlIG1vZGlmaWVkLCBzdGFydHRhZydzIHN0cmluZyBkb2VzIG5vdCBjaGFuZ2UuCi0JICogCi0JICogQHBhcmFtIERURCdzCi0JICogICAgICAgICAgICBsb2NhdGlvbgotCSAqIEBwYXJhbSBwdwotCSAqICAgICAgICAgICAgc3RyZWFtIHRvIHdyaXRlIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gaW5kZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludGxuKGRvY3R5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50RWxlbWVudCAhPSBudWxsKQotCQkJKChTR01MRWxlbWVudCkgZG9jdW1lbnRFbGVtZW50KS5wcmludEFzU0dNTChwdywgMCwgaW5kZW50KTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBjaGFyRW50aXRpZXM0WG1sOwotCi0JU3RyaW5nIGdldEVudGl0eU9yaWdpbjRYbWwoU3RyaW5nIGVudGl0eSkgewotCQlyZXR1cm4gKFN0cmluZykgY2hhckVudGl0aWVzNFhtbC5nZXQoZW50aXR5KTsKLQl9Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBTR01MRG9jVHlwZURlZiBkdGQ7Ci0KLQlwdWJsaWMgU0dNTERvY1R5cGVEZWYgZ2V0RFREKCkgewotCQlyZXR1cm4gZHRkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERURChTR01MRG9jVHlwZURlZiBkdGQpIHsKLQkJdGhpcy5kdGQgPSBkdGQ7Ci0JfQotCi0JU3RyaW5nIGdldEVudGl0eU9yaWdpbihDaGFyYWN0ZXIgQ2gpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNoYXJOdW1FbnRpdGllcy5nZXQoQ2gpOwotCX0KLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZTxDaGFyYWN0ZXIsIFN0cmluZz4gY2hhck51bUVudGl0aWVzID0gbmV3IEhhc2h0YWJsZTxDaGFyYWN0ZXIsIFN0cmluZz4oKTsKLQotCXZvaWQgcHV0Q2hhck51bUVudGl0eShDaGFyYWN0ZXIgQywgU3RyaW5nIGVudCkgewotCQljaGFyTnVtRW50aXRpZXMucHV0KEMsIGVudCk7Ci0JfQotCi0JU3RyaW5nIGdldENoYXJOdW1FbnRpdHkoQ2hhcmFjdGVyIEMpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNoYXJOdW1FbnRpdGllcy5nZXQoQyk7Ci0JfQotCi0JLy8gRE9NIExldmVsIDIKLQotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBpbXBvcnRlZE5vZGUsIGJvb2xlYW4gZGVlcCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCU5vZGUgcmV0OwotCQlzd2l0Y2ggKGltcG9ydGVkTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQlyZXQgPSBjcmVhdGVFbGVtZW50KGltcG9ydGVkTm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gaW1wb3J0ZWROb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBpbXBvcnRlZEF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCWlmIChpbXBvcnRlZEF0dHIuZ2V0U3BlY2lmaWVkKCkpIHsKLQkJCQkJQXR0ciBhdHRyID0gY3JlYXRlQXR0cmlidXRlKGltcG9ydGVkQXR0ci5nZXROb2RlTmFtZSgpKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZShpbXBvcnRlZEF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJCSgoRWxlbWVudCkgcmV0KS5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREU6Ci0JCQlyZXQgPSBjcmVhdGVBdHRyaWJ1dGUoaW1wb3J0ZWROb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJKChBdHRyKSByZXQpLnNldFZhbHVlKGltcG9ydGVkTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCXJldCA9IGNyZWF0ZVRleHROb2RlKGltcG9ydGVkTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCXJldCA9IGNyZWF0ZUNEQVRBU2VjdGlvbihpbXBvcnRlZE5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm9kZS5DT01NRU5UX05PREU6Ci0JCQlyZXQgPSBjcmVhdGVDb21tZW50KGltcG9ydGVkTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIGltcG9ydGVkTm9kZTsKLQkJCXJldCA9IGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihwaS5nZXRUYXJnZXQoKSwgcGkuZ2V0RGF0YSgpKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsCi0JCQkJCSJFTlRJVFlfUkVGRVJFTkNFOiAiICsgaW1wb3J0ZWROb2RlKSB7Ci0JCQl9OwotCQljYXNlIE5vZGUuRU5USVRZX05PREU6Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIkVOVElUWTogIgotCQkJCQkrIGltcG9ydGVkTm9kZSkgewotCQkJfTsKLQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIkRPQ1VNRU5UOiAiCi0JCQkJCSsgaW1wb3J0ZWROb2RlKSB7Ci0JCQl9OwotCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsCi0JCQkJCSJET0NVTUVOVF9UWVBFOiAiICsgaW1wb3J0ZWROb2RlKSB7Ci0JCQl9OwotCQljYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLQkJCXJldCA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERToKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTk9UQVRJT046ICIKLQkJCQkJKyBpbXBvcnRlZE5vZGUpIHsKLQkJCX07Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwKLQkJCQkJIlVua25vd24gbm9kZSB0eXBlOiAiICsgaW1wb3J0ZWROb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCX07Ci0JCX0KLQkJaWYgKGRlZXApIHsKLQkJCWZvciAoTm9kZSBpbXBvcnRlZENoaWxkID0gaW1wb3J0ZWROb2RlLmdldEZpcnN0Q2hpbGQoKTsgaW1wb3J0ZWRDaGlsZCAhPSBudWxsOyBpbXBvcnRlZENoaWxkID0gaW1wb3J0ZWRDaGlsZAotCQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJldC5hcHBlbmRDaGlsZChpbXBvcnROb2RlKGltcG9ydGVkQ2hpbGQsIHRydWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkLgotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5jcmVhdGVFbGVtZW50KHF1YWxpZmllZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRWxlbWVudChxdWFsaWZpZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZC4KLQkgKiBAcmV0dXJuIHNhbWUgYXMgPGNvZGU+Y3JlYXRlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQuCi0JICogQHJldHVybiBzYW1lIGFzIDxjb2RlPmdldEVsZW1lbnRzQnlUYWdOYW1lKGxvY2FsTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlyZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUobG9jYWxOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB3aG9zZSA8Y29kZT5JRDwvY29kZT4gaXMgZ2l2ZW4gYnkKLQkgKiA8Y29kZT5lbGVtZW50SWQ8L2NvZGU+LiBJZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaGFzIHRoaXMKLQkgKiA8Y29kZT5JRDwvY29kZT4gVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGRlcHRoLWZpcnN0IGFuZCBwcmUtb3JkZXIKLQkgKiB0cmF2ZXJzYWwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGVsZW1lbnRJRCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudEJ5SWQoZG9jdW1lbnRFbGVtZW50LCBlbGVtZW50SUQpOwotCX0KLQotCXByaXZhdGUgRWxlbWVudCBnZXRFbGVtZW50QnlJZChFbGVtZW50IGVsLCBTdHJpbmcgZWxlbWVudElEKSB7Ci0JCWlmIChlbC5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGVsZW1lbnRJRCkpIHsKLQkJCXJldHVybiBlbDsKLQkJfSBlbHNlIHsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IGVsLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJRWxlbWVudCByZXQgPSBnZXRFbGVtZW50QnlJZCgoRWxlbWVudCkgY2hpbGQsIGVsZW1lbnRJRCk7Ci0JCQkJCWlmIChyZXQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRE9NIExldmVsIDMKLQkgKi8KLQotCXB1YmxpYyBOb2RlIGFkb3B0Tm9kZShOb2RlIHNvdXJjZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRE9NQ29uZmlndXJhdGlvbiBnZXREb21Db25maWcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0WG1sU3RhbmRhbG9uZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFVSSShTdHJpbmcgZG9jdW1lbnRVUkkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0WG1sU3RhbmRhbG9uZShib29sZWFuIHhtbFN0YW5kYWxvbmUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRYbWxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MRG9jdW1lbnRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2N1bWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmE1NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxEb2N1bWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1jbGFzcyBTR01MRG9jdW1lbnRGcmFnbWVudCBleHRlbmRzIFNHTUxQYXJlbnROb2RlIGltcGxlbWVudHMgRG9jdW1lbnRGcmFnbWVudCB7Ci0Jdm9pZCBjaGVjayhOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChuZXdDaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgRUxFTUVOVF9OT0RFOgotCQljYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLQkJY2FzZSBDT01NRU5UX05PREU6Ci0JCWNhc2UgVEVYVF9OT0RFOgotCQljYXNlIENEQVRBX1NFQ1RJT05fTk9ERToKLQkJY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3Q2hpbGQKLQkJCQkJKyAiIGNhbm5vdCBiZSBhIGNoaWxkIG9mICIgKyB0aGlzKSB7Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fREFUQV9BTExPV0VEX0VSUiwgdGhpcwotCQkJCSsgIiBjYW5ub3QgaGF2ZSBhbnkgZGF0YS4iKSB7Ci0JCX07Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQl9Ci0KLQlTR01MRG9jdW1lbnRGcmFnbWVudChEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiRG9jdW1lbnRGcmFnbWVudFsiKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXNiLmFwcGVuZChjaGlsZC50b1N0cmluZygpKTsKLQkJCWlmIChjaGlsZC5nZXROZXh0U2libGluZygpICE9IG51bGwpIHsKLQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoJ10nKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiMGFkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UeXBlSW5mbzsKLQotLyoqCi0gKiBFbGVtZW50IGNsYXNzIG9mIFNHTUwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNHTUxFbGVtZW50IGV4dGVuZHMgU0dNTFBhcmVudE5vZGUgaW1wbGVtZW50cyBFbGVtZW50LCBJUHJpbnRYTUwgewotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lOwotCi0JLyoqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgU0dNTEF0dHJpYnV0ZSBhdHRyaWJ1dGVzW10gPSBuZXcgU0dNTEF0dHJpYnV0ZVs4XTsKLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGludCBhdHRyTnVtID0gMDsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgZWxlbWVudCdzIG5hbWUKLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBvd25lciBkb2N1bWVudCBvZiB0aGlzIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNHTUxFbGVtZW50KFN0cmluZyBuYW1lLCBEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQkJdGhpcy50YWdOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgYW4gc3BlY2lmaWVkIG5vZGUgaXMgYXBwcm9wcmlhdGUgYXMgYSBjaGlsZC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgY2hpbGQgbm9kZSB0byBhZGQKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIDxjb2RlPiBub2RlIDwvY29kZT4gaXMgbm90IGFwcHJvcHJpYXRlIGFzIGEgY2hpbGQuCi0JICovCi0Jdm9pZCBjaGVjayhOb2RlIG5vZGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsCi0JCQkJCSJ0cnlpbmcgdG8gaW5zZXJ0IG51bGwiKSB7Ci0JCQl9OwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG93bmVyRG9jdW1lbnQpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLldST05HX0RPQ1VNRU5UX0VSUiwgbm9kZQotCQkJCQkrICIgY3JlYXRlZCBmcm9tICIgKyBub2RlLmdldE93bmVyRG9jdW1lbnQoKSArICIuICIgKyB0aGlzCi0JCQkJCSsgIiBjcmVhdGVkIGZyb20gIiArIG93bmVyRG9jdW1lbnQpIHsKLQkJCX07Ci0JCX0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBFTEVNRU5UX05PREU6Ci0JCWNhc2UgVEVYVF9OT0RFOgotCQljYXNlIENPTU1FTlRfTk9ERToKLQkJY2FzZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCWNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotCQljYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBub2RlCi0JCQkJCSsgIiBpcyBub3QgYWxsb3dlZCBhcyBhIGNoaWxkIG9mICIgKyB0aGlzKSB7Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJU0dNTEF0dHJpYnV0ZSBhdHRyID0gYXR0cmlidXRlc1tpXTsKLQkJCWlmIChhdHRyLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotCQkJCXJldHVybiBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVNHTUxBdHRyaWJ1dGUgcmV0ID0gYXR0cmlidXRlc1tpXTsKLQkJCWlmIChyZXQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kQXR0ckJ1ZigpIHsKLQkJU0dNTEF0dHJpYnV0ZSBuZXdCdWZbXSA9IG5ldyBTR01MQXR0cmlidXRlW2F0dHJOdW0gKiAyXTsKLQkJU3lzdGVtLmFycmF5Y29weShhdHRyaWJ1dGVzLCAwLCBuZXdCdWYsIDAsIGF0dHJOdW0pOwotCQlhdHRyaWJ1dGVzID0gbmV3QnVmOwotCX0KLQotCS8qKgotCSAqIHJldHVybmVkIGluc3RhbmNlIGFsd2F5cyBpZ25vcmVzIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgTmFtZWROb2RlTWFwKCkgewotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcignWycpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck51bSAtIDE7IGkrKykgewotCQkJCQlyZXQuYXBwZW5kKGF0dHJpYnV0ZXNbaV0gKyAiLCAiKTsKLQkJCQl9Ci0JCQkJaWYgKGF0dHJOdW0gPiAwKSB7Ci0JCQkJCXJldC5hcHBlbmQoYXR0cmlidXRlc1thdHRyTnVtIC0gMV0pOwotCQkJCX0KLQkJCQlyZXQuYXBwZW5kKCddJyk7Ci0JCQkJcmV0dXJuIHJldC50b1N0cmluZygpOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJCX0KLQotCQkJcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQkJCXJldHVybiBnZXROYW1lZEl0ZW0obG9jYWxOYW1lKTsKLQkJCX0KLQotCQkJcHVibGljIE5vZGUgc2V0TmFtZWRJdGVtKE5vZGUgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCQlpZiAoYXJnIGluc3RhbmNlb2YgU0dNTEF0dHJpYnV0ZSkgewotCQkJCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQlTR01MQXR0cmlidXRlIHJldCA9IGF0dHJpYnV0ZXNbaV07Ci0JCQkJCQlpZiAocmV0LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJCQkJYXJnLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQkJYXR0cmlidXRlc1tpXSA9IChTR01MQXR0cmlidXRlKSBhcmc7Ci0JCQkJCQkJYXR0cmlidXRlc1tpXS5zZXRPd25lckVsZW1lbnQoU0dNTEVsZW1lbnQudGhpcyk7Ci0JCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoYXR0ck51bSA9PSBhdHRyaWJ1dGVzLmxlbmd0aCkgewotCQkJCQkJZXhwYW5kQXR0ckJ1ZigpOwotCQkJCQl9Ci0JCQkJCWF0dHJpYnV0ZXNbYXR0ck51bSsrXSA9IChTR01MQXR0cmlidXRlKSBhcmc7Ci0JCQkJCSgoU0dNTEF0dHJpYnV0ZSkgYXJnKS5zZXRPd25lckVsZW1lbnQoU0dNTEVsZW1lbnQudGhpcyk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oCi0JCQkJCQkJRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKLQkJCQkJCQkib25seSBBdHRyIGluc3RhbmNlIGNhbiBiZSBzZXQ6ICIgKyBhcmcpIHsKLQkJCQkJfTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbU5TKE5vZGUgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gc2V0TmFtZWRJdGVtKGFyZyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlTR01MQXR0cmlidXRlIGF0dHIgPSBhdHRyaWJ1dGVzW2ldOwotCQkJCQlpZiAoYXR0ci5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKLQkJCQkJCWF0dHJpYnV0ZXNbaV0gPSBudWxsOwotCQkJCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0JCQkJCQlmb3IgKGkrKzsgaSA8IGF0dHJOdW07IGkrKykgewotCQkJCQkJCWF0dHJpYnV0ZXNbaSAtIDFdID0gYXR0cmlidXRlc1tpXTsKLQkJCQkJCX0KLQkJCQkJCWF0dHJOdW0tLTsKLQkJCQkJCXJldHVybiBhdHRyOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW1OUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gcmVtb3ZlTmFtZWRJdGVtKGxvY2FsTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBhdHRyTnVtKSB7Ci0JCQkJCXJldHVybiBhdHRyaWJ1dGVzW2luZGV4XTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBhdHRyTnVtOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgbmFtZSkgewotCQlmaW5hbCBib29sZWFuIGFsbCA9IG5hbWUuZXF1YWxzKCIqIik7Ci0JCWZpbmFsIFN0cmluZyB0YXJnZXROYW1lID0gbmFtZTsKLQkJcmV0dXJuIG5ldyBOb2RlTGlzdCgpIHsKLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCWludCByZXQgPSAwOwotCQkJCU5vZGUgdG1wMSwgdG1wMjsKLQkJCQl0bXAxID0gU0dNTEVsZW1lbnQudGhpcy5maXJzdENoaWxkOwotCQkJCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIChhbGwgfHwgdGFyZ2V0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRtcDEKLQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpKSkKLQkJCQkJCQkmJiB0bXAxICE9IFNHTUxFbGVtZW50LnRoaXMpIHsKLQkJCQkJCXJldCsrOwotCQkJCQl9Ci0JCQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAodG1wMSA9PSBTR01MRWxlbWVudC50aGlzKSB7Ci0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJd2hpbGUgKHRtcDIgPT0gbnVsbCAmJiB0bXAxICE9IG51bGwpIHsKLQkJCQkJCXRtcDEgPSB0bXAyID0gdG1wMS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAodG1wMSAhPSBTR01MRWxlbWVudC50aGlzKSB7Ci0JCQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdG1wMSA9IHRtcDI7Ci0JCQkJfQotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJTm9kZSB0bXAxLCB0bXAyOwotCQkJCXRtcDEgPSBTR01MRWxlbWVudC50aGlzLmZpcnN0Q2hpbGQ7Ci0JCQkJb3V0ZXI6IHdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCQkJaWYgKHRtcDEgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCQkJJiYgKGFsbCB8fCB0YXJnZXROYW1lLmVxdWFsc0lnbm9yZUNhc2UodG1wMQotCQkJCQkJCQkJLmdldE5vZGVOYW1lKCkpKQotCQkJCQkJCSYmIHRtcDEgIT0gU0dNTEVsZW1lbnQudGhpcykgewotCQkJCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQkJCQlyZXR1cm4gdG1wMTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW5kZXgtLTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKHRtcDIgPSB0bXAxLmdldEZpcnN0Q2hpbGQoKSkgPT0gbnVsbCkgewotCQkJCQkJaWYgKHRtcDEgPT0gU0dNTEVsZW1lbnQudGhpcykgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRtcDEgIT0gU0dNTEVsZW1lbnQudGhpcykgewotCQkJCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRtcDEgPSB0bXAyOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVMRU1FTlRfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTR01MQXR0cmlidXRlIGF0dHIgPSBhdHRyaWJ1dGVzW2ldOwotCQkJaWYgKGF0dHIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZShuYW1lKTsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROb2RlVmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhdHRyaWJ1dGVzW2ldID0gbnVsbDsKLQkJCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0JCQkJCWZvciAoaSsrOyBpIDwgYXR0ck51bTsgaSsrKSB7Ci0JCQkJCQlhdHRyaWJ1dGVzW2kgLSAxXSA9IGF0dHJpYnV0ZXNbaV07Ci0JCQkJCX0KLQkJCQkJYXR0ck51bS0tOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUVsZW1lbnREZWZpbml0aW9uIGVkZWY7Ci0JCVNHTUxEb2NUeXBlRGVmIGR0ZCA9ICgoU0dNTERvY3VtZW50KSBvd25lckRvY3VtZW50KS5nZXREVEQoKTsKLQkJaWYgKGR0ZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVkZWYgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24odGFnTmFtZSk7Ci0JCWlmIChlZGVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0cmlidXRlRGVmaW5pdGlvbiBhZGVmID0gZWRlZi5nZXRBdHRyaWJ1dGVEZWYoYXR0ck5hbWUpOwotCQlyZXR1cm4gYWRlZiAhPSBudWxsID8gYWRlZi5nZXREZWZhdWx0VmFsdWUoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIG9sZEF0dHIpIHsKLQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGF0dHJpYnV0ZXNbaV0gPT0gb2xkQXR0cikgewotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUob2xkQXR0ci5nZXROb2RlTmFtZSgpKTsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJU0dNTEF0dHJpYnV0ZSBhdHRyID0gKFNHTUxBdHRyaWJ1dGUpIG93bmVyRG9jdW1lbnQKLQkJCQkJCQkuY3JlYXRlQXR0cmlidXRlKG9sZEF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCWF0dHIuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJCQkJYXR0cmlidXRlc1tpXSA9IGF0dHI7Ci0JCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWF0dHJpYnV0ZXNbaV0gPSBudWxsOwotCQkJCQlmb3IgKGkrKzsgaSA8IGF0dHJOdW07IGkrKykgewotCQkJCQkJYXR0cmlidXRlc1tpIC0gMV0gPSBhdHRyaWJ1dGVzW2ldOwotCQkJCQl9Ci0JCQkJCWF0dHJOdW0tLTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJKChTR01MQXR0cmlidXRlKSBvbGRBdHRyKS5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0JCXJldHVybiBvbGRBdHRyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJU0dNTEF0dHJpYnV0ZSBhdHRyOwotCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlhdHRyID0gYXR0cmlidXRlc1tpXTsKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWF0dHIgPSAoU0dNTEF0dHJpYnV0ZSkgb3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQkJaWYgKGF0dHJpYnV0ZXMubGVuZ3RoID09IGF0dHJOdW0pIHsKLQkJCWV4cGFuZEF0dHJCdWYoKTsKLQkJfQotCQlhdHRyaWJ1dGVzW2F0dHJOdW0rK10gPSBhdHRyOwotCX0KLQotCXB1YmxpYyBBdHRyIHNldEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCEobmV3QXR0ciBpbnN0YW5jZW9mIFNHTUxBdHRyaWJ1dGUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5XUk9OR19ET0NVTUVOVF9FUlIsIG5ld0F0dHIKLQkJCQkJKyAiaXMgbm90IFNHTUxBdHRyaWJ1dGUiKSB7Ci0JCQl9OwotCQl9Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVNHTUxBdHRyaWJ1dGUgYXR0ciA9IGF0dHJpYnV0ZXNbaV07Ci0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuZXdBdHRyLmdldE5hbWUoKSkpIHsKLQkJCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQkJCQlhdHRyaWJ1dGVzW2ldID0gKFNHTUxBdHRyaWJ1dGUpIG5ld0F0dHI7Ci0JCQkJYXR0cmlidXRlc1tpXS5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0JCQkJcmV0dXJuIGF0dHI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGF0dHJpYnV0ZXMubGVuZ3RoID09IGF0dHJOdW0pIHsKLQkJCWV4cGFuZEF0dHJCdWYoKTsKLQkJfQotCQlhdHRyaWJ1dGVzW2F0dHJOdW1dID0gKFNHTUxBdHRyaWJ1dGUpIG5ld0F0dHI7Ci0JCWF0dHJpYnV0ZXNbYXR0ck51bSsrXS5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLAotCQkJCSJjYW4ndCBzZXQgdmFsdWUgaW4gIiArIHRoaXMpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc3RhcnQgdGFnIHN0cmluZy4gSWYgYXR0cmlidXRlIHZhbHVlIGluY2x1ZGVzIGEgY2hhcmFjdGVyIHRoYXQgY2FuIGJlCi0JICogcmV2ZXJ0ZWQsIHJlcGxhY2VzIGl0IHRvIG9yaWdpbmFsIGNoYXJhY3RlciBlbnRpdHkuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2Ygc3RhcnQgdGFnLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJldC5hcHBlbmQoJzwnKTsKLQkJcmV0LmFwcGVuZCh0YWdOYW1lKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTnVtOyBpKyspCi0JCQlyZXQuYXBwZW5kKGF0dHJpYnV0ZXNbaV0udG9TdHJpbmcoKSk7Ci0JCXJldC5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcocmV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFzWE1MKFByaW50V3JpdGVyIHB3LCBpbnQgaW5kZW50TGV2ZWwsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCWlmIChpbmRlbnQKLQkJCQkmJiAocHJldmlvdXNTaWJsaW5nID09IG51bGwgfHwgcHJldmlvdXNTaWJsaW5nLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUKLQkJCQkJCSYmIHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZXZlbDsgaSsrKQotCQkJCXB3LnByaW50KCcgJyk7Ci0JCX0KLQkJcHcucHJpbnQoJzwnICsgZ2V0VGFnTmFtZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTnVtOyBpKyspIHsKLQkJCXB3LnByaW50KGF0dHJpYnV0ZXNbaV0udG9YTUxTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGhhc0NoaWxkTm9kZXMoKSkgewotCQkJcHcucHJpbnQoJz4nKTsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChpbmRlbnQgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERQotCQkJCQkJJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkgewotCQkJCQlwdy5wcmludGxuKCk7Ci0JCQkJfQotCQkJCSgoSVByaW50WE1MKSBjaGlsZCkucHJpbnRBc1hNTChwdywgaW5kZW50TGV2ZWwgKyAxLCBpbmRlbnQpOwotCQkJfQotCQkJaWYgKGluZGVudAotCQkJCQkmJiAoZ2V0TGFzdENoaWxkKCkgPT0gbnVsbCB8fCBnZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFCi0JCQkJCQkJJiYgZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpIHsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IGluZGVudExldmVsOyBpID4gMDsgaS0tKQotCQkJCQlwdy5wcmludCgnICcpOwotCQkJfQotCQkJcHcucHJpbnQoIjwvIiArIGdldFRhZ05hbWUoKSArICc+Jyk7Ci0JCX0gZWxzZSB7Ci0JCQlwdy5wcmludCgiLz4iKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNTR01MKFByaW50V3JpdGVyIHB3LCBpbnQgaW5kZW50TGV2ZWwsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCWlmIChpbmRlbnQKLQkJCQkmJiAocHJldmlvdXNTaWJsaW5nID09IG51bGwgfHwgcHJldmlvdXNTaWJsaW5nLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUKLQkJCQkJCSYmIHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSkgewotCQkJZm9yIChpbnQgaSA9IGluZGVudExldmVsOyBpID4gMDsgaS0tKQotCQkJCXB3LnByaW50KCcgJyk7Ci0JCX0KLQkJcHcucHJpbnQodG9TdHJpbmcoKSk7Ci0JCWJvb2xlYW4gcGFyZW50OwotCQlpZiAocGFyZW50ID0gaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoaW5kZW50ICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUKLQkJCQkJCSYmIGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCQkJcHcucHJpbnRsbigpOwotCQkJCX0KLQkJCQkoKElQcmludFhNTCkgY2hpbGQpLnByaW50QXNTR01MKHB3LCBpbmRlbnRMZXZlbCArIDEsIGluZGVudCk7Ci0JCQl9Ci0JCX0KLQkJU0dNTERvY1R5cGVEZWYgZHRkID0gKChTR01MRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKSkuZ2V0RFREKCk7Ci0JCUVsZW1lbnREZWZpbml0aW9uIGVkID0gbnVsbDsKLQkJaWYgKGR0ZCAhPSBudWxsKSB7Ci0JCQllZCA9IGR0ZC5nZXRFbGVtZW50RGVmaW5pdGlvbih0YWdOYW1lKTsKLQkJfQotCQlpZiAocGFyZW50IHx8IGVkID09IG51bGwgfHwgZWQuZ2V0Q29udGVudE1vZGVsKCkgIT0gU0dNTFBhcnNlci5lbXB0eSkgewotCQkJaWYgKGluZGVudAotCQkJCQkmJiAoZ2V0TGFzdENoaWxkKCkgPT0gbnVsbCB8fCBnZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFCi0JCQkJCQkJJiYgZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpIHsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IGluZGVudExldmVsOyBpID4gMDsgaS0tKQotCQkJCQlwdy5wcmludCgnICcpOwotCQkJfQotCQkJcHcucHJpbnQoIjwvIiArIGdldFRhZ05hbWUoKSArICc+Jyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVNHTUxFbGVtZW50IHJldCA9IChTR01MRWxlbWVudCkgc3VwZXIuY2xvbmVOb2RlKGRlZXApOwotCQlTR01MQXR0cmlidXRlIGNsb25lQXR0cmlidXRlc1tdID0gbmV3IFNHTUxBdHRyaWJ1dGVbYXR0cmlidXRlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQljbG9uZUF0dHJpYnV0ZXNbaV0gPSAoU0dNTEF0dHJpYnV0ZSkgYXR0cmlidXRlc1tpXS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJY2xvbmVBdHRyaWJ1dGVzW2ldLnNldE93bmVyRWxlbWVudChyZXQpOwotCQl9Ci0JCXJldC5hdHRyaWJ1dGVzID0gY2xvbmVBdHRyaWJ1dGVzOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkCi0JICogQHJldHVybiBzYW1lIGFzIDxjb2RlPmdldEF0dHJpYnV0ZShsb2NhbE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKGxvY2FsTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhbiBhdHRyaWJ1dGUuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoaXMgbWV0aG9kIGlzIHNhbWUgYXMKLQkgKiA8Y29kZT5zZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0JCQlTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gYXR0cmlidXRlLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBpcyBzYW1lIGFzCi0JICogPGNvZGU+cmVtb3ZlQXR0cmlidXRlKGxvY2FsTmFtZSk8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUF0dHJpYnV0ZShsb2NhbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkCi0JICogQHJldHVybiBzYW1lIGFzIDxjb2RlPmdldEF0dHJpYnV0ZU5vZGUobG9jYWxOYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZShsb2NhbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5zZXRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBBdHRyIHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZAotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5nZXRFbGVtZW50c0J5VGFnTmFtZShsb2NhbE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lKGxvY2FsTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVNHTUxBdHRyaWJ1dGUgYXR0ciA9IGF0dHJpYnV0ZXNbaV07Ci0JCQlpZiAoYXR0ci5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKG5hbWUpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQotCSAqICAgICAgICAgICAgaWdub3JlZAotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5oYXNBdHRyaWJ1dGVOUyhsb2NhbE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJcmV0dXJuIGhhc0F0dHJpYnV0ZShsb2NhbE5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyTnVtID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBET00gTGV2ZWwgMwotCSAqLwotCi0JcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEVudGl0eURlY2xhcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEVudGl0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjQ1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cC5JTW9kZWxHcm91cDsKLQotY2xhc3MgU0dNTEVudGl0eURlY2xhcmF0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gbnVsbDsKLQotCXByaXZhdGUgSU1vZGVsR3JvdXAgcmVwbGFjZW1lbnRTdWJ0cmVlID0gbnVsbDsKLQotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVEZWZpbml0aW9uc1tdID0gbnVsbDsKLQotCXByaXZhdGUgU0dNTERvY1R5cGVEZWYgZHRkOwotCi0JU0dNTEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5U3RyaW5nLAotCQkJU0dNTERvY1R5cGVEZWYgZHRkKSB7Ci0JCXRoaXMubmFtZSA9IGVudGl0eU5hbWU7Ci0JCXRoaXMucmVwbGFjZW1lbnRTdHJpbmcgPSBlbnRpdHlTdHJpbmc7Ci0JCXRoaXMuZHRkID0gZHRkOwotCX0KLQotCUF0dHJpYnV0ZURlZmluaXRpb25bXSBnZXRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zOwotCX0KLQotCVJlYWRlciBnZXRSZXBsYWNlbWVudFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgU3RyaW5nUmVhZGVyKHJlcGxhY2VtZW50U3RyaW5nKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudFN0cmluZzsKLQl9Ci0KLQlJTW9kZWxHcm91cCBnZXRSZXBsYWNlbWVudFN1YnRyZWUoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudFN1YnRyZWU7Ci0JfQotCi0Jdm9pZCBzZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhBdHRyaWJ1dGVEZWZpbml0aW9uIGFkc1tdKSB7Ci0JCWF0dHJpYnV0ZURlZmluaXRpb25zID0gYWRzOwotCX0KLQotCXZvaWQgc2V0UmVwbGFjZW1lbnRTdHJpbmcoU3RyaW5nIGFyZykgewotCQlyZXBsYWNlbWVudFN0cmluZyA9IGFyZzsKLQl9Ci0KLQl2b2lkIHNldFJlcGxhY2VtZW50U3VidHJlZShJTW9kZWxHcm91cCBhcmcpIHsKLQkJcmVwbGFjZW1lbnRTdWJ0cmVlID0gYXJnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lICsgJz0nICsgcmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgaW50IGNoYXJFbnRpdHkgPSAtMTsKLQotCWludCBnZXRSZXBsYWNlbWVudENoYXIoKSB7Ci0JCXJldHVybiBjaGFyRW50aXR5OwotCX0KLQotCXZvaWQgc2V0UmVwbGFjZW1lbnRDaGFyKGludCBjaCkgewotCQljaGFyRW50aXR5ID0gY2g7Ci0JfQotCi0JU0dNTERvY1R5cGVEZWYgZ2V0RFREKCkgewotCQlyZXR1cm4gZHRkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MRW50aXR5UmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTEVudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q2ODQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWNsYXNzIFNHTUxFbnRpdHlSZWZlcmVuY2UgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFNHTUxFbnRpdHlEZWNsYXJhdGlvbiBlZDsKLQotCVNHTUxFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUsIFNHTUxFbnRpdHlEZWNsYXJhdGlvbiBlZCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmVkID0gZWQ7Ci0JfQotCi0JU0dNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTJjODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0vKioKLSAqIEJhc2UgY2xhc3Mgb2Ygb3JnLnczYy5kb20uTm9kZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIG1vc3QKLSAqIG1ldGhvZHMgZXhjZXB0IGZvciBhIGZldyB3aGljaCBkZXBlbmRzIG9uIGNvbmNyZXRlIGl0cyBjbGFzc2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0dNTE5vZGUgaW1wbGVtZW50cyBOb2RlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0JU0dNTE5vZGUgcHJldmlvdXNTaWJsaW5nLCBuZXh0U2libGluZywgcGFyZW50OwotCi0JRG9jdW1lbnQgb3duZXJEb2N1bWVudDsKLQotCVNHTUxOb2RlKERvY3VtZW50IGRvYykgewotCQlvd25lckRvY3VtZW50ID0gZG9jOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJdHJ5IHsKLQkJCVNHTUxOb2RlIHJldCA9IChTR01MTm9kZSkgY2xvbmUoKTsKLQkJCXJldC5wYXJlbnQgPSByZXQubmV4dFNpYmxpbmcgPSByZXQucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQkJCXJldHVybiByZXQ7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uIEVsZW1lbnQgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE5vZGVMaXN0IG51bGxOb2RlTGlzdCA9IG5ldyBOb2RlTGlzdCgpIHsKLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX07Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIG51bGxOb2RlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0U2libGluZzsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgdGhpcwotCQkJCSsgIiBjYW5ub3QgaGF2ZSBjaGlsZHJlbi4iKSB7Ci0JCX07Ci0JfQotCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIHRoaXMKLQkJCQkrICIgY2Fubm90IGhhdmUgY2hpbGRyZW4uIikgewotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIHRoaXMKLQkJCQkrICIgY2Fubm90IGhhdmUgY2hpbGRyZW4uIikgewotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCB0aGlzCi0JCQkJKyAiIGNhbm5vdCBoYXZlIGNoaWxkcmVuLiIpIHsKLQkJfTsKLQl9Ci0KLQkvLyBET00gTGV2ZWwgMgotCi0JcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIGZhbHNlIGJlY2F1c2UgdGhpcyBpcyBub3QgWE1MIGltcGxlbWVudGF0aW9uIGJ1dCBTR01MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsd2F5cyBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBET00gTGV2ZWwgMwotCSAqLwotCi0JcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXF1YWxOb2RlKE5vZGUgYXJnKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBPYmplY3Qgc2V0VXNlckRhdGEoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTFBJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTFBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDM1MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLS8qKgotICogT3JpZ2luYWxseSA8Y29kZT5vcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IGlzIGRlZmluZWQgZm9yCi0gKiBYTUwuIFN0cnVjdHVyZSBvZiBYTUwncyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gaXMgJmx0Oz88Y29kZT50YXJnZXQgZGF0YQotICogPC9jb2RlPgotICogPyZndDsuIEJ1dCBzdHJ1Y3R1cmUgb2YgU0dNTCdzIFBJIGlzICZsdDs/PGNvZGU+ZGF0YTwvY29kZT4gJmd0OyBTbywgdGhpcwotICogY2xhc3MgaGFzIG5vIDxjb2RlPnRhcmdldDwvY29kZT4uIEV2ZXJ5dGhpbmcgaXMgPGNvZGU+ZGF0YTwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFNHTUxQSSBleHRlbmRzIFNHTUxOb2RlIGltcGxlbWVudHMgUHJvY2Vzc2luZ0luc3RydWN0aW9uLAotCQlJUHJpbnRYTUwgewotCXZvaWQgY2hlY2soTm9kZSBub2RlKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwKLQkJCQkiUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNhbm5vdCBoYXZlIGFueSBjaGlsZHJlbi4iKSB7Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTm9kZUxpc3QgbnVsbE5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KCkgewotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgewotCQl0aGlzLmRhdGEgPSBub2RlVmFsdWU7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBudWxsTm9kZUxpc3Q7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0LCBkYXRhOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gaW5zdGFuY2Ugd2hvc2UgdGFyZ2V0IHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHVibGljIFNHTUxQSShTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSwgU0dNTERvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU0dNTCdzIFBJIGhhcyBubyB0YWdldC4gU28gcmV0dXJucyBkYXRhIGluc3RlYWQgb2YgdGFyZ2V0LgotCSAqIAotCSAqIEByZXR1cm4gYWx3YXlzIHNhbWUgYXMge0BsaW5rICNnZXREYXRhKCkgZ2V0RGF0YSgpfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgZGVidWcuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICI8PyIgKyBkYXRhICsgJz4nOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQoIjw/IiArIGRhdGEgKyAiPz4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFzU0dNTChQcmludFdyaXRlciBwdywgaW50IGluZGVudExldmVsLCBib29sZWFuIGluZGVudCkgewotCQlwdy5wcmludCgiPD8iICsgZGF0YSArICc+Jyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxQYXJlbnROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTFBhcmVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4NzFmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTFBhcmVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBvZiBvcmcudzNjLmRvbS5Ob2RlIGltcGxlbWVudGF0aW9uLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgbW9zdAotICogbWV0aG9kcyBleGNlcHQgZm9yIGEgZmV3IHdoaWNoIGRlcGVuZHMgb24gY29uY3JldGUgaXRzIGNsYXNzZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTR01MUGFyZW50Tm9kZSBleHRlbmRzIFNHTUxOb2RlIGltcGxlbWVudHMgTm9kZSwKLQkJQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgewotCVNHTUxOb2RlIGZpcnN0Q2hpbGQsIGxhc3RDaGlsZDsKLQotCVNHTUxQYXJlbnROb2RlKERvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCX0KLQotCWFic3RyYWN0IHZvaWQgY2hlY2soTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJU0dNTFBhcmVudE5vZGUgcmV0ID0gbnVsbDsKLQkJaWYgKGRlZXAgJiYgZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQlyZXQgPSBjbG9uZU5vZGVEZWVwKCk7Ci0JCQlpZiAocmV0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCXJldCA9IChTR01MUGFyZW50Tm9kZSkgY2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0Lmxhc3RDaGlsZCA9IHJldC5maXJzdENoaWxkID0gbnVsbDsKLQkJfQotCQlyZXQucGFyZW50ID0gcmV0Lm5leHRTaWJsaW5nID0gcmV0LnByZXZpb3VzU2libGluZyA9IG51bGw7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSBTR01MUGFyZW50Tm9kZSBjbG9uZU5vZGVEZWVwKCkgewotCQl0cnkgewotCQkJU0dNTFBhcmVudE5vZGUgcmV0ID0gKFNHTUxQYXJlbnROb2RlKSBjbG9uZSgpOwotCQkJcmV0LnByZXZpb3VzU2libGluZyA9IHJldC5uZXh0U2libGluZyA9IHJldC5wYXJlbnQgPSByZXQuZmlyc3RDaGlsZCA9IHJldC5sYXN0Q2hpbGQgPSBudWxsOwotCQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJCXJldHVybiByZXQ7Ci0JCQlTR01MTm9kZSBjaGlsZCA9IHJldC5maXJzdENoaWxkID0gKFNHTUxOb2RlKSB0aGlzLmZpcnN0Q2hpbGQKLQkJCQkJLmNsb25lTm9kZSh0cnVlKTsKLQkJCWNoaWxkLnBhcmVudCA9IHJldDsKLQkJCWZvciAoU0dNTE5vZGUgc291cmNlID0gdGhpcy5maXJzdENoaWxkLm5leHRTaWJsaW5nOyBzb3VyY2UgIT0gbnVsbDsgc291cmNlID0gc291cmNlLm5leHRTaWJsaW5nKSB7Ci0JCQkJY2hpbGQubmV4dFNpYmxpbmcgPSAoU0dNTE5vZGUpIHNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7Ci0JCQkJY2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gY2hpbGQ7Ci0JCQkJY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZzsKLQkJCQljaGlsZC5wYXJlbnQgPSByZXQ7Ci0JCQl9Ci0JCQlyZXQubGFzdENoaWxkID0gY2hpbGQ7Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTGlzdCgpIHsKLQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJU0dNTE5vZGUgcmV0ID0gZmlyc3RDaGlsZDsKLQkJCQl3aGlsZSAoaW5kZXggPiAwICYmIHJldCAhPSBudWxsKSB7Ci0JCQkJCXJldCA9IHJldC5uZXh0U2libGluZzsKLQkJCQkJaW5kZXgtLTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGluZGV4ID09IDAgPyByZXQgOiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQlpbnQgcmV0ID0gMDsKLQkJCQlmb3IgKFNHTUxOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykgewotCQkJCQlyZXQrKzsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5maXJzdENoaWxkOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMubGFzdENoaWxkOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmlyc3RDaGlsZCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgU0dNTERvY3VtZW50RnJhZ21lbnQKLQkJCQkmJiBub2RlLmdldE93bmVyRG9jdW1lbnQoKSA9PSB0aGlzLmdldE93bmVyRG9jdW1lbnQoKSkgewotCQkJU0dNTERvY3VtZW50RnJhZ21lbnQgZnJhZ21lbnQgPSAoU0dNTERvY3VtZW50RnJhZ21lbnQpIG5vZGU7Ci0JCQlmb3IgKFNHTUxOb2RlIGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykgewotCQkJCWNoaWxkLnBhcmVudCA9IHRoaXM7Ci0JCQl9Ci0JCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJzdENoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKLQkJCQl0aGlzLmxhc3RDaGlsZCA9IGZyYWdtZW50Lmxhc3RDaGlsZDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgPSBmcmFnbWVudC5maXJzdENoaWxkOwotCQkJCWZyYWdtZW50LmZpcnN0Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gdGhpcy5sYXN0Q2hpbGQ7Ci0JCQkJdGhpcy5sYXN0Q2hpbGQgPSBmcmFnbWVudC5sYXN0Q2hpbGQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQljaGVjayhub2RlKTsKLQkJU0dNTE5vZGUgc2dtbE5vZGUgPSAoU0dNTE5vZGUpIG5vZGU7Ci0JCWlmIChzZ21sTm9kZS5wYXJlbnQgIT0gbnVsbCkgewotCQkJc2dtbE5vZGUucGFyZW50LnJlbW92ZUNoaWxkKHNnbWxOb2RlKTsKLQkJfQotCQlzZ21sTm9kZS5wYXJlbnQgPSB0aGlzOwotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQl0aGlzLmZpcnN0Q2hpbGQgPSB0aGlzLmxhc3RDaGlsZCA9IHNnbWxOb2RlOwotCQkJcmV0dXJuIG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmxhc3RDaGlsZC5uZXh0U2libGluZyA9IHNnbWxOb2RlOwotCQkJc2dtbE5vZGUucHJldmlvdXNTaWJsaW5nID0gdGhpcy5sYXN0Q2hpbGQ7Ci0JCQl0aGlzLmxhc3RDaGlsZCA9IHNnbWxOb2RlOwotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZDaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOwotCQl9Ci0JCVNHTUxOb2RlIHNnbWxSZWZDaGlsZCA9IChTR01MTm9kZSkgcmVmQ2hpbGQ7Ci0JCWlmIChzZ21sUmVmQ2hpbGQucGFyZW50ICE9IHRoaXMpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsICJUaGVyZSBpc24ndCAiCi0JCQkJCSsgcmVmQ2hpbGQgKyAiIGFzIGEgY2hpbGRyZW4iKSB7Ci0JCQl9OwotCQl9Ci0JCWlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFNHTUxEb2N1bWVudEZyYWdtZW50Ci0JCQkJJiYgbmV3Q2hpbGQuZ2V0T3duZXJEb2N1bWVudCgpID09IHRoaXMuZ2V0T3duZXJEb2N1bWVudCgpKSB7Ci0JCQlTR01MRG9jdW1lbnRGcmFnbWVudCBmcmFnbWVudCA9IChTR01MRG9jdW1lbnRGcmFnbWVudCkgbmV3Q2hpbGQ7Ci0JCQlmb3IgKFNHTUxOb2RlIGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykgewotCQkJCWNoaWxkLnBhcmVudCA9IHRoaXM7Ci0JCQl9Ci0JCQlpZiAoZmlyc3RDaGlsZCA9PSByZWZDaGlsZCkgewotCQkJCXRoaXMuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBmcmFnbWVudC5sYXN0Q2hpbGQ7Ci0JCQkJZnJhZ21lbnQubGFzdENoaWxkLm5leHRTaWJsaW5nID0gdGhpcy5maXJzdENoaWxkOwotCQkJCXRoaXMuZmlyc3RDaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7Ci0JCQl9IGVsc2UgewotCQkJCWZyYWdtZW50LmZpcnN0Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gc2dtbFJlZkNoaWxkLnByZXZpb3VzU2libGluZzsKLQkJCQlmcmFnbWVudC5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgPSBzZ21sUmVmQ2hpbGQ7Ci0JCQkJc2dtbFJlZkNoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7Ci0JCQkJc2dtbFJlZkNoaWxkLnByZXZpb3VzU2libGluZyA9IGZyYWdtZW50Lmxhc3RDaGlsZDsKLQkJCX0KLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQljaGVjayhuZXdDaGlsZCk7Ci0JCVNHTUxOb2RlIHNnbWxOZXdDaGlsZCA9IChTR01MTm9kZSkgbmV3Q2hpbGQ7Ci0JCWlmIChzZ21sTmV3Q2hpbGQucGFyZW50ICE9IG51bGwpIHsKLQkJCXNnbWxOZXdDaGlsZC5wYXJlbnQucmVtb3ZlQ2hpbGQoc2dtbE5ld0NoaWxkKTsKLQkJfQotCi0JCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gcmVmQ2hpbGQpIHsKLQkJCXRoaXMuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBzZ21sTmV3Q2hpbGQ7Ci0JCQlzZ21sTmV3Q2hpbGQubmV4dFNpYmxpbmcgPSB0aGlzLmZpcnN0Q2hpbGQ7Ci0JCQlzZ21sTmV3Q2hpbGQucGFyZW50ID0gdGhpczsKLQkJCXRoaXMuZmlyc3RDaGlsZCA9IHNnbWxOZXdDaGlsZDsKLQkJfSBlbHNlIHsKLQkJCXNnbWxOZXdDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBzZ21sUmVmQ2hpbGQucHJldmlvdXNTaWJsaW5nOwotCQkJc2dtbE5ld0NoaWxkLm5leHRTaWJsaW5nID0gc2dtbFJlZkNoaWxkOwotCQkJc2dtbFJlZkNoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJCXNnbWxSZWZDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBzZ21sTmV3Q2hpbGQ7Ci0JCQlzZ21sTmV3Q2hpbGQucGFyZW50ID0gdGhpczsKLQkJfQotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVNHTUxOb2RlIHNnbWxPbGRDaGlsZDsKLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCB8fCAhKG9sZENoaWxkIGluc3RhbmNlb2YgU0dNTE5vZGUpCi0JCQkJfHwgKHNnbWxPbGRDaGlsZCA9IChTR01MTm9kZSkgb2xkQ2hpbGQpLnBhcmVudCAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCAiVGhlcmUgaXNuJ3QgIgotCQkJCQkrIG9sZENoaWxkICsgIiBhcyBhIGNoaWxkcmVuIikgewotCQkJfTsKLQkJfQotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG9sZENoaWxkKSB7Ci0JCQlpZiAodGhpcy5maXJzdENoaWxkID09IHRoaXMubGFzdENoaWxkKSB7Ci0JCQkJdGhpcy5maXJzdENoaWxkID0gdGhpcy5sYXN0Q2hpbGQgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQgPSBzZ21sT2xkQ2hpbGQubmV4dFNpYmxpbmc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnByZXZpb3VzU2libGluZyA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGhpcy5sYXN0Q2hpbGQgPT0gb2xkQ2hpbGQpIHsKLQkJCXRoaXMubGFzdENoaWxkID0gc2dtbE9sZENoaWxkLnByZXZpb3VzU2libGluZzsKLQkJCXRoaXMubGFzdENoaWxkLm5leHRTaWJsaW5nID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXNnbWxPbGRDaGlsZC5uZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmcgPSBzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nOwotCQkJc2dtbE9sZENoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IHNnbWxPbGRDaGlsZC5uZXh0U2libGluZzsKLQkJfQotCQlzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nID0gbnVsbDsKLQkJc2dtbE9sZENoaWxkLnBhcmVudCA9IG51bGw7Ci0JCXJldHVybiBvbGRDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrKG5ld0NoaWxkKTsKLQkJU0dNTE5vZGUgc2dtbE5ld0NoaWxkID0gKFNHTUxOb2RlKSBuZXdDaGlsZDsKLQkJU0dNTE5vZGUgc2dtbE9sZENoaWxkID0gKFNHTUxOb2RlKSBvbGRDaGlsZDsKLQkJaWYgKHNnbWxPbGRDaGlsZC5wYXJlbnQgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgdGhpcwotCQkJCQkrICJkb2Vzbid0IGhhdmUgIiArIG5ld0NoaWxkICsgIiBhcyBhIGNoaWxkIikgewotCQkJfTsKLQkJfQotCi0JCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gb2xkQ2hpbGQpIHsKLQkJCWlmICh0aGlzLmZpcnN0Q2hpbGQgIT0gdGhpcy5sYXN0Q2hpbGQpIHsKLQkJCQlzZ21sTmV3Q2hpbGQubmV4dFNpYmxpbmcgPSB0aGlzLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5sYXN0Q2hpbGQgPSBzZ21sTmV3Q2hpbGQ7Ci0JCQl9Ci0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBzZ21sTmV3Q2hpbGQ7Ci0JCQlzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nID0gbnVsbDsKLQkJCXNnbWxPbGRDaGlsZC5wYXJlbnQgPSBudWxsOwotCQkJc2dtbE5ld0NoaWxkLnBhcmVudCA9IHRoaXM7Ci0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCX0KLQkJaWYgKHRoaXMubGFzdENoaWxkID09IG9sZENoaWxkKSB7Ci0JCQl0aGlzLmxhc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcubmV4dFNpYmxpbmcgPSBzZ21sTmV3Q2hpbGQ7Ci0JCQlzZ21sTmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gdGhpcy5sYXN0Q2hpbGQucHJldmlvdXNTaWJsaW5nOwotCQkJdGhpcy5sYXN0Q2hpbGQgPSBzZ21sTmV3Q2hpbGQ7Ci0JCQlzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQkJCXNnbWxPbGRDaGlsZC5wYXJlbnQgPSBudWxsOwotCQkJc2dtbE5ld0NoaWxkLnBhcmVudCA9IHRoaXM7Ci0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCX0KLQkJc2dtbE5ld0NoaWxkLnByZXZpb3VzU2libGluZyA9IHNnbWxPbGRDaGlsZC5wcmV2aW91c1NpYmxpbmc7Ci0JCXNnbWxOZXdDaGlsZC5uZXh0U2libGluZyA9IHNnbWxPbGRDaGlsZC5uZXh0U2libGluZzsKLQkJc2dtbE9sZENoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJc2dtbE9sZENoaWxkLnByZXZpb3VzU2libGluZyA9IHNnbWxPbGRDaGlsZC5uZXh0U2libGluZyA9IG51bGw7Ci0JCXNnbWxPbGRDaGlsZC5wYXJlbnQgPSBudWxsOwotCQlzZ21sTmV3Q2hpbGQucGFyZW50ID0gdGhpczsKLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCS8vIERPTSBMZXZlbCAyCi0KLQlwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB7Ci0JCWZvciAoU0dNTE5vZGUgbiA9IHRoaXMuZmlyc3RDaGlsZDsgbiAhPSBudWxsOykgewotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBURVhUX05PREUpIHsKLQkJCQlpZiAobi5uZXh0U2libGluZyAhPSBudWxsCi0JCQkJCQkmJiBuLm5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gVEVYVF9OT0RFKSB7Ci0JCQkJCSgoVGV4dCkgbikuYXBwZW5kRGF0YSgoKFRleHQpIG4ubmV4dFNpYmxpbmcpLmdldERhdGEoKSk7Ci0JCQkJCXJlbW92ZUNoaWxkKG4ubmV4dFNpYmxpbmcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW4gPSBuLm5leHRTaWJsaW5nOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbi5ub3JtYWxpemUoKTsKLQkJCQluID0gbi5uZXh0U2libGluZzsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzkwZWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyLkF0dHJpYnV0ZVZhbHVlRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyLkRlZmF1bHRFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXIuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JVG9rZW5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5pbnRlcm5hbC5tb2RlbGdyb3VwLklNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cC5BbmRNb2RlbEdyb3VwLkFuZENvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0KLS8qKgotICogUHVyZSBTR01MIHBhcnNlci4gQmFzZSBjbGFzcyBvZiBhIHBhcnNlciB3aGljaCBwYXJzZXMgYSBTR01MIGRlcml2ZWQgbWFya3VwCi0gKiBsYW5ndWFnZS4gTGFuZ3VhZ2UtZGVwZW5kZW50IGN1c3RvbWl6YXRpb24gaGF2ZSB0byBiZSBwcm92aWRlZCBieSBhIHN1YmNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU0dNTFBhcnNlciBpbXBsZW1lbnRzIElTR01MQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnQgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kV2l0aFNsYXNoID0gZmFsc2U7Ci0KLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VGFnTmFtZSA9ICIiOwotCi0JcHJpdmF0ZSBET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY3JlYXRlRG9jdW1lbnRNZXRob2RQYXJhbVR5cGVzW10gPSB7IFN0cmluZy5jbGFzcywKLQkJCVN0cmluZy5jbGFzcywgRG9jdW1lbnRUeXBlLmNsYXNzIH07Ci0KLQkvKioKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIGZhaWxlZC4KLQkgKi8KLQlwdWJsaWMgRE9NSW1wbGVtZW50YXRpb24gc2V0RE9NSW1wbGVtZW50YXRpb24oRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbCkgewotCQlDbGFzcyBkb21JbXBsZUludGVyZmFjZSA9IERPTUltcGxlbWVudGF0aW9uLmNsYXNzOwotCQl0cnkgewotCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGNyZWF0ZURvY3VtZW50TWV0aG9kID0gZG9tSW1wbGVJbnRlcmZhY2UKLQkJCQkJLmdldE1ldGhvZCgiY3JlYXRlRG9jdW1lbnQiLCBjcmVhdGVEb2N1bWVudE1ldGhvZFBhcmFtVHlwZXMpOwotCQkJaWYgKGNyZWF0ZURvY3VtZW50TWV0aG9kICE9IG51bGwpIHsKLQkJCQl0aGlzLmRvbUltcGwgPSBkb21JbXBsOwotCQkJCWRvYyA9IG51bGw7Ci0JCQkJcmV0dXJuIGRvbUltcGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBBIERPTUltcGxlbWVudGF0aW9uIGluc3RhY2UgdGhpcyBwYXJzZXIgdXNlcnMuCi0JICovCi0JcHVibGljIERPTUltcGxlbWVudGF0aW9uIGdldERPTUltcGxlbWVudGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kb21JbXBsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgdGhpcyBpbnN0YW5jZSBhbmQge0BsaW5rIERlZmF1bHRFcnJvckhhbmRsZXJ9aW5zdGFuY2UgaXMKLQkgKiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgU0dNTFBhcnNlcigpIHsKLQkJYWRkRXJyb3JIYW5kbGVyKG5ldyBEZWZhdWx0RXJyb3JIYW5kbGVyKCkpOwotCQlhZGRUb2tlbkVycm9ySGFuZGxlcihuZXcgQXR0cmlidXRlVmFsdWVFcnJvckhhbmRsZXIoKSk7Ci0JCXNldERPTUltcGxlbWVudGF0aW9uKFNHTUxET01JbXBsLmdldERPTUltcGxlbWVudGF0aW9uKCkpOwotCQlpZiAoZ2V0RE9NSW1wbGVtZW50YXRpb24oKSA9PSBudWxsKSB7Ci0JCQlzZXREb2N1bWVudChuZXcgU0dNTERvY3VtZW50KCkpOwotCQl9Ci0JCWFub255bW91c0VsZW1lbnREZWYgPSBuZXcgRWxlbWVudERlZmluaXRpb24oIkFOT05ZTU9VUyIsIGFueSk7Ci0JfQotCi0JcHJpdmF0ZSBJRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcnNbXSA9IG5ldyBJRXJyb3JIYW5kbGVyWzhdOwotCi0JcHJpdmF0ZSBJVG9rZW5FcnJvckhhbmRsZXIgdG9rZW5FcnJvckhhbmRsZXJzW10gPSBuZXcgSVRva2VuRXJyb3JIYW5kbGVyWzhdOwotCi0JcHJpdmF0ZSBpbnQgZXJyb3JIYW5kbGVyTnVtID0gMDsKLQotCXByaXZhdGUgaW50IHRva2VuRXJyb3JIYW5kbGVyTnVtID0gMDsKLQotCS8qKgotCSAqIFNldHMgYW4gZXJyb3IgaGFuZGxlciB0aGF0IHJlY292ZXJzIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckhhbmRsZXIKLQkgKiBAZGVwcmVjYXRlZCB7QGxpbmsgI2FkZEVycm9ySGFuZGxlcihvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyKX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoSUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKLQkJYWRkRXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBFcnJvckhhbmRsZXIgaW5zdGFuY2UuIEFuIGVycm9ySGFuZGxlciBhZGRlZCBsYXRlciBpcyBpbnZva2VkCi0JICogZWFybGllciBieSB0aGlzIHBhcnNlciBpbnN0YW5jZSB0aGFuIGVycm9ySGFuZGxlcnMgYWRkZWQgZWFybGllci4gSWYgb25lCi0JICogZXJyb3JIYW5kbGVyIGhhbmRsZXMgZXJyb3IgKGVnLiByZXR1cm5zIDxjb2RlPgotCSAqIHRydWU8L2NvZGU+KSwgbm8gbW9yZQotCSAqIGVycm9ySGFuZGxlcnMgYXJlIGludm9rZWQuCi0JICogCi0JICogQHBhcmFtIGVycm9ySGFuZGxlcgotCSAqICAgICAgICAgICAgZXJyb3JIYW5kbGVyIGluc3RhbmNlIHRvIGJlIGFkZGVkIHRvIHRoaXMgcGFyc2VyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3JIYW5kbGVyKElFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0JCWlmIChlcnJvckhhbmRsZXJOdW0gPT0gZXJyb3JIYW5kbGVycy5sZW5ndGgpIHsKLQkJCUlFcnJvckhhbmRsZXIgbmV3RXJyb3JIYW5kbGVyc1tdID0gbmV3IElFcnJvckhhbmRsZXJbZXJyb3JIYW5kbGVycy5sZW5ndGggKiAyXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXJyb3JIYW5kbGVyTnVtOyBpKyspIHsKLQkJCQluZXdFcnJvckhhbmRsZXJzW2ldID0gZXJyb3JIYW5kbGVyc1tpXTsKLQkJCX0KLQkJCWVycm9ySGFuZGxlcnMgPSBuZXdFcnJvckhhbmRsZXJzOwotCQl9Ci0JCXRoaXMuZXJyb3JIYW5kbGVyc1tlcnJvckhhbmRsZXJOdW0rK10gPSBlcnJvckhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBFcnJvckhhbmRsZXIgaW5zdGFuY2UuIEFuIGVycm9ySGFuZGxlciBhZGRlZCBsYXRlciBpcyBpbnZva2VkCi0JICogZWFybGllciBieSB0aGlzIHBhcnNlciBpbnN0YW5jZSB0aGFuIGVycm9ySGFuZGxlcnMgYWRkZWQgZWFybGllci4gSWYgb25lCi0JICogZXJyb3JIYW5kbGVyIGhhbmRsZXMgZXJyb3IgKGVnLiByZXR1cm5zIDxjb2RlPgotCSAqIHRydWU8L2NvZGU+KSwgbm8gbW9yZQotCSAqIGVycm9ySGFuZGxlcnMgYXJlIGludm9rZWQuCi0JICogCi0JICogQHBhcmFtIGVycm9ySGFuZGxlcgotCSAqICAgICAgICAgICAgZXJyb3JIYW5kbGVyIGluc3RhbmNlIHRvIGJlIGFkZGVkIHRvIHRoaXMgcGFyc2VyCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9rZW5FcnJvckhhbmRsZXIoSVRva2VuRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewotCQlpZiAodG9rZW5FcnJvckhhbmRsZXJOdW0gPT0gdG9rZW5FcnJvckhhbmRsZXJzLmxlbmd0aCkgewotCQkJSVRva2VuRXJyb3JIYW5kbGVyIG5ld0Vycm9ySGFuZGxlcnNbXSA9IG5ldyBJVG9rZW5FcnJvckhhbmRsZXJbZXJyb3JIYW5kbGVycy5sZW5ndGggKiAyXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5FcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJCW5ld0Vycm9ySGFuZGxlcnNbaV0gPSB0b2tlbkVycm9ySGFuZGxlcnNbaV07Ci0JCQl9Ci0JCQl0b2tlbkVycm9ySGFuZGxlcnMgPSBuZXdFcnJvckhhbmRsZXJzOwotCQl9Ci0JCXRoaXMudG9rZW5FcnJvckhhbmRsZXJzW3Rva2VuRXJyb3JIYW5kbGVyTnVtKytdID0gZXJyb3JIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgbm9kZS1sZXZlbCBlcnJvciBoYW5kbGVycyBpbmNsdWRlZCBpbiB0aGlzIHBhcnNlcgotCSAqIAotCSAqIEByZXR1cm4gZXJyb3IgaGFuZGxlcnMKLQkgKi8KLQlwdWJsaWMgSUVycm9ySGFuZGxlcltdIGdldEVycm9ySGFuZGxlcnMoKSB7Ci0JCUlFcnJvckhhbmRsZXIgcmV0W10gPSBuZXcgSUVycm9ySGFuZGxlcltlcnJvckhhbmRsZXJOdW1dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVycm9ySGFuZGxlck51bTsgaSsrKSB7Ci0JCQlyZXRbaV0gPSBlcnJvckhhbmRsZXJzW2ldOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0b2tlbi1sZXZlbCBlcnJvciBoYW5kbGVycyBpbmNsdWRlZCBpbiB0aGlzIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgSVRva2VuRXJyb3JIYW5kbGVyW10gZ2V0VG9rZW5FcnJvckhhbmRsZXJzKCkgewotCQlJVG9rZW5FcnJvckhhbmRsZXIgcmV0W10gPSBuZXcgSVRva2VuRXJyb3JIYW5kbGVyW2Vycm9ySGFuZGxlck51bV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5FcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJcmV0W2ldID0gdG9rZW5FcnJvckhhbmRsZXJzW2ldOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIG5vZGUtbGV2ZWwgZXJyb3IgaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JIYW5kbGVyCi0JICogICAgICAgICAgICBlcnJvciBoYW5kbGVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVycm9ySGFuZGxlcihJRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVycm9ySGFuZGxlck51bTsgaSsrKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyc1tpXSA9PSBlcnJvckhhbmRsZXIpIHsKLQkJCQllcnJvckhhbmRsZXJzW2ldID0gbnVsbDsKLQkJCQlmb3IgKGkrKzsgaSA8IGVycm9ySGFuZGxlck51bTsgaSsrKSB7Ci0JCQkJCWVycm9ySGFuZGxlcnNbaSAtIDFdID0gZXJyb3JIYW5kbGVyc1tpXTsKLQkJCQl9Ci0JCQkJZXJyb3JIYW5kbGVyTnVtLS07Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHRva2VuLWxldmVsIGVycm9yIGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGVycm9ySGFuZGxlcgotCSAqICAgICAgICAgICAgZXJyb3IgaGFuZGxlciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUb2tlbkVycm9ySGFuZGxlcihJVG9rZW5FcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5FcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJaWYgKHRva2VuRXJyb3JIYW5kbGVyc1tpXSA9PSBlcnJvckhhbmRsZXIpIHsKLQkJCQl0b2tlbkVycm9ySGFuZGxlcnNbaV0gPSBudWxsOwotCQkJCWZvciAoaSsrOyBpIDwgdG9rZW5FcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJCQl0b2tlbkVycm9ySGFuZGxlcnNbaSAtIDFdID0gdG9rZW5FcnJvckhhbmRsZXJzW2ldOwotCQkJCX0KLQkJCQllcnJvckhhbmRsZXJOdW0tLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHZhcmlhYmxlIGlzIGZvciBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGV4dHJhY3ROdW0gPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGV4dHJhY3RDaGFyID0gdHJ1ZTsKLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhpcyBwYXJzZXIgZXh0cmFjdHMgYm90aCBjaGFyYWN0ZXIgYW5kIG51bWJlciBlbnRpdGllcyBvcgotCSAqIG5vdC4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0RW50aXR5KGJvb2xlYW4gYikgewotCQl0aGlzLmV4dHJhY3RDaGFyID0gdGhpcy5leHRyYWN0TnVtID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGlmIGl0IHBhcnNlcyBhbmQgZXh0cmFjdHMgbnVtYmVyIGVudGl0aWVzIG9yIG5vdC4gQnkgZGVmYXVsdCwgaXQKLQkgKiBwYXJzZXMgYW5kIG51bWJlciBjaGFyYWN0ZXIgZW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGV4dHJhY3RzIG51bWJlciBlbnRpdGllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0TnVtRW50aXR5KGJvb2xlYW4gYikgewotCQl0aGlzLmV4dHJhY3ROdW0gPSBiOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBpdCBwYXJzZXMgYW5kIGV4dHJhY3RzIG51bWJlciBlbnRpdGllcyBvciBub3QuIEJ5IGRlZmF1bHQsIGl0Ci0JICogcGFyc2VzIGFuZCBleHRyYWN0cyBudW1iZXIgZW50aXRpZXMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGV4dHJhY3RzIG51bWJlciBlbnRpdGllcy4gT3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXh0cmFjdE51bUVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0cmFjdE51bTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGlmIGl0IHBhcnNlcyBhbmQgZXh0cmFjdHMgY2hhcmFjdGVyIGVudGl0aWVzIG9yIG5vdC4gQnkgZGVmYXVsdCwgaXQKLQkgKiBwYXJzZXMgYW5kIGV4dHJhY3RzIGNoYXJhY3RlciBlbnRpdGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZXh0cmFjdHMgY2hhcmFjdGVyIGVudGl0aWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4dHJhY3RDaGFyRW50aXR5KGJvb2xlYW4gYikgewotCQl0aGlzLmV4dHJhY3RDaGFyID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgaXQgcGFyc2VzIGFuZCBleHRyYWN0cyBjaGFyYWN0ZXIgZW50aXRpZXMgb3Igbm90LiBCeSBkZWZhdWx0LAotCSAqIGl0IHBhcnNlcyBhbmQgZXh0cmFjdHMgY2hhcmFjdGVyIGVudGl0aWVzLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRyYWN0cyBjaGFyYWN0ZXIgZW50aXRpZXMuIE90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4dHJhY3RDaGFyRW50aXR5KCkgewotCQlyZXR1cm4gZXh0cmFjdENoYXI7Ci0JfQotCi0JcHJpdmF0ZSBJbnNUb2tlbml6ZXIgdG9rZW5pemVyOwotCi0JcHJpdmF0ZSBEb2N1bWVudCBkb2MgPSBudWxsOwotCi0JLyoqCi0JICogUHVibGljIGVudGl0aWVzIGFyZSBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZS4gS2V5cyBhcmUgaWQgYW5kIHZhbHVlcyBhcmUKLQkgKiBmaWxlIG5hbWUuIEJvdGggYXJlIGluc3RhbmNlcyBvZiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPi4gRm9yCi0JICogZXhhbXBsZSwgZm9yIHRoZSBrZXkgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iLCB0aGUgdmFsdWUKLQkgKiBpcyAibG9vc2UuZHRkIgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBwdWJFbnRpdHlNYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotCi0JLyoqCi0JICogR2V0cyBwdWJsaWMgZW50aXR5IG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2h0YWJsZSBpbnN0YW5jZSB3aG9zZSBrZXlzIGFyZSBwdWJsaWMgaWQgYW5kIHZhbHVlcyBhcmUgZmlsZQotCSAqICAgICAgICAgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0UHVibGljRW50aXR5TWFwKCkgewotCQlyZXR1cm4gcHViRW50aXR5TWFwOwotCX0KLQotCS8qKgotCSAqIFRvcCBlbGVtZW50J3MgRWxlbWVudERlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbiBsYXN0RGVmID0gbnVsbDsKLQotCXN0YXRpYyBJTW9kZWxHcm91cCBwY2RhdGEgPSBuZXcgSU1vZGVsR3JvdXAoKSB7Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uKSkgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVmZXIoYm9vbGVhbiBpbmZpbml0ZSkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiI1BDREFUQSI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJCWJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQkJcmV0W3RvdGFsU2l6ZSAtIDJdID0gdHJ1ZTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9OwotCi0Jc3RhdGljIElNb2RlbEdyb3VwIGNkYXRhID0gbmV3IElNb2RlbEdyb3VwKCkgewotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENEQVRBU2VjdGlvbikgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVmZXIoYm9vbGVhbiBpbmZpbml0ZSkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ0RBVEEiOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goaW50IG51bWJlcikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9OwotCi0Jc3RhdGljIElNb2RlbEdyb3VwIGVtcHR5ID0gbmV3IElNb2RlbEdyb3VwKCkgewotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJFTVBUWSI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbltdIHJlaGFzaChpbnQgdG90YWxTaXplKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlzdGF0aWMgSU1vZGVsR3JvdXAgYW55ID0gbmV3IElNb2RlbEdyb3VwKCkgewotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJCXBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgRWxlbWVudERlZmluaXRpb24gYW5vbnltb3VzRWxlbWVudERlZjsKLQotCS8qKgotCSAqIEdldHMgYSBlbGVtZW50IGRlZmluaXRpb24gZm9yIHVuZGVmaW5lZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERlZmluaXRpb24gZ2V0QW5vbnltb3VzRWxlbWVudERlZmluaXRpb24oKSB7Ci0JCXJldHVybiBhbm9ueW1vdXNFbGVtZW50RGVmOwotCX0KLQotCXByaXZhdGUgU0dNTERvY1R5cGVEZWYgZHRkOwotCi0JLyoqCi0JICogR2V0cyBEVEQgdGhhdCBkZWZpbmVzIHRoaXMgRG9jdW1lbnQncyBzeW50YXguCi0JICogCi0JICogQHJldHVybiBEVEQgdGhhdCBkZWZpbmVzIHRoaXMgRG9jdW1lbnQncyBzeW50YXguCi0JICovCi0JcHVibGljIFNHTUxEb2NUeXBlRGVmIGdldERURCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRkOwotCX0KLQotCS8qKgotCSAqIFNldHMgRFREIHRoYXQgZGVmaW5lcyB0aGlzIERvY3VtZW50J3Mgc3ludGF4LgotCSAqIAotCSAqIEBwYXJhbSBkdGQKLQkgKiAgICAgICAgICAgIERURCB0aGF0IGRlZmluZXMgdGhpcyBEb2N1bWVudCdzIHN5bnRheC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXREVEQoU0dNTERvY1R5cGVEZWYgZHRkKSB7Ci0JCXRoaXMuZHRkID0gZHRkOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgU0dNTERvY3VtZW50KSB7Ci0JCQkoKFNHTUxEb2N1bWVudCkgZG9jKS5zZXREVEQoZHRkKTsKLQkJfQotCi0JCWlzWEhUTUwgPSAoZHRkLnRvU3RyaW5nKCkuaW5kZXhPZigiWEhUTUwiKSA+IC0xKTsKLQotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlPE5vZGUsIEFuZENvbnRleHQ+IGFuZE1hcCA9IG5ldyBIYXNodGFibGU8Tm9kZSwgQW5kQ29udGV4dD4oKTsKLQotCXB1YmxpYyBIYXNodGFibGU8Tm9kZSwgQW5kQ29udGV4dD4gZ2V0QW5kTWFwKCkgewotCQlyZXR1cm4gYW5kTWFwOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlPE5vZGUsIEludGVnZXI+IHNlcU1hcCA9IG5ldyBIYXNodGFibGU8Tm9kZSwgSW50ZWdlcj4oKTsKLQotCXB1YmxpYyBIYXNodGFibGU8Tm9kZSwgSW50ZWdlcj4gZ2V0U2VxTWFwKCkgewotCQlyZXR1cm4gc2VxTWFwOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlPE5vZGUsIE5vZGU+IHBsdXNNYXAgPSBuZXcgSGFzaHRhYmxlPE5vZGUsIE5vZGU+KCk7Ci0KLQlwdWJsaWMgSGFzaHRhYmxlPE5vZGUsIE5vZGU+IGdldFBsdXNNYXAoKSB7Ci0JCXJldHVybiBwbHVzTWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQ29udGV4dE1hcChOb2RlIHBhcmVudCkgewotCQlhbmRNYXAucmVtb3ZlKHBhcmVudCk7Ci0JCXNlcU1hcC5yZW1vdmUocGFyZW50KTsKLQkJcGx1c01hcC5yZW1vdmUocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEF0dHIgYXR0cmlidXRlKEVsZW1lbnREZWZpbml0aW9uIGVkLCBBdHRyaWJ1dGVMaXN0SW1wbCBhdHRybGlzdCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCUF0dHIgcmV0ID0gbnVsbDsKLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBOQU1FX0NIQVIpIHsKLQkJCWlmIChoYW5kbGVFcnJvcihUQUdfTkFNRSwgdG9rZW5pemVyLnN2YWwpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZShlZCwgYXR0cmxpc3QpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIGF0dE5hbWUgPSBjaGFuZ2VBdHRyTmFtZUNhc2UodG9rZW5pemVyLnN2YWwpOwotCQkJQXR0cmlidXRlRGVmaW5pdGlvbiBhZCA9IGVkICE9IG51bGwgPyBlZC5nZXRBdHRyaWJ1dGVEZWYoYXR0TmFtZSkKLQkJCQkJOiBudWxsOwotCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0TmFtZTsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gRVEpIHsKLQkJCQlhdHRWYWx1ZSA9IHRva2VuaXplci5yZWFkQXR0cmlidXRlVmFsdWUoYWQsIGVkKTsKLQkJCQlyZXQgPSBkb2MuY3JlYXRlQXR0cmlidXRlKGF0dE5hbWUpOwotCQkJCXJldC5zZXRWYWx1ZShhdHRWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCXJldCA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCQl9Ci0JCQlpZiAoYWQgPT0gbnVsbCkgewotCQkJCWlmIChhdHRybGlzdCAhPSBudWxsKSB7Ci0JCQkJCWF0dHJsaXN0LmFkZEF0dHJpYnV0ZShhdHROYW1lLCAiQ0RBVEEiLCBhdHRWYWx1ZSk7Ci0JCQkJfQotCQkJCWlmIChlZCAhPSBudWxsICYmIGVkICE9IGFub255bW91c0VsZW1lbnREZWYpIHsKLQkJCQkJaWYgKGhhbmRsZUVycm9yKElMTEVHQUxfQVRUUklCVVRFLCByZXQpKSB7Ci0JCQkJCQlyZXQgPSBhdHRyaWJ1dGUoZWQsIGF0dHJsaXN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVycm9yKElMTEVHQUxfQVRUUklCVVRFLCAiSWxsZWdhbCBhdHRyaWJ1dGUgJyIKLQkJCQkJCQkJKyBhdHROYW1lICsgIicgZm9yICIgKyBlZC5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhdHRybGlzdCAhPSBudWxsKSB7Ci0JCQkJYXR0cmxpc3QuYWRkQXR0cmlidXRlKGF0dE5hbWUsIGFkLmdldERlY2xhcmVkVHlwZVN0cigpLAotCQkJCQkJYXR0VmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogUmVjb3JkcyBhbiBlcnJvci4gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuIElmIGl0IGhhcyBFcnJvckxvZ0xpc3RlbmVyCi0JICogaW5zdGFuY2VzLCBjYWxscyB0aGVpciB7QGxpbmsgSUVycm9yTG9nTGlzdGVuZXIjZXJyb3JMb2coaW50LFN0cmluZyl9Ci0JICogbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBjb2RlCi0JICogICAgICAgICAgICBlcnJvciBjb2RlLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGVycm9yKGludCBjb2RlLCBTdHJpbmcgbXNnKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXJyb3JMb2dMaXN0ZW5lck51bTsgaSsrKSB7Ci0JCQlpZiAodG9rZW5pemVyICE9IG51bGwpIHsKLQkJCQllcnJvckxvZ0xpc3RlbmVyc1tpXS5lcnJvckxvZyhjb2RlLCB0b2tlbml6ZXIuZ2V0Q3VycmVudExpbmUoKQotCQkJCQkJKyAiOiAiICsgbXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3JMb2dMaXN0ZW5lcnNbaV0uZXJyb3JMb2coY29kZSwgbXNnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSUVycm9yTG9nTGlzdGVuZXIgZXJyb3JMb2dMaXN0ZW5lcnNbXSA9IG5ldyBJRXJyb3JMb2dMaXN0ZW5lcls4XTsKLQotCXByaXZhdGUgaW50IGVycm9yTG9nTGlzdGVuZXJOdW0gPSAwOwotCi0JLyoqCi0JICogQWRkcyBhbiBlcnJvciBsb2cgbGlzdGVybmVyLiBMaXN0ZW5lciBpcyBpbnZva2VkIHdoZW4gZXJyb3IgaXMgb2NjdXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFcnJvckxvZ0xpc3RlbmVyKElFcnJvckxvZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlcnJvckxvZ0xpc3RlbmVyTnVtID09IGVycm9yTG9nTGlzdGVuZXJzLmxlbmd0aCkgewotCQkJSUVycm9yTG9nTGlzdGVuZXIgbmV3TGlzdGVuZXJzW10gPSBuZXcgSUVycm9yTG9nTGlzdGVuZXJbZXJyb3JMb2dMaXN0ZW5lck51bSAqIDJdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckxvZ0xpc3RlbmVyTnVtOyBpKyspIHsKLQkJCQluZXdMaXN0ZW5lcnNbaV0gPSBlcnJvckxvZ0xpc3RlbmVyc1tpXTsKLQkJCX0KLQkJCWVycm9yTG9nTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQl9Ci0JCWVycm9yTG9nTGlzdGVuZXJzW2Vycm9yTG9nTGlzdGVuZXJOdW0rK10gPSBsaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGVycm9yIGxvZyBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVyCi0JICogICAgICAgICAgICBlcnJvciBsb2cgbGlzdGVuZXIgdG8gcmVtb3ZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVycm9yTG9nTGlzdGVuZXIoSUVycm9yTG9nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckxvZ0xpc3RlbmVyTnVtOyBpKyspIHsKLQkJCWlmIChlcnJvckxvZ0xpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgewotCQkJCWVycm9yTG9nTGlzdGVuZXJzW2ldID0gbnVsbDsKLQkJCQlmb3IgKGkrKzsgaSA8IGVycm9yTG9nTGlzdGVuZXJOdW07IGkrKykgewotCQkJCQllcnJvckxvZ0xpc3RlbmVyc1tpIC0gMV0gPSBlcnJvckxvZ0xpc3RlbmVyc1tpXTsKLQkJCQl9Ci0JCQkJZXJyb3JMb2dMaXN0ZW5lck51bS0tOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgRW5kVGFnIGV0YWcoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlTdHJpbmcgdGFnTmFtZTsKLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIpIHsKLQkJCXRhZ05hbWUgPSBjaGFuZ2VUYWdDYXNlKHRva2VuaXplci5zdmFsKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gVEFHQyAmJiB0b2tlbml6ZXIudHR5cGUgIT0gRU9GKSB7Ci0JCQl9Ci0JCQk7Ci0KLQkJCUVuZFRhZyBldCA9IG5ldyBFbmRUYWcodGFnTmFtZSk7Ci0JCQljdXJyZW50Tm9kZSA9IGV0OwotCQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCAmJiAhZUhhbmRsZUxvZ2ljYWwpIHsKLQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQodGFnTmFtZSk7Ci0JCQl9Ci0JCQlFbGVtZW50RGVmaW5pdGlvbiBlZCA9IGR0ZC5nZXRFbGVtZW50RGVmaW5pdGlvbih0YWdOYW1lKTsKLQotCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQlsYXN0RWxlbWVudE51bWJlciA9IGVkLm51bWJlcjsKLQkJCQlyZXR1cm4gZXQ7Ci0JCQl9IGVsc2UgaWYgKGtlZXBVbmtub3ducykgewotCQkJCWxhc3RFbGVtZW50RGVmID0gYW5vbnltb3VzRWxlbWVudERlZjsKLQkJCQlsYXN0RWxlbWVudE51bWJlciA9IHBjZGF0YU51bWJlciArIDE7Ci0JCQkJcmV0dXJuIGV0OwotCQkJfSBlbHNlIGlmIChoYW5kbGVFcnJvcihVTktOT1dOX0VMRU1FTlQsIGV0KSkgewotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGRvY3VtZW50IHBhcnNlZCBieSB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gcGFyc2VkIGRvY3VtZW50IGluc3RhbmNlLgotCSAqIEBzZWUgI3NldERvY3VtZW50KG9yZy53M2MuZG9tLkRvY3VtZW50KQotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBwdXNoIGJhY2sgYnVmZmVyIHNpemUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUZfU0laID0gMjU2OwotCi0JcHJpdmF0ZSBpbnQgYnVmQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBOb2RlIGJ1ZltdID0gbmV3IE5vZGVbQlVGX1NJWl07Ci0KLQkvKioKLQkgKiBHZXRzIGEgTm9kZSBvciB7QGxpbmsgRW5kVGFnfWZyb20gYSBjdXJyZW50bHkgcmVhZGluZyBzdHJlYW0gYXMgYSByZXN1bHQKLQkgKiBvZiB0b2tlbml6aW5nLgotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIG9yZy53M2MuZG9tLk5vZGUgTm9kZX1vciB7QGxpbmsgRW5kVGFnfQotCSAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogQHNlZSAjcHVzaEJhY2tOb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChidWZDb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gbm9kZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGJ1ZlstLWJ1ZkNvdW50XTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBiYWNrIGEgbm9kZSB0byB0aGlzIHBhcnNlci4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgbm9kZSB0byBiZSBwdXNoZWQgYmFjay4KLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoQmFja05vZGUoTm9kZSBub2RlKSB7Ci0JCWJ1ZltidWZDb3VudCsrXSA9IG5vZGU7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJbGFzdEVsZW1lbnREZWYgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24obm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCWxhc3RFbGVtZW50TnVtYmVyID0gbGFzdEVsZW1lbnREZWYubnVtYmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHJlc291cmNlIHJlYWRlciBmb3IgdGhpcyBwYXJzZXIuIEJ5IGRlZmF1bHQsIHRoaXMgY2xhc3MgaGFzIG5vCi0JICogcmVzb3VyY2UuIFNvIGlmIHNvbWUgcmVzb3VyY2UgaXMgcmVxdWlyZWQsIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGEKLQkgKiBzdWJjbGFzcy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgYWx3YXlzIHRocm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVhZGVyIGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiY2Fubm90IGZpbmQgIiArIHJlc291cmNlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIG5vZGUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlOb2RlIHJldDsKLQotCQkvLyBUT0RPIGVtdWxhdGUgPHRhZyAvPiBieSB1c2luZyBFbmRUYWcKLQkJaWYgKGlzRW5kV2l0aFNsYXNoICYmICFpc0VtcHR5RWxlbWVudCkgewotCQkJLy8gaWYoaXNYSFRNTCAmJiBpc0VuZFdpdGhTbGFzaCl7Ci0JCQlpc0VuZFdpdGhTbGFzaCA9IGZhbHNlOwotCi0JCQlFbmRUYWcgZXQgPSBuZXcgRW5kVGFnKGN1cnJlbnRUYWdOYW1lKTsKLQkJCWN1cnJlbnROb2RlID0gZXQ7Ci0JCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmICFlSGFuZGxlTG9naWNhbCkgewotCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudChjdXJyZW50VGFnTmFtZSk7Ci0JCQl9Ci0JCQlFbGVtZW50RGVmaW5pdGlvbiBlZCA9IGR0ZC5nZXRFbGVtZW50RGVmaW5pdGlvbihjdXJyZW50VGFnTmFtZSk7Ci0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCWxhc3RFbGVtZW50TnVtYmVyID0gZWQubnVtYmVyOwotCQkJCXJldHVybiBldDsKLQkJCX0gZWxzZSBpZiAoa2VlcFVua25vd25zKSB7Ci0JCQkJbGFzdEVsZW1lbnREZWYgPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQkJCWxhc3RFbGVtZW50TnVtYmVyID0gcGNkYXRhTnVtYmVyICsgMTsKLQkJCQlyZXR1cm4gZXQ7Ci0JCQl9IGVsc2UgaWYgKGhhbmRsZUVycm9yKFVOS05PV05fRUxFTUVOVCwgZXQpKSB7Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlzd2l0Y2ggKHRva2VuaXplci5uZXh0VG9rZW4oKSkgewotCQljYXNlIFNUQUdPOgotCQkJcmV0ID0gc3RhZygpOwotCQkJaWYgKHJldCA9PSBudWxsKSB7IC8vIFVua25vd24gRWxlbWVudC4gU2tpcCBpdC4KLQkJCQlyZXQgPSBnZXROb2RlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFVEFHTzoKLQkJCXJldCA9IGV0YWcoKTsKLQkJCWlmIChyZXQgPT0gbnVsbCkgeyAvLyBVbmtub3duIEVsZW1lbnQuIFNraXAgaXQuCi0JCQkJcmV0ID0gbm9kZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0hJVEVTUEFDRToKLQkJCWN1cnJlbnROb2RlID0gcmV0ID0gZG9jLmNyZWF0ZVRleHROb2RlKHRva2VuaXplci5zdmFsKTsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBTR01MVGV4dCkgewotCQkJCSgoU0dNTFRleHQpIHJldCkuc2V0SXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudCh0cnVlKTsKLQkJCX0KLQkJCWlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQlpZiAoc2F4Y2ggIT0gbnVsbCkgewotCQkJCQlkb2NIYW5kbGVyLmNoYXJhY3RlcnMoc2F4Y2gsIGJlZ2luLCBsZW4pOwotCQkJCQlzYXhjaCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUENEQVRBOgotCQkJY3VycmVudE5vZGUgPSByZXQgPSBkb2MuY3JlYXRlVGV4dE5vZGUodG9rZW5pemVyLnN2YWwpOwotCQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCkgewotCQkJCWlmIChzYXhjaCAhPSBudWxsKSB7Ci0JCQkJCWRvY0hhbmRsZXIuY2hhcmFjdGVycyhzYXhjaCwgYmVnaW4sIGxlbik7Ci0JCQkJCXNheGNoID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBDT01NRU5UOgotCQkJY3VycmVudE5vZGUgPSByZXQgPSBkb2MuY3JlYXRlQ29tbWVudCh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlpZiAobGV4SGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJbGV4SGFuZGxlci5jb21tZW50KHNheGNoLCBiZWdpbiwgbGVuKTsKLQkJCQlzYXhjaCA9IG51bGw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQSToKLQkJCWN1cnJlbnROb2RlID0gcmV0ID0gZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihudWxsLAotCQkJCQl0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJZG9jSGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obnVsbCwgdG9rZW5pemVyLnN2YWwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRU9GOgotCQkJcmV0ID0gbnVsbDsKLQkJCWJyZWFrOwotCQljYXNlIE1ETzoKLQkJCWVycm9yKElMTEVHQUxfRE9DVFlQRSwKLQkJCQkJIklsbGVnYWwgRGVjbGFyYXRpb24uIERpc2NhcmRpbmcgdG8gbmV4dCAnPiciKTsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJz4nKSB7Ci0JCQkJLy8gY29uc3VtZSAnPicKLQkJCQl0b2tlbml6ZXIuY29uc3VtZVVudGlsKCc+Jyk7Ci0JCQkJdG9rZW5pemVyLnN3aXRjaFRvKERFRkFVTFQpOwotCQkJfQotCQkJcmV0dXJuIG5vZGUoKTsKLQkJZGVmYXVsdDoKLQkJCWVycm9yKE1JU0NfRVJSLAotCQkJCQkiSW50ZXJuYWwgUGFyc2VyIEVycm9yOiBjaGFyYWN0ZXIgZW5jb2RpbmcgbWF5IGJlIHdyb25nLiIpOwotCQkJcmV0dXJuIG5vZGUoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBzeW50YXggaW5mb3JtYXRpb24gZGVzY3JpYmVkIGJ5IERURC4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIERURCdzIHB1YmxpYyBpZCB0aGF0IHNwZWNpZmllcyB3aGljaCB0byBzZXQgdXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBEVEQoU3RyaW5nIHB1YmxpY0lEKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcHVibGljSUQgPSBtYWtlVW5pcXVlKHB1YmxpY0lEKTsKLQkJU0dNTERvY1R5cGVEZWYgcmV0ID0gU0dNTERvY1R5cGVEZWYuZ2V0UHVibGljKHB1YmxpY0lEKTsKLQkJaWYgKHJldCAhPSBudWxsKSB7Ci0JCQlzZXREVEQocmV0KTsKLQkJCWxhc3REZWYgPSByZXQuZ2V0RWxlbWVudERlZmluaXRpb24oZ2V0RGVmYXVsdFRvcEVsZW1lbnQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHB1YmxpY0lEKSB7Ci0JCQkJcmV0ID0gU0dNTERvY1R5cGVEZWYuZ2V0UHVibGljKHB1YmxpY0lEKTsKLQkJCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCQkJcmV0ID0gU0dNTERvY1R5cGVEZWYuY3JlYXRlUHVibGljKHB1YmxpY0lELCB0aGlzKTsKLQkJCQkJc2V0RFREKHJldCk7Ci0JCQkJCVJlYWRlciBkciA9IGdldFJlc291cmNlKChTdHJpbmcpIHB1YkVudGl0eU1hcC5nZXQocHVibGljSUQpKTsKLQkJCQkJRFREVG9rZW5pemVyIHRvayA9IG5ldyBEVERUb2tlbml6ZXIoZHIpOwotCQkJCQluZXcgRFREUGFyc2VyKHRvaywgcmV0KS5yZWFkRFREKCk7Ci0JCQkJCWRyLmNsb3NlKCk7Ci0JCQkJCVNHTUxEb2NUeXBlRGVmLnB1dFB1YmxpYyhwdWJsaWNJRCwgcmV0KTsKLQkJCQkJcmV0LnJlaGFzaCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldERURChyZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlsYXN0RGVmID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKGdldERlZmF1bHRUb3BFbGVtZW50KCkpOwotCQlwY2RhdGFOdW1iZXIgPSBkdGQuZ2V0RWxlbWVudENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlhbmNlc3RlckVsZW1lbnREZWZzW2ldID0gZHRkCi0JCQkJCS5nZXRFbGVtZW50RGVmaW5pdGlvbihhbmNlc3RlckVsZW1lbnREZWZzW2ldLmdldE5hbWUoKSk7Ci0JCQlpZiAoYW5jZXN0ZXJFbGVtZW50RGVmc1tpXSA9PSBudWxsKSB7Ci0JCQkJZXJyb3IoVU5LTk9XTl9FTEVNRU5ULCBhbmNlc3RlcnNbaV0uZ2V0Tm9kZU5hbWUoKQotCQkJCQkJKyAiIGlzIG5vdCBkZWZpbmVkIGluICIgKyBwdWJsaWNJRCk7Ci0JCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tpXSA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCQl9Ci0JCX0KLQkJYW5vbnltb3VzRWxlbWVudERlZi5yZWhhc2gocGNkYXRhTnVtYmVyICsgMik7Ci0JCWFub255bW91c0VsZW1lbnREZWYubnVtYmVyID0gcGNkYXRhTnVtYmVyICsgMTsKLQl9Ci0KLQlpbnQgcGNkYXRhTnVtYmVyOwotCi0JLyoqCi0JICogUGFyc2VzIFNHTUwgYSBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4gU0dNTCBkb2N1bWVudHMgYXJlCi0JICogY29uc2lzdHMgb2YgdGhyZWUgcGFydHMuIDEuIFNHTUwgZGVjbGFyYXRpb24uIDIuIERjdW1lbnQgdHlwZSBkZWZpbml0aW9uLgotCSAqIDMuIFNHTUwgaW5zdGFuY2VzLiBJZiBhIGRvY3VtZW50IG1pc3NlcyAxLiBhbmQgMi4sIHRoaXMgcGFyc2VyIHRyeSB0bwotCSAqIHJlYWQgdGhlIGRlZmF1bHQgZGVjbGFyYXRpb24gc3BlY2lmaWVkIGJ5Ci0JICoge0BsaW5rICNzZXREZWZhdWx0RFREKGphdmEubGFuZy5TdHJpbmcpfS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICBwYXJzZSB0byByZWFkLgotCSAqIEByZXR1cm4gZG9jdW1lbnQuCi0JICogQGV4Y2VwdGlvbiBQYXNlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHVucmVjb3ZlcmFibGUgc3ludGF4IG9yIHRva2VuIGVycm9yIG9jY3VyZWQsIHRocm93ZWQKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE5vZGUgcGFyc2UoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLQkJCVNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChkb21JbXBsID09IG51bGwgJiYgZG9jID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiTm8gZmFjdG9yeSBpbnN0YW5jZS4iKTsKLQkJfQotCQlpbml0KCk7Ci0KLQkJdGhpcy50b2tlbml6ZXIgPSBuZXcgSW5zVG9rZW5pemVyKHJlYWRlciwgdGhpcyk7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCWRvY0hhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKHRoaXMudG9rZW5pemVyKTsKLQkJCWRvY0hhbmRsZXIuc3RhcnREb2N1bWVudCgpOwotCQl9Ci0JCXNldERURChTR01MRG9jVHlwZURlZi5jcmVhdGVBbm9ueW1vdXModGhpcykpOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IHJlYWREb2NUeXBlKCk7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpIHsKLQkJCWVycm9yKERPQ1RZUEVfTUlTU0VELCAiPCFET0NUWVBFIC4uLj4gaXMgbWlzc2luZy4gIFRyeSB0byB1c2UgXCIiCi0JCQkJCSsgZGVmYXVsdERURCArICJcIiBhcyBkb2N1bWVudCB0eXBlIik7Ci0JCQlzZXR1cERURChkZWZhdWx0RFREKTsKLQkJfQotCQl0b2tlbml6ZXIuZXh0cmFjdE51bUVudGl0eShleHRyYWN0TnVtKTsKLQkJdG9rZW5pemVyLmV4dHJhY3RDaGFyRW50aXR5KGV4dHJhY3RDaGFyKTsKLQkJdG9rZW5pemVyLnNldFByZXNlcnZlV2hpdGVzcGFjZShwcmVzZXJ2ZVdoaXRlc3BhY2UpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCWRvYyA9IGNyZWF0ZURvY3VtZW50KGRvY1R5cGUpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIFNHTUxEb2N1bWVudAotCQkJCQkmJiAoKFNHTUxEb2N1bWVudCkgZG9jKS5nZXREVEQoKSA9PSBudWxsKSB7Ci0JCQkJKChTR01MRG9jdW1lbnQpIGRvYykuc2V0RFREKHRoaXMuZHRkKTsKLQkJCX0KLQkJCXdoaWxlICghY29tbWVudHNCZWZvcmVEb2N0eXBlLmlzRW1wdHkoKSkgewotCQkJCUNBVEIgY2F0YiA9IChDQVRCKSBjb21tZW50c0JlZm9yZURvY3R5cGUubGFzdEVsZW1lbnQoKTsKLQkJCQlOb2RlIG5vZGUgPSBjYXRiLmNvbW1lbnQgPyAoTm9kZSkgZG9jLmNyZWF0ZUNvbW1lbnQoY2F0Yi5zdHIpCi0JCQkJCQk6IGRvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obnVsbCwgY2F0Yi5zdHIpOwotCQkJCWRvYy5pbnNlcnRCZWZvcmUobm9kZSwgZG9jLmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQkJY29tbWVudHNCZWZvcmVEb2N0eXBlLnJlbW92ZUVsZW1lbnQoY2F0Yik7Ci0JCQl9Ci0JCX0KLQotCQkvLyAvLzA0MTAyNiBoYW5kbGUgY29tbWVudHMgYWZ0ZXIgZG9jdHlwZQotCQkvLyBjb21tZW50X2xvb3A6IHdoaWxlICh0cnVlKSB7Ci0JCS8vIHN3aXRjaCAodG9rZW5pemVyLm5leHRUb2tlbigpKSB7Ci0JCS8vIGNhc2UgQ09NTUVOVDoKLQkJLy8gZG9jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KHRva2VuaXplci5zdmFsKSk7Ci0JCS8vIGlmIChsZXhIYW5kbGVyICE9IG51bGwpIHsKLQkJLy8gbGV4SGFuZGxlci5jb21tZW50KHNheGNoLCBiZWdpbiwgbGVuKTsKLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBQSToKLQkJLy8gZG9jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KHRva2VuaXplci5zdmFsKSk7Ci0JCS8vIGlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJLy8gZG9jSGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obnVsbCwgdG9rZW5pemVyLnN2YWwpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE1ETzoKLQkJLy8gYnJlYWsgY29tbWVudF9sb29wOwotCQkvLyBkZWZhdWx0OgotCQkvLyB0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJLy8gYnJlYWsgY29tbWVudF9sb29wOwotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyBkdW1teQotCQljb250ZXh0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImR1bW15MCIpOwotCQlzZXFBcnJheSA9IG5ldyBJTW9kZWxHcm91cFtkdGQubWF4U2VxTGVuZ3RoXTsKLQkJTm9kZSByZXQgPSByZWFkSW5zdGFuY2VzKCk7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwpCi0JCQlkb2NIYW5kbGVyLmVuZERvY3VtZW50KCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxHcm91cCBzZXFBcnJheVtdOwotCi0JcHVibGljIElNb2RlbEdyb3VwW10gZ2V0U2VxQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnNlcUFycmF5OwotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChEb2N1bWVudFR5cGUgZG9jVHlwZSkgewotCQlEb2N1bWVudCByZXQgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50KCJkdW1teTEiLCAiZHVtbXkxIiwKLQkJCQlkb2NUeXBlKTsKLQkJaWYgKHJldC5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlyZXQucmVtb3ZlQ2hpbGQocmV0LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENvbnRleHQgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgY29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIGEgY3VycmVudCBjb250ZXh0IGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBjb250ZXh0IGVsZW1lbnQKLQkgKiBAc2VlICNzZXRDb250ZXh0KG9yZy53M2MuZG9tLkVsZW1lbnQpCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dDsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnQgZm9yd2FyZFBhdGhbXSA9IG5ldyBFbGVtZW50W0JVRl9TSVpdOwotCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbiBhbmNlc3RlckVsZW1lbnREZWZzW10gPSBuZXcgRWxlbWVudERlZmluaXRpb25bQlVGX1NJWl07Ci0KLQlwcml2YXRlIEVsZW1lbnQgYW5jZXN0ZXJzW10gPSBuZXcgRWxlbWVudFtCVUZfU0laXTsKLQotCXByaXZhdGUgaW50IGRlcHRoID0gMDsKLQotCXByaXZhdGUgQXR0cmlidXRlTGlzdEltcGwgbnVsbEF0dHJpYnV0ZUxpc3QgPSBjcmVhdGVBdHRyaWJ1dGVMaXN0KCk7Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dEZvcndhcmQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJRWxlbWVudERlZmluaXRpb24gZWQ7Ci0JCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCWZvciAoTm9kZSBkb3duID0gY29udGV4dC5nZXRMYXN0Q2hpbGQoKTsgZG93biBpbnN0YW5jZW9mIEVsZW1lbnQ7IGRvd24gPSBkb3duCi0JCQkJCS5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChkb3duID09IGVsZW1lbnQpIHsKLQkJCQkJYW5jZXN0ZXJzW2RlcHRoXSA9IGVsZW1lbnQ7Ci0JCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gbGFzdEVsZW1lbnREZWY7Ci0JCQkJCWRlcHRoKys7Ci0JCQkJCWRvY0hhbmRsZXIuc3RhcnRFbGVtZW50KGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSwgYXR0cmxpc3QpOwotCQkJCQlhdHRybGlzdCA9IG51bGw7Ci0JCQkJCXRoaXMuY29udGV4dCA9IGVsZW1lbnQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQlhbmNlc3RlcnNbZGVwdGhdID0gKEVsZW1lbnQpIGRvd247Ci0JCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gZWQgPSBkdGQKLQkJCQkJCQkuZ2V0RWxlbWVudERlZmluaXRpb24oZG93bi5nZXROb2RlTmFtZSgpKTsKLQkJCQkJaWYgKGVkID09IG51bGwpIHsKLQkJCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gYW5vbnltb3VzRWxlbWVudERlZjsKLQkJCQkJfQotCQkJCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChkb3duLmdldE5vZGVOYW1lKCksCi0JCQkJCQkJbnVsbEF0dHJpYnV0ZUxpc3QpOwotCQkJCQlkZXB0aCsrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoTm9kZSBkb3duID0gY29udGV4dC5nZXRMYXN0Q2hpbGQoKTsgZG93biBpbnN0YW5jZW9mIEVsZW1lbnQ7IGRvd24gPSBkb3duCi0JCQkJCS5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChkb3duID09IGVsZW1lbnQpIHsKLQkJCQkJYW5jZXN0ZXJzW2RlcHRoXSA9IGVsZW1lbnQ7Ci0JCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gbGFzdEVsZW1lbnREZWY7Ci0JCQkJCWRlcHRoKys7Ci0JCQkJCWF0dHJsaXN0ID0gbnVsbDsKLQkJCQkJdGhpcy5jb250ZXh0ID0gZWxlbWVudDsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFuY2VzdGVyc1tkZXB0aF0gPSAoRWxlbWVudCkgZG93bjsKLQkJCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tkZXB0aF0gPSBlZCA9IGR0ZAotCQkJCQkJCS5nZXRFbGVtZW50RGVmaW5pdGlvbihkb3duLmdldE5vZGVOYW1lKCkpOwotCQkJCQlpZiAoZWQgPT0gbnVsbCkgewotCQkJCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tkZXB0aF0gPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRlcHRoKys7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIFBhcnNlciBFcnJvci4iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dEJhY2t3YXJkKGludCBuZXdEZXB0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBkZXB0aCAtIDE7IGkgPj0gbmV3RGVwdGg7IGktLSkgewotCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudChhbmNlc3RlcnNbaV0uZ2V0Tm9kZU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJZGVwdGggPSBuZXdEZXB0aDsKLQkJdGhpcy5jb250ZXh0ID0gYW5jZXN0ZXJzW25ld0RlcHRoIC0gMV07Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGN1cnJlbnQgY29udGV4dCBlbGVtZW50IG5vZGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG5ldyBjb250ZXh0LgotCSAqIEBzZWUgI2dldENvbnRleHQoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENvbnRleHQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUVsZW1lbnQgdXAgPSBhbmNlc3RlcnNbaV07Ci0JCQlpZiAodXAgPT0gZWxlbWVudCkgewotCQkJCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IGRlcHRoIC0gMTsgaiA+IGk7IGotLSkgewotCQkJCQkJZG9jSGFuZGxlci5lbmRFbGVtZW50KGFuY2VzdGVyc1tqXS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkZXB0aCA9IGkgKyAxOwotCQkJCXRoaXMuY29udGV4dCA9IGVsZW1lbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGZvcndhcmRQYXRoTGVuID0gMDsKLQkJCWZvciAoTm9kZSBkb3duID0gdXAuZ2V0TGFzdENoaWxkKCk7IGRvd24gaW5zdGFuY2VvZiBFbGVtZW50OyBkb3duID0gZG93bgotCQkJCQkuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQlpZiAoZG93biA9PSBlbGVtZW50KSB7Ci0JCQkJCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGogPSBkZXB0aCAtIDE7IGogPiBpOyBqLS0pIHsKLQkJCQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQoYW5jZXN0ZXJzW2pdLmdldE5vZGVOYW1lKCkpOwotCQkJCQkJfQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmb3J3YXJkUGF0aExlbjsgaisrKSB7Ci0JCQkJCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQoZm9yd2FyZFBhdGhbal0KLQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpLCBudWxsQXR0cmlidXRlTGlzdCk7Ci0JCQkJCQkJYW5jZXN0ZXJzW2kgKyBqICsgMV0gPSBmb3J3YXJkUGF0aFtqXTsKLQkJCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2kgKyBqICsgMV0gPSBkdGQKLQkJCQkJCQkJCS5nZXRFbGVtZW50RGVmaW5pdGlvbihmb3J3YXJkUGF0aFtqXQotCQkJCQkJCQkJCQkuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQkJaWYgKGFuY2VzdGVyRWxlbWVudERlZnNbaSArIGogKyAxXSA9PSBudWxsKSB7Ci0JCQkJCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbaSArIGogKyAxXSA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQoZG93bi5nZXROb2RlTmFtZSgpLCBhdHRybGlzdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZvcndhcmRQYXRoTGVuOyBqKyspIHsKLQkJCQkJCQlhbmNlc3RlcnNbaSArIGogKyAxXSA9IGZvcndhcmRQYXRoW2pdOwotCQkJCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbaSArIGogKyAxXSA9IGR0ZAotCQkJCQkJCQkJLmdldEVsZW1lbnREZWZpbml0aW9uKGZvcndhcmRQYXRoW2pdCi0JCQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCQlpZiAoYW5jZXN0ZXJFbGVtZW50RGVmc1tpICsgaiArIDFdID09IG51bGwpIHsKLQkJCQkJCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tpICsgaiArIDFdID0gYW5vbnltb3VzRWxlbWVudERlZjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGVwdGggPSBpICsgZm9yd2FyZFBhdGhMZW4gKyAxOwotCQkJCQlhbmNlc3RlcnNbZGVwdGhdID0gZWxlbWVudDsKLQkJCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tkZXB0aF0gPSBsYXN0RWxlbWVudERlZjsKLQkJCQkJZGVwdGgrKzsKLQkJCQkJYXR0cmxpc3QgPSBudWxsOwotCQkJCQl0aGlzLmNvbnRleHQgPSBlbGVtZW50OwotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yd2FyZFBhdGhbZm9yd2FyZFBhdGhMZW4rK10gPSAoRWxlbWVudCkgZG93bjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlcyBiYWNrd2FyZCBjb250ZXh0LgotCQlpbnQgbmV3RGVwdGggPSAwOwotCQlmb3IgKE5vZGUgdXAgPSBlbGVtZW50OyB1cCBpbnN0YW5jZW9mIEVsZW1lbnQ7IHVwID0gdXAuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQluZXdEZXB0aCsrOwotCQl9Ci0JCUVsZW1lbnQgbmV3QW5jZXN0ZXJzW10gPSBuZXcgRWxlbWVudFtuZXdEZXB0aF07Ci0JCWludCBpID0gMTsKLQkJZm9yIChOb2RlIHVwID0gZWxlbWVudDsgdXAgaW5zdGFuY2VvZiBFbGVtZW50OyB1cCA9IHVwLmdldFBhcmVudE5vZGUoKSkgewotCQkJbmV3QW5jZXN0ZXJzW25ld0RlcHRoIC0gaV0gPSAoRWxlbWVudCkgdXA7Ci0JCQlpKys7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG5ld0RlcHRoOyBpKyspIHsKLQkJCWlmIChhbmNlc3RlcnNbaV0gIT0gbmV3QW5jZXN0ZXJzW2ldKSB7Ci0JCQkJaWYgKGVIYW5kbGVMb2dpY2FsICYmIGRvY0hhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gZGVwdGggLSAxOyBqID49IGk7IGotLSkgewotCQkJCQkJZG9jSGFuZGxlci5lbmRFbGVtZW50KGFuY2VzdGVyc1tqXS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gaTsgaiA8IG5ld0RlcHRoIC0gMTsgaisrKSB7Ci0JCQkJCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChuZXdBbmNlc3RlcnNbal0uZ2V0Tm9kZU5hbWUoKSwKLQkJCQkJCQkJbnVsbEF0dHJpYnV0ZUxpc3QpOwotCQkJCQl9Ci0JCQkJCWRvY0hhbmRsZXIuc3RhcnRFbGVtZW50KGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSwgYXR0cmxpc3QpOwotCQkJCX0KLQkJCQl3aGlsZSAoaSA8IG5ld0RlcHRoIC0gMSkgewotCQkJCQlhbmNlc3RlcnNbaV0gPSBuZXdBbmNlc3RlcnNbaV07Ci0JCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbaV0gPSBkdGQKLQkJCQkJCQkuZ2V0RWxlbWVudERlZmluaXRpb24obmV3QW5jZXN0ZXJzW2ldLmdldE5vZGVOYW1lKCkpOwotCQkJCX0KLQkJCQlhbmNlc3RlcnNbbmV3RGVwdGggLSAxXSA9IGVsZW1lbnQ7Ci0JCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tuZXdEZXB0aCAtIDFdID0gbGFzdEVsZW1lbnREZWY7Ci0JCQkJZGVwdGggPSBuZXdEZXB0aDsKLQkJCQlhdHRybGlzdCA9IG51bGw7Ci0JCQkJdGhpcy5jb250ZXh0ID0gZWxlbWVudDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxFbGVtZW50PiBub2Rlc1dpdGhFbmR0YWcgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgYSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgaXRzIGVuZCB0YWcgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5lbGVtZW50PC9jb2RlPiBoYXMgaXRzIGVuZCB0YWcuCi0JICogICAgICAgICBPdGhlcndpc2UsIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5vZGVzV2l0aEVuZHRhZy5jb250YWlucyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoYXQgYSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgaXRzIGVuZCB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlub2Rlc1dpdGhFbmR0YWcuYWRkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VG9wRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlFbGVtZW50IHByZXYgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCWRvYy5yZXBsYWNlQ2hpbGQoZWxlbWVudCwgcHJldik7Ci0JCX0gZWxzZSB7Ci0JCQlkb2MuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCX0KLQkJY29udGV4dCA9IGVsZW1lbnQ7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwgJiYgZUhhbmRsZUxvZ2ljYWwpIHsKLQkJCUF0dHJpYnV0ZUxpc3RJbXBsIGFsID0gYXR0cmxpc3QgIT0gbnVsbCA/IGF0dHJsaXN0Ci0JCQkJCTogbnVsbEF0dHJpYnV0ZUxpc3Q7Ci0JCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChlbGVtZW50LmdldE5vZGVOYW1lKCksIGFsKTsKLQkJCWF0dHJsaXN0ID0gbnVsbDsKLQkJfQotCQlhbmNlc3RlckVsZW1lbnREZWZzWzBdID0gbGFzdERlZjsKLQkJYW5jZXN0ZXJzWzBdID0gZWxlbWVudDsKLQkJZGVwdGgrKzsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxFbmRUYWc+IG1pc3NlZEVuZHRhZ3MgPSBuZXcgVmVjdG9yPEVuZFRhZz4oKTsKLQotCXByaXZhdGUgTm9kZSByZWFkSW5zdGFuY2VzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLQkJCVNBWEV4Y2VwdGlvbiB7Ci0JCU5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBkb2M7Ci0JCXdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUKLQkJCQl8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCWlmIChrZWVwQ29tbWVudCkKLQkJCQlkb2MuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQlub2RlID0gZ2V0Tm9kZSgpOwotCQl9Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBFTkRUQUc6Ci0KLQkJCWlmICghaGFuZGxlRXJyb3IoRkxPQVRJTkdfRU5EVEFHLCBub2RlKSkgewotCQkJCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJZG9jSGFuZGxlci5pZ25vcmFibGVXaGl0ZXNwYWNlKHNheGNoLCBiZWdpbiwgbGVuKTsKLQkJCQl9Ci0JCQkJZXJyb3IoRkxPQVRJTkdfRU5EVEFHLCAiSWxsZWdhbCBlbmQgdGFnOiAiICsgbm9kZQotCQkJCQkJKyAiLiAgSWdub3JlIGl0LiIpOwotCQkJfQotCQkJcmV0dXJuIHJlYWRJbnN0YW5jZXMoKTsKLQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCWlmIChsYXN0RGVmLmluc3RhbmNlKG5vZGUpKSB7Ci0JCQkJc2V0VG9wRWxlbWVudCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCUF0dHJpYnV0ZUxpc3RJbXBsIGF0dHJsaXN0dG1wID0gYXR0cmxpc3Q7Ci0JCQkJYXR0cmxpc3QgPSBudWxsOwotCQkJCXNldFRvcEVsZW1lbnQoZG9jLmNyZWF0ZUVsZW1lbnQoY2hhbmdlRGVmYXVsdFRhZ0Nhc2UobGFzdERlZgotCQkJCQkJLmdldE5hbWUoKSkpKTsKLQkJCQlhdHRybGlzdCA9IGF0dHJsaXN0dG1wOwotCQkJCWFkZEF1dG9HZW5lcmF0ZWQoY29udGV4dCk7Ci0JCQkJaWYgKGxhc3REZWYuZ2V0Q29udGVudE1vZGVsKCkubWF0Y2godGhpcywgY29udGV4dCwgbm9kZSkpIHsKLQkJCQkJaWYgKCFsYXN0RGVmLnN0YXJ0VGFnT21pdHRhYmxlKCkpIHsKLQkJCQkJCWVycm9yKElMTEVHQUxfVE9QX0VMRU1FTlQsIG5vZGUKLQkJCQkJCQkJKyAiIGNhbid0IGJlIGEgdG9wIGVsZW1lbnQuIik7Ci0JCQkJCX0KLQkJCQkJc2V0Q29udGV4dEZvcndhcmQoKEVsZW1lbnQpIG5vZGUpOwotCQkJCX0gZWxzZSBpZiAoIWhhbmRsZUVycm9yKElMTEVHQUxfQ0hJTEQsIG5vZGUpKSB7Ci0JCQkJCWFkZEVycm9yTm9kZShjb250ZXh0KTsKLQkJCQkJZXJyb3IoSUxMRUdBTF9DSElMRCwgbm9kZQotCQkJCQkJCSsgIiBpcyBub3QgYWxsb3dlZCBhcyBhIGNoaWxkIG9mICIgKyBjb250ZXh0KTsKLQkJCQkJY29udGV4dC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQkJc2V0Q29udGV4dEZvcndhcmQoKEVsZW1lbnQpIG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCXBvc3RFbGVtZW50KChFbGVtZW50KSBub2RlKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJaWYgKHByZXNlcnZlV2hpdGVzcGFjZSAmJiB3aGl0ZXNwYWNlVGV4dCgoVGV4dCkgbm9kZSkpIHsKLQkJCQlyZXR1cm4gcmVhZEluc3RhbmNlcygpOwotCQkJfQotCQkJZXJyb3IoSUxMRUdBTF9UT1BfRUxFTUVOVCwgIiN0ZXh0IGNhbid0IGJlIGEgdG9wIGVsZW1lbnQiKTsKLQkJCXNldFRvcEVsZW1lbnQoZG9jLmNyZWF0ZUVsZW1lbnQoY2hhbmdlRGVmYXVsdFRhZ0Nhc2UobGFzdERlZgotCQkJCQkuZ2V0TmFtZSgpKSkpOwotCQkJYWRkQXV0b0dlbmVyYXRlZChjb250ZXh0KTsKLQkJCWNvbnRleHQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbml6ZXIuZ2V0Q3VycmVudExpbmUoKQotCQkJCQkrICI6IEludGVybmFsIFBhcnNlciBFcnJvciAiICsgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRJbnN0YW5jZXMyKCk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIHJlYWRJbnN0YW5jZXMyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLQkJCVNBWEV4Y2VwdGlvbiB7Ci0JCUVsZW1lbnREZWZpbml0aW9uIGVkOwotCQlOb2RlIG5vZGU7Ci0JCW91dGVyOiBmb3IgKG5vZGUgPSBnZXROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5vZGUoKSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5vZGUuZ2V0Tm9kZVR5cGUoKSsiIDogIitub2RlKTsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5vZGUudG9TdHJpbmcoKSk7Ci0KLQkJCW5vZGVfc2VsOiBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCQkJaWYgKGtlZXBDb21tZW50KQotCQkJCQljb250ZXh0LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRUQUc6Ci0KLQkJCQltaXNzZWRFbmR0YWdzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JCQkJaWYgKF9ERUJVRwotCQkJCQkJJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiREVCVUdfRU5EVEFHIikpKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6ICIgKyBub2RlKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJaWYgKGFuY2VzdGVyRWxlbWVudERlZnNbaV0ubnVtYmVyID09IGxhc3RFbGVtZW50TnVtYmVyCi0JCQkJCQkJJiYgKGxhc3RFbGVtZW50TnVtYmVyICE9IHBjZGF0YU51bWJlciArIDEgfHwgYW5jZXN0ZXJzW2ldCi0JCQkJCQkJCQkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkJCQkJCQlub2RlLmdldE5vZGVOYW1lKCkpKSkgewotCi0JCQkJCQlpZiAoIW1pc3NlZEVuZHRhZ3MuaXNFbXB0eSgpKSB7Ci0KLQkJCQkJCQlleHRyYUVyckluZm8gPSBtaXNzZWRFbmR0YWdzOwotCQkJCQkJCWlmIChoYW5kbGVFcnJvcihTVURERU5fRU5EVEFHLCBub2RlKSkgewotCQkJCQkJCQlleHRyYUVyckluZm8gPSBudWxsOwotCQkJCQkJCQlicmVhayBub2RlX3NlbDsKLQkJCQkJCQl9Ci0JCQkJCQkJZXh0cmFFcnJJbmZvID0gbnVsbDsKLQkJCQkJCQllcnJvcihTVURERU5fRU5EVEFHLCBtaXNzZWRFbmR0YWdzCi0JCQkJCQkJCQkrICIgaGF2ZSBiZWVuIGZvcmNlZCB0byBiZSBpbnNlcnRlZCBieSAiCi0JCQkJCQkJCQkrIG5vZGUpOwotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIGlmIChhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoIC0gMV0ubnVtYmVyID09Ci0JCQkJCQkgKiBsYXN0RWxlbWVudE51bWJlcikgewotCQkJCQkJICogbm9kZXNXaXRoRW5kdGFnLmFkZEVsZW1lbnQoY29udGV4dCk7IH0KLQkJCQkJCSAqLwotCQkJCQkJKChFbmRUYWcpIG5vZGUpLnNldEVsZW1lbnQoYW5jZXN0ZXJzW2ldKTsKLQkJCQkJCW5vZGVzV2l0aEVuZHRhZy5hZGRFbGVtZW50KGFuY2VzdGVyc1tpXSk7Ci0JCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCQlzZXRDb250ZXh0QmFja3dhcmQoaSk7Ci0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhayBub2RlX3NlbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghYW5jZXN0ZXJFbGVtZW50RGVmc1tpXS5lbmRUYWdPbWl0dGFibGUoKSkgewotCQkJCQkJCW1pc3NlZEVuZHRhZ3MuaW5zZXJ0RWxlbWVudEF0KG5ldyBFbmRUYWcoCi0JCQkJCQkJCQlhbmNlc3RlcnNbaV0uZ2V0Tm9kZU5hbWUoKSksIDApOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJaWYgKCFoYW5kbGVFcnJvcihGTE9BVElOR19FTkRUQUcsIG5vZGUpKSB7Ci0JCQkJCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWRvY0hhbmRsZXIuaWdub3JhYmxlV2hpdGVzcGFjZShzYXhjaCwgYmVnaW4sIGxlbik7Ci0JCQkJCX0KLQkJCQkJZXJyb3IoRkxPQVRJTkdfRU5EVEFHLCAiSWxsZWdhbCBlbmQgdGFnOiAiICsgbm9kZQotCQkJCQkJCSsgIi4gIElnbm9yZSBpdCIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJRWxlbWVudCBleFBhcmVudCA9IG51bGw7Ci0JCQkJaWYgKF9ERUJVRwotCQkJCQkJJiYgZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJCQkJU3lzdGVtLmdldFByb3BlcnR5KCJERUJVR19TVEFSVFRBRyIpKSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiAiICsgZWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50Iik7Ci0KLQkJCQlmb3IgKGludCBpID0gZGVwdGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQllZCA9IGFuY2VzdGVyRWxlbWVudERlZnNbaV07Ci0JCQkJCWlmICghZWQuZW5kVGFnT21pdHRhYmxlKCkgJiYgZXhQYXJlbnQgPT0gbnVsbCkgewotCQkJCQkJZXhQYXJlbnQgPSBhbmNlc3RlcnNbaV07Ci0JCQkJCX0KLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWQudG9TdHJpbmcoKSk7Ci0KLQkJCQkJaWYgKGVkLmV4Y2x1c2lvbihsYXN0RWxlbWVudE51bWJlcikpIHsKLQkJCQkJCWlmIChleFBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFoYW5kbGVFcnJvcihJTExFR0FMX0NISUxELCBub2RlKSkgewotCQkJCQkJCQlhZGRFcnJvck5vZGUoY29udGV4dCk7Ci0JCQkJCQkJCWVycm9yKElMTEVHQUxfQ0hJTEQsIG5vZGUKLQkJCQkJCQkJCQkrICIgaXMgYW4gZXhjZXB0aW9uIHVuZXIgIgotCQkJCQkJCQkJCSsgYW5jZXN0ZXJzW2ldKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoY29udGV4dCAhPSBub2RlICYmIGVIYW5kbGVMb2dpY2FsCi0JCQkJCQkJCQkJJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChub2RlLmdldE5vZGVOYW1lKCksCi0JCQkJCQkJCQkJCWF0dHJsaXN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlwb3N0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJCQkJYnJlYWsgbm9kZV9zZWw7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChhbmNlc3RlcnNbaSAtIDFdICE9IG51bGwpIHsKLQkJCQkJCQlzZXRDb250ZXh0QmFja3dhcmQoaSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbmVudDogbWlkIik7Ci0KLQkJCQkJaWYgKGVkLmluY2x1c2lvbihsYXN0RWxlbWVudE51bWJlcikpIHsKLQkJCQkJCWNvbnRleHQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQkJCQlzZXRDb250ZXh0Rm9yd2FyZChlbGVtZW50KTsKLQkJCQkJCXBvc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkJYnJlYWsgbm9kZV9zZWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWQgPSBhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoIC0gMV07Ci0JCQkJSU1vZGVsR3JvdXAgY29udGVudE1vZGVsID0gZWQuZ2V0Q29udGVudE1vZGVsKCk7Ci0KLQkJCQkvLyBUT0RPIGNvcnJlY3QgdGhpcwotCQkJCWlmIChjb250ZW50TW9kZWwubWF0Y2gobGFzdEVsZW1lbnROdW1iZXIpCi0JCQkJCQkmJiBjb250ZW50TW9kZWwubWF0Y2godGhpcywgY29udGV4dCwgbm9kZSkpIHsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBmb3ciKTsKLQotCQkJCQlzZXRDb250ZXh0Rm9yd2FyZChlbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGVkLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbDogb21pdCIpOwotCi0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCWVkID0gYW5jZXN0ZXJFbGVtZW50RGVmc1tpXTsKLQkJCQkJCWNvbnRlbnRNb2RlbCA9IGVkLmdldENvbnRlbnRNb2RlbCgpOwotCQkJCQkJaWYgKGNvbnRlbnRNb2RlbC5tYXRjaChsYXN0RWxlbWVudE51bWJlcikKLQkJCQkJCQkJJiYgKGZvdW5kID0gY29udGVudE1vZGVsLm1hdGNoKHRoaXMsCi0JCQkJCQkJCQkJYW5jZXN0ZXJzW2ldLCBub2RlKSkKLQkJCQkJCQkJfHwgIWVkLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBvbWl0MiAiK2ZvdW5kKTsKLQotCQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kZWw6IG9rIik7Ci0JCQkJCQlzZXRDb250ZXh0KGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgaWYgKCFoYW5kbGVFcnJvcihJTExFR0FMX0NISUxELCBub2RlKSkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbDogY2hpbGQiKTsKLQotCQkJCQkJY29udGV4dC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCQkJCWFkZEVycm9yTm9kZShjb250ZXh0KTsKLQkJCQkJCWVycm9yKElMTEVHQUxfQ0hJTEQsIG5vZGUKLQkJCQkJCQkJKyAiIGlzIG5vdCBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgIiArIGNvbnRleHQpOwotCi0JCQkJCQlzZXRDb250ZXh0Rm9yd2FyZChlbGVtZW50KTsKLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50LmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyB1bmxlc3MgdGhlIGVycm9yIGhhbmRsZXJzIGlnbm9yZSB0aGUgbm9kZQotCi0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBwb3N0Iik7Ci0KLQkJCQkJCXBvc3RFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kZWw6IG9taXQzIik7Ci0KLQkJCQl9IGVsc2UgaWYgKCFoYW5kbGVFcnJvcihJTExFR0FMX0NISUxELCBub2RlKSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBlcnJvciIpOwotCQkJCQkvLyBUT0RPID8/PwotCQkJCQljb250ZXh0LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJCQlhZGRFcnJvck5vZGUoY29udGV4dCk7Ci0JCQkJCWVycm9yKElMTEVHQUxfQ0hJTEQsIG5vZGUKLQkJCQkJCQkrICIgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiAiICsgY29udGV4dCk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihub2RlLmdldE5vZGVOYW1lKCkrY29udGV4dCk7Ci0JCQkJCXNldENvbnRleHRGb3J3YXJkKGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kZWw6IGVuZCIpOwotCi0JCQkJaWYgKGNvbnRleHQgIT0gbm9kZSAmJiBlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQobm9kZS5nZXROb2RlTmFtZSgpLCBhdHRybGlzdCk7Ci0JCQkJfQotCQkJCXBvc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCQlpZiAocHJlc2VydmVXaGl0ZXNwYWNlICYmIHdoaXRlc3BhY2VUZXh0KChUZXh0KSBub2RlKSkgewotCQkJCQlnZXRDb250ZXh0KCkuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllZCA9IGFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGggLSAxXTsKLQkJCQljb250ZW50TW9kZWwgPSBlZC5nZXRDb250ZW50TW9kZWwoKTsKLQkJCQlpZiAoY29udGVudE1vZGVsLm1hdGNoKHBjZGF0YU51bWJlcikKLQkJCQkJCSYmIGNvbnRlbnRNb2RlbC5tYXRjaCh0aGlzLCBjb250ZXh0LCBub2RlKSkgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKGVkLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0JCQkJCWZvciAoaW50IGkgPSBkZXB0aCAtIDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQllZCA9IGFuY2VzdGVyRWxlbWVudERlZnNbaV07Ci0JCQkJCQljb250ZW50TW9kZWwgPSBlZC5nZXRDb250ZW50TW9kZWwoKTsKLQkJCQkJCWlmIChjb250ZW50TW9kZWwubWF0Y2gocGNkYXRhTnVtYmVyKQotCQkJCQkJCQkmJiBjb250ZW50TW9kZWwubWF0Y2godGhpcywgYW5jZXN0ZXJzW2ldLCBub2RlKSkgewotCQkJCQkJCWJyZWFrIG5vZGVfc2VsOwotCQkJCQkJfSBlbHNlIGlmICghZWQuZW5kVGFnT21pdHRhYmxlKCkpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaGFuZGxlRXJyb3IoSUxMRUdBTF9DSElMRCwgbm9kZSkpCi0JCQkJCWJyZWFrIG5vZGVfc2VsOwotCQkJCWFkZEVycm9yTm9kZShjb250ZXh0KTsKLQkJCQllcnJvcihJTExFR0FMX0NISUxELCAiI3RleHQoIiArIG5vZGUKLQkJCQkJCSsgIikgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiAiICsgY29udGV4dCk7Ci0JCQkJY29udGV4dC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuaXplci5nZXRDdXJyZW50TGluZSgpCi0JCQkJCQkrICI6IEludGVybmFsIHBhcnNlciBlcnJvciAiICsgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNHTUxQYXJzZXI6IGEiKTsKLQotCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmIGVIYW5kbGVMb2dpY2FsKSB7Ci0JCQlFbGVtZW50IHRvcCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCWlmIChnZXRDb250ZXh0KCkgIT0gdG9wKSB7Ci0JCQkJc2V0Q29udGV4dCh0b3ApOwotCQkJfQotCQkJaWYgKHRvcCAhPSBudWxsKQotCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudCh0b3AuZ2V0Tm9kZU5hbWUoKSk7Ci0JCX0KLQkJaWYgKChub2RlID0gZ2V0Tm9kZSgpKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmIGVIYW5kbGVMb2dpY2FsKSB7Ci0JCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQodGhpcy5jb250ZXh0LmdldE5vZGVOYW1lKCksCi0JCQkJCQludWxsQXR0cmlidXRlTGlzdCk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNHTUxQYXJzZXI6IHB1c2hiYWNrIik7Ci0KLQkJCXB1c2hCYWNrTm9kZShub2RlKTsKLQkJCXJlYWRJbnN0YW5jZXMyKCk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTR01MUGFyc2VyOiBlbmQiKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2hpdGVzcGFjZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0IGluc3RhbmNlb2YgU0dNTFRleHQpIHsKLQkJCXJldHVybiAoKFNHTUxUZXh0KSB0ZXh0KS5nZXRJc1doaXRlc3BhY2VJbkVsZW1lbnRDb250ZW50KCk7Ci0JCX0KLQkJY2hhciBzdHJbXSA9IHRleHQuZ2V0RGF0YSgpLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9zdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJSU1vZGVsR3JvdXAgbWcgPSBsYXN0RWxlbWVudERlZi5nZXRDb250ZW50TW9kZWwoKTsKLQotCQlpZiAobWcgPT0gY2RhdGEpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkJTm9kZSBjZGF0YSA9IHJlYWRDREFUQSh0YWdOYW1lKTsKLQkJCWN1cnJlbnROb2RlID0gbmV3IEVuZFRhZyh0YWdOYW1lKTsKLQkJCSgoRW5kVGFnKSBjdXJyZW50Tm9kZSkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vZGVzV2l0aEVuZHRhZy5hZGRFbGVtZW50KGVsZW1lbnQpOwotCQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCAmJiAhZUhhbmRsZUxvZ2ljYWwpIHsKLQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQodGFnTmFtZSk7Ci0JCQl9Ci0JCQllbGVtZW50LmFwcGVuZENoaWxkKGNkYXRhKTsKLQkJCWlmIChjb250ZXh0ID09IGVsZW1lbnQpCi0JCQkJc2V0Q29udGV4dEJhY2t3YXJkKGRlcHRoIC0gMSk7Ci0KLQkJfSBlbHNlIGlmIChtZyA9PSBlbXB0eSAmJiBsYXN0RWxlbWVudERlZi5lbmRUYWdPbWl0dGFibGUoKSkgeyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJLy8gb21pdHRlZAotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWxlbWVudC50b1N0cmluZygpK2xhc3RFbGVtZW50RGVmLnRvU3RyaW5nKCkpOwotCQkJaWYgKGNvbnRleHQgPT0gZWxlbWVudCkgewotCQkJCXNldENvbnRleHRCYWNrd2FyZChkZXB0aCAtIDEpOwotCQkJfSBlbHNlIGlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpc1hIVE1MICYmIGlzRW5kV2l0aFNsYXNoKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWxlbWVudC50b1N0cmluZygpK2xhc3RFbGVtZW50RGVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDREFUQVNlY3Rpb24gcmVhZENEQVRBKFN0cmluZyBhcmcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAobGV4SGFuZGxlciAhPSBudWxsKSB7Ci0JCQlsZXhIYW5kbGVyLnN0YXJ0Q0RBVEEoKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnJhd1RleHQoYXJnKTsKLQkJQ0RBVEFTZWN0aW9uIHJldCA9IGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oc3RyKTsKLQkJY3VycmVudE5vZGUgPSByZXQ7Ci0JCWlmIChsZXhIYW5kbGVyICE9IG51bGwpIHsKLQkJCWxleEhhbmRsZXIuZW5kQ0RBVEEoKTsKLQkJfQotCQl0b2tlbml6ZXIuZWF0Q0RBVEFFbmRUYWcoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxDQVRCPiBjb21tZW50c0JlZm9yZURvY3R5cGUgPSBuZXcgVmVjdG9yPENBVEI+KCk7Ci0KLQlwcml2YXRlIFZlY3RvciBjb21tZW50c0FmdGVyZURvY3R5cGUgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcKLQkgKi8KLQljbGFzcyBDQVRCIHsKLQkJLyoqCi0JCSAqIElmIGNvbW1lbnQsIHRydWUuIE90aGVyd2lzZSwgZmFsc2UuCi0JCSAqLwotCQlib29sZWFuIGNvbW1lbnQgPSB0cnVlOwotCi0JCVN0cmluZyBzdHI7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgcmVhZERvY1R5cGUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGxhc3REZWYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJBbHJlYWR5IHJlYWQgRE9DVFlQRSBkZWNsYXJhdGlvbiIpOwotCQl9Ci0KLQkJY29tbWVudF9sb29wOiB3aGlsZSAodHJ1ZSkgewotCQkJc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJCWNhc2UgQ09NTUVOVDoKLQkJCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCQkJQ0FUQiBjYXRiID0gbmV3IENBVEIoKTsKLQkJCQkJY2F0Yi5zdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkJY29tbWVudHNCZWZvcmVEb2N0eXBlLmFkZEVsZW1lbnQoY2F0Yik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudE5vZGUgPSBkb2MuY3JlYXRlQ29tbWVudCh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQkJCWRvYy5hcHBlbmRDaGlsZChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWlmIChsZXhIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJbGV4SGFuZGxlci5jb21tZW50KHNheGNoLCBiZWdpbiwgbGVuKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBJOgotCQkJCWlmIChkb2MgPT0gbnVsbCkgewotCQkJCQlDQVRCIGNhdGIgPSBuZXcgQ0FUQigpOwotCQkJCQljYXRiLmNvbW1lbnQgPSBmYWxzZTsKLQkJCQkJY2F0Yi5zdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkJY29tbWVudHNCZWZvcmVEb2N0eXBlLmFkZEVsZW1lbnQoY2F0Yik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudE5vZGUgPSBkb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKG51bGwsCi0JCQkJCQkJdG9rZW5pemVyLnN2YWwpOwotCQkJCQlkb2MuYXBwZW5kQ2hpbGQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWRvY0hhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKG51bGwsIHRva2VuaXplci5zdmFsKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1ETzoKLQkJCQlicmVhayBjb21tZW50X2xvb3A7Ci0JCQlkZWZhdWx0OgotCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBOQU1FX0NIQVIKLQkJCQkmJiAhdG9rZW5pemVyLnN2YWwuZXF1YWxzKCJET0NUWVBFIikpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW5rbm93biBkZWNsYXJhdGlvbiBhdCAiCi0JCQkJCSsgdG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkpOwotCQl9Ci0JCS8qCi0JCSAqIE9ubHkgc3VwcG9ydHMgaW5pdGlhbGx5IHNldHRlZCBwdWJsaWMgZW50aXR5LiBGb3IgZXhhbXBsZSwgPCFET0NUWVBFCi0JCSAqIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQkJICovCi0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSKSB7Ci0JCQlTdHJpbmcgZG9jVHlwZU5hbWUgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCXRoaXMuZGVmYXVsdFRvcEVsZW1lbnQgPSBkb2NUeXBlTmFtZTsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSCi0JCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIlBVQkxJQyIpKSB7Ci0JCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnIicpIHsKLQkJCQkJU3RyaW5nIHB1YmxpY0lEID0gdG9rZW5pemVyLmVhdFVudGlsKCciJyk7Ci0JCQkJCWlmIChlbmZvcmNlZERvY3R5cGUgIT0gbnVsbCkgewotCQkJCQkJcHVibGljSUQgPSBlbmZvcmNlZERvY3R5cGU7Ci0JCQkJCX0KLQkJCQkJaWYgKGxleEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJbGV4SGFuZGxlci5zdGFydERURChkb2NUeXBlTmFtZSwgcHVibGljSUQsIG51bGwpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBlbnRpdHlGaWxlTmFtZSA9IChTdHJpbmcpIHB1YkVudGl0eU1hcC5nZXQocHVibGljSUQpOwotCQkJCQlpZiAoZW50aXR5RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQkJaWYgKGRlZmF1bHREVEQgIT0gbnVsbCkgewotCQkJCQkJCWVycm9yKElMTEVHQUxfRE9DVFlQRSwgIkluc3RlYWQgb2YgXCIiICsgcHVibGljSUQKLQkJCQkJCQkJCSsgIlwiIHVzZSBcIiIgKyBkZWZhdWx0RFREICsgIlwiIGFzIGEgRFRELiIpOwotCQkJCQkJCWVudGl0eUZpbGVOYW1lID0gKFN0cmluZykgcHViRW50aXR5TWFwCi0JCQkJCQkJCQkuZ2V0KGRlZmF1bHREVEQpOwotCQkJCQkJfQotCQkJCQkJaWYgKGVudGl0eUZpbGVOYW1lID09IG51bGwpIHsKLQkJCQkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24odG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkKLQkJCQkJCQkJCSsgIjogdGhpcyBwYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCQkJCQkJCQkrIHB1YmxpY0lEKTsKLQkJCQkJCX0KLQkJCQkJCXB1YmxpY0lEID0gZGVmYXVsdERURDsKLQkJCQkJfQotCQkJCQlzZXR1cERURChwdWJsaWNJRCk7Ci0JCQkJCWlmIChkb21JbXBsID09IG51bGwpIHsKLQkJCQkJCWRvbUltcGwgPSBkb2MuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJCQkJfQotCQkJCQlEb2N1bWVudFR5cGUgcmV0ID0gbnVsbDsKLQkJCQkJaWYgKGRvbUltcGwgIT0gbnVsbCkgewotCQkJCQkJY3VycmVudE5vZGUgPSByZXQgPSBjcmVhdGVEb2NUeXBlKGRvbUltcGwsIGRvY1R5cGVOYW1lLAotCQkJCQkJCQlwdWJsaWNJRCk7Ci0JCQkJCX0KLQkJCQkJLy8gY29uc3VtZSAnPicKLQkJCQkJdG9rZW5pemVyLmNvbnN1bWVVbnRpbCgnPicpOwotCQkJCQl0b2tlbml6ZXIuc3dpdGNoVG8oREVGQVVMVCk7Ci0JCQkJCWxhc3REZWYgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24oZG9jVHlwZU5hbWUpOwotCQkJCQlpZiAobGFzdERlZiA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgdG9wRWxlbWVudE5hbWUgPSBnZXREZWZhdWx0VG9wRWxlbWVudCgpOwotCQkJCQkJZXJyb3IoSUxMRUdBTF9ET0NUWVBFLCBkb2NUeXBlTmFtZQotCQkJCQkJCQkrICIgaXMgbm90IGRlZmluZWQgYXMgYSByb290IGVsZW1lbnQuICBVc2UgIgotCQkJCQkJCQkrIHRvcEVsZW1lbnROYW1lICsgJy4nKTsKLQkJCQkJCWxhc3REZWYgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24odG9wRWxlbWVudE5hbWUpOwotCQkJCQl9Ci0JCQkJCWlmIChsZXhIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWxleEhhbmRsZXIuZW5kRFREKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJldDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdG9rZW5pemVyLmNvbnN1bWVVbnRpbCgnPicpOwotCQllcnJvcihJTExFR0FMX0RPQ1RZUEUsICJJbnZhbGlkIERPQ1RZUEUgZGVjbGFyYXRpb24uIFVzZSAiICsgZGVmYXVsdERURCk7Ci0JCXNldHVwRFREKGRlZmF1bHREVEQpOwotCQlsYXN0RGVmID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKGdldERlZmF1bHRUb3BFbGVtZW50KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50VHlwZSBjcmVhdGVEb2NUeXBlKERPTUltcGxlbWVudGF0aW9uIGRvbUltcGwsCi0JCQlTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCkgewotCQkvKgotCQkgKiBGb3IgY29tcGF0aWJpbGl0eSB0byBET00gbGV2ZWwgMQotCQkgKi8KLQkJQ2xhc3MgZG9tSW1wbENsYXNzID0gZG9tSW1wbC5nZXRDbGFzcygpOwotCQlDbGFzcyBzdHJpbmdDbGFzcyA9IGRvY1R5cGVOYW1lLmdldENsYXNzKCk7Ci0JCUNsYXNzIHBhcmFtZXRlclR5cGVzW10gPSB7IHN0cmluZ0NsYXNzLCBzdHJpbmdDbGFzcywgc3RyaW5nQ2xhc3MgfTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGRvbUltcGxDbGFzcy5nZXRNZXRob2QoImNyZWF0ZURvY3VtZW50VHlwZSIsCi0JCQkJCXBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhcmdzW10gPSB7IGRvY1R5cGVOYW1lLCBwdWJsaWNJRCwgIiIgfTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoRG9jdW1lbnRUeXBlKSBtZXRob2QuaW52b2tlKGRvbUltcGwsIChPYmplY3RbXSlhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8qCi0JCSAqIEZvciBET00gbGV2ZWwgMiB0cnkgeyByZXR1cm4gZG9tSW1wbC5jcmVhdGVEb2N1bWVudFR5cGUoZG9jVHlwZU5hbWUsCi0JCSAqIHB1YmxpY0lELCAiIik7IH0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7IHJldHVybiBudWxsOyB9Ci0JCSAqLwotCX0KLQotCXByaXZhdGUgTm9kZSBub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW5bXSA9IG5ldyBOb2RlW0JVRl9TSVpdOwotCi0JcHJpdmF0ZSBpbnQgbm9kZVdpdGhJbGxlZ2FsQ2hpbGROdW0gPSAwOwotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZE5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbigpIHsKLQkJTm9kZSBuZXdOb2Rlc1tdID0gbmV3IE5vZGVbbm9kZVdpdGhJbGxlZ2FsQ2hpbGROdW0gKiAyXTsKLQkJU3lzdGVtLmFycmF5Y29weShub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW4sIDAsIG5ld05vZGVzLCAwLAotCQkJCW5vZGVXaXRoSWxsZWdhbENoaWxkTnVtKTsKLQkJbm9kZXNXaXRoSWxsZWdhbENoaWxkcmVuID0gbmV3Tm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVycm9yTm9kZShOb2RlIG5vZGUpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGVXaXRoSWxsZWdhbENoaWxkTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW5baV0gPT0gbm9kZSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbi5sZW5ndGggPT0gbm9kZVdpdGhJbGxlZ2FsQ2hpbGROdW0pIHsKLQkJCWV4cGFuZE5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbigpOwotCQl9Ci0JCW5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbltub2RlV2l0aElsbGVnYWxDaGlsZE51bSsrXSA9IG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEgc3BlY2lmaWVkIG5vZGUgaGFzIGFuIGVycm9yIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgbm9kZSB0byBiZSBja2Vja2VkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgYW4gZXJyb3Igbm9kZS4KLQkgKiAgICAgICAgIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yTm9kZShOb2RlIG5vZGUpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGVXaXRoSWxsZWdhbENoaWxkTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW5baV0gPT0gbm9kZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgdGhpcyBwYXJzZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJbGFzdERlZiA9IG51bGw7Ci0JCWNvbnRleHQgPSBudWxsOwotCQlub2RlV2l0aElsbGVnYWxDaGlsZE51bSA9IDA7Ci0JCWRlcHRoID0gMDsKLQkJYW5kTWFwLmNsZWFyKCk7Ci0JCXNlcU1hcC5jbGVhcigpOwotCQlwbHVzTWFwLmNsZWFyKCk7Ci0JCWNvbW1lbnRzQmVmb3JlRG9jdHlwZS5yZW1vdmVBbGxFbGVtZW50cygpOwotCQljb21tZW50c0FmdGVyZURvY3R5cGUucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkJaWYgKGdldERPTUltcGxlbWVudGF0aW9uKCkgIT0gbnVsbCkgewotCQkJc2V0RE9NSW1wbGVtZW50YXRpb24oZ2V0RE9NSW1wbGVtZW50YXRpb24oKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGRvYwotCQkJCQkuZ2V0Rmlyc3RDaGlsZCgpKSB7Ci0JCQkJZG9jLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCWludCBnZXRDaGFyRW50aXR5KFN0cmluZyBlbnRpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sCi0JCQlTQVhFeGNlcHRpb24gewotCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVyID0gZHRkLmdldEVudGl0eVJlZmVyZW5jZShlbnRpdHkpOwotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJaW50IGNoID0gZWQuZ2V0UmVwbGFjZW1lbnRDaGFyKCk7Ci0JCWlmIChjaCAhPSAtMSkgewotCQkJcmV0dXJuIGNoOwotCQl9Ci0JCUluc1Rva2VuaXplciB0b2tlbml6ZXIyID0gbmV3IEluc1Rva2VuaXplcihlZC5nZXRSZXBsYWNlbWVudFJlYWRlcigpLAotCQkJCXRoaXMpOwotCQlpZiAodG9rZW5pemVyMi5uZXh0VG9rZW4oKSA9PSBQQ0RBVEEgJiYgdG9rZW5pemVyMi5zdmFsLmxlbmd0aCgpID09IDEpIHsKLQkJCWNoYXIgcmV0ID0gdG9rZW5pemVyMi5zdmFsLmNoYXJBdCgwKTsKLQkJCWVkLnNldFJlcGxhY2VtZW50Q2hhcihyZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW50ZXJuYWwgUGFyc2VyIEVycm9yOiAiICsgZW50aXR5Ci0JCQkJCSsgIiBub3QgZGVmaW5lZC4iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgYSA8aT5Eb2N1bWVudCA8L2k+IGluc3RhbmNlIHRoYXQgd2lsbCBiZSBhIGZhY3Rvcnkgb2Ygbm9kZXMgaW4gRE9NCi0JICogdHJlZS4gVGhpcyBwYXJzZXIgY2FuIHVzZSBhbnkgaW1wbGVtZW50YXRpb24gb2YgVzNDJ3MgRE9NLiBCeSBkZWZhdWx0LAotCSAqIFBhcnNlcnMgdXNlIHtAbGluayBTR01MRG9jdW1lbnR9LiBUaGlzIG1ldGhvZCBtYWtlIHRoZSBwYXJzZXIgaW5zdGFuY2UKLQkgKiBpZ25vcmUgRE9NSW1wbGVtZW50YXRpb24gYnkgc2lkZSBlZmZlY3RzLgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG5ldyBEb2N1bWVudCBpbnN0YW5jZS4KLQkgKiBAc2VlICNnZXREb2N1bWVudCgpCi0JICogQGRlcHJlY2F0ZWQgU2VlIHtAbGluayAjc2V0RE9NSW1wbGVtZW50YXRpb24oRE9NSW1wbGVtZW50YXRpb24pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQkJZG9tSW1wbCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVMaXN0SW1wbCBhdHRybGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBsYXN0RWxlbWVudE51bWJlcjsKLQotCXByaXZhdGUgRWxlbWVudERlZmluaXRpb24gbGFzdEVsZW1lbnREZWY7Ci0KLQlwcml2YXRlIE5vZGUgc3RhZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCUVsZW1lbnQgcmV0OwotCQlpc0VtcHR5RWxlbWVudCA9IHRydWU7Ci0JCWlzRW5kV2l0aFNsYXNoID0gZmFsc2U7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gTkFNRV9DSEFSKSB7Ci0JCQlpZiAoaGFuZGxlRXJyb3IoVEFHX05BTUUsIHRva2VuaXplci5zdmFsKSkgewotCQkJCXJldHVybiBzdGFnKCk7Ci0JCQl9Ci0JCQllcnJvcihTVEFSVFRBR19TWU5UQVhfRVJSLAotCQkJCQkiUGVyaGFwcyBjaGFyYWN0ZXIgZW5jb2RpbmcgbWF5IG5vdCBiZSBjb3JyZWN0LiIpOwotCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBOQU1FX0NIQVIpIHsKLQkJCQlpZiAodG9rZW5pemVyLnR0eXBlID09IEVPRiB8fCB0b2tlbml6ZXIudHR5cGUgPT0gVEFHQykgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlFbGVtZW50RGVmaW5pdGlvbiBlZCA9IHRoaXMuZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKHRva2VuaXplci5zdmFsKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWxhc3RFbGVtZW50TnVtYmVyID0gZWQubnVtYmVyOwotCQkJbGFzdEVsZW1lbnREZWYgPSBlZDsKLQkJCWlzRW1wdHlFbGVtZW50ID0gZWQuZ2V0Q29udGVudE1vZGVsKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkiRU1QVFkiKTsKLQkJfSBlbHNlIGlmIChrZWVwVW5rbm93bnMpIHsKLQkJCWxhc3RFbGVtZW50TnVtYmVyID0gcGNkYXRhTnVtYmVyICsgMTsKLQkJCWVkID0gbGFzdEVsZW1lbnREZWYgPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQl9Ci0JCWN1cnJlbnROb2RlID0gcmV0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoY2hhbmdlVGFnQ2FzZSh0b2tlbml6ZXIuc3ZhbCkpOwotCQkvKgotCQkgKiBib29sZWFuIHN5bnRheEVycm9yID0gZmFsc2U7Ci0JCSAqLwotCQlBdHRyIGF0dHIgPSBudWxsOwotCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKQotCQkJYXR0cmxpc3QgPSBjcmVhdGVBdHRyaWJ1dGVMaXN0KCk7Ci0JCWlzRW5kV2l0aFNsYXNoID0gZmFsc2U7Ci0JCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gVEFHQykgewotCQkJaWYgKHRva2VuaXplci50dHlwZSA9PSAnLycpIHsKLQkJCQlpc0VuZFdpdGhTbGFzaCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlzRW5kV2l0aFNsYXNoID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAodG9rZW5pemVyLnR0eXBlID09IFNUQUdPIHx8IHRva2VuaXplci50dHlwZSA9PSBFVEFHTykgewotCQkJCWlmIChoYW5kbGVFcnJvcihCRUZPUkVfQVRUUk5BTUUsIHRva2VuaXplci5zdmFsKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZXJyb3IoU1RBUlRUQUdfU1lOVEFYX0VSUiwgInJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBpbiAiICsgcmV0KTsKLQkJCQl0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09IEVPRikgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQl0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJCWF0dHIgPSBhdHRyaWJ1dGUoZWQsIGF0dHJsaXN0KTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlyZXQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQkvKgotCQkJCSAqIH0gZWxzZSBpZiAoIXN5bnRheEVycm9yKSB7IHN5bnRheEVycm9yID0gdHJ1ZTsKLQkJCQkgKiBlcnJvcihTVEFSVFRBR19TWU5UQVhfRVJSLCAicmVxdWlyZXMgYW4gYXR0cmlidXRlIGFmdGVyICIgKwotCQkJCSAqIHJldCk7Ci0JCQkJICovCi0JCQl9Ci0JCX0KLQotCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmICFlSGFuZGxlTG9naWNhbCkgewotCQkJLy8gaWYoZHRkLnRvU3RyaW5nKCkuaW5kZXhPZigiWEhUTUwiKSA8IDAgfHwgIWVuZFdpdGhTbGFzaCl7Ci0JCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChyZXQuZ2V0Tm9kZU5hbWUoKSwgYXR0cmxpc3QpOwotCQkJLy8gfQotCQl9Ci0KLQkJaWYgKGVkID09IG51bGwpIHsKLQotCQkJaWYgKCFoYW5kbGVFcnJvcihVTktOT1dOX0VMRU1FTlQsIHJldCkpIHsKLQkJCQllcnJvcihVTktOT1dOX0VMRU1FTlQsICJVbmtub3duIEVsZW1lbnQ6ICIgKyByZXQuZ2V0VGFnTmFtZSgpCi0JCQkJCQkrICIuICBJZ25vcmUgaXQuIik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChlZCA9PSBhbm9ueW1vdXNFbGVtZW50RGVmKSB7Ci0KLQkJCWlmIChoYW5kbGVFcnJvcihVTktOT1dOX0VMRU1FTlQsIHJldCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3IoVU5LTk9XTl9FTEVNRU5ULCAiVW5rbm93biBFbGVtZW50OiAiICsgcmV0LmdldFRhZ05hbWUoKQotCQkJCQkJKyAiLiAgRGVmaW5lIGl0cyBkZWZpbml0aW9uIGFzIDwhRUxFTUVOVCAiCi0JCQkJCQkrIHJldC5nZXROb2RlTmFtZSgpLnRvVXBwZXJDYXNlKCkgKyAiIC0gLSBBTlk+Iik7Ci0JCQl9Ci0JCX0KLQotCQljdXJyZW50VGFnTmFtZSA9IHJldC5nZXROb2RlTmFtZSgpOwotCQkvLyBpZiAoaXNYSFRNTCAmJiBpc0VuZFdpdGhTbGFzaCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNsYXNoIGVuZCB0YWciKTsKLQkJLy8gaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCAmJiAhZUhhbmRsZUxvZ2ljYWwpIHsKLQkJLy8gZG9jSGFuZGxlci5lbmRFbGVtZW50KHJldC5nZXROb2RlTmFtZSgpKTsKLQkJLy8gfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZG9jSGFuZGxlcik7Ci0JCS8vIH0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYWtlVW5pcXVlKFN0cmluZyBpZCkgewotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBwdWJFbnRpdHlNYXAuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyByZXQgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHJldCkpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyBkZWZhdWx0IGR0ZC4gSWYgJmx0OyFET0NUWVBFIC4uLiAmZ3Q7IHN0YXRlbWVudCBpcyBtaXNzaW5nIGluIGEKLQkgKiB0b3Agb2YgYSBkb2N1bWVudCwgYSBwYXJzZXIgcmVhZHMgaXQgYnkgc3BlY2lmZWQgZHRkLgotCSAqIAotCSAqIEBwYXJhbSBkdGQKLQkgKiAgICAgICAgICAgIGR0ZCdzIHB1YmxpYyBpZCBmb3IgZGVmYXVsdCBsaWtlCi0JICogICAgICAgICAgICA8Y29kZT4iLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdERURChTdHJpbmcgZHRkKSB7Ci0JCWRlZmF1bHREVEQgPSBtYWtlVW5pcXVlKGR0ZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbnN0YW5jZSB2YXJpYWJsZSBob2xkcyBhIGRlZmF1bHQgRFREJ3MgcHVibGljIElELiBJZiBhIHBhcnNlciBtZWV0cwotCSAqIGEgc3RyYW5nZSBET0NUWVBFIGRlY2xhcmF0aW9uLCBpdCByZWFkcyBhIGRvY3VtZW50IHdpdGggdGhpcyBkZWZhdWx0IERURC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHREVEQgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0b3AgZWxlbWVudCdzIG5hbWUuIElmIHlvdSB3YW50IHRoZSBwYXJzZXIgdG8gcmVhZCBkb2N1bWVudCB3aXRob3V0Ci0JICogRE9DVFlQRSBkZWNsYXJhdGlvbiBhdCB0aGUgdG9wLCB5b3UgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4KLQkgKiBzb21lIGVsZW1lbnQncyBuYW1lLiBGb3IgSFRNTCBkb2N1bWVudHMsIGl0IHJldHVybnMgIkhUTUwiLgotCSAqIAotCSAqIEByZXR1cm4gdG9wIGVsZW1lbnQncyBuYW1lCi0JICogQGV4Y2VwdGlvbiBQYXJzZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGFsd2F5cyB0aHJvd24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VG9wRWxlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWZhdWx0VG9wRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFRvcEVsZW1lbnQ7Ci0JCX0KLQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKAotCQkJCSJkb2Vzbid0IGtub3cgd2hpY2ggZWxlbWVudCBtdXN0IGJlIGF0IHRoZSB0b3AuIik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRvcEVsZW1lbnQgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVJfQ0FTRSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1dFUl9DQVNFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SSUdJTkFMX0NBU0UgPSAyOwotCi0JcHJpdmF0ZSBpbnQgZGVmYXVsdFRhZ0Nhc2UgPSBVUFBFUl9DQVNFOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGVsZW1lbnQgbmFtZXMnIGNhc2Ugd2hvc2Ugc3RhcnQgdGFncyBhcmUgb21pdHRlZC4gRGVmYXVsdAotCSAqIGJlaGF2aWVyIG1ha2VzIHRoZW0gdXBwZXJjYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnQ2FzZQotCSAqICAgICAgICAgICAgdGhpcyBtdXN0IGJlIHtAbGluayAjVVBQRVJfQ0FTRX1vciB7QGxpbmsgI0xPV0VSX0NBU0V9LiBJZgotCSAqICAgICAgICAgICAgb3RoZXJ3aXNlLCBpZ25vcmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhZ0Nhc2UoaW50IHRhZ0Nhc2UpIHsKLQkJaWYgKHRhZ0Nhc2UgPT0gMCB8fCB0YWdDYXNlID09IExPV0VSX0NBU0UpIHsKLQkJCXRoaXMuZGVmYXVsdFRhZ0Nhc2UgPSB0YWdDYXNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIGEgc3BlY2lmaWVkIHN0cmluZyB0byBzcGVjaWZpZWQgY2FzZWQuCi0JICogCi0JICogQHNlZSAjc2V0RGVmYXVsdFRhZ0Nhc2UoaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2hhbmdlRGVmYXVsdFRhZ0Nhc2UoU3RyaW5nIHRhZykgewotCQlzd2l0Y2ggKHRoaXMuZGVmYXVsdFRhZ0Nhc2UpIHsKLQkJY2FzZSBVUFBFUl9DQVNFOgotCQkJcmV0dXJuIHRhZy50b1VwcGVyQ2FzZSgpOwotCQljYXNlIExPV0VSX0NBU0U6Ci0JCQlyZXR1cm4gdGFnLnRvTG93ZXJDYXNlKCk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgUGFyc2VyIEVycm9yIik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB0YWdDYXNlID0gT1JJR0lOQUxfQ0FTRTsKLQotCS8qKgotCSAqIFNwZWNpZmllcyBlbGVtZW50IG5hbWVzJyBjYXNlLiBEZWZhdWx0IGJlaGF2aWVyIG1ha2VzIHRoZW0gb3JpZ2luYWwKLQkgKiBjYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnQ2FzZQotCSAqICAgICAgICAgICAgdGhpcyBtdXN0IGJlIHtAbGluayAjVVBQRVJfQ0FTRX0se0BsaW5rICNMT1dFUl9DQVNFfW9yCi0JICogICAgICAgICAgICB7QGxpbmsgI09SSUdJTkFMX0NBU0V9LiBJZiBvdGhlcndpc2UsIGlnbm9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdDYXNlKGludCB0YWdDYXNlKSB7Ci0JCWlmICh0YWdDYXNlID09IFVQUEVSX0NBU0UgfHwgdGFnQ2FzZSA9PSBMT1dFUl9DQVNFCi0JCQkJfHwgdGFnQ2FzZSA9PSBPUklHSU5BTF9DQVNFKSB7Ci0JCQl0aGlzLnRhZ0Nhc2UgPSB0YWdDYXNlOwotCQl9Ci0JfQotCi0JZmluYWwgU3RyaW5nIGNoYW5nZVRhZ0Nhc2UoU3RyaW5nIHRhZykgewotCQlzd2l0Y2ggKHRoaXMudGFnQ2FzZSkgewotCQljYXNlIFVQUEVSX0NBU0U6Ci0JCQlyZXR1cm4gdGFnLnRvVXBwZXJDYXNlKCk7Ci0JCWNhc2UgTE9XRVJfQ0FTRToKLQkJCXJldHVybiB0YWcudG9Mb3dlckNhc2UoKTsKLQkJY2FzZSBPUklHSU5BTF9DQVNFOgotCQkJcmV0dXJuIHRhZzsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBQYXJzZXIgRXJyb3IiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGF0dHJDYXNlID0gT1JJR0lOQUxfQ0FTRTsKLQotCS8qKgotCSAqIFNwZWNpZmllcyBhdHRyaWJ1dGUgbmFtZXMnIGNhc2UuIERlZmF1bHQgYmVoYXZpZXIgbWFrZXMgdGhlbSBvcmlnaW5hbAotCSAqIGNhc2VkLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyQ2FzZQotCSAqICAgICAgICAgICAgdGhpcyBtdXN0IGJlIHtAbGluayAjVVBQRVJfQ0FTRX0se0BsaW5rICNMT1dFUl9DQVNFfW9yCi0JICogICAgICAgICAgICB7QGxpbmsgI09SSUdJTkFMX0NBU0V9LiBJZiBvdGhlcndpc2UsIGlnbm9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJDYXNlKSB7Ci0JCWlmIChhdHRyQ2FzZSA9PSBVUFBFUl9DQVNFIHx8IGF0dHJDYXNlID09IExPV0VSX0NBU0UKLQkJCQl8fCBhdHRyQ2FzZSA9PSBPUklHSU5BTF9DQVNFKSB7Ci0JCQl0aGlzLmF0dHJDYXNlID0gYXR0ckNhc2U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBTdHJpbmcgY2hhbmdlQXR0ck5hbWVDYXNlKFN0cmluZyBhdHRyKSB7Ci0JCXN3aXRjaCAodGhpcy5hdHRyQ2FzZSkgewotCQljYXNlIFVQUEVSX0NBU0U6Ci0JCQlyZXR1cm4gYXR0ci50b1VwcGVyQ2FzZSgpOwotCQljYXNlIExPV0VSX0NBU0U6Ci0JCQlyZXR1cm4gYXR0ci50b0xvd2VyQ2FzZSgpOwotCQljYXNlIE9SSUdJTkFMX0NBU0U6Ci0JCQlyZXR1cm4gYXR0cjsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBQYXJzZXIgRXJyb3IiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGVuZm9yY2VkRG9jdHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBJZ25vcmVzIGEgZGVjbGFyYXRpb24gYXQgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQgYW5kIGVuZm9yY2VzIGRvY3VtZW50Ci0JICogdHlwZSBzcGVjaWZpZWQgYnkgPGNvZGU+cHVibGljSWQ8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgZW5mb3JjZURvY3R5cGUoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWVuZm9yY2VkRG9jdHlwZSA9IG1ha2VVbmlxdWUocHVibGljSWQpOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0b2tlbml6ZXIuY2xvc2UoKTsKLQkJdG9rZW5pemVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBleHRyYUVyckluZm8gPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyBleHRyYSBlcnJvciBpbmZvcm1hdGlvbi4gQSBwYXJzZXIgcGFzc2VzIHR3byBlcnJvciBpbmZvcm1hdGlvbiAoZS5nLgotCSAqIGVycm9yIGNvZGUgYW5kIGVycm9yIG5vZGUpIHRvIG5vZGUtbGV2ZWwgZXJyb3IgaGFuZGxlcnMuIEhvd2V2ZXIsIGl0IGlzCi0JICogbm93IGVub3VnaCBmb3Igc29tZSBraW5kIG9mIGVycm9yIGhhbmRsZXJzIHRvIHJlY292ZXIgdGhlIGVycm9yLiBJZgotCSAqIHtAbGluayBJU0dNTENvbnN0YW50cyNTVURERU5fRU5EVEFHfWVycm9yIG9jY3VycywgcGFyc2VyIHNldCBtaXNzZWQgZW5kCi0JICogdGFncyBiZXR3ZWVuIGVycm9yIG5vZGUgYW5kIGZ1dHVyZSBjb250ZXh0IHRvIGV4dHJhIGVycm9yIGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXh0cmFFcnJJbmZvKCkgewotCQlyZXR1cm4gZXh0cmFFcnJJbmZvOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgTm9kZSBub2RlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IGVycm9ySGFuZGxlck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyc1tpXS5oYW5kbGVFcnJvcihjb2RlLCB0aGlzLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTdHJpbmcgZXJyb3JTdHIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IHRva2VuRXJyb3JIYW5kbGVyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICh0b2tlbkVycm9ySGFuZGxlcnNbaV0uaGFuZGxlRXJyb3IoY29kZSwgdGhpcywgZXJyb3JTdHIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXZvaWQgcHV0Q2hhck51bUVudGl0eShDaGFyYWN0ZXIgQywgU3RyaW5nIGVudCkgewotCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgU0dNTERvY3VtZW50KSB7Ci0JCQkoKFNHTUxEb2N1bWVudCkgZG9jKS5wdXRDaGFyTnVtRW50aXR5KEMsIGVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50SGFuZGxlciBkb2NIYW5kbGVyID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgYSA8aT5Eb2N1bWVudEhhbmRsZXIgPC9pPiBpbnN0YW5jZSBpbmNsdWRlZCBpbiB0aGlzIHBhcnNlci4KLQkgKiAKLQkgKiBAc2VlICNzZXREb2N1bWVudEhhbmRsZXIob3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyKQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEhhbmRsZXIgZ2V0RG9jdW1lbnRIYW5kbGVyKCkgewotCQlyZXR1cm4gdGhpcy5kb2NIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgYSA8aT5Eb2N1bWVudEhhbmRsZXIgPC9pPiBpbnN0YWNlIGZvciB0aGlzIHBhcnNlci4KLQkgKiAKLQkgKiBAc2VlICNnZXREb2N1bWVudEhhbmRsZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50SGFuZGxlcihEb2N1bWVudEhhbmRsZXIgaGFuZGxlcikgewotCQl0aGlzLmRvY0hhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBmYWxzZTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiBwYXJzZXIgcHJlc2VydmUgd2hpdGVzcGFjZXMgb3Igbm90LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYXJzZXIgcHJlc2VydmUgd2hpdGVzcGFjZXMuCi0JICogICAgICAgICBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJlc2VydmVXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gcHJlc2VydmVXaGl0ZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhpcyBwYXJzZXIgcHJlc2VydmUgd2hpdGVzcGFjZXMgb3Igbm90LiBJZiBwcmVzZXJ2ZSwgdGhlCi0JICogcGFyc2VyIGNyZWF0ZSB0ZXh0IG5vZGUgZm9yIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIGFuZCBkb2VzIG5vdCBpZ25vcmUKLQkgKiBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZCBhZnRlciBzdGFydCB0YWdzIGFuZCBiZWZvcmUgZW5kIHRhZ3MuIEJ5Ci0JICogZGVmYXVsdCBhIHBhcnNlciBpZ25vcmVzIHdoaXRlc3BhY2VzLgotCSAqIAotCSAqIEBzZWUgI2dldFByZXNlcnZlV2hpdGVzcGFjZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VydmVXaGl0ZXNwYWNlKGJvb2xlYW4gcHJlc2VydikgewotCQlpZiAodG9rZW5pemVyICE9IG51bGwpIHsKLQkJCXRva2VuaXplci5zZXRQcmVzZXJ2ZVdoaXRlc3BhY2UocHJlc2Vydik7Ci0JCX0KLQkJdGhpcy5wcmVzZXJ2ZVdoaXRlc3BhY2UgPSBwcmVzZXJ2OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hpY2ggdGhpcyBwYXJzZXIgaW52b2tlcyB7QGxpbmsgCi0JICogb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotCSAqIG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QpfSBhbmQKLQkgKiB7QGxpbmsgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZyl9Ci0JICogPGNvZGU+bG9naWNhbGx5PC9jb2RlPiBvciA8Y29kZT5waHlzaWNhbGx5PC9jb2RlPi48Y29kZT4KLQkgKiBMb2dpY2FsPC9jb2RlPgotCSAqIG1lYW5zIHRoYXQgaWYgYSBzdGFydCBvciBlbmQgdGFnIG9mIGEgZWxlbWVudCBpcyBvbWl0dGVkLCBhIHBhcnNlcgotCSAqIGludm9rZXMgZWFjaCBtZXRob2QuIDxjb2RlPlBoeXNpY2FsPC9jb2RlPiBtZWFucyB0aGF0IHBhcnNlcnMgaW52b2tlcwotCSAqIGVhY2ggbWV0aG9kIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHRhZyBhcHBlYXJlbnRseSBleGlzdC4gSWYKLQkgKiA8Y29kZT5waHlzaWNhbDwvY29kZT4sIGEgcGFyc2VyIGRvZXMgbm90IGNhcmUgaWYgdGhlIHRhZyBpcyBpbGxlZ2FsIG9yCi0JICogbm90LiBEZWZhdWx0IGlzIDxjb2RlPnBoeXNpY2FsPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBsb2dpY2FsCi0JICogICAgICAgICAgICBpZiB0cnVlLCBkZWFsIHdpdGggdGFncyBhcyBsb2dpY2FsLiBPdGhlcndpc2UsIGFzIHBoeXNpY2FsCi0JICovCi0JcHVibGljIHZvaWQgZWxlbWVudEhhbmRsZShib29sZWFuIGxvZ2ljYWwpIHsKLQkJdGhpcy5lSGFuZGxlTG9naWNhbCA9IGxvZ2ljYWw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVIYW5kbGVMb2dpY2FsID0gdHJ1ZTsKLQotCXByaXZhdGUgVmVjdG9yPEVsZW1lbnQ+IGF1dG9HZW5lcmF0ZWQgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoaXMgcGFyc2VyCi0JICogb3Igbm90LiBGb3IgZXhhbXBsZSwgPGNvZGU+VEJPRFk8L2NvZGU+IHVuZGVyIDxjb2RlPlRBQkxFPC9jb2RlPiBpcwotCSAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGluIGZvbGxvd2luZyBkb2N1bWVudC4KLQkgKiAKLQkgKiA8UFJFPgotCSAqIAotCSAqICZsdDtUQUJMRSZndDsgJmx0O1RSJmd0OyZsdDtURCZndDsmbHQ7VEQmZ3Q7ICZsdDsvVEFCTEUmZ3Q7Ci0JICogCi0JICogPFBSRT4KLQkgKiAKLQkgKiBAcGFyYW0gYW4KLQkgKiAgICAgICAgICAgIGVsZW1lbnQgbm9kZSB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5lbGVtZW50PC9jb2RlPiBpcyBhdXRvbWF0aWNhbGx5Ci0JICogICAgICAgICBnZW5lcmF0ZWQgYnkgdGhpcy4gT3RoZXJ3aXNlIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGF1dG9HZW5lcmF0ZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBhdXRvR2VuZXJhdGVkLmNvbnRhaW5zKGVsZW1lbnQpOwotCX0KLQotCWZpbmFsIHZvaWQgYWRkQXV0b0dlbmVyYXRlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJYXV0b0dlbmVyYXRlZC5hZGRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgYSBzdHJpbmcgdG8gY3VycmVudCBwb3NpdGlvbiBpbiByZWFkIHN0cmVhbS4gVGhpcyBtZXRob2QgaXMKLQkgKiB1c3VhbGx5IGludm9rZWQgYnkgdG9rZW4tbGV2ZWwgZXJyb3IgaGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgU3RyaW5nIHRvIGluc2VydAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydChTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0b2tlbml6ZXIudW5yZWFkKHN0cik7Ci0JfQotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVMaXN0SW1wbCBjcmVhdGVBdHRyaWJ1dGVMaXN0KCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZUxpc3RJbXBsKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGtlZXBVbmtub3duczsKLQotCS8qKgotCSAqIERldGVybWluZXMgdW5rbm93biBlbGVtZW50cyBhcmUga2VwdCBvciBub3QuIFRoZSBkZWZpbml0aW9uIG9mIHRoZQotCSAqIGVsbWVlbnRzIGlzIDxjb2RlPiZsdDshRUxFTUVOVCA8aT5hbm9ueW1vdXM8L2k+IC0gLSBBTlkmZ3Q7PC9jb2RlPiwKLQkgKiB3aGVyZSA8aT5hbnlueW1vdXMgPC9pPiBpcyBhbiB1bmtub3duIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGtlZXAKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhcnNlciBrZWVwcy4gT3RoZXJ3aXNlCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBrZWVwVW5rbm93bkVsZW1lbnRzKGJvb2xlYW4ga2VlcCkgewotCQl0aGlzLmtlZXBVbmtub3ducyA9IGtlZXA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjdXJyZW50IGxpbmUgbnVtYmVyIG9mIHNvdXJjZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGxpbmUgbnVtYmVyCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcueG1sLnNheC5Mb2NhdG9yI2dldExpbmVOdW1iZXIoKX0KLQkgKi8KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gdG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjdXJyZW50IGNvbHVtbiBudW1iZXIgb2Ygc291cmNlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gY29sdW1uIG51bWJlcgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLnhtbC5zYXguTG9jYXRvciNnZXRDb2x1bW5OdW1iZXIoKX0KLQkgKi8KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRDb2x1bW5OdW1iZXIoKSB7Ci0JCXJldHVybiB0b2tlbml6ZXIuZ2V0Q3VycmVudENvbCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY3VycmVudCByZWFkaW5nIG5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDdXJyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuY3VycmVudE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIGN1cnJlbnROb2RlOwotCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMuY3VycmVudE5vZGUgPSBub2RlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBrZWVwQ29tbWVudCA9IHRydWU7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoaXMgcGFyc2VyIGtlZXBzIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbgotCSAqIHRoZSB0cmVlIG9yIG5vdC4gQnkgZGVmYXVsdCwgaXQga2VlcHMuCi0JICogCi0JICogQHBhcmFtIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGtlZXBzLCBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0S2VlcENvbW1lbnQoYm9vbGVhbiBrZWVwKSB7Ci0JCXRoaXMua2VlcENvbW1lbnQgPSBrZWVwOwotCX0KLQotCXByaXZhdGUgY2hhciBzYXhjaFtdOwotCi0JcHJpdmF0ZSBpbnQgYmVnaW4sIGxlbjsKLQotCXZvaWQgc2V0Q2hhcmFjdGVyKGNoYXIgY2hbXSwgaW50IGJlZ2luLCBpbnQgbGVuKSB7Ci0JCXRoaXMuc2F4Y2ggPSBjaDsKLQkJdGhpcy5iZWdpbiA9IGJlZ2luOwotCQl0aGlzLmxlbiA9IGxlbjsKLQl9Ci0KLQlwcml2YXRlIExleGljYWxIYW5kbGVyIGxleEhhbmRsZXI7Ci0KLQkvKioKLQkgKiBOb3RlOiBkb2VzIG5vdCBzdXBwb3J0Ci0JICoge0BsaW5rIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKX1hbmQKLQkgKiB7QGxpbmsgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV4aWNhbEhhbmRsZXIoTGV4aWNhbEhhbmRsZXIgbGV4SGFuZGxlcikgewotCQl0aGlzLmxleEhhbmRsZXIgPSBsZXhIYW5kbGVyOwotCX0KLQotCUxleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyKCkgewotCQlyZXR1cm4gdGhpcy5sZXhIYW5kbGVyOwotCX0KLQotCXZvaWQgaW5jcmVtZW50RGVwdGgoaW50IGkpIHsKLQkJdGhpcy5kZXB0aCArPSBpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBkZXB0aAotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbkNvbnRleHQoaW50IGkpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0aGlzLmRlcHRoICs9IGk7Ci0JCXRoaXMuY29udGV4dCA9IGFuY2VzdGVyc1tkZXB0aCAtIDFdOwotCQlpZiAoIWVIYW5kbGVMb2dpY2FsIHx8IGRvY0hhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaiA9IGRlcHRoOyBqIDwgaTsgaisrKSB7Ci0JCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChhbmNlc3RlcnNbal0uZ2V0Tm9kZU5hbWUoKSwKLQkJCQkJbnVsbEF0dHJpYnV0ZUxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIEVsZW1lbnRbXSBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCUVsZW1lbnQgcmV0W10gPSBuZXcgRWxlbWVudFtkZXB0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYW5jZXN0ZXJzLCAwLCByZXQsIDAsIGRlcHRoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYSBmcmFnbWVudCB1bmRlciBzcGVjaWZpZWQgY29udGV4dC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUZyYWdtZW50KEVsZW1lbnQgcGFyZW50LCBSZWFkZXIgcmVhZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGR0ZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkNhbid0IHBhcnNlIHdpdGhvdXQgRFREIik7Ci0JCX0gZWxzZSBpZiAoZG9jID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiQ2FuJ3QgcGFyc2Ugd2l0aG91dCBhIERvY3VtZW50Iik7Ci0JCX0KLQkJdGhpcy5hbmNlc3RlckVsZW1lbnREZWZzWzBdID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKHBhcmVudAotCQkJCS5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKHRoaXMuYW5jZXN0ZXJFbGVtZW50RGVmc1swXSA9PSBudWxsKSB7Ci0JCQl0aGlzLmFuY2VzdGVyRWxlbWVudERlZnNbMF0gPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQl9Ci0JCXRoaXMuYW5jZXN0ZXJzWzBdID0gcGFyZW50OwotCQl0aGlzLmNvbnRleHQgPSBwYXJlbnQ7Ci0JCWRlcHRoID0gMTsKLQkJdGhpcy50b2tlbml6ZXIgPSBuZXcgSW5zVG9rZW5pemVyKHJlYWRlciwgdGhpcyk7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCWRvY0hhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKHRoaXMudG9rZW5pemVyKTsKLQkJfQotCQl0b2tlbml6ZXIuZXh0cmFjdE51bUVudGl0eShleHRyYWN0TnVtKTsKLQkJdG9rZW5pemVyLmV4dHJhY3RDaGFyRW50aXR5KGV4dHJhY3RDaGFyKTsKLQkJdG9rZW5pemVyLnNldFByZXNlcnZlV2hpdGVzcGFjZShwcmVzZXJ2ZVdoaXRlc3BhY2UpOwotCi0JCXJlYWRJbnN0YW5jZXMyKCk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGEgZnJhZ21lbnQuIEFzIGEgc2lkZSBlZmZlY3QsIHdhc3RlcyBhIGVsZW1lbnQgbm9kZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBwYXJzZUZyYWdtZW50KFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlFbGVtZW50IGR1bW15ID0gZG9jICE9IG51bGwgPyBkb2MuY3JlYXRlRWxlbWVudCgiZHVtbXkiKSA6IG51bGw7Ci0JCXBhcnNlRnJhZ21lbnQoZHVtbXksIHJlYWRlcik7Ci0JCURvY3VtZW50RnJhZ21lbnQgcmV0ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZHVtbXkuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGR1bW15Ci0JCQkJLmdldEZpcnN0Q2hpbGQoKSkgewotCQkJZHVtbXkucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJcmV0LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvU0dNTFRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTFkMGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIFNHTUxUZXh0IGV4dGVuZHMgU0dNTENoYXJhY3RlckRhdGEgaW1wbGVtZW50cyBUZXh0LCBJUHJpbnRYTUwgewotCXB1YmxpYyBTR01MVGV4dChTdHJpbmcgc3RyLCBEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoc3RyLCBkb2MpOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFRFWFRfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiN0ZXh0IjsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVNHTUxUZXh0IHNpYmxpbmc7Ci0JCXRyeSB7Ci0JCQlzaWJsaW5nID0gbmV3IFNHTUxUZXh0KHRleHQuc3Vic3RyaW5nKG9mZnNldCksIG93bmVyRG9jdW1lbnQpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBlLmdldE1lc3NhZ2UoKSkgewotCQkJfTsKLQkJfQotCQlzaWJsaW5nLnByZXZpb3VzU2libGluZyA9IHRoaXM7Ci0JCXNpYmxpbmcucGFyZW50ID0gcGFyZW50OwotCQluZXh0U2libGluZyA9IHNpYmxpbmc7Ci0JCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhvZmZzZXQpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIG9yaWdpbmFsIHN0cmluZyB3aG9zZSBjb252ZXJ0ZWQgY2hhcmFjdGVyIGVudGl0aWVzIGFyZSByZXZlcnRlZC4gSWYKLQkgKiBhbiBvcmlnaW5hbCBzdHJpbmcgaXMgImEgJmFtcDtndDsgYiIsIHRoZW4gcmV0dXJuZWQgdmFsdWUgaXMgYWxzbyAiYQotCSAqICZhbXA7Z3Q7IGIiIChlZy4gcmV0dXJuIHZhbHVlIG9mIHtAbGluayAjZ2V0Tm9kZVZhbHVlKCl9IGlzICJhICZndDsgYiIpLgotCSAqIAotCSAqIEByZXR1cm4gb3JpZ2luYWwgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU0dNTERvY3VtZW50IGRvYyA9IChTR01MRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJQ2hhcmFjdGVyIEMgPSBuZXcgQ2hhcmFjdGVyKGNoKTsKLQkJCVN0cmluZyBlbnRpdHlPcmlnaW4gPSBkb2MuZ2V0RW50aXR5T3JpZ2luKEMpOwotCQkJaWYgKGVudGl0eU9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKCcmJyArIGVudGl0eU9yaWdpbiArICc7Jyk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1hNTFN0cmluZygpIHsKLQkJU0dNTERvY3VtZW50IGRvYyA9IChTR01MRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJQ2hhcmFjdGVyIEMgPSBuZXcgQ2hhcmFjdGVyKGNoKTsKLQkJCVN0cmluZyBlbnRpdHlPcmlnaW4gPSBkb2MuZ2V0RW50aXR5T3JpZ2luKEMpOwotCQkJaWYgKGVudGl0eU9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKCImIyIgKyAoaW50KSBjaCArICc7Jyk7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICcmJykgewotCQkJCXNiLmFwcGVuZCgiJmFtcDsiKTsKLQkJCX0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJc2IuYXBwZW5kKCImbHQ7Iik7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCXNiLmFwcGVuZCgiJmd0OyIpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQodG9YTUxTdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQodG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVzcGFjZSA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNXaGl0ZXNwYWNlOwotCX0KLQotCXZvaWQgc2V0SXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudChib29sZWFuIGIpIHsKLQkJdGhpcy5pc1doaXRlc3BhY2UgPSBiOwotCX0KLQotCS8qKgotCSAqIERPTSBMZXZlbCAzCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxUb2tlbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9TR01MVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDJjMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL1NHTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSAqIFRva2VuaXplciBpbnRlcmZhY2UKLSAqLwotYWJzdHJhY3QgY2xhc3MgU0dNTFRva2VuaXplciBpbXBsZW1lbnRzIElTR01MQ29uc3RhbnRzIHsKLQlwcm90ZWN0ZWQgTGluZU51bWJlclJlYWRlciByZWFkZXI7Ci0KLQlwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgewotCQlyZXR1cm4gdGhpcy5yZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogdG9rZW4gdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBzdmFsOwotCi0JLyoqCi0JICogdG9rZW4gdHlwZS4KLQkgKi8KLQlwdWJsaWMgaW50IHR0eXBlOwotCi0JcHJvdGVjdGVkIGludCBzdGF0ZSA9IERFRkFVTFQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdXNoQmFja2VkOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBTR01MVG9rZW5pemVyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByZWFkZXIKLQkgKiAgICAgICAgICAgIHJlYWRlciB0aGF0IHJlYWQgU0dNTCBEb2N1bWVudHMuCi0JICovCi0JcHVibGljIFNHTUxUb2tlbml6ZXIoUmVhZGVyIHJlYWRlcikgewotCQl0aGlzKHJlYWRlciwgREVGQVVMVCk7Ci0JfQotCi0JU0dNTFRva2VuaXplcihSZWFkZXIgcmVhZGVyLCBpbnQgc3RhdGUpIHsKLQkJaWYgKHJlYWRlciBpbnN0YW5jZW9mIExpbmVOdW1iZXJSZWFkZXIpIHsKLQkJCXRoaXMucmVhZGVyID0gKExpbmVOdW1iZXJSZWFkZXIpIHJlYWRlcjsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIocmVhZGVyKTsKLQkJfQotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCXB1c2hCYWNrZWQgPSBmYWxzZTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgaW50IGRlZmF1bHRTdGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBHZXRzIEN1cnJlbnQgTGluZSBOdW1iZXIuCi0JICogCi0JICogQHJldHVybiBsaW5lIG51bWJlci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldEN1cnJlbnRMaW5lKCkgewotCQlyZXR1cm4gcmVhZGVyLmdldExpbmVOdW1iZXIoKSArIDE7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdG9rZW4gZnJvbSBhIFNHTUwgZG9jdW1lbnQgYW5kIHJldHVybiBhIHR5cGUgb2YgdGhlIHRva2VuLgotCSAqIAotCSAqIEByZXR1cm4gdHlwZSBvZiBhIHJlYWQgdG9rZW4uCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKLQkgKiBAZXhjZXB0aW9uIFBhcnNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gVW5leHBlY3RlZCBFT0Ygb2NjdXJzCi0JICovCi0JcHVibGljIGZpbmFsIGludCBuZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQkJaWYgKHB1c2hCYWNrZWQpIHsKLQkJCXB1c2hCYWNrZWQgPSBmYWxzZTsKLQkJCXJldHVybiB0dHlwZTsKLQkJfQotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgREVGQVVMVDoKLQkJCXJldHVybiBkZWZhdWx0U3RhdGUoKTsKLQkJY2FzZSBUQUc6Ci0JCQlyZXR1cm4gdGFnKCk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdXNoIGJhY2sgdG9rZW5zLiBOZXh0IGNhbGwgb2YgbmV4dFRva2VuKCkgcmV0dXJucyBjdXJyZW50IHR0eXBlIGFuZCBzdmFsCi0JICogd2lsbCBub3QgY2hhbmdlLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHB1c2hCYWNrKCkgewotCQlwdXNoQmFja2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXIgUmluZyBCdWZmZXIgZm9yIHVucmVhZDsKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNoYXJCdWZmZXJbXSA9IG5ldyBpbnRbQlVGX1NJWl07Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZfU0laID0gMTAyNDsKLQotCXByb3RlY3RlZCBpbnQgaW5kZXggPSAwOwotCi0JcHJvdGVjdGVkIGZpbmFsIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJcmV0dXJuIGNoYXJCdWZmZXJbLS1pbmRleF07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcmVhZGVyLnJlYWQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHVucmVhZChpbnQgY2gpIHsKLQkJY2hhckJ1ZmZlcltpbmRleCsrXSA9IGNoOwotCX0KLQotCWZpbmFsIHZvaWQgc3dpdGNoVG8oaW50IHN0YXRlKSB7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgaW50IHRhZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQlmaW5hbCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5yZWFkZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvVW5zeW5jaHJvbml6ZWRIYXNodGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9VbnN5bmNocm9uaXplZEhhc2h0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWU1NmU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9VbnN5bmNocm9uaXplZEhhc2h0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sOwotCi1jbGFzcyBVbnN5bmNocm9uaXplZEhhc2h0YWJsZSB7Ci0JY2xhc3MgRW50cnkgewotCQlTdHJpbmcga2V5OwotCi0JCUVsZW1lbnREZWZpbml0aW9uIHZhbDsKLQotCQlpbnQgbnVtOwotCi0JCUVudHJ5IG5leHQ7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbiBsaW5lYXJUYWJsZVtdID0gbmV3IEVsZW1lbnREZWZpbml0aW9uWzI1Nl07Ci0KLQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kKCkgewotCQlFbGVtZW50RGVmaW5pdGlvbiBuZXdUYWJsZVtdID0gbmV3IEVsZW1lbnREZWZpbml0aW9uW2NvdW50ICogMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkobGluZWFyVGFibGUsIDAsIG5ld1RhYmxlLCAwLCBjb3VudCk7Ci0JCWxpbmVhclRhYmxlID0gbmV3VGFibGU7Ci0JfQotCi0JcHJpdmF0ZSBFbnRyeSB0YWJsZVtdID0gbmV3IEVudHJ5WzI1Nl07Ci0KLQlwcml2YXRlIGludCBoYXNoQ29kZShjaGFyIGtleVtdKSB7Ci0JCWludCByZXQgPSAwOwotCQlmb3IgKGludCBpID0ga2V5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlyZXQgPSAyNSAqIHJldCArIChrZXlbaV0gJiAweDFmKSAtIDE7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlmaW5hbCBFbGVtZW50RGVmaW5pdGlvbiBnZXQoaW50IG51bWJlcikgewotCQlyZXR1cm4gbGluZWFyVGFibGVbbnVtYmVyXTsKLQl9Ci0KLQlmaW5hbCBFbGVtZW50RGVmaW5pdGlvbiBnZXQoU3RyaW5nIGtleSkgewotCQljaGFyIHN0cltdID0ga2V5LnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoRW50cnkgZW50cnkgPSB0YWJsZVsweGZmICYgaGFzaENvZGUoc3RyKV07IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cnkubmV4dCkgewotCQkJU3RyaW5nIGVudHJ5S2V5ID0gZW50cnkua2V5OwotCQkJaWYgKGVudHJ5S2V5LmVxdWFsc0lnbm9yZUNhc2Uoa2V5KSkKLQkJCQlyZXR1cm4gZW50cnkudmFsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCWZpbmFsIHZvaWQgcHV0KFN0cmluZyBrZXksIEVsZW1lbnREZWZpbml0aW9uIHZhbCkgewotCQljaGFyIHN0cltdID0ga2V5LnRvQ2hhckFycmF5KCk7Ci0JCUVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7Ci0JCWVudHJ5LmtleSA9IGtleTsKLQkJZW50cnkudmFsID0gdmFsOwotCQl2YWwubnVtYmVyID0gZW50cnkubnVtID0gY291bnQ7Ci0JCWlmIChsaW5lYXJUYWJsZS5sZW5ndGggPT0gY291bnQpCi0JCQlleHBhbmQoKTsKLQkJbGluZWFyVGFibGVbY291bnQrK10gPSB2YWw7Ci0JCWludCBpbmRleCA9IDB4ZmYgJiBoYXNoQ29kZShzdHIpOwotCQllbnRyeS5uZXh0ID0gdGFibGVbaW5kZXhdOwotCQl0YWJsZVtpbmRleF0gPSBlbnRyeTsKLQl9Ci0KLQlmaW5hbCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGNvdW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvQXR0cmlidXRlVmFsdWVFcnJvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvQXR0cmlidXRlVmFsdWVFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhZjMxYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0F0dHJpYnV0ZVZhbHVlRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuSVNHTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVWYWx1ZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIElUb2tlbkVycm9ySGFuZGxlciwgSVNHTUxDb25zdGFudHMgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVycm9yU3RyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNvZGUgIT0gQVRUUl9WQUxVRSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGd0SW5kZXggPSBlcnJvclN0ci5pbmRleE9mKCc+Jyk7Ci0JCWludCBsdEluZGV4OwotCQljaGFyIGNsb3NpbmdDaGFyOwotCQlpbnQgZXJyb3JTdHJMZW4gPSBlcnJvclN0ci5sZW5ndGgoKTsKLQkJaWYgKGVycm9yU3RyTGVuID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICgoY2xvc2luZ0NoYXIgPSBlcnJvclN0ci5jaGFyQXQoMCkpICE9ICdcJycgJiYgY2xvc2luZ0NoYXIgIT0gJyInKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGd0SW5kZXggPiAxICYmIChsdEluZGV4ID0gZXJyb3JTdHIuaW5kZXhPZignPCcpKSA+IGd0SW5kZXgpIHsKLQkJCS8vIGNhc2Ugb2YgYXR0cj0idmFsdWVfd2l0aG91dF9lbmRxdW90ZT4gLi4uIDxuZXh0VGFnCi0JCQlpbnQgbmV4dFRhZ0JlZ2luID0gbHRJbmRleCArIDE7Ci0JCQlpZiAoZXJyb3JTdHIuY2hhckF0KG5leHRUYWdCZWdpbikgPT0gJy8nKQotCQkJCW5leHRUYWdCZWdpbisrOwotCQkJaW50IG5leHRUYWdFbmQgPSBuZXh0VGFnQmVnaW47Ci0JCQljaGFyIGMwOwotCQkJd2hpbGUgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjMCA9IGVycm9yU3RyLmNoYXJBdChuZXh0VGFnRW5kKSkKLQkJCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMwKSkgewotCQkJCW5leHRUYWdFbmQrKzsKLQkJCX0KLQkJCWlmIChuZXh0VGFnQmVnaW4gPT0gbmV4dFRhZ0VuZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmcgbmV4dFRhZyA9IGVycm9yU3RyLnN1YnN0cmluZyhuZXh0VGFnQmVnaW4sIG5leHRUYWdFbmQpOwotCQkJaWYgKHBhcnNlci5nZXREVEQoKS5nZXRFbGVtZW50RGVmaW5pdGlvbihuZXh0VGFnKSAhPSBudWxsKSB7Ci0JCQkJcGFyc2VyLmVycm9yKFNUQVJUVEFHX1NZTlRBWF9FUlIsCi0JCQkJCQkiIGF0dHJpYnV0ZSB2YWx1ZSBtaXNzZWQgY2xvc2luZyBxdW90YXRpb24uIik7Ci0JCQkJcGFyc2VyLmluc2VydChlcnJvclN0ci5zdWJzdHJpbmcoMCwgZ3RJbmRleCkgKyBjbG9zaW5nQ2hhcgotCQkJCQkJKyBlcnJvclN0ci5zdWJzdHJpbmcoZ3RJbmRleCkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKGVycm9yU3RyLmNoYXJBdChlcnJvclN0ckxlbiAtIDEpID09IGNsb3NpbmdDaGFyCi0JCQkJJiYgZXJyb3JTdHIubGVuZ3RoKCkgPiAxCi0JCQkJJiYgZXJyb3JTdHIuY2hhckF0KGVycm9yU3RyTGVuIC0gMikgPT0gJz0nKSB7Ci0JCQkvLyBjYXNlIG9mIGF0dHI9InZhbHVlX3dpdGhvdXRfZW5kcXVvdGUKLQkJCS8vIG5leHRBdHRyTmFtZT0ibmV4dEF0dHJWYWx1ZS4uLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvclN0ckxlbjsgaSsrKSB7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZXJyb3JTdHIuY2hhckF0KGkpKSkgewotCQkJCQlpbnQgZXJyb3JQb2ludCA9IGk7Ci0JCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGVycm9yU3RyLmNoYXJBdCgrK2kpKSkKLQkJCQkJCTsKLQkJCQkJY2hhciBjMDsKLQkJCQkJLy8gaW50IG5leHRBdHRyTmFtZVN0YXJ0ID0gaTsKLQkJCQkJYzAgPSBlcnJvclN0ci5jaGFyQXQoaSk7Ci0JCQkJCWlmICghQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMwKQotCQkJCQkJCSYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzApKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZG8gewotCQkJCQkJaSsrOwotCQkJCQkJYzAgPSBlcnJvclN0ci5jaGFyQXQoaSk7Ci0JCQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjMCkKLQkJCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzApKTsKLQkJCQkJd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYzAgPSBlcnJvclN0ci5jaGFyQXQoaSkpKQotCQkJCQkJaSsrOwotCQkJCQlpZiAoYzAgPT0gJz0nKSB7Ci0JCQkJCQlwYXJzZXIuaW5zZXJ0KGVycm9yU3RyLnN1YnN0cmluZygwLCBlcnJvclBvaW50KQotCQkJCQkJCQkrIGNsb3NpbmdDaGFyICsgZXJyb3JTdHIuc3Vic3RyaW5nKGVycm9yUG9pbnQpKTsKLQkJCQkJCXBhcnNlci5lcnJvcihTVEFSVFRBR19TWU5UQVhfRVJSLAotCQkJCQkJCQkiIGF0dHJpYnV0ZSB2YWx1ZSBtaXNzZWQgY2xvc2luZyBxdW90YXRpb24uIik7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9EZWZhdWx0RXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0RlZmF1bHRFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3NzllZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0RlZmF1bHRFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5FbGVtZW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJRXJyb3JIYW5kbGVyfQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotICAgIC8qKgotICAgICAqIFNldCBhcHByb3ByaWF0ZSBjb250ZXh0IGVsZW1lbnQgdG8gY29udGV4dCBpZiBhbiBlcnJvciBvY2N1cnMuCi0gICAgICogPG9sPgotICAgICAqIDxsaT4gSWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgYSBzaW5nbGV0b24gaW5zdGFuY2UsIGZpbmQgYW5vdGhlciAKLSAgICAgKiBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZS4gIEFuZCBpZiB0aGUgb3RoZXIgaGFzIG5vIGF0dHJpYnV0ZSwgCi0gICAgICogbWVyZ2UgdGhlbS4KLSAgICAgKiA8bGk+IElmIGN1cnJlbnQgY29udGV4dCBoYXMgYWxyZWFkeSBhbiBpbGxlZ2FsIGNoaWxkcmVuLAotICAgICAqIGl0IGZhaWxzIChTaW5jZSB2ZXIuMS4xLmE3KS4KLSAgICAgKiA8bGk+IElmIDxjb2RlPmVycm9yTm9kZTwvY29kZT4gaXMgdW5rbm93biBlbGVtZW50LCBmYWlsLgotICAgICAqIDwhLS0KLSAgICAgKiA8bGk+IGlmIDxjb2RlPmVycm9yTm9kZTwvY29kZT4gaXMgYW4gZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgY29udGV4dCAKLSAgICAgKiBhbmQgaGFzIG5vIGF0dHJpYnV0ZSwgaXQgaW50ZXJwcmV0IDxjb2RlPmVycm9yTm9kZTwvY29kZT4gYXMgZW5kdGFnLgotICAgICAqIDxsaT4gSWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgYW5kIEVsZW1lbnQgYW5kIGVtcHR5IGNoaWxkIGVsZW1lbnQsIGl0IGFsc28gZmFpbHMuCi0gICAgICogPGxpPiBPdGhlcndpc2Ugc2VhcmNoZXMgYSBwcm9wZXIgcGFyZW50IGZyb20gY3VycmVudCBjb250ZXh0Ci0gICAgICogdG8gb3V0ZXItbW9zdCBhbmQgcmlnaHQtbW9zdCBub2RlLgotICAgICAqIC0tPgotICAgICAqIDwvb2w+Ci0gICAgICogQHBhcmFtIG5vZGUgaWxsZWdhbCBjaGlsZCAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQsIG90aGVyd2lzZSBmYWxzZQotICAgICAqIEBzZWUgU0dNTFBhcnNlciNnZXRDb250ZXh0KCkKLSAgICAgKiBAc2VlIFNHTUxQYXJzZXIjc2V0Q29udGV4dChvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQlpZiAoZXJyb3JOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgeyAKLQkgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpZXJyb3JOb2RlOwotCSAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkgICAgRWxlbWVudERlZmluaXRpb24gZWQ7Ci0JICAgIGlmICgoZWQgPSBwYXJzZXIuZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24oZWxlbWVudE5hbWUpKSA9PSBudWxsKSB7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgfSBlbHNlIGlmIChlZC5pc1NpbmdsZXRvbigpKSB7Ci0JCU5vZGVMaXN0IG90aGVycyA9IHBhcnNlci5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnROYW1lKTsKLQkJaWYgKG90aGVycy5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCSAgICBFbGVtZW50IGFub3RoZXIgPSAoRWxlbWVudClvdGhlcnMuaXRlbSgwKTsKLQkJICAgIGlmIChwYXJzZXIuYXV0b0dlbmVyYXRlZChhbm90aGVyKSkgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCSAgICBhbm90aGVyLnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCQlwYXJzZXIuc2V0Q3VycmVudE5vZGUoYW5vdGhlcik7Ci0JCQlwYXJzZXIuc2V0Q29udGV4dChhbm90aGVyKTsKLQkJCXBhcnNlci5lcnJvcihJTExFR0FMX0NISUxELCBlcnJvck5vZGUgKyAiIGFuZCAiICsgYW5vdGhlciArCi0JCQkJICAgICAiIGFyZSBkdXBsaWNhdGVkLiIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9JRXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0lFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ODY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0lFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5JU0dNTENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIE5vZGUtbGV2ZWwgZXJyb3IgaGFuZGxlciBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVycm9ySGFuZGxlciBleHRlbmRzIElTR01MQ29uc3RhbnRzIHsKLQkvKioKLQkgKiBIYW5kbGVzIGVycm9yIHdob3NlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IDxjb2RlPmNvZGU8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGVycm9yIHR5cGUuCi0JICogQHBhcmFtIHBhcnNlcgotCSAqICAgICAgICAgICAgY2FsbGVyIG9mIHRoaXMgaGFuZGxlci4gVGhpcyBwYXJzZXIncyBzdGF0ZSBpcyBlYXNpbHkgY2hhbmdlZAotCSAqICAgICAgICAgICAgYnkgdGhlIG1ldGhvZHMgYmVsb3cuCi0JICogQHBhcmFtIGVycm9yTm9kZQotCSAqICAgICAgICAgICAgYSBub2RlIHRoYXQgY2F1c2VzIHRoZSBlcnJvci4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVycm9yIHdhcyBoYW5kbGVkLiBPdGhlcndpc2UgPGNvZGU+ZmFsc2UKLQkgKiA8L2NvZGU+LgotCSAqIEBzZWUgU0dNTFBhcnNlciNnZXROb2RlKCkKLQkgKiBAc2VlIFNHTUxQYXJzZXIjcHVzaEJhY2tOb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0JICogQHNlZSBTR01MUGFyc2VyI2dldEV4dHJhRXJySW5mbygpCi0JICogQHNlZSBTR01MUGFyc2VyI2dldENvbnRleHQoKQotCSAqIEBzZWUgU0dNTFBhcnNlciNzZXRDb250ZXh0KG9yZy53M2MuZG9tLkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSVRva2VuRXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0lUb2tlbkVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDdlZTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSVRva2VuRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuSVNHTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotCi0KLS8qKgotICogVG9rZW4tbGV2bGUgZXJyb3IgaGFuZGxlciBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRva2VuRXJyb3JIYW5kbGVyIHsKLQkvKioKLQkgKiBIYW5kbGVzIGVycm9yIHdob3NlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IDxjb2RlPmNvZGU8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGVycm9yIHR5cGUuIFRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdG9rZW5pemVyJ3Mgc3RhdGUuIEluCi0JICogICAgICAgICAgICBvdGhlciB3b3Jkcywgd2hlcmUgdGhlIHRva2VuaXplciByZWFkLiA8Y29kZT5Db2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgbXVzdCBiZSB7QGxpbmsgSVNHTUxDb25zdGFudHMjQVRUUl9WQUxVRX0gKEVycm9yIG9jY3VycyB3aGVuIGEKLQkgKiAgICAgICAgICAgIHRva2VuaXplciBpcyB0byByZWFkIGF0dHJpYnV0ZSdzIHZhbHVlKSwKLQkgKiAgICAgICAgICAgIHtAbGluayBJU0dNTENvbnN0YW50cyNCRUZPUkVfQVRUUk5BTUV9ICh0byByZWFkIGF0dHJpYnV0ZSdzCi0JICogICAgICAgICAgICBuYW1lKSBvciB7QGxpbmsgSVNHTUxDb25zdGFudHMjVEFHX05BTUV9ICh0byByZWFkIHRhZyBuYW1lKS4KLQkgKiAgICAgICAgICAgIElmIHN0cmluZyB0byBzdWJzdGl0dXRlIGlzIGRpZWNvdmVyZWQsIHRoYXQgY2FuIGJlIGluc2VydGVkIHRvCi0JICogICAgICAgICAgICBjdXJyZW50IHJlYWRpbmcgcG9zaXRpb24uCi0JICogQHBhcmFtIHBhcnNlcgotCSAqICAgICAgICAgICAgY2FsbGVyIG9mIHRoaXMgaGFuZGxlci4KLQkgKiBAcGFyYW0gZXJyb3JTdHIKLQkgKiAgICAgICAgICAgIHN0cmluZyB0aGF0IGNhdXNlcyB0aGUgZXJyb3IuCi0JICogQHJldHVybiB0cnVlIGlmIGVycm9yIHdhcyBoYW5kbGVkLiBPdGhlcndpc2UgZmFsc2UuCi0JICogQHNlZSBTR01MUGFyc2VyI2luc2VydChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgU3RyaW5nIGVycm9yU3RyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9JbnRlcmxlYXZlZEVuZHRhZ0V4Y2hhbmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9JbnRlcmxlYXZlZEVuZHRhZ0V4Y2hhbmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDk2MjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSW50ZXJsZWF2ZWRFbmR0YWdFeGNoYW5nZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLkVsZW1lbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuRW5kVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuSUVycm9yTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqICBBIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgSUVycm9ySGFuZGxlcn0uCi0gKiAgVGhpcyBjbGFzcyBpcyBleHBlcmltZW50YWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmxlYXZlZEVuZHRhZ0V4Y2hhbmdlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotICAgIC8qKgotICAgICAqICBFeGNoYW5nZXMgaW50ZXJsZWF2ZWQgZW5kIHRhZ3MuICBGb3IgZXhhbXBsZSwgY2hhbmdlcwotICAgICAqIDxwcmU+Ci0gICAgICogICAmbHQ7Y2VudGVyJmd0OyZsdDtmb250Jmd0Oy4uLiZsdDsvY2VudGVyJmd0OyZsdDsvZm9udCZndDsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiB0bwotICAgICAqIDxwcmU+Ci0gICAgICogICAmbHQ7Y2VudGVyJmd0OyZsdDtmb250Jmd0Oy4uLiZsdDsvZm9udCZndDsmbHQ7L2NlbnRlciZndDsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiBAcGFyYW0gY29kZSBJZiB7QGxpbmsgU0dNTFBhcnNlciNTVURERU5fRU5EVEFHfSwgdHJpZXMgdG8gZXhjaGFuZ2UuICAKLSAgICAgKiBAcGFyYW0gZXJyb3JOb2RlIHN1ZGRlbiBlbmR0YWcuICBJdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIAotICAgICAqIHtAbGluayBFbmRUYWd9Ci0gICAgICogT3RoZXJ3aXNlLCBkb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCWlmICghKGNvZGUgPT0gU1VEREVOX0VORFRBRyAmJiBlcnJvck5vZGUgaW5zdGFuY2VvZiBFbmRUYWcpKSB7Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JLy8gc2VhcmNoZXMgYW4gZWxlbWVudCB3aXRob3V0IGFuIHVub21pdHRhYmxlIGVuZHRhZy4KLQlmb3IgKE5vZGUgcE5vZGUgPSBwYXJzZXIuZ2V0Q29udGV4dCgpOwotCSAgICAgcE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50OyBwTm9kZSA9IHBOb2RlLmdldFBhcmVudE5vZGUoKSkgewotCSAgICBpZiAoIXBOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShlcnJvck5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJRWxlbWVudERlZmluaXRpb24gZWQgPSBwYXJzZXIuZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24ocE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCS8vIGlmIGZvdW5kLCB0cnkgdG8gZXhjaGFuZ2UgZW5kdGFncy4KLQkJaWYgKCFlZC5lbmRUYWdPbWl0dGFibGUoKSAmJiBleGNoYW5nZUVuZHRhZyhwYXJzZXIsIGVycm9yTm9kZSwgZWQuZ2V0TmFtZSgpKSkgewotCQkgICAgcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGFyZ2V0IGVuZHRhZydzIG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4Y2hhbmdlRW5kdGFnKFNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSwgU3RyaW5nIHRhcmdldCkKLQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCS8vIG1ha2VzIGxvb2sgYWhlYWQgYnVmZmVyCi0JTm9kZSBmb0J1ZltdID0gbmV3IE5vZGVbU0dNTFBhcnNlci5CVUZfU0laLzJdOyAgCi0JaW50IGk7Ci0JLy8gc2VhcmNocyBhbiB0YXJnZXQgZW5kdGFnIGFuZCBzdG9yZSBub2RlcyB0byBidWZmZXIgc2ltdWx0YW5lb3VzbHkKLQlmb3IgKGkgPSAwOyBpIDwgU0dNTFBhcnNlci5CVUZfU0laLzI7IGkrKykgewotCSAgICBOb2RlIGZvID0gcGFyc2VyLmdldE5vZGUoKTsKLQkgICAgaWYgKGZvIGluc3RhbmNlb2YgRW5kVGFnKSB7Ci0JCS8vIElmIGZvdW5kIGV4Y2hhbmdlIGVuZHRhZ3MgYW5kIHB1c2hlcyBiYWNrIHRoZW0gdG8gdGhlIHBhcnNlcgotCQlpZiAoZm8uZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldCkpIHsKLQkJICAgIHBhcnNlci5lcnJvcihTVURERU5fRU5EVEFHLCBlcnJvck5vZGUgKyAiIGFuZCAiICsgZm8gKyAKLQkJCQkgIiBhcmUgaW50ZXJsZWF2ZWQuIFNvIGV4Y2hhbmdlIGl0IGJ5IGFuIGVycm9yIGhhbmRsZXIuIik7Ci0JCSAgICBwYXJzZXIucHVzaEJhY2tOb2RlKGVycm9yTm9kZSk7Ci0JCSAgICB3aGlsZSAoaSA+IDApIHBhcnNlci5wdXNoQmFja05vZGUoZm9CdWZbLS1pXSk7Ci0JCSAgICBwYXJzZXIucHVzaEJhY2tOb2RlKGZvKTsKLQkJICAgIHJldHVybiB0cnVlOwotCQl9Ci0JICAgIH0KLQkgICAgZm9CdWZbaV0gPSBmbzsKLQl9Ci0Jd2hpbGUgKGkgPiAwKSBwYXJzZXIucHVzaEJhY2tOb2RlKGZvQnVmWy0taV0pOwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogIEp1c3QgZm9yIHRlc3RzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQl0cnkgewotCSAgICBIVE1MUGFyc2VyIHBhcnNlciA9IG5ldyBIVE1MUGFyc2VyKCk7Ci0JICAgIHBhcnNlci5hZGRFcnJvckxvZ0xpc3RlbmVyKG5ldyBJRXJyb3JMb2dMaXN0ZW5lcigpIHsKLQkJICAgIHB1YmxpYyB2b2lkIGVycm9yTG9nKGludCBjb2RlLCBTdHJpbmcgbXNnKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsgCi0JCSAgICB9Ci0JCX0pOwotCSAgICBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBJbnRlcmxlYXZlZEVuZHRhZ0V4Y2hhbmdlcigpKTsKLQkgICAgcGFyc2VyLnBhcnNlKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShhcmdzWzBdKSk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9SYW5nZUV4cGFuZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL1JhbmdlRXhwYW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5MGE3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL1JhbmdlRXhwYW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLkhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5FbmRUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5JRXJyb3JMb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gY2xhc3Mgb2Yge0BsaW5rIElFcnJvckhhbmRsZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2VFeHBhbmRlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAoIShjb2RlID09IFNVRERFTl9FTkRUQUcgJiYgZXJyb3JOb2RlIGluc3RhbmNlb2YgRW5kVGFnKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVZlY3RvcjxFbGVtZW50PiBlbGVtZW50c1RvQmVJbnNlcnRlZCA9IG5ldyBWZWN0b3I8RWxlbWVudD4oKTsKLQkJZm9yIChOb2RlIG5vZGUgPSBwYXJzZXIuZ2V0Q29udGV4dCgpOyBub2RlIGluc3RhbmNlb2YgRWxlbWVudDsgbm9kZSA9IG5vZGUKLQkJCQkuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoZXJyb3JOb2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJcGFyc2VyLnNldENvbnRleHQoKEVsZW1lbnQpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBlbGVtZW50c1RvQmVJbnNlcnRlZC5lbGVtZW50cygpOyBlCi0JCQkJCQkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCUVsZW1lbnQgZWwgPSAoRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpOwotCQkJCQlwYXJzZXIuZ2V0Q29udGV4dCgpLmFwcGVuZENoaWxkKGVsKTsKLQkJCQkJcGFyc2VyLnNldENvbnRleHQoZWwpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudHNUb0JlSW5zZXJ0ZWQuYWRkRWxlbWVudChwYXJzZXIuZ2V0RG9jdW1lbnQoKQotCQkJCQkJLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGZvciB0ZXN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JCXRyeSB7Ci0JCQlIVE1MUGFyc2VyIHBhcnNlciA9IG5ldyBIVE1MUGFyc2VyKCk7Ci0JCQlwYXJzZXIuYWRkRXJyb3JMb2dMaXN0ZW5lcihuZXcgSUVycm9yTG9nTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZXJyb3JMb2coaW50IGNvZGUsIFN0cmluZyBtc2cpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBSYW5nZUV4cGFuZGVyKCkpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShhcmdzWzBdKSk7Ci0JCQkoKFNHTUxEb2N1bWVudCkgcGFyc2VyLmdldERvY3VtZW50KCkpLnByaW50QXNTR01MKG5ldyBQcmludFdyaXRlcigKLQkJCQkJU3lzdGVtLm91dCksIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL0FuZE1vZGVsR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL0FuZE1vZGVsR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViYmMwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9BbmRNb2RlbEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEFuZE1vZGVsR3JvdXAgZXh0ZW5kcyBDb21wb3NpdGVNb2RlbEdyb3VwIHsKLQlwdWJsaWMgQW5kTW9kZWxHcm91cChJTW9kZWxHcm91cCBtb2RlbEdyb3VwKSB7Ci0gICAgICAgIHN1cGVyKG1vZGVsR3JvdXApOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGFkZChJTW9kZWxHcm91cCBtb2RlbEdyb3VwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIChhICYgYiAmIChjICYgZCkpICE9IChhICYgYiAmIGMgJiBkKQotICAgICAgICAgKi8KLSAgICAgICAgY2hpbGRyZW5bY2hpbGRMZW5ndGgrK10gPSBtb2RlbEdyb3VwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKCIoIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICAgIHJldCA9IHJldCArIGNoaWxkcmVuW2ldICsgJyYnOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IHJldCArIGNoaWxkcmVuW2NoaWxkTGVuZ3RoIC0gMV0gKyAnKSc7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2goU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxOb2RlLCBBbmRDb250ZXh0PiBtYXAgPSBwYXJzZXIuZ2V0QW5kTWFwKCk7Ci0gICAgICAgIEFuZENvbnRleHQgYWMgPSAoQW5kQ29udGV4dCkgbWFwLmdldChwYXJlbnQpOwotICAgICAgICBpZiAoYWMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWMgPSBuZXcgQW5kQ29udGV4dCh0aGlzKTsKLSAgICAgICAgICAgIG1hcC5wdXQocGFyZW50LCBhYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWMucHJldiAhPSBudWxsICYmIGFjLnByZXYubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWMucHJldkluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBhYy5tZ3NbYWMucHJldkluZGV4XSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIElNb2RlbEdyb3VwIG1nID0gYWMubWdzW2ldOwotICAgICAgICAgICAgaWYgKG1nICE9IG51bGwgJiYgbWcubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotICAgICAgICAgICAgICAgIGFjLnByZXZJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgaWYgKG1nIGluc3RhbmNlb2YgUmVwTW9kZWxHcm91cCB8fCBtZyBpbnN0YW5jZW9mIFBsdXNNb2RlbEdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjLnByZXYgPSBtZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotICAgICAgICBmb3IgKGludCBpID0gY2hpbGRMZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKCFjaGlsZHJlbltpXS5vcHRpb25hbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQW5kQ29udGV4dCB7Ci0gICAgICAgIElNb2RlbEdyb3VwIG1nc1tdOwotCi0gICAgICAgIElNb2RlbEdyb3VwIHByZXYgPSBudWxsOwotCi0gICAgICAgIGludCBwcmV2SW5kZXggPSAtMTsKLQotICAgICAgICBBbmRDb250ZXh0KEFuZE1vZGVsR3JvdXAgYW1nKSB7Ci0gICAgICAgICAgICBtZ3MgPSBuZXcgSU1vZGVsR3JvdXBbYW1nLmNoaWxkTGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWdzW2ldID0gYW1nLmNoaWxkcmVuW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRQcmV2KElNb2RlbEdyb3VwIG1nKSB7Ci0gICAgICAgICAgICBwcmV2ID0gbWc7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvQ29tcG9zaXRlTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvQ29tcG9zaXRlTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTkyNmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL0NvbXBvc2l0ZU1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5pbnRlcm5hbC5tb2RlbGdyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9zaXRlTW9kZWxHcm91cCBpbXBsZW1lbnRzIElNb2RlbEdyb3VwIHsKLSAgICBwcm90ZWN0ZWQgSU1vZGVsR3JvdXAgY2hpbGRyZW5bXTsKLQotICAgIHByb3RlY3RlZCBpbnQgY2hpbGRMZW5ndGg7Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0ucmVmZXIoaW5maW5pdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZU1vZGVsR3JvdXAoSU1vZGVsR3JvdXAgbW9kZWxHcm91cCkgewotICAgICAgICBjaGlsZHJlbiA9IG5ldyBJTW9kZWxHcm91cFsxMjhdOwotICAgICAgICBjaGlsZHJlblswXSA9IG1vZGVsR3JvdXA7Ci0gICAgICAgIGNoaWxkTGVuZ3RoID0gMTsKLSAgICAgICAgbW9kZWxHcm91cC5yZWZlcihmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2goaW50IG51bWJlcikgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihoYXNoW251bWJlcl0pOwotICAgICAgICByZXR1cm4gaGFzaFtudW1iZXJdOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNoW10gPSBudWxsOwotCi0gICAgcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotICAgICAgICBpZiAoaGFzaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotICAgICAgICBoYXNoID0gbmV3IGJvb2xlYW5bdG90YWxTaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hpbGRIYXNoW10gPSBjaGlsZHJlbltpXS5yZWhhc2godG90YWxTaXplKTsKLSAgICAgICAgICAgIGlmIChjaGlsZEhhc2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB0b3RhbFNpemUgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgICAgICAgICAgICAgaGFzaFtqXSB8PSBjaGlsZEhhc2hbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0JcHVibGljIGludCBnZXRDaGlsZExlbmd0aCgpIHsKLQkJcmV0dXJuIGNoaWxkTGVuZ3RoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9JTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvSU1vZGVsR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1OTFiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9JTW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEdyb3VwIHsKLQkvKioKLQkgKiBDaGVja3MgaWYgPGNvZGU+Y2hpbGQ8L2NvZGU+IG1hdGNoZXMgdG8gPGNvZGU+cGFyZW50PC9jb2RlPi4gQW5kIGFzCi0JICogYSBzaWRlIGVmZmVjdCwgYWRkcyBjaGlsZCB0byBwYXJlbnQgYW5kIHNldHMgcGFyc2VycyBjb250ZXh0IHRvIGl0IGlmIGl0Ci0JICogbWF0Y2hlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgbm9kZSB0byBiZSB0ZXN0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+Y2hpbGQ8L2NvZGU+IG1hdGNoZXMgdG8gPGNvZGU+cGFyZW50PC9jb2RlPgotCSAqLwotCWJvb2xlYW4gbWF0Y2goU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKTsKLQotCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKTsKLQotCWJvb2xlYW4gbWF0Y2goaW50IG51bWJlcik7Ci0KLQlib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvT3B0TW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvT3B0TW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNmNTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL09wdE1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5pbnRlcm5hbC5tb2RlbGdyb3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE9wdE1vZGVsR3JvdXAgaW1wbGVtZW50cyBJTW9kZWxHcm91cCB7Ci0JcHJpdmF0ZSBJTW9kZWxHcm91cCBjaGlsZDsKLQotCXB1YmxpYyBPcHRNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLQkJY2hpbGQgPSBtb2RlbEdyb3VwOwotCQltb2RlbEdyb3VwLnJlZmVyKGZhbHNlKTsKLQl9Ci0KLQkvLyBmb3IgZGVidWcuCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIoIiArIGNoaWxkICsgIik/IjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJYm9vbGVhbiByZXQgPSB0aGlzLmNoaWxkLm1hdGNoKHBhcnNlciwgcGFyZW50LCBjaGlsZCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib3B0OiAiK3JldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gb3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZmVyKGJvb2xlYW4gaW5maW5pdGUpIHsKLQkJY2hpbGQucmVmZXIoaW5maW5pdGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNoW107Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCXJldHVybiBoYXNoW251bWJlcl07Ci0JfQotCi0JcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotCQlyZXR1cm4gaGFzaCAhPSBudWxsID8gaGFzaCA6IChoYXNoID0gY2hpbGQucmVoYXNoKHRvdGFsU2l6ZSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9Pck1vZGVsR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL09yTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRkOGUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL09yTW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLkVsZW1lbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5TR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE9yTW9kZWxHcm91cCBleHRlbmRzIENvbXBvc2l0ZU1vZGVsR3JvdXAgewotICAgIHB1YmxpYyBPck1vZGVsR3JvdXAoSU1vZGVsR3JvdXAgbW9kZWxHcm91cCkgewotICAgICAgICBzdXBlcihtb2RlbEdyb3VwKTsKLSAgICAgICAgaWYgKG1vZGVsR3JvdXAgaW5zdGFuY2VvZiBPck1vZGVsR3JvdXApIHsKLSAgICAgICAgICAgIE9yTW9kZWxHcm91cCBvck1HID0gKE9yTW9kZWxHcm91cCkgbW9kZWxHcm91cDsKLSAgICAgICAgICAgIHRoaXMuY2hpbGRMZW5ndGggPSBvck1HLmNoaWxkTGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2ldID0gb3JNRy5jaGlsZHJlbltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIChhIHwgYiB8IChjIHwgZCkpID09IChhIHwgYiB8IGMgfCBkKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZChJTW9kZWxHcm91cCBtb2RlbEdyb3VwKSB7Ci0gICAgICAgIGlmIChtb2RlbEdyb3VwIGluc3RhbmNlb2YgT3JNb2RlbEdyb3VwKSB7Ci0gICAgICAgICAgICBPck1vZGVsR3JvdXAgb3JNb2RlbEdyb3VwID0gKE9yTW9kZWxHcm91cCkgbW9kZWxHcm91cDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JNb2RlbEdyb3VwLmNoaWxkTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbltjaGlsZExlbmd0aCsrXSA9IG9yTW9kZWxHcm91cC5jaGlsZHJlbltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkTGVuZ3RoKytdID0gbW9kZWxHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50RGVmaW5pdGlvbltdIGdldENoaWxkcmVuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudERlZmluaXRpb24gcmV0W10gPSBuZXcgRWxlbWVudERlZmluaXRpb25bY2hpbGRMZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJldFtpXSA9IChFbGVtZW50RGVmaW5pdGlvbikgY2hpbGRyZW5baV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBmb3IgZGVidWcuCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoIigiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExlbmd0aCAtIDE7IGkrKykgewotICAgICAgICAgICAgcmV0ID0gcmV0ICsgY2hpbGRyZW5baV0gKyAnfCc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gcmV0ICsgY2hpbGRyZW5bY2hpbGRMZW5ndGggLSAxXSArICcpJzsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvcjogbWF0Y2giKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3I6IG91dCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb3B0aW9uYWwoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBjaGlsZExlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ub3B0aW9uYWwoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL1BsdXNNb2RlbEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9QbHVzTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkzYzg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL1BsdXNNb2RlbEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgUGx1c01vZGVsR3JvdXAgaW1wbGVtZW50cyBJTW9kZWxHcm91cCB7Ci0gICAgcHJpdmF0ZSBJTW9kZWxHcm91cCBjaGlsZDsKLQotICAgIFJlcE1vZGVsR3JvdXAgcmVwOwotCi0gICAgcHVibGljIFBsdXNNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLSAgICAgICAgY2hpbGQgPSBtb2RlbEdyb3VwOwotICAgICAgICByZXAgPSBuZXcgUmVwTW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvLyBmb3IgZGVidWcuCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIGNoaWxkICsgIikrIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLSAgICAgICAgSGFzaHRhYmxlPE5vZGUsIE5vZGU+IG1hcCA9IHBhcnNlci5nZXRQbHVzTWFwKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0OwotICAgICAgICBpZiAobWFwLmdldChwYXJlbnQpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBtYXAucHV0KHBhcmVudCwgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwbHVzOiAiK3JldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwLm1hdGNoKHBhcnNlciwgcGFyZW50LCBjaGlsZCk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGx1czogIityZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotICAgICAgICByZXR1cm4gY2hpbGQub3B0aW9uYWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc2hbXTsKLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKGludCBudW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIGhhc2hbbnVtYmVyXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbltdIHJlaGFzaChpbnQgdG90YWxTaXplKSB7Ci0gICAgICAgIHJldHVybiBoYXNoICE9IG51bGwgPyBoYXNoIDogKGhhc2ggPSByZXAucmVoYXNoKHRvdGFsU2l6ZSkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9SZXBNb2RlbEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvaW50ZXJuYWwvbW9kZWxncm91cC9SZXBNb2RlbEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YWUxNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvUmVwTW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmludGVybmFsLm1vZGVsZ3JvdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLlNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgUmVwTW9kZWxHcm91cCBpbXBsZW1lbnRzIElNb2RlbEdyb3VwIHsKLQlwcml2YXRlIElNb2RlbEdyb3VwIGNoaWxkOwotCi0JcHVibGljIFJlcE1vZGVsR3JvdXAoSU1vZGVsR3JvdXAgbW9kZWxHcm91cCkgewotCQljaGlsZCA9IG1vZGVsR3JvdXA7Ci0JCW1vZGVsR3JvdXAucmVmZXIodHJ1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIoIiArIGNoaWxkICsgIikqIjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJcGFyc2VyLmNsZWFyQ29udGV4dE1hcChwYXJlbnQpOwotCQlyZXR1cm4gdGhpcy5jaGlsZC5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc2hbXTsKLQotCXB1YmxpYyBib29sZWFuIG1hdGNoKGludCBudW1iZXIpIHsKLQkJcmV0dXJuIGhhc2hbbnVtYmVyXTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbltdIHJlaGFzaChpbnQgdG90YWxTaXplKSB7Ci0JCXJldHVybiBoYXNoICE9IG51bGwgPyBoYXNoIDogKGhhc2ggPSBjaGlsZC5yZWhhc2godG90YWxTaXplKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvU2VxTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL2ludGVybmFsL21vZGVsZ3JvdXAvU2VxTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWNlYjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC9pbnRlcm5hbC9tb2RlbGdyb3VwL1NlcU1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW50ZXJuYWwubW9kZWxncm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLklTR01MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFNlcU1vZGVsR3JvdXAgZXh0ZW5kcyBDb21wb3NpdGVNb2RlbEdyb3VwIHsKLQlwdWJsaWMgU2VxTW9kZWxHcm91cChJTW9kZWxHcm91cCBtb2RlbEdyb3VwKSB7Ci0JCXN1cGVyKG1vZGVsR3JvdXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChJTW9kZWxHcm91cCBtb2RlbEdyb3VwKSB7Ci0JCS8qCi0JCSAqIChhICwgYiwgKGMsIGQpKSA9PSAoYSwgYiwgYywgZCkKLQkJICovCi0JCWlmIChtb2RlbEdyb3VwIGluc3RhbmNlb2YgU2VxTW9kZWxHcm91cCkgewotCQkJU2VxTW9kZWxHcm91cCBhbm90aGVyID0gKFNlcU1vZGVsR3JvdXApIG1vZGVsR3JvdXA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFub3RoZXIuY2hpbGRMZW5ndGg7IGkrKykgewotCQkJCWFub3RoZXIuY2hpbGRyZW5baV0ucmVmZXIoZmFsc2UpOwotCQkJCXRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZExlbmd0aCsrXSA9IGFub3RoZXIuY2hpbGRyZW5baV07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbltjaGlsZExlbmd0aCsrXSA9IG1vZGVsR3JvdXA7Ci0JCQltb2RlbEdyb3VwLnJlZmVyKGZhbHNlKTsKLQkJfQotCX0KLQotCS8vIGZvciBkZWJ1Zy4KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmV0ID0gbmV3IFN0cmluZygiKCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlyZXQgPSByZXQgKyBjaGlsZHJlbltpXSArICcsJzsKLQkJfQotCQlyZXQgPSByZXQgKyBjaGlsZHJlbltjaGlsZExlbmd0aCAtIDFdICsgJyknOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8vIFRPRE8gc3VwcG9ydCBuZXN0ZWQgc2VxTW9kZWwKLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJSGFzaHRhYmxlPE5vZGUsIEludGVnZXI+IG1hcCA9IHBhcnNlci5nZXRTZXFNYXAoKTsKLQkJSW50ZWdlciBjdXJyZW50ID0gKEludGVnZXIpIG1hcC5nZXQocGFyZW50KTsKLQkJSU1vZGVsR3JvdXAgbWc7Ci0JCWludCBpbmRleCA9IGN1cnJlbnQgPT0gbnVsbCA/IDAgOiBjdXJyZW50LmludFZhbHVlKCk7Ci0JCS8vIHByZWZldGNoIDIKLQkJaW50IHJlc3QgPSAwOwotCQkvLyBpbnQgY3VySW5kZXggPSBpbmRleDsKLQkJSU1vZGVsR3JvdXAgc2tpcHBlZFtdID0gcGFyc2VyLmdldFNlcUFycmF5KCk7Ci0JCWludCBza2lwcGVkTnVtID0gMDsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoOiAxc3QiKTsKLQkJd2hpbGUgKGluZGV4IDwgY2hpbGRMZW5ndGgpIHsKLQkJCW1nID0gY2hpbGRyZW5baW5kZXhdOwotCi0JCQlpZiAobWcubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmICghKG1nIGluc3RhbmNlb2YgUGx1c01vZGVsR3JvdXApCi0JCQkJCQkmJiAhKG1nIGluc3RhbmNlb2YgUmVwTW9kZWxHcm91cCkpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJaWYgKHNraXBwZWROdW0gPiAwKSB7Ci0JCQkJCXBhcnNlci5lcnJvcihJU0dNTENvbnN0YW50cy5JTExFR0FMX0NISUxELCAiT3JkZXIgb2YgIgotCQkJCQkJCSsgcGFyZW50ICsgIidzIGNoaWxkcmVuIGlzIHdyb25nLiIpOwotCQkJCX0KLQotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibWF0Y2g6IHRydWUgIitpbmRleCk7Ci0KLQkJCQltYXAucHV0KHBhcmVudCwgbmV3IEludGVnZXIoaW5kZXgpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAobWcub3B0aW9uYWwoKSkgewotCQkJCWluZGV4Kys7Ci0JCQl9IGVsc2UgaWYgKHJlc3QgPCAyKSB7Ci0JCQkJc2tpcHBlZFtza2lwcGVkTnVtKytdID0gbWc7Ci0JCQkJcmVzdCsrOwotCQkJCWluZGV4Kys7Ci0JCQl9IGVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWF0Y2g6IGZhbHNlIik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibWF0Y2g6IDJuZCIpOwotCQkvLyBzZWFyY2ggYmVmb3JlIGluZGV4LCBpZiBmb3VuZCAtPiBlcnJvcgotCQkvKgotCQkgKiBmb3IgKGludCBpID0gY3VySW5kZXggLSAyOyBpID49IDA7IGktLSkgeyBtZyA9IGNoaWxkcmVuW2ldOyBpZgotCQkgKiAobWcubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgeyAvLyBtYXAucHV0KHBhcmVudCwgbmV3IEludGVnZXIoaSArCi0JCSAqIDEpKTsgb3V0ZXIxOiBmb3IgKE5vZGUgcHJldiA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOyBwcmV2ICE9Ci0JCSAqIG51bGw7ICkgeyBpbnQgcHJldklEID0gY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50ID8KLQkJICogcGFyc2VyLmdldERURCgpLmdldEVsZW1lbnREZWZpbml0aW9uKHByZXYuZ2V0Tm9kZU5hbWUoKSkubnVtYmVyIDoKLQkJICogcGFyc2VyLnBjZGF0YU51bWJlcjsgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgY3VySW5kZXg7IGorKykgeyBtZyA9Ci0JCSAqIGNoaWxkcmVuW2pdOyBpZiAobWcubWF0Y2gocHJldklEKSkgeyBwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkgKiBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBwcmV2KTsgcHJldiA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkgKiBjb250aW51ZSBvdXRlcjE7IH0gfSBwcmV2ID0gcHJldi5nZXRQcmV2aW91c1NpYmxpbmcoKTsgfQotCQkgKiBwYXJzZXIuZXJyb3IoU0dNTENvbnN0YW50cy5JTExFR0FMX0NISUxELCAiT3JkZXIgb2YgIiArIHBhcmVudCArICIncwotCQkgKiBjaGlsZHJlbiBpcyB3cm9uZy4iKTsgcmV0dXJuIHRydWU7IH0gfQotCQkgKi8KLQkJTm9kZSBzaWJsaW5nID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQlpZiAoc2libGluZyBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJJiYgc2libGluZy5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkKLQkJCQkmJiBwYXJzZXIuYXV0b0dlbmVyYXRlZCgoRWxlbWVudCkgc2libGluZykpIHsKLQkJCS8vIG11c3QgYmUgZXJyb3IKLQkJCXdoaWxlIChzaWJsaW5nLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCU5vZGUgc2liQ2hpbGQgPSBzaWJsaW5nLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlzaWJsaW5nLnJlbW92ZUNoaWxkKHNpYkNoaWxkKTsKLQkJCQljaGlsZC5hcHBlbmRDaGlsZChzaWJDaGlsZCk7Ci0JCQl9Ci0JCQlwYXJlbnQucmVwbGFjZUNoaWxkKGNoaWxkLCBzaWJsaW5nKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBvcHRpb25hbCgpIHsKLQkJZm9yIChpbnQgaSA9IGNoaWxkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICghY2hpbGRyZW5baV0ub3B0aW9uYWwoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL0Vycm9ySGFuZGxlclRhYmxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvRXJyb3JIYW5kbGVyVGFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjlhZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvRXJyb3JIYW5kbGVyVGFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JRXJyb3JIYW5kbGVyOwotCi0vKioKLSAqIEZvciBKREsxLjIgb3IgbGF0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVycm9ySGFuZGxlclRhYmxlSW1wbCBleHRlbmRzIEhhc2h0YWJsZTxVUkwsIElFcnJvckhhbmRsZXJbXT4gaW1wbGVtZW50cwotCQlJRXJyb3JIYW5kbGVyVGFibGUgewotCXB1YmxpYyBFcnJvckhhbmRsZXJUYWJsZUltcGwoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJUHJvcGVydGllcyBwcm9wID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCXByb3AubG9hZChnZXRDbGFzcygpCi0JCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlcnJvcmhhbmRsZXJzLnByb3BlcnRpZXMiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IHByb3Aua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHVybFN0ciA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCVVSTCB1cmw7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcHV0KHVybCwgY3JlYXRlRXJyb3JIYW5kbGVycygoU3RyaW5nKSBwcm9wLmdldCh1cmxTdHIpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBlcnJvckhhbmRsZXJOYW1lQXJyYXlbXSA9IG5ldyBTdHJpbmdbMTI4XTsKLQotCXByaXZhdGUgSUVycm9ySGFuZGxlcltdIGNyZWF0ZUVycm9ySGFuZGxlcnMoU3RyaW5nIGVycm9ySGFuZGxlck5hbWVzKSB7Ci0JCWludCBsYXN0Q29tbWEgPSAwOwotCQlpbnQgZXJyb3JIYW5kbGVyTnVtID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJOYW1lcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyTmFtZXMuY2hhckF0KGkpID09ICcsJykgewotCQkJCWVycm9ySGFuZGxlck5hbWVBcnJheVtlcnJvckhhbmRsZXJOdW0rK10gPSBlcnJvckhhbmRsZXJOYW1lcwotCQkJCQkJLnN1YnN0cmluZyhsYXN0Q29tbWEsIGkpOwotCQkJCWxhc3RDb21tYSA9IGkgKyAxOwotCQkJfQotCQl9Ci0JCWVycm9ySGFuZGxlck5hbWVBcnJheVtlcnJvckhhbmRsZXJOdW0rK10gPSBlcnJvckhhbmRsZXJOYW1lcwotCQkJCS5zdWJzdHJpbmcobGFzdENvbW1hKTsKLQotCQlJRXJyb3JIYW5kbGVyIHJldFtdID0gbmV3IElFcnJvckhhbmRsZXJbZXJyb3JIYW5kbGVyTnVtXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJdHJ5IHsKLQkJCQlDbGFzcyBlcnJvckhhbmRsZXJDbGFzcyA9IENsYXNzCi0JCQkJCQkuZm9yTmFtZShlcnJvckhhbmRsZXJOYW1lQXJyYXlbaV0pOwotCQkJCXJldFtpXSA9IChJRXJyb3JIYW5kbGVyKSBlcnJvckhhbmRsZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIElFcnJvckhhbmRsZXJbXSBnZXRFcnJvckhhbmRsZXJzKFVSTCB1cmwpIHsKLQkJcmV0dXJuIChJRXJyb3JIYW5kbGVyW10pIGdldCh1cmwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL0lFcnJvckhhbmRsZXJUYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvSUVycm9ySGFuZGxlclRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZWRjY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvSUVycm9ySGFuZGxlclRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyLklFcnJvckhhbmRsZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVycm9ySGFuZGxlclRhYmxlIHsKLSAgICBwdWJsaWMgSUVycm9ySGFuZGxlcltdIGdldEVycm9ySGFuZGxlcnMoVVJMIHVybCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvdXRpbC9JTXV0YWJsZVRyZWVOb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvSU11dGFibGVUcmVlTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxMGI1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvdXRpbC9JTXV0YWJsZVRyZWVOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLnV0aWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50cmVlLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotcHVibGljIGludGVyZmFjZSBJTXV0YWJsZVRyZWVOb2RlRmFjdG9yeSB7Ci0JcHVibGljIE11dGFibGVUcmVlTm9kZSBjcmVhdGVOb2RlKE5vZGUgbm9kZSk7Ci0KLQlwdWJsaWMgTXV0YWJsZVRyZWVOb2RlIGdldE5vZGUoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL011dGFibGVUcmVlTm9kZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvdXRpbC9NdXRhYmxlVHJlZU5vZGVGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGJlM2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL011dGFibGVUcmVlTm9kZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuKjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgTXV0YWJsZVRyZWVOb2RlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJTXV0YWJsZVRyZWVOb2RlRmFjdG9yeSB7Ci0JLyoqCi0JICogS2V5OiBET00gTm9kZSwgVmFsdWU6IE11dGFibGVUcmVlTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZTxOb2RlLCBNdXRhYmxlVHJlZU5vZGVJbXBsPiB0YWJsZSA9IG5ldyBIYXNodGFibGU8Tm9kZSwgTXV0YWJsZVRyZWVOb2RlSW1wbD4oKTsKLQotCXB1YmxpYyBNdXRhYmxlVHJlZU5vZGUgY3JlYXRlTm9kZShOb2RlIG5vZGUpIHsKLQkJTXV0YWJsZVRyZWVOb2RlSW1wbCByZXQgPSAoTXV0YWJsZVRyZWVOb2RlSW1wbCkgdGFibGUuZ2V0KG5vZGUpOwotCQlpZiAocmV0ID09IG51bGwpIHsKLQkJCXJldCA9IG5ldyBNdXRhYmxlVHJlZU5vZGVJbXBsKG5vZGUsIHRoaXMpOwotCQkJdGFibGUucHV0KG5vZGUsIHJldCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgTXV0YWJsZVRyZWVOb2RlIGdldE5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoTXV0YWJsZVRyZWVOb2RlSW1wbCkgdGFibGUuZ2V0KG5vZGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL011dGFibGVUcmVlTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL011dGFibGVUcmVlTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhNTU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL3NnbWwvdXRpbC9NdXRhYmxlVHJlZU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5zZ21sLnV0aWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy50cmVlLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE11dGFibGVUcmVlTm9kZUltcGwgaW1wbGVtZW50cyBNdXRhYmxlVHJlZU5vZGUgewotCXByaXZhdGUgTm9kZSBkb21Ob2RlOwotCi0JcHJpdmF0ZSBJTXV0YWJsZVRyZWVOb2RlRmFjdG9yeSBmYWN0b3J5OwotCi0JcHVibGljIE5vZGUgZ2V0RG9tTm9kZSgpIHsKLQkJcmV0dXJuIGRvbU5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU11dGFibGVUcmVlTm9kZUZhY3Rvcnkgc2ZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBTZWUge0BsaW5rIElNdXRhYmxlVHJlZU5vZGVGYWN0b3J5fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXV0YWJsZVRyZWVOb2RlSW1wbCBjcmVhdGVOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAoc2ZhY3RvcnkgPT0gbnVsbCkgewotCQkJc2ZhY3RvcnkgPSBuZXcgTXV0YWJsZVRyZWVOb2RlRmFjdG9yeUltcGwoKTsKLQkJfQotCQlyZXR1cm4gKE11dGFibGVUcmVlTm9kZUltcGwpIHNmYWN0b3J5LmNyZWF0ZU5vZGUobm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE11dGFibGVUcmVlTm9kZUltcGwoTm9kZSBub2RlLCBJTXV0YWJsZVRyZWVOb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRoaXMuZG9tTm9kZSA9IG5vZGU7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGRvbU5vZGUudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHJlZU5vZGUgZ2V0Q2hpbGRBdChpbnQgY2hpbGRJbmRleCkgewotCQlOb2RlIHJldDsKLQkJZm9yIChyZXQgPSBkb21Ob2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGRJbmRleCA+IDAgJiYgcmV0ICE9IG51bGw7IHJldCA9IHJldAotCQkJCS5nZXROZXh0U2libGluZygpLCBjaGlsZEluZGV4LS0pCi0JCQk7Ci0JCXJldHVybiByZXQgIT0gbnVsbCA/IGZhY3RvcnkuY3JlYXRlTm9kZShyZXQpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7Ci0JCWludCByZXQgPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBkb21Ob2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpKQotCQkJcmV0Kys7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJTm9kZSBkb21QYXJlbnQgPSBkb21Ob2RlLmdldFBhcmVudE5vZGUoKTsKLQkJcmV0dXJuIGRvbVBhcmVudCA9PSBudWxsID8gbnVsbCA6IGZhY3RvcnkuY3JlYXRlTm9kZShkb21QYXJlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoVHJlZU5vZGUgbm9kZSkgewotCQlOb2RlIHRhcmdldENoaWxkID0gKChNdXRhYmxlVHJlZU5vZGVJbXBsKSBub2RlKS5kb21Ob2RlOwotCQlpbnQgcmV0ID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gZG9tTm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkID09IHRhcmdldENoaWxkKSB7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEFsbG93c0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZG9tTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZG9tTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGVhZigpIHsKLQkJcmV0dXJuICEoZG9tTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpICYmICFkb21Ob2RlLmhhc0NoaWxkTm9kZXMoKQotCQkJCSYmICEoZG9tTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gY2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0JCQlwcml2YXRlIE5vZGUgbmV4dENoaWxkID0gZG9tTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCQlyZXR1cm4gbmV4dENoaWxkICE9IG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQkJaWYgKG5leHRDaGlsZCA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCU11dGFibGVUcmVlTm9kZSByZXQgPSBmYWN0b3J5LmNyZWF0ZU5vZGUobmV4dENoaWxkKTsKLQkJCQluZXh0Q2hpbGQgPSBuZXh0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydChNdXRhYmxlVHJlZU5vZGUgY2hpbGQsIGludCBpbmRleCkgewotCQlOb2RlIGFmdGVyOwotCQlmb3IgKGFmdGVyID0gZG9tTm9kZS5nZXRGaXJzdENoaWxkKCk7IGFmdGVyICE9IG51bGwgJiYgaW5kZXggPiAwOyBhZnRlciA9IGFmdGVyCi0JCQkJLmdldE5leHRTaWJsaW5nKCksIGluZGV4LS0pCi0JCQk7Ci0JCWRvbU5vZGUuaW5zZXJ0QmVmb3JlKCgoTXV0YWJsZVRyZWVOb2RlSW1wbCkgY2hpbGQpLmRvbU5vZGUsIGFmdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCU5vZGUgY2hpbGQ7Ci0JCWZvciAoY2hpbGQgPSBkb21Ob2RlLmdldEZpcnN0Q2hpbGQoKTsgaW5kZXggPiAwICYmIGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSwgaW5kZXgtLSkKLQkJCTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlkb21Ob2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoTXV0YWJsZVRyZWVOb2RlIG5vZGUpIHsKLQkJZG9tTm9kZS5yZW1vdmVDaGlsZCgoKE11dGFibGVUcmVlTm9kZUltcGwpIG5vZGUpLmRvbU5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXJPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJdGhpcy5kb21Ob2RlID0gKE5vZGUpIG9iamVjdDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKSB7Ci0JCWRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGRvbU5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChNdXRhYmxlVHJlZU5vZGUgbmV3UGFyZW50KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvU2dtbFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL1NnbWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDZmYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvU2dtbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTZ21sVXRpbCB7Ci0JcHVibGljIHN0YXRpYyBOb2RlIGNvbW1vbkFuY2VzdGVyKE5vZGUgYW5jMSwgTm9kZSBhbmMyKSB7Ci0JCWZvciAoTm9kZSBwMSA9IGFuYzEuZ2V0UGFyZW50Tm9kZSgpOyBwMSAhPSBudWxsOyBwMSA9IHAxCi0JCQkJLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChOb2RlIHAyID0gYW5jMi5nZXRQYXJlbnROb2RlKCk7IHAyICE9IG51bGw7IHAyID0gcDIKLQkJCQkJLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmIChwMSA9PSBwMikKLQkJCQkJcmV0dXJuIHAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIDxjb2RlPm5vZGU8L2NvZGU+IHdpdGggaXRzIGNoaWxkcmVuLiBUaGUgZm9sbG93aW5nIGlzIGFuCi0JICogZXhhbXBsZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgUiAgICAgICAgICBSICAgICAKLQkgKiAgICAvIFwgICAgICAgIC98XCAgICAKLQkgKiAgIEEgICBCICAtJmd0OyAgQSBFIEYgICAKLQkgKiAgICAgIC8gXCAgICAgICAgICAgICAKLQkgKiAgICAgRSAgIEYgICAgICAgICAgICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAKLQkgKiAgICAgIHJlbW92ZSBCICAgICAgICAKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGFyZ2V0IG5vZGUuCi0JICogQHJldHVybiA8Y29kZT5ub2RlPC9jb2RlPiBpZiBzdWNjZWVkZWQuIE90aGVyd2l6ZSwgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZSArICIgZG9lc24ndCBoYXZlIGEgcGFyZW50Iik7Ci0JCX0KLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbm9kZQotCQkJCS5nZXRGaXJzdENoaWxkKCkpIHsKLQkJCW5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9kZSk7Ci0JCX0KLQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgPGNvZGU+bm9kZTwvY29kZT4gYW5kIG1vdmVzIGNoaWxkcmVuIHNwZWNpZmllZCBieQotCSAqIDxjb2RlPmZyb208L2NvZGU+IGFuZCA8Y29kZT50bzwvY29kZT4gdG8gaXQuIFRoZSBmb2xsb3dpbmcgaXMgYW4KLQkgKiBleGFtcGxlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICBSICAgICAgICAgUiAgICAgICAKLQkgKiAgICAgL3xcICAgICAgIC8gXCAgICAgIAotCSAqICAgIEEgRSBGICAtJmd0OyBBICAgQiAgICAgCi0JICogICAgICAgICAgICAgICAgIC8gXCAgICAKLQkgKiAgICAgICAgICAgICAgICBFICAgRiAgIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogICAgIGFkZCBCIC4uLiAgICAgICAgICAKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGFyZ2V0IG5vZGUKLQkgKiBAcGFyYW0gZnJvbQotCSAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBjaGlsZHJlbiBtb3ZlZCB0byA8Y29kZT5ub2RlPC9jb2RlPi4gSWYKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBubyBjaGlsZCB3aWxsIGJlIG1vdmVkLgotCSAqIEBwYXJhbSB0bwotCSAqICAgICAgICAgICAgZW5kIG9mIHRoZSBjaGlsZHJlbiBtb3ZlZCB0byA8Y29kZT5ub2RlPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+bm9kZTwvY29kZT4gaWYgc3VjY2VlZGVkLiBPdGhlcndpemUsIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZChOb2RlIHBhcmVudCwgTm9kZSBub2RlLCBOb2RlIGZyb20sIE5vZGUgdG8pIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnQ9bnVsbCIpOwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZSArICIgYWxyZWFkeSBoYXMgaXRzIHBhcmVudCIpOwotCQl9IGVsc2UgaWYgKGZyb20gPT0gbnVsbCkgewotCQkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBudWxsKTsKLQkJfSBlbHNlIGlmIChmcm9tLmdldFBhcmVudE5vZGUoKSAhPSBwYXJlbnQpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZnJvbSArICIncyBwYXJlbnQgaXNuJ3QgIgotCQkJCQkrIHBhcmVudCk7Ci0JCX0gZWxzZSBpZiAodG8uZ2V0UGFyZW50Tm9kZSgpICE9IHBhcmVudCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0byArICIncyBwYXJlbnQgaXNuJ3QgIiArIHBhcmVudCk7Ci0JCX0gZWxzZSBpZiAoZnJvbSAhPSBudWxsKSB7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBmcm9tOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkID09IHRvKSB7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgZnJvbSk7Ci0JCQkJCWZvciAoY2hpbGQgPSBmcm9tOyBjaGlsZCAhPSB0bzsgY2hpbGQgPSBub2RlCi0JCQkJCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCQlub2RlLmluc2VydEJlZm9yZShjaGlsZCwgbnVsbCk7Ci0JCQkJCX0KLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKHRvKTsKLQkJCQkJbm9kZS5pbnNlcnRCZWZvcmUodG8sIG51bGwpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gbGluayBmcm9tICIgKyBmcm9tICsgIiB0byAiCi0JCQkJCSsgdG8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvZXJyb3JoYW5kbGVycy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9zZ21sL3V0aWwvZXJyb3JoYW5kbGVycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIzMjcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vc2dtbC91dGlsL2Vycm9yaGFuZGxlcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2YmQ3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTVkZTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIE9ERiBNb2RlbCBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmCi1CdW5kbGUtVmVyc2lvbjogMC4wLjEKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5jb21tb24KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5hbmltLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydCwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudCwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZCwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdywKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybWF0LAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5tYW5pZmVzdCwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbiwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmFjY2Vzc2liaWxpdHksCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi54bGluawotQnVuZGxlLUNsYXNzUGF0aDogb2RmYXBpLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9kZlBsdWdpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NWQwOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0JCQkgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG9kZmFwaS5qYXIKLWphcnMuY29tcGlsZS5vcmRlciA9IG9kZmFwaS5qYXIKLXNvdXJjZS5vZGZhcGkuamFyID0gc3JjLwotb3V0cHV0Lm9kZmFwaS5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09ERkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9PREZDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlODFhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09ERkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgT0RGQ29uc3RhbnRzIHsKLQlwdWJsaWMgZW51bSBDb250ZW50VHlwZSB7Ci0JCVdSSVRFLCBTUFJFQURTSEVFVCwgUFJFU0VOVEFUSU9OLCBEUkFXLCBDSEFSVCwgTk9ORQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9EVF9TVUZGSVggPSAiLm9kdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRFNfU1VGRklYID0gIi5vZHMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0RQX1NVRkZJWCA9ICIub2RwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ERl9NQU5JRkVTVF9ESVIgPSAiTUVUQS1JTkYiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0RGX0NPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudC54bWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0RGX1NUWUxFX0ZJTEVOQU1FID0gInN0eWxlcy54bWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0RGX01BTklGRVNUX0ZJTEVOQU1FID0gT0RGX01BTklGRVNUX0RJUgotCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyAibWFuaWZlc3QueG1sIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09ERkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9PREZFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4N2NkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09ERkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmOwotCi1wdWJsaWMgY2xhc3MgT0RGRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE4OTk5MDk3NTA2ODQ1MTcxOEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT0RGRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIE9ERkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBPREZFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIE9ERkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9PREZQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT0RGUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDE4MmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9PREZQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGY7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZEb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgT0RGUGFyc2VyIHsKLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0RmlsZUlucHV0U3RyZWFtKFN0cmluZyBvZGZOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKG9kZk5hbWUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJWmlwRW50cnkgemlwRW50cnkgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKG5ldyBGaWxlKHVybC50b1VSSSgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShvZGZOYW1lKTsKLQkJCX0KLQkJCVN0cmluZyB6aXBGaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpOwotCQkJemlwRW50cnkgPSB6aXBGaWxlLmdldEVudHJ5KHppcEZpbGVOYW1lKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCWlmICh6aXBFbnRyeSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlzID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbSh6aXBFbnRyeSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ERk5vZGUoTm9kZSBwYXJlbnQsIE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCU9ERk5vZGUgb2RmTm9kZVBhcmVudCkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gKChFbGVtZW50KSBwYXJlbnQpLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmICgoYXR0cnMgIT0gbnVsbCkgJiYgKGF0dHJzLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJKChPREZEb2N1bWVudEltcGwpIG9kZkRvYykuZ2V0T0RGTm9kZShhdHRycy5pdGVtKGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOb2RlTGlzdCBubCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpICE9IDApKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gbmwuaXRlbShpKTsKLQotCQkJCU9ERk5vZGUgb2RmQ2hpbGQgPSAoKE9ERkRvY3VtZW50SW1wbCkgb2RmRG9jKS5nZXRPREZOb2RlKGNoaWxkKTsKLQkJCQljcmVhdGVPREZOb2RlKGNoaWxkLCBvZGZEb2MsIG9kZkNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgT0RGRG9jdW1lbnQgcGFyc2UoSW5wdXRTb3VyY2UgaXMpIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCi0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2UoaXMpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU9ERkRvY3VtZW50IG9kZkRvYyA9IG5ldyBPREZEb2N1bWVudEltcGwoZG9jdW1lbnQpOwotCQlPREZOb2RlIG9kZkRvY1Jvb3QgPSAoT0RGTm9kZSkgb2RmRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQljcmVhdGVPREZOb2RlKHJvb3QsIG9kZkRvYywgb2RmRG9jUm9vdCk7Ci0KLQkJcmV0dXJuIG9kZkRvYzsKLQl9Ci0KLQlwdWJsaWMgT0RGRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIG9kZk5hbWUsIFN0cmluZyB4bWxOYW1lKSB7Ci0JCU9ERkRvY3VtZW50IG9kZkRvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IGdldEZpbGVJbnB1dFN0cmVhbShvZGZOYW1lLCB4bWxOYW1lKTsKLQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJb2RmRG9jID0gcGFyc2UobmV3IElucHV0U291cmNlKGlzKSk7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBvZGZEb2M7Ci0JfQotCi0JcHVibGljIE9ERkRvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBvZGZOYW1lKSB7Ci0JCU9ERkRvY3VtZW50IGNvbnRlbnREb2MgPSBnZXREb2N1bWVudChvZGZOYW1lLAotCQkJCU9ERkNvbnN0YW50cy5PREZfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCU9ERkRvY3VtZW50IHN0eWxlRG9jID0gZ2V0RG9jdW1lbnQob2RmTmFtZSwKLQkJCQlPREZDb25zdGFudHMuT0RGX1NUWUxFX0ZJTEVOQU1FKTsKLQotCQlpZiAoY29udGVudERvYyAhPSBudWxsKSB7Ci0JCQljb250ZW50RG9jLnNldFN0eWxlRG9jdW1lbnQoc3R5bGVEb2MpOwotCQkJY29udGVudERvYy5zZXRVUkwob2RmTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudERvYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsZUVudHJpZXMoU3RyaW5nIG9kZk5hbWUpIHsKLQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwob2RmTmFtZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHVybC5nZXRQYXRoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUob2RmTmFtZSk7Ci0JCQl9Ci0JCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCWxpc3QuYWRkKG5hbWUpOwotCQkJfQotCQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHRyYWN0RmlsZShTdHJpbmcgb2RmTmFtZSwgU3RyaW5nIGVudHJ5LCBTdHJpbmcgb3V0cHV0RmlsZU5hbWUpIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBnZXRGaWxlSW5wdXRTdHJlYW0ob2RmTmFtZSwgZW50cnkpOwotCQlGaWxlVXRpbHMuc2F2ZVRvRmlsZShpcywgb3V0cHV0RmlsZU5hbWUsIHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT2RmUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09kZlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjA0MDkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT2RmUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgT2RmUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCXByaXZhdGUgc3RhdGljIE9kZlBsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgT2RmUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2RmUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9hbmltL0FuaW1Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYW5pbS9BbmltQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzhkZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9hbmltL0FuaW1Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5hbmltOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5pbUNvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQU5JTV9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6YW5pbWF0aW9uOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBUiA9ICJwYXIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9Db250ZW50QmFzZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9Db250ZW50QmFzZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhZDgzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvQ29udGVudEJhc2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklDb250ZW50UmFuZ2U7Ci0KLQotcHVibGljIGludGVyZmFjZSBDb250ZW50QmFzZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKTsKLQotCUlDb250ZW50UmFuZ2UgY3JlYXRlUmFuZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEJhc2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEJhc2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTA1NDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL0RyYXdpbmdPYmplY3RCYXNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLkRlc2NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuVGl0bGVFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIERyYXdpbmdPYmplY3RCYXNlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0U1ZHVGl0bGVFbGVtZW50KCk7Ci0KLQlwdWJsaWMgRGVzY0VsZW1lbnQgZ2V0U1ZHRGVzY0VsZW1lbnQoKTsKLQotCXB1YmxpYyBPREZFbGVtZW50IGdldFNob3J0RGVzY0VsZW1lbnQoKTsKLQotCXB1YmxpYyBPREZFbGVtZW50IGdldExvbmdEZXNjRWxlbWVudCgpOwotCi0JLy8gZm9yIE5vdGVzOCwgTm90ZXM4IHNhdmUgZG9jdW1lbnQgYnkgT0RGIDEuMSBzY2hlbWEsCi0JLy8gYnV0IG9kZjp2ZXJzaW9uIGlzIHNldCBhcyAxLjAKLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRTaG9ydERlc2NFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKTsKLQotCXB1YmxpYyBPREZFbGVtZW50IGdldExvbmdEZXNjRWxlbWVudChkb3VibGUgdmVyc2lvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL0RyYXdpbmdPYmplY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiZWZiZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuVGV4dEJveEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRHJhd2luZ09iamVjdEVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdDYXB0aW9uSWQoKTsKLQotCWxvbmcgZ2V0SGVpZ2h0KCk7Ci0KLQlsb25nIGdldFdpZHRoKCk7Ci0KLQlsb25nIGdldFgoKTsKLQotCWxvbmcgZ2V0WSgpOwotCi0Jdm9pZCBzZXRIZWlnaHQobG9uZyBoZWlnaHQpOwotCi0Jdm9pZCBzZXRXaWR0aChsb25nIHdpZHRoKTsKLQotCXZvaWQgc2V0WChsb25nIHgpOwotCi0Jdm9pZCBzZXRZKGxvbmcgeSk7Ci0KLQlsb25nIGdldFBhZ2VJbmRleCgpOwotCi0JbG9uZyBnZXRaSW5kZXgoKTsKLQotCXB1YmxpYyBUZXh0Qm94RWxlbWVudCBnZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudCgpOwotCi0JLy8gZm9yIE5vdGVzOCwgTm90ZXM4IHNhdmUgZG9jdW1lbnQgYnkgT0RGIDEuMSBzY2hlbWEsCi0JLy8gYnV0IG9kZjp2ZXJzaW9uIGlzIHNldCBhcyAxLjAKLQlwdWJsaWMgVGV4dEJveEVsZW1lbnQgZ2V0Qm91bmRDYXB0aW9uVGV4dEJveEVsZW1lbnQoZG91YmxlIHZlcnNpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y4ZDY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEJhc2VFbGVtZW50IHsKLQlwdWJsaWMgRnJhbWVFbGVtZW50IGdldEZyYW1lRWxlbWVudCgpOwotCi0JcHVibGljIFNlcXVlbmNlRWxlbWVudCBnZXRUZXh0U2VxdWVuY2VFbGVtZW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkF0dHIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZBdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDM3YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkF0dHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotcHVibGljIGludGVyZmFjZSBPREZBdHRyIGV4dGVuZHMgT0RGTm9kZSwgQXR0ciB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ2hhcmFjdGVyRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkNoYXJhY3RlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0NDk0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ2hhcmFjdGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ERkNoYXJhY3RlckRhdGEgZXh0ZW5kcyBPREZOb2RlLCBDaGFyYWN0ZXJEYXRhIHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZDb21tZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ29tbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDVkZjhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZDb21tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT0RGQ29tbWVudCBleHRlbmRzIE9ERkNoYXJhY3RlckRhdGEsIENvbW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkRvY3VtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjNTQ0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT0RGRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRVUkwoKTsKLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgc1VybCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRPREZWZXJzaW9uKGRvdWJsZSB2ZXJzaW9uKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0T0RGVmVyc2lvbigpOwotCi0JcHVibGljIHZvaWQgc2V0U3R5bGVEb2N1bWVudChPREZEb2N1bWVudCBzdHlsZURvYyk7Ci0KLQlwdWJsaWMgT0RGRG9jdW1lbnQgZ2V0U3R5bGVEb2N1bWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDZiNzkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT0RGRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOYW1lZE5vZGVNYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxMjZiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGTmFtZWROb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGludGVyZmFjZSBPREZOYW1lZE5vZGVNYXAgZXh0ZW5kcyBOYW1lZE5vZGVNYXAgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERk5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmRmZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBPREZOb2RlIGV4dGVuZHMgTm9kZSB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGTm9kZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOb2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjVhOWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBPREZOb2RlTGlzdCBleHRlbmRzIE5vZGVMaXN0IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYjI1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBPREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gZXh0ZW5kcyBPREZOb2RlLAotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERlRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MWY0MDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERlRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGludGVyZmFjZSBPREZUZXh0IGV4dGVuZHMgT0RGQ2hhcmFjdGVyRGF0YSwgVGV4dCB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9BYnN0cmFjdE9ERk5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9BYnN0cmFjdE9ERk5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjY5MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvQWJzdHJhY3RPREZOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbnN0cnVjdG9yIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoQ2xhc3MgY3MpIHsKLQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBjcy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3NbXSBwYXJtcyA9IGNvbnN0cnVjdG9yc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKHBhcm1zLmxlbmd0aCA9PSAyICYmIHBhcm1zWzBdLmVxdWFscyhPREZEb2N1bWVudC5jbGFzcykKLQkJCQkJJiYgcGFybXNbMV0uZXF1YWxzKEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJcmV0dXJuIGNvbnN0cnVjdG9yc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL0RyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL0RyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkNTM0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQgewotCi0JcHJvdGVjdGVkIERyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRTaG9ydERlc2NFbGVtZW50KCkgewotCQlPREZEb2N1bWVudCBkb2MgPSAoT0RGRG9jdW1lbnQpIHRoaXMuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlyZXR1cm4gZ2V0U2hvcnREZXNjRWxlbWVudChkb2MuZ2V0T0RGVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRTaG9ydERlc2NFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uID09IDEuMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0U1ZHRGVzY0VsZW1lbnQoKTsKLQkJfSBlbHNlIGlmICh2ZXJzaW9uID4gMS4wKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRTVkdUaXRsZUVsZW1lbnQoKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2ZmaWNlIHZlcnNpb24iKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRMb25nRGVzY0VsZW1lbnQoKSB7Ci0JCU9ERkRvY3VtZW50IGRvYyA9IChPREZEb2N1bWVudCkgdGhpcy5nZXRPd25lckRvY3VtZW50KCk7Ci0JCXJldHVybiBnZXRMb25nRGVzY0VsZW1lbnQoZG9jLmdldE9ERlZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIE9ERkVsZW1lbnQgZ2V0TG9uZ0Rlc2NFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uID09IDEuMCkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigibG9uZyBkZXNjIGlzIG5vdCBhdmFpbGFibGUgZm9yIE9ERiAxLjAiKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZWxzZSBpZiAodmVyc2lvbiA+IDEuMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0U1ZHRGVzY0VsZW1lbnQoKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2ZmaWNlIHZlcnNpb24iKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9EcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2ZDAxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9EcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5HRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5UZXh0Qm94RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlNwcmVhZFNoZWV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLkRlc2NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuU1ZHQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuVGl0bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGV4dGVuZHMKLQkJRHJhd2luZ09iamVjdEJhc2VFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLQotCXByb3RlY3RlZCBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q2FwdGlvbklkKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NBUFRJT05fSUQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ0FQVElPTl9JRCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEhlaWdodCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0V2lkdGgoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFgoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFkoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlaWdodChsb25nIGhlaWdodCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChsb25nIHdpZHRoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFgobG9uZyB4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFkobG9uZyB5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBsb25nIGdldFBhZ2VJbmRleCgpIHsKLQkJLy8gaWYgcHJlc2VudGF0aW9uIGRvYwotCQlQYWdlRWxlbWVudCBwYWdlID0gbnVsbDsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChudWxsICE9IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VFbGVtZW50KSB7Ci0JCQkJcGFnZSA9IChQYWdlRWxlbWVudCkgcGFyZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChudWxsID09IHBhcmVudCkgfHwgKHBhcmVudCBpbnN0YW5jZW9mIEJvZHlFbGVtZW50KSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG51bGwgIT0gcGFnZSkKLQkJCXJldHVybiBwYWdlLmdldFBhZ2VJbmRleCgpOwotCi0JCS8vIGlmIHNwcmVhZHNoZWV0IGRvYwotCQlUYWJsZUVsZW1lbnQgc2hlZXQgPSBudWxsOwotCQlwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChudWxsICE9IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJCU5vZGUgZ3BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGdwYXJlbnQgaW5zdGFuY2VvZiBTcHJlYWRTaGVldEVsZW1lbnQpIHsKLQkJCQkJc2hlZXQgPSAoVGFibGVFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICgobnVsbCA9PSBwYXJlbnQpIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBCb2R5RWxlbWVudCkpCi0JCQkJYnJlYWs7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChudWxsICE9IHNoZWV0KSB7Ci0JCQlpbnQgc2hlZXRJbmRleCA9IDA7Ci0KLQkJCU5vZGUgcHJlU2liID0gc2hlZXQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAocHJlU2liICE9IG51bGwpIHsKLQkJCQlpZiAocHJlU2liIGluc3RhbmNlb2YgVGFibGVFbGVtZW50KQotCQkJCQlzaGVldEluZGV4Kys7Ci0JCQkJcHJlU2liID0gcHJlU2liLmdldFByZXZpb3VzU2libGluZygpOwotCQkJfQotCi0JCQlyZXR1cm4gc2hlZXRJbmRleDsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRaSW5kZXgoKSB7Ci0JCS8vIE9wZW5PZmZpY2Uub3JnIHNhdmUgZHJhdzp6LWluZGV4IGF0dHJpYnV0ZSBmb3IgYWxsIGdyYXBoaWMgb2JqZWN0IGluCi0JCS8vIE9EVCBhbmQgT0RTCi0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfWl9JTkRFWCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfWl9JTkRFWCkpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJLy8gT3Blbk9mZmljZS5vcmcgZG9uJ3Qgc2F2ZSBkcmF3OnotaW5kZXggYXR0cmlidXRlIGZvciBhbGwgZ3JhcGhpYwotCQkvLyBvYmplY3QgaW4gT0RQCi0JCURvY3VtZW50Q29udGVudEVsZW1lbnQgY29udGVudCA9IChEb2N1bWVudENvbnRlbnRFbGVtZW50KSBvZGZEb2MKLQkJCQkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCUNvbnRlbnRUeXBlIHR5cGUgPSBjb250ZW50LmdldEJvZHlFbGVtZW50KCkuZ2V0Q29udGVudCgpCi0JCQkJLmdldENvbnRlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBDb250ZW50VHlwZS5QUkVTRU5UQVRJT04pIHx8ICh0eXBlID09IENvbnRlbnRUeXBlLkRSQVcpKSB7Ci0JCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQYWdlRWxlbWVudCkgewotCQkJCWludCB6SW5kZXggPSAwOwotCQkJCU5vZGUgcHJlTm9kZSA9IHRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJd2hpbGUgKHByZU5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAocHJlTm9kZSBpbnN0YW5jZW9mIERyYXdpbmdPYmplY3RFbGVtZW50KSB7Ci0JCQkJCQl6SW5kZXgrKzsKLQkJCQkJfSBlbHNlIGlmIChwcmVOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQkJTm9kZUxpc3QgbmwgPSAoKEVsZW1lbnQpIHByZU5vZGUpCi0JCQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCQkJCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQkJCURyYXdDb25zdGFudHMuRUxFTUVOVF9DT05UUk9MKTsKLQkJCQkJCWlmICgobnVsbCAhPSBubCkgJiYgKG5sLmdldExlbmd0aCgpID4gMCkpCi0JCQkJCQkJekluZGV4ICs9IG5sLmdldExlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCXByZU5vZGUgPSBwcmVOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gekluZGV4OwotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBHRWxlbWVudCkgewotCQkJCXJldHVybiAoKEdFbGVtZW50KSBwYXJlbnQpLmdldFpJbmRleCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEJveEVsZW1lbnQgZ2V0Qm91bmRDYXB0aW9uVGV4dEJveEVsZW1lbnQoKSB7Ci0JCU9ERkRvY3VtZW50IG9kZkRvYyA9IChPREZEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlyZXR1cm4gZ2V0Qm91bmRDYXB0aW9uVGV4dEJveEVsZW1lbnQob2RmRG9jLmdldE9ERlZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIFRleHRCb3hFbGVtZW50IGdldEJvdW5kQ2FwdGlvblRleHRCb3hFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uID09IDEuMCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBjYXB0aW9uSWQgPSBnZXRBdHRyRHJhd0NhcHRpb25JZCgpOwotCQlpZiAoY2FwdGlvbklkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlPREZEb2N1bWVudCBvZGZEb2MgPSAoT0RGRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJT0RGRWxlbWVudEltcGwgcm9vdCA9IChPREZFbGVtZW50SW1wbCkgb2RmRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlPREZFbGVtZW50IGVsZW0gPSByb290LmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX1RFWFRfQk9YLAotCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLCBUZXh0Q29uc3RhbnRzLkFUVFJfSUQsCi0JCQkJY2FwdGlvbklkKTsKLQkJaWYgKChlbGVtICE9IG51bGwpICYmIChlbGVtIGluc3RhbmNlb2YgVGV4dEJveEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gKFRleHRCb3hFbGVtZW50KSBlbGVtOwotCQl9Ci0JCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJIidkcmF3OmNhcHRpb24taWQnIGRvZXMgbm90IHBvaW50IHRvIHRleHQ6Ym94IGVsZW1lbnQuIikKLQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0U1ZHVGl0bGVFbGVtZW50KCkgewotCQlOb2RlTGlzdCBubCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLAotCQkJCSIuLypbKG5hbWVzcGFjZS11cmkoKT0nIiArIFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgU1ZHQ29uc3RhbnRzLkVMRU1FTlRfVElUTEUKLQkJCQkJCSsgIicpXSIpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA9PSAxKSkKLQkJCXJldHVybiAoVGl0bGVFbGVtZW50KSBubC5pdGVtKDApOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDEpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkiZHJhd2luZyBvYmplY3QgaGFzIG1vcmUgdGhhbiBvbmUgc3ZnOnRpdGxlIGVsZW1lbnRzLiIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRGVzY0VsZW1lbnQgZ2V0U1ZHRGVzY0VsZW1lbnQoKSB7Ci0JCU5vZGVMaXN0IG5sID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHRoaXMsCi0JCQkJIi4vKlsobmFtZXNwYWNlLXVyaSgpPSciICsgU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBTVkdDb25zdGFudHMuRUxFTUVOVF9ERVNDCi0JCQkJCQkrICInKV0iKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPT0gMSkpCi0JCQlyZXR1cm4gKERlc2NFbGVtZW50KSBubC5pdGVtKDApOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDEpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkiZHJhd2luZyBvYmplY3QgaGFzIG1vcmUgdGhhbiBvbmUgc3ZnOmRlc2MgZWxlbWVudHMuIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExOTUxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLkRlc2NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuVGl0bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNlcXVlbmNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgZXh0ZW5kcwotCQlEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci0KLQlwcm90ZWN0ZWQgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgRnJhbWVFbGVtZW50IGdldEZyYW1lRWxlbWVudCgpIHsKLQkJT0RGRWxlbWVudCBwYXJlbnQgPSAoT0RGRWxlbWVudCkgdGhpcy5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBGcmFtZUVsZW1lbnQpIHsKLQkJCXJldHVybiAoRnJhbWVFbGVtZW50KSBwYXJlbnQ7Ci0JCX0gZWxzZSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkicGFyZW50IG9mIGVtYmVkIG9iamVjdCBlbGVtZW50IHNob3VsZCBiZSBkcmF3OmZyYW1lIGVsZW1lbnQuIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0U1ZHVGl0bGVFbGVtZW50KCkgewotCQlGcmFtZUVsZW1lbnQgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoKTsKLQkJaWYgKGZyYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZyYW1lLmdldFNWR1RpdGxlRWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyBEZXNjRWxlbWVudCBnZXRTVkdEZXNjRWxlbWVudCgpIHsKLQkJRnJhbWVFbGVtZW50IGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KCk7Ci0JCWlmIChmcmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmcmFtZS5nZXRTVkdEZXNjRWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyBTZXF1ZW5jZUVsZW1lbnQgZ2V0VGV4dFNlcXVlbmNlRWxlbWVudCgpIHsKLQkJRnJhbWVFbGVtZW50IGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KCk7Ci0JCWlmIChmcmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QoZnJhbWUsCi0JCQkJIi4uLypbbmFtZXNwYWNlLXVyaSgpPSciICsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VRVUVOQ0UgKyAiJ10iKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPT0gMSkpCi0JCQlyZXR1cm4gKFNlcXVlbmNlRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAxKSkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJImRyYXc6aW1hZ2UgaGFzIG1vcmUgdGhhbiBvbmUgdGV4dDpzZXF1ZW5jZSBlbGVtZW50cy4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkF0dHJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZBdHRySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTlhZWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkF0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotCi0KLWNsYXNzIE9ERkF0dHJJbXBsIGV4dGVuZHMgT0RGTm9kZUltcGwgaW1wbGVtZW50cyBPREZBdHRyIHsKLQotCXB1YmxpYyBPREZBdHRySW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEF0dHIgaUF0dHIpIHsKLQkJc3VwZXIob2RmRG9jLCBpQXR0cik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKChBdHRyKSBpTm9kZSkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldE93bmVyRWxlbWVudCgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgQXR0cikgewotCQkJRWxlbWVudCBpT3duZXIgPSAoKEF0dHIpIGlOb2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCWlmIChpT3duZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJcmV0dXJuIChFbGVtZW50KSBvZGZEb2MuZ2V0T0RGTm9kZShpT3duZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUeXBlSW5mbyBnZXRTY2hlbWFUeXBlSW5mbygpIHsKLQkJcmV0dXJuICgoQXR0cikgaU5vZGUpLmdldFNjaGVtYVR5cGVJbmZvKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BlY2lmaWVkKCkgewotCQlyZXR1cm4gKChBdHRyKSBpTm9kZSkuZ2V0U3BlY2lmaWVkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuICgoQXR0cikgaU5vZGUpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKLQkJcmV0dXJuICgoQXR0cikgaU5vZGUpLmlzSWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkoKEF0dHIpIGlOb2RlKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQ2hhcmFjdGVyRGF0YUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkNoYXJhY3RlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzRhZDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQ2hhcmFjdGVyRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZDaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBPREZDaGFyYWN0ZXJEYXRhSW1wbCBleHRlbmRzIE9ERk5vZGVJbXBsIGltcGxlbWVudHMKLQkJT0RGQ2hhcmFjdGVyRGF0YSB7Ci0KLQlwdWJsaWMgT0RGQ2hhcmFjdGVyRGF0YUltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLAotCQkJQ2hhcmFjdGVyRGF0YSBpbm5lckNoYXJhY3RlckRhdGEpIHsKLQkJc3VwZXIob2RmRG9jLCBpbm5lckNoYXJhY3RlckRhdGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHsKLQkJCSgoQ2hhcmFjdGVyRGF0YSkgaU5vZGUpLmFwcGVuZERhdGEoYXJnKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJKChDaGFyYWN0ZXJEYXRhKSBpTm9kZSkuZGVsZXRlRGF0YShvZmZzZXQsIGNvdW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQlyZXR1cm4gKChDaGFyYWN0ZXJEYXRhKSBpTm9kZSkuZ2V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQlyZXR1cm4gKChDaGFyYWN0ZXJEYXRhKSBpTm9kZSkuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJKChDaGFyYWN0ZXJEYXRhKSBpTm9kZSkuaW5zZXJ0RGF0YShvZmZzZXQsIGFyZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBhcmcpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJKChDaGFyYWN0ZXJEYXRhKSBpTm9kZSkucmVwbGFjZURhdGEob2Zmc2V0LCBjb3VudCwgYXJnKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQkoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5zZXREYXRhKGRhdGEpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBzdWJzdHJpbmdEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHsKLQkJCXJldHVybiAoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5zdWJzdHJpbmdEYXRhKG9mZnNldCwgY291bnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkNvbW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZDb21tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI2Nzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkNvbW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotCi0KLXB1YmxpYyBjbGFzcyBPREZDb21tZW50SW1wbCBleHRlbmRzIE9ERkNoYXJhY3RlckRhdGFJbXBsIGltcGxlbWVudHMgT0RGQ29tbWVudCB7Ci0JcHVibGljIE9ERkNvbW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgQ29tbWVudCBpbm5lckNvbW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBpbm5lckNvbW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkRvY3VtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGIyYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbC5DaGFydE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuaW1wbC5EcjNkTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsLkRyYXdOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGwuRm9ybU5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuTnVtYmVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuaW1wbC5OdW1iZXJOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50Q29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudFN0eWxlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5PZmZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsLk9mZmljZU5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uUHJlc2VudGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uaW1wbC5QcmVzZW50YXRpb25Ob2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGwuU3R5bGVOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLmltcGwuU1ZHTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsLlRhYmxlTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsLlRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgT0RGRG9jdW1lbnRJbXBsIGV4dGVuZHMgT0RGTm9kZUltcGwgaW1wbGVtZW50cyBPREZEb2N1bWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gZmFjdG9yeU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0Jc3RhdGljIHsKLQkJZmFjdG9yeU1hcC5wdXQoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydE5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksIERyM2ROb2RlRmFjdG9yeS5jbGFzcyk7Ci0JCWZhY3RvcnlNYXAucHV0KERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Tm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwgRm9ybU5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCU51bWJlck5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZU5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCVByZXNlbnRhdGlvbk5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZU5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZU5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksIFRleHROb2RlRmFjdG9yeS5jbGFzcyk7Ci0JCWZhY3RvcnlNYXAucHV0KFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHTm9kZUZhY3RvcnkuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWFwPE5vZGUsIE9ERk5vZGU+IGludGVybmFsTm9kZU1hcCA9IG5ldyBIYXNoTWFwPE5vZGUsIE9ERk5vZGU+KCk7Ci0KLQlwcml2YXRlIFN0cmluZyBzVXJsID0gbnVsbDsKLQotCXByaXZhdGUgT0RGRG9jdW1lbnQgc3R5bGVEb2MgPSBudWxsOwotCi0JcHVibGljIE9ERkRvY3VtZW50SW1wbChEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQkJaW50ZXJuYWxOb2RlTWFwLnB1dChkb2MsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBOb2RlIGFkb3B0Tm9kZShOb2RlIHNvdXJjZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuY3JlYXRlQ0RBVEFTZWN0aW9uKGRhdGEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tZW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIGRhdGEpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuY3JlYXRlQ29tbWVudChkYXRhKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuIChFbGVtZW50KSBnZXRPREZOb2RlKCgoRG9jdW1lbnQpIGlOb2RlKQotCQkJCQkuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudE5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGdldE9ERk5vZGUoKChEb2N1bWVudCkgaU5vZGUpLmNyZWF0ZUVsZW1lbnROUygKLQkJCQkJbmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVudGl0eVJlZmVyZW5jZSBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuY3JlYXRlRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsCi0JCQlTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudCkgaU5vZGUpLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlUZXh0IGlUZXh0ID0gKChEb2N1bWVudCkgaU5vZGUpLmNyZWF0ZVRleHROb2RlKGRhdGEpOwotCQkJcmV0dXJuIChUZXh0KSBnZXRPREZOb2RlKGlUZXh0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGdldERvY3R5cGUoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudCkgaU5vZGUpLmdldERvY3R5cGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlFbGVtZW50IGlFbGVtID0gKChEb2N1bWVudCkgaU5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJaWYgKGlFbGVtID09IG51bGwpCi0JCQkJcmV0dXJuIGlFbGVtOwotCQkJcmV0dXJuIChFbGVtZW50KSBnZXRPREZOb2RlKGlFbGVtKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VVJJKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXREb2N1bWVudFVSSSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBET01Db25maWd1cmF0aW9uIGdldERvbUNvbmZpZygpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuZ2V0RG9tQ29uZmlnKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGVsZW1lbnRJZCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJRWxlbWVudCBpRWxlbSA9ICgoRG9jdW1lbnQpIGlOb2RlKS5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpOwotCQkJaWYgKGlFbGVtID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGdldE9ERk5vZGUoaUVsZW0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnbmFtZSkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJTm9kZUxpc3QgaU5vZGVMaXN0ID0gKChEb2N1bWVudCkgaU5vZGUpCi0JCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWduYW1lKTsKLQkJCWlmIChpTm9kZUxpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgT0RGTm9kZUxpc3RJbXBsKHRoaXMsIGlOb2RlTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJTm9kZUxpc3QgaU5vZGVMaXN0ID0gKChEb2N1bWVudCkgaU5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJCW5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJCWlmIChpTm9kZUxpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgT0RGTm9kZUxpc3RJbXBsKHRoaXMsIGlOb2RlTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERPTUltcGxlbWVudGF0aW9uIGdldEltcGxlbWVudGF0aW9uKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRFbmNvZGluZygpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuZ2V0SW5wdXRFbmNvZGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudCkgaU5vZGUpLmdldFN0cmljdEVycm9yQ2hlY2tpbmcoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuZ2V0WG1sRW5jb2RpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRYbWxTdGFuZGFsb25lKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXRYbWxTdGFuZGFsb25lKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuZ2V0WG1sVmVyc2lvbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBpbXBvcnRlZE5vZGUsIGJvb2xlYW4gZGVlcCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9ybWFsaXplRG9jdW1lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBOb2RlIHJlbmFtZU5vZGUoTm9kZSBuLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50VVJJKFN0cmluZyBkb2N1bWVudFVSSSkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJKChEb2N1bWVudCkgaU5vZGUpLnNldERvY3VtZW50VVJJKGRvY3VtZW50VVJJKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmljdEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBzdHJpY3RFcnJvckNoZWNraW5nKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQkoKERvY3VtZW50KSBpTm9kZSkuc2V0U3RyaWN0RXJyb3JDaGVja2luZyhzdHJpY3RFcnJvckNoZWNraW5nKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhtbFN0YW5kYWxvbmUoYm9vbGVhbiB4bWxTdGFuZGFsb25lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCSgoRG9jdW1lbnQpIGlOb2RlKS5zZXRYbWxTdGFuZGFsb25lKHhtbFN0YW5kYWxvbmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQkoKERvY3VtZW50KSBpTm9kZSkuc2V0WG1sVmVyc2lvbih4bWxWZXJzaW9uKTsKLQkJfQotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIE9ERkRvY3VtZW50IGltcGxlbWVudGF0aW9uCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlwcml2YXRlIE1ldGhvZCBmaW5kQ3JlYXRlRWxlbWVudE1ldGhvZChDbGFzcyBjcykgewotCQlNZXRob2RbXSBtZXRob2RzID0gY3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJjcmVhdGVFbGVtZW50Ii5lcXVhbHMobWV0aG9kc1tpXS5nZXROYW1lKCkpKSB7Ci0JCQkJQ2xhc3NbXSBwYXJtcyA9IG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQlpZiAocGFybXMubGVuZ3RoID09IDMgJiYgcGFybXNbMF0uZXF1YWxzKE9ERkRvY3VtZW50LmNsYXNzKQotCQkJCQkJJiYgcGFybXNbMV0uZXF1YWxzKFN0cmluZy5jbGFzcykKLQkJCQkJCSYmIHBhcm1zWzJdLmVxdWFscyhFbGVtZW50LmNsYXNzKSkgewotCQkJCQlyZXR1cm4gbWV0aG9kc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9ERk5vZGUgZ2V0T0RGTm9kZShOb2RlIG5vZGUpIHsKLQkJT0RGTm9kZSByZXN1bHQgPSBpbnRlcm5hbE5vZGVNYXAuZ2V0KG5vZGUpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCUNsYXNzIGZhY3RvcnkgPSBmYWN0b3J5TWFwLmdldChub2RlLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJTWV0aG9kIGNyZWF0ZUVsZW1NZXRob2QgPSBmaW5kQ3JlYXRlRWxlbWVudE1ldGhvZChmYWN0b3J5KTsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQgPSAoT0RGTm9kZSkgY3JlYXRlRWxlbU1ldGhvZC5pbnZva2UoZmFjdG9yeSwKLQkJCQkJCQluZXcgT2JqZWN0W10geyB0aGlzLCBub2RlLmdldExvY2FsTmFtZSgpLAotCQkJCQkJCQkJKEVsZW1lbnQpIG5vZGUgfSk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlyZXN1bHQgPSBuZXcgT0RGRWxlbWVudEltcGwodGhpcywgKEVsZW1lbnQpIG5vZGUpOwotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQXR0cikgewotCQkJCXJlc3VsdCA9IG5ldyBPREZBdHRySW1wbCh0aGlzLCAoQXR0cikgbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJcmVzdWx0ID0gbmV3IE9ERlRleHRJbXBsKHRoaXMsIChUZXh0KSBub2RlKTsKLQkJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCQlyZXN1bHQgPSBuZXcgT0RGQ29tbWVudEltcGwodGhpcywgKENvbW1lbnQpIG5vZGUpOwotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJCXJlc3VsdCA9IG5ldyBPREZDaGFyYWN0ZXJEYXRhSW1wbCh0aGlzLCAoQ2hhcmFjdGVyRGF0YSkgbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLQkJCQlyZXN1bHQgPSBuZXcgT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCh0aGlzLAotCQkJCQkJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IG5ldyBPREZOb2RlSW1wbCh0aGlzLCBub2RlKTsKLQkJCX0KLQkJfQotCQlpbnRlcm5hbE5vZGVNYXAucHV0KG5vZGUsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiBzVXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgc1VybCkgewotCQl0aGlzLnNVcmwgPSBzVXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9ERlZlcnNpb24oZG91YmxlIHZlcnNpb24pIHsKLQkJRWxlbWVudCByb290ID0gdGhpcy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJcm9vdC5zZXRBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkVSU0lPTiwgbmV3IERvdWJsZSh2ZXJzaW9uKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldE9ERlZlcnNpb24oKSB7Ci0JCUVsZW1lbnQgcm9vdCA9IHRoaXMuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgcm9vdCkuZ2V0QXR0ck9mZmljZVZlcnNpb24oKTsKLQkJfSBlbHNlIGlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRTdHlsZXNFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudFN0eWxlc0VsZW1lbnQpIHJvb3QpLmdldEF0dHJPZmZpY2VWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIC0xLjA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGVEb2N1bWVudChPREZEb2N1bWVudCBzdHlsZURvYykgewotCQl0aGlzLnN0eWxlRG9jID0gc3R5bGVEb2M7Ci0JfQotCi0JcHVibGljIE9ERkRvY3VtZW50IGdldFN0eWxlRG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLnN0eWxlRG9jOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwZTNkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudFN0eWxlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVHlwZUluZm87Ci0KLQotcHVibGljIGNsYXNzIE9ERkVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGTm9kZUltcGwgaW1wbGVtZW50cyBPREZFbGVtZW50LAotCQlTZXJpYWxpemFibGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NTc5NjUyMzc2OTM4NTc3Mjk2TDsKLQotCXB1YmxpYyBPREZFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgaUVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBpRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE9ERkVsZW1lbnQgZmluZEVsZW1lbnRCeUF0dHJWYWx1ZShTdHJpbmcgZWxlbU5hbWVzcGFjZVVSSSwKLQkJCVN0cmluZyBlbGVtTG9jYWxOYW1lLCBTdHJpbmcgYXR0ck5hbWVzcGFjZVVSSSwKLQkJCVN0cmluZyBhdHRyTG9jYWxOYW1lLCBTdHJpbmcgYXR0clZhbHVlKSB7Ci0JCUVsZW1lbnQgcm9vdCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3Qocm9vdCwKLQkJCQkiLi8vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBlbGVtTmFtZXNwYWNlVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBlbGVtTG9jYWxOYW1lICsgIiddIgotCQkJCQkJKyAiW2F0dHJpYnV0ZTo6KltuYW1lc3BhY2UtdXJpKCk9JyIgKyBhdHRyTmFtZXNwYWNlVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBhdHRyTG9jYWxOYW1lICsgIiddPSciCi0JCQkJCQkrIGF0dHJWYWx1ZSArICInXSIpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJcmV0dXJuIChPREZFbGVtZW50KSBubC5pdGVtKDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPREZFbGVtZW50IGZpbmRFbGVtZW50QnlBdHRyVmFsdWVGcm9tU3R5bGVEb2MoCi0JCQlTdHJpbmcgZWxlbU5hbWVzcGFjZVVSSSwgU3RyaW5nIGVsZW1Mb2NhbE5hbWUsCi0JCQlTdHJpbmcgYXR0ck5hbWVzcGFjZVVSSSwgU3RyaW5nIGF0dHJMb2NhbE5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIHsKLQkJT0RGRG9jdW1lbnQgc3R5bGVEb2MgPSAoKE9ERkRvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpCi0JCQkJLmdldFN0eWxlRG9jdW1lbnQoKTsKLQkJaWYgKHN0eWxlRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudCBzdHlsZVJvb3QgPSBzdHlsZURvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKChzdHlsZVJvb3QgIT0gbnVsbCkgJiYgKHN0eWxlUm9vdCBpbnN0YW5jZW9mIERvY3VtZW50U3R5bGVzRWxlbWVudCkpIHsKLQkJCXJldHVybiAoKE9ERkVsZW1lbnRJbXBsKSBzdHlsZVJvb3QpLmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJCWVsZW1OYW1lc3BhY2VVUkksIGVsZW1Mb2NhbE5hbWUsIGF0dHJOYW1lc3BhY2VVUkksCi0JCQkJCWF0dHJMb2NhbE5hbWUsIGF0dHJWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmdldEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUF0dHIgaUF0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQkJaWYgKGlBdHRyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiAoQXR0cikgb2RmRG9jLmdldE9ERk5vZGUoaUF0dHIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUF0dHIgaUF0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLAotCQkJCQlsb2NhbE5hbWUpOwotCQkJaWYgKGlBdHRyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiAoQXR0cikgb2RmRG9jLmdldE9ERk5vZGUoaUF0dHIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlOb2RlTGlzdCBpTm9kZUxpc3QgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKLQkJCXJldHVybiBuZXcgT0RGTm9kZUxpc3RJbXBsKG9kZkRvYywgaU5vZGVMaXN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCU5vZGVMaXN0IGlOb2RlTGlzdCA9ICgoRWxlbWVudCkgaU5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJCW5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJCXJldHVybiBuZXcgT0RGTm9kZUxpc3RJbXBsKG9kZkRvYywgaU5vZGVMaXN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIGlOb2RlKS5nZXRTY2hlbWFUeXBlSW5mbygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmdldFRhZ05hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmhhc0F0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBpTm9kZSkuaGFzQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkoKEVsZW1lbnQpIGlOb2RlKS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgaU5vZGUpLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciBvbGRBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQXR0ciBpUmVtb3ZlZEF0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKG9sZEF0dHIpOwotCQkJb2RmRG9jLmdldE9ERk5vZGUoaVJlbW92ZWRBdHRyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCSgoRWxlbWVudCkgaU5vZGUpLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JCUF0dHIgaU5ld0F0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCi0JCWlmIChpTmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlvZGZEb2MuZ2V0T0RGTm9kZShpTmV3QXR0cik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLQkJCVN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCSgoRWxlbWVudCkgaU5vZGUpLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpOwotCQlBdHRyIGlOZXdBdHRyID0gKChFbGVtZW50KSBpTm9kZSkuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwKLQkJCQlxdWFsaWZpZWROYW1lKTsKLQotCQlpZiAoaU5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJb2RmRG9jLmdldE9ERk5vZGUoaU5ld0F0dHIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgJiYgKG5ld0F0dHIgaW5zdGFuY2VvZiBPREZOb2RlSW1wbCkpIHsKLQkJCU5vZGUgaU5ld0F0dHIgPSAoKE9ERk5vZGVJbXBsKSBuZXdBdHRyKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCWlmIChpTmV3QXR0ciBpbnN0YW5jZW9mIEF0dHIpIHsKLQkJCQl0cnkgewotCQkJCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBpTmV3QXR0cik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaU5ld0F0dHIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIChBdHRyKSBvZGZEb2MuZ2V0T0RGTm9kZShpTmV3QXR0cik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZU5TKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRJZEF0dHJpYnV0ZShuYW1lLCBpc0lkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRJZEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBpc0lkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlOb2RlIGludGVybmFsSWRBdHRyID0gKChPREZOb2RlSW1wbCkgaWRBdHRyKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJaWYgKChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIChpbnRlcm5hbElkQXR0ciBpbnN0YW5jZW9mIEF0dHIpKSB7Ci0JCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRJZEF0dHJpYnV0ZU5vZGUoKEF0dHIpIGludGVybmFsSWRBdHRyLCBpc0lkKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZOYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZOYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2U5ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgT0RGTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIE9ERk5hbWVkTm9kZU1hcCB7Ci0JcHJvdGVjdGVkIE9ERkRvY3VtZW50SW1wbCBvZGZEb2MgPSBudWxsOwotCi0JcHJpdmF0ZSBOYW1lZE5vZGVNYXAgaUF0dHJzOwotCi0JcHVibGljIE9ERk5hbWVkTm9kZU1hcEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBOYW1lZE5vZGVNYXAgaUF0dHJzKSB7Ci0JCXRoaXMub2RmRG9jID0gKE9ERkRvY3VtZW50SW1wbCkgb2RmRG9jOwotCQl0aGlzLmlBdHRycyA9IGlBdHRyczsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLml0ZW0oaW5kZXgpOwotCQlpZiAoaU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaU5vZGUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gaUF0dHJzLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJaWYgKGlOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG9kZkRvYy5nZXRPREZOb2RlKGlOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJTm9kZSBpTm9kZSA9IGlBdHRycy5zZXROYW1lZEl0ZW0obm9kZSk7Ci0JCWlmIChpTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJTm9kZSBpTm9kZSA9IGlBdHRycy5yZW1vdmVOYW1lZEl0ZW0obmFtZSk7Ci0JCWlmIChpTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJaWYgKGlOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG9kZkRvYy5nZXRPREZOb2RlKGlOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIG5vZGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLnNldE5hbWVkSXRlbU5TKG5vZGUpOwotCQlpZiAoaU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaU5vZGUpOwotCX0KLQotCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJTm9kZSBpTm9kZSA9IGlBdHRycy5yZW1vdmVOYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0JCWlmIChpTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERk5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzE5MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLWNsYXNzIE9ERk5vZGVJbXBsIGltcGxlbWVudHMgT0RGTm9kZSB7Ci0JcHJvdGVjdGVkIE9ERkRvY3VtZW50SW1wbCBvZGZEb2MgPSBudWxsOwotCi0JcHJvdGVjdGVkIE5vZGUgaU5vZGUgPSBudWxsOwotCi0JLy8gY29uc3RydWN0dXJlIGZvciBPREZEb2N1bWVudEltcGwKLQlwcm90ZWN0ZWQgT0RGTm9kZUltcGwoTm9kZSBpTm9kZSkgewotCQl0aGlzLm9kZkRvYyA9IChPREZEb2N1bWVudEltcGwpIHRoaXM7Ci0JCXRoaXMuaU5vZGUgPSBpTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT0RGTm9kZUltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBOb2RlIGlOb2RlKSB7Ci0JCXRoaXMub2RmRG9jID0gKE9ERkRvY3VtZW50SW1wbCkgb2RmRG9jOwotCQl0aGlzLmlOb2RlID0gaU5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0SW50ZXJuYWxOb2RlKCkgewotCQlyZXR1cm4gaU5vZGU7Ci0JfQotCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSB7Ci0JCQlOb2RlIGlOZXdDaGlsZCA9ICgoT0RGTm9kZUltcGwpIG5ld0NoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaVJlc3VsdE5vZGUgPSBpTm9kZS5hcHBlbmRDaGlsZChpTmV3Q2hpbGQpOwotCQkJcmV0dXJuIG5ldyBPREZOb2RlSW1wbChvZGZEb2MsIGlSZXN1bHROb2RlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgaUNsb25lTm9kZSA9IGlOb2RlLmNsb25lTm9kZShkZWVwKTsKLQkJaWYgKGlDbG9uZU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpQ2xvbmVOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSB7Ci0JCQlOb2RlIGlPdGhlciA9ICgoT0RGTm9kZUltcGwpIG90aGVyKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCXJldHVybiBpTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpT3RoZXIpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTmFtZWROb2RlTWFwIGlBdHRycyA9IGlOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGlBdHRycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgT0RGTmFtZWROb2RlTWFwSW1wbChvZGZEb2MsIGlBdHRycyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQlyZXR1cm4gaU5vZGUuZ2V0QmFzZVVSSSgpOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gbmV3IE9ERk5vZGVMaXN0SW1wbChvZGZEb2MsIGlOb2RlLmdldENoaWxkTm9kZXMoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGlGaXJzdENoaWxkID0gaU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoaUZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpRmlyc3RDaGlsZCk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGlMYXN0Q2hpbGQgPSBpTm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGlMYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTGFzdENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJcmV0dXJuIGlOb2RlLmdldExvY2FsTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gaU5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgaU5leHRTaWJsaW5nID0gaU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKGlOZXh0U2libGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIG9kZkRvYy5nZXRPREZOb2RlKGlOZXh0U2libGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGlOb2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gaU5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBvZGZEb2M7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJTm9kZSBpUGFyZW50ID0gaU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoaVBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpUGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIGlOb2RlLmdldFByZWZpeCgpOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBpUHJldmlvdXNTaWJsaW5nID0gaU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWlmIChpUHJldmlvdXNTaWJsaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaVByZXZpb3VzU2libGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaU5vZGUuZ2V0VGV4dENvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGlOb2RlLmdldFVzZXJEYXRhKGtleSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGlOb2RlLmhhc0F0dHJpYnV0ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gaU5vZGUuaGFzQ2hpbGROb2RlcygpOwotCX0KLQotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKChuZXdDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKQotCQkJCSYmIChyZWZDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSkgewotCQkJTm9kZSBpTmV3Q2hpbGQgPSAoKE9ERk5vZGVJbXBsKSBuZXdDaGlsZCkuZ2V0SW50ZXJuYWxOb2RlKCk7Ci0JCQlOb2RlIGlSZWZDaGlsZCA9ICgoT0RGTm9kZUltcGwpIHJlZkNoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaUluc2VydGVkQ2hpbGQgPSBpTm9kZS5pbnNlcnRCZWZvcmUoaU5ld0NoaWxkLCBpUmVmQ2hpbGQpOwotCQkJaWYgKGlJbnNlcnRlZENoaWxkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaUluc2VydGVkQ2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXJldHVybiBpTm9kZS5pc0RlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQlpZiAoYXJnIGluc3RhbmNlb2YgT0RGTm9kZUltcGwpIHsKLQkJCU5vZGUgaWFyZyA9ICgoT0RGTm9kZUltcGwpIGFyZykuZ2V0SW50ZXJuYWxOb2RlKCk7Ci0JCQlyZXR1cm4gaU5vZGUuaXNFcXVhbE5vZGUoaWFyZyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBPREZOb2RlSW1wbCkgewotCQkJTm9kZSBpb3RoZXIgPSAoKE9ERk5vZGVJbXBsKSBvdGhlcikuZ2V0SW50ZXJuYWxOb2RlKCk7Ci0JCQlyZXR1cm4gaU5vZGUuaXNTYW1lTm9kZShpb3RoZXIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGlOb2RlLmlzU3VwcG9ydGVkKGZlYXR1cmUsIHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIGlOb2RlLmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJcmV0dXJuIGlOb2RlLmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChvbGRDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSB7Ci0JCQlOb2RlIGlPbGRDaGlsZCA9ICgoT0RGTm9kZUltcGwpIG9sZENoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaVJlbW92ZWRDaGlsZCA9IGlOb2RlLnJlbW92ZUNoaWxkKGlPbGRDaGlsZCk7Ci0JCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaVJlbW92ZWRDaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoKG5ld0NoaWxkIGluc3RhbmNlb2YgT0RGTm9kZUltcGwpCi0JCQkJJiYgKG9sZENoaWxkIGluc3RhbmNlb2YgT0RGTm9kZUltcGwpKSB7Ci0JCQlOb2RlIGlOZXdDaGlsZCA9ICgoT0RGTm9kZUltcGwpIG5ld0NoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaU9sZENoaWxkID0gKChPREZOb2RlSW1wbCkgb2xkQ2hpbGQpLmdldEludGVybmFsTm9kZSgpOwotCQkJTm9kZSBpUmVwbGFjZWRDaGlsZCA9IGlOb2RlLnJlcGxhY2VDaGlsZChpTmV3Q2hpbGQsIGlPbGRDaGlsZCk7Ci0JCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaVJlcGxhY2VkQ2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaU5vZGUuc2V0Tm9kZVZhbHVlKG5vZGVWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpTm9kZS5zZXRQcmVmaXgocHJlZml4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpTm9kZS5zZXRUZXh0Q29udGVudCh0ZXh0Q29udGVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBzZXRVc2VyRGF0YShTdHJpbmcga2V5LCBPYmplY3QgZGF0YSwgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERk5vZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODgzNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBPREZOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBPREZOb2RlTGlzdCB7Ci0JcHJpdmF0ZSBPREZEb2N1bWVudEltcGwgb3duZXI7Ci0KLQlwcml2YXRlIE5vZGVMaXN0IGlOb2RlTGlzdDsKLQotCXB1YmxpYyBPREZOb2RlTGlzdEltcGwoT0RGRG9jdW1lbnRJbXBsIG93bmVyLCBOb2RlTGlzdCBpTm9kZUxpc3QpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmlOb2RlTGlzdCA9IGlOb2RlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlOb2RlIGlOb2RlID0gaU5vZGVMaXN0Lml0ZW0oaW5kZXgpOwotCQlpZiAoaU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gb3duZXIuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBpTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYxNWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBleHRlbmRzIE9ERk5vZGVJbXBsIGltcGxlbWVudHMKLQkJT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uIHsKLQotCXB1YmxpYyBPREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBpbm5lclByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotCQlzdXBlcihvZGZEb2MsIGlubmVyUHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotCQkJcmV0dXJuICgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBpTm9kZSkuZ2V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLQkJCXJldHVybiAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgaU5vZGUpLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIHMpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLQkJCSgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBpTm9kZSkuc2V0RGF0YShzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGU3R5bGFibGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGU3R5bGFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDcxOGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlN0eWxhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci0JcHJvdGVjdGVkIE9ERlN0eWxhYmxlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZUVsZW1lbnQgc3R5bGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlRleHRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZUZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU0ZGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1jbGFzcyBPREZUZXh0SW1wbCBleHRlbmRzIE9ERkNoYXJhY3RlckRhdGFJbXBsIGltcGxlbWVudHMgT0RGVGV4dCB7Ci0KLQlwdWJsaWMgT0RGVGV4dEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBUZXh0IGlubmVyVGV4dCkgewotCQlzdXBlcihvZGZEb2MsIGlubmVyVGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaG9sZVRleHQoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCXJldHVybiAoKFRleHQpIGlOb2RlKS5nZXRXaG9sZVRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJcmV0dXJuICgoVGV4dCkgaU5vZGUpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBUZXh0IHJlcGxhY2VXaG9sZVRleHQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQlyZXR1cm4gKChUZXh0KSBpTm9kZSkucmVwbGFjZVdob2xlVGV4dChjb250ZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCXJldHVybiAoKFRleHQpIGlOb2RlKS5zcGxpdFRleHQob2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0F4aXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0F4aXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzc4NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9BeGlzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBBeGlzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnREaW1lbnNpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0TmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2F0ZWdvcmllc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2F0ZWdvcmllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNjgzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NhdGVnb3JpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIENhdGVnb3JpZXNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVDZWxsUmFuZ2VBZGRyZXNzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9DaGFydENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9DaGFydENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQwOWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2hhcnRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDaGFydENvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQ0hBUlRfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmNoYXJ0OjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NIQVJUID0gImNoYXJ0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVElUTEUgPSAidGl0bGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MRUdFTkQgPSAibGVnZW5kIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUExPVF9BUkVBID0gInBsb3QtYXJlYSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FYSVMgPSAiYXhpcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NBVEVHT1JJRVMgPSAiY2F0ZWdvcmllcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0dSSUQgPSAiZ3JpZCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NFUklFUyA9ICJzZXJpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9EQVRBX1BPSU5UID0gImRhdGEtcG9pbnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TVE9DS19HQUlOX01BUktFUiA9ICJzdG9jay1nYWluLW1hcmtlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NUT0NLX0xPU1NfTUFSS0VSID0gInN0b2NrLWxvc3MtbWFya2VyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU1RPQ0tfUkFOR0VfTElORSA9ICJzdG9jay1yYW5nZS1saW5lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfV0FMTCA9ICJ3YWxsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRkxPT1IgPSAiZmxvb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESU1FTlNJT04gPSAiZGltZW5zaW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRVBFQVRFRCA9ICJyZXBlYXRlZCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0xFR0VORF9QT1NJVElPTiA9ICJsZWdlbmQtcG9zaXRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9EQVRBX1NPVVJDRV9IQVNfTEFCRUxTID0gImRhdGEtc291cmNlLWhhcy1sYWJlbHMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQUJMRV9OVU1CRVJfTElTVCA9ICJ0YWJsZS1udW1iZXItbGlzdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUWUxFX05BTUUgPSAic3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0pBUEFORVNFX0NBTkRMRV9TVElDSyA9ICJqYXBhbmVzZS1jYW5kbGUtc3RpY2siOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVE9DS19XSVRIX1ZPTFVNRSA9ICJzdG9jay13aXRoLXZvbHVtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RIUkVFX0RJTUVOU0lPTkFMID0gInRocmVlLWRpbWVuc2lvbmFsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfREVFUCA9ICJkZWVwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTElORVMgPSAibGluZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9JTlRFUlBPTEFUSU9OID0gImludGVycG9sYXRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWU1CT0xfVFlQRSA9ICJzeW1ib2wtdHlwZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlRJQ0FMID0gInZlcnRpY2FsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTElORVNfVVNFRCA9ICJsaW5lcy11c2VkIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ09OTkVDVF9CQVJTID0gImNvbm5lY3QtYmFycyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NFUklFU19TT1VSQ0UgPSAic2VyaWVzLXNvdXJjZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01FQU5fVkFMVUUgPSAibWVhbi12YWx1ZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VSUk9SX01BUkdJTiA9ICJlcnJvci1tYXJnaW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FUlJPUl9MT1dFUl9MSU1JVCA9ICJlcnJvci1sb3dlci1saW1pdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VSUk9SX1VQUEVSX0xJTUlUID0gImVycm9yLXVwcGVyLWxpbWl0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRVJST1JfQ0FURUdPUlkgPSAiZXJyb3ItY2F0ZWdvcnkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FUlJPUl9QRVJDRU5UQUdFID0gImVycm9yLXBlcmNlbnRhZ2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRUdSRVNTSU9OX1RZUEUgPSAicmVncmVzc2lvbi10eXBlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfREFUQV9MQUJFTF9OVU1CRVIgPSAiZGF0YS1sYWJlbC1udW1iZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9EQVRBX0xBQkVMX1RFWFQgPSAiZGF0YS1sYWJlbC10ZXh0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfREFUQV9MQUJFTF9TWU1CT0wgPSAiZGF0YS1sYWJlbC1zeW1ib2wiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZX0xBQkVMID0gImRpc3BsYXktbGFiZWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9USUNLX01BUktTX01BSk9SX0lOTkVSID0gInRpY2stbWFya3MtbWFqb3ItaW5uZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9USUNLX01BUktTX01BSk9SX09VVEVSID0gInRpY2stbWFya3MtbWFqb3Itb3V0ZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MT0dBUklUSE1JQyA9ICJsb2dhcml0aG1pYyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RFWFRfT1ZFUkxBUCA9ICJ0ZXh0LW92ZXJsYXAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQUJFTF9BUlJBTkdFTUVOVCA9ICJsYWJlbC1hcnJhbmdlbWVudCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1ZJU0lCTEUgPSAidmlzaWJsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX09SSUdJTiA9ICJvcmlnaW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9HQVBfV0lEVEggPSAiZ2FwLXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfT1ZFUkxBUCA9ICJvdmVybGFwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU09MSURfVFlQRSA9ICJzb2xpZC10eXBlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQVRUQUNIRURfQVhJUyA9ICJhdHRhY2hlZC1heGlzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUlOSU1VTSA9ICJtaW5pbXVtIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUFYSU1VTSA9ICJtYXhpbXVtIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NoYXJ0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9DaGFydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MGZkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NoYXJ0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDaGFydEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1dpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0RhdGFQb2ludEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRGF0YVBvaW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOThiNGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRGF0YVBvaW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBEYXRhUG9pbnRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGludCBnZXRBdHRyQ2hhcnRSZXBlYXRlZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRmxvb3JFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0Zsb29yRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI5N2U2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRmxvb3JFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEZsb29yRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9HcmlkRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9HcmlkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhjNmRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvR3JpZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgR3JpZEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0xlZ2VuZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvTGVnZW5kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJlYzRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvTGVnZW5kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBMZWdlbmRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdYKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdZKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydExlZ2VuZFBvc2l0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9QbG90QXJlYUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvUGxvdEFyZWFFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MWIzM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9QbG90QXJlYUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUGxvdEFyZWFFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUNlbGxSYW5nZUFkZHJlc3MoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0RGF0YVNvdXJjZUhhc0xhYmVscygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRUYWJsZU51bWJlckxpc3QoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1dpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RWcnAoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RWcG4oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RWdXAoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RQcm9qZWN0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkRGlzdGFuY2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RGb2NhbExlbmd0aCgpOwotCi0JcHVibGljIGludCBnZXRBdHRyRHIzZFNoYWRvd1NsYW50KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkU2hhZGVNb2RlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkQW1iaWVudENvbG9yKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyRHIzZExpZ2h0aW5nTW9kZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvU2VyaWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TZXJpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzE2NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TZXJpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcmllc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0QXR0YWNoZWRBeGlzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja0dhaW5NYXJrZXJFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrR2Fpbk1hcmtlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkYWZlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrR2Fpbk1hcmtlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvY2tHYWluTWFya2VyRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja0xvc3NNYXJrZXJFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrTG9zc01hcmtlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlODhlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrTG9zc01hcmtlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvY2tMb3NzTWFya2VyRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja1JhbmdlTGluZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvU3RvY2tSYW5nZUxpbmVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDRkMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja1JhbmdlTGluZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RvY2tSYW5nZUxpbmVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1RpdGxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9UaXRsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmMDRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1RpdGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgVGl0bGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlLCBJRWRpdGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1dhbGxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1dhbGxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDdhNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9XYWxsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBXYWxsRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0F4aXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0F4aXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGYyYTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9BeGlzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5BeGlzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBBeGlzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQXhpc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0ODI5MjQwMzUzNjU2OTcyNzRMOwotCi0JcHJvdGVjdGVkIEF4aXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0RGltZW5zaW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RJTUVOU0lPTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9ESU1FTlNJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydE5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DYXRlZ29yaWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DYXRlZ29yaWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MmUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvQ2F0ZWdvcmllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNhdGVnb3JpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENhdGVnb3JpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ2F0ZWdvcmllc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwMzk0MzEwMTI3ODQ5Mjc3NjhMOwotCi0JcHJvdGVjdGVkIENhdGVnb3JpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlQ2VsbFJhbmdlQWRkcmVzcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9DRUxMX1JBTkdFX0FERFJFU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQ0VMTF9SQU5HRV9BRERSRVNTKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DaGFydEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvQ2hhcnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWZlZDk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DaGFydEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoYXJ0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ2hhcnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NDIyMzQ5NzgzODA2Njk3MjE5TDsKLQotCXByb3RlY3RlZCBDaGFydEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfSEVJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX0hFSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0NoYXJ0Tm9kZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DaGFydE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDcyN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0NoYXJ0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDaGFydE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfQ0hBUlQsIENoYXJ0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfVElUTEUsIFRpdGxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfTEVHRU5ELCBMZWdlbmRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoQ2hhcnRDb25zdGFudHMuRUxFTUVOVF9QTE9UX0FSRUEsIFBsb3RBcmVhRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfQVhJUywgQXhpc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX0NBVEVHT1JJRVMsCi0JCQkJQ2F0ZWdvcmllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX0dSSUQsIEdyaWRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoQ2hhcnRDb25zdGFudHMuRUxFTUVOVF9TRVJJRVMsIFNlcmllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX0RBVEFfUE9JTlQsCi0JCQkJRGF0YVBvaW50RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfU1RPQ0tfR0FJTl9NQVJLRVIsCi0JCQkJU3RvY2tHYWluTWFya2VyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfU1RPQ0tfTE9TU19NQVJLRVIsCi0JCQkJU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfU1RPQ0tfUkFOR0VfTElORSwKLQkJCQlTdG9ja1JhbmdlTGluZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX1dBTEwsIFdhbGxFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoQ2hhcnRDb25zdGFudHMuRUxFTUVOVF9GTE9PUiwgRmxvb3JFbGVtZW50SW1wbC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoT0RGRG9jdW1lbnQgb2RmRG9jLCBTdHJpbmcgdGFnTmFtZSwKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlDbGFzcyBjcyA9IChDbGFzcykgdGFnTWFwLmdldCh0YWdOYW1lKTsKLQkJaWYgKG51bGwgPT0gY3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoRWxlbWVudCkgZmluZEVsZW1lbnRDb25zdHJhY3RvcihjcykubmV3SW5zdGFuY2UoCi0JCQkJCW5ldyBPYmplY3RbXSB7IG9kZkRvYywgZWxlbWVudCB9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9EYXRhUG9pbnRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0RhdGFQb2ludEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWIyNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0RhdGFQb2ludEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5EYXRhUG9pbnRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRGF0YVBvaW50RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERhdGFQb2ludEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MjEyMjM4NDg5MjUxMTcxNjEyTDsKLQotCXByb3RlY3RlZCBEYXRhUG9pbnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0UmVwZWF0ZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfUkVQRUFURUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfUkVQRUFURUQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0Zsb29yRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9GbG9vckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MGVjODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0Zsb29yRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5GbG9vckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGbG9vckVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEZsb29yRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI3NDMzMTY1MDI1NzEyODAwMzdMOwotCi0JcHJvdGVjdGVkIEZsb29yRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0dyaWRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0dyaWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJkZTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9HcmlkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuR3JpZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBHcmlkRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JpZEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkwMTU4NTUzOTA0Mzg5OTg3NDhMOwotCi0JcHJvdGVjdGVkIEdyaWRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0xlZ2VuZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvTGVnZW5kRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmODhiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvTGVnZW5kRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuTGVnZW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExlZ2VuZEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIExlZ2VuZEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1NTIyOTIwNTUzNTk0NDUwMDdMOwotCi0JcHJvdGVjdGVkIExlZ2VuZEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRMZWdlbmRQb3NpdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MRUdFTkRfUE9TSVRJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTEVHRU5EX1BPU0lUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnWCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHQ29uc3RhbnRzLkFUVFJfWCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9YKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnWSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHQ29uc3RhbnRzLkFUVFJfWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9ZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9QbG90QXJlYUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvUGxvdEFyZWFFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZmNDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9QbG90QXJlYUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5QbG90QXJlYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuRHIzZENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQbG90QXJlYUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBsb3RBcmVhRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyMDE3NTYwMzMxMjY4NDI5OTJMOwotCi0JcHJvdGVjdGVkIFBsb3RBcmVhRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUNlbGxSYW5nZUFkZHJlc3MoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQ0VMTF9SQU5HRV9BRERSRVNTKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0NFTExfUkFOR0VfQUREUkVTUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0RGF0YVNvdXJjZUhhc0xhYmVscygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9EQVRBX1NPVVJDRV9IQVNfTEFCRUxTKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RBVEFfU09VUkNFX0hBU19MQUJFTFMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFRhYmxlTnVtYmVyTGlzdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9UQUJMRV9OVU1CRVJfTElTVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9UQUJMRV9OVU1CRVJfTElTVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1dpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX1dJRFRIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnSGVpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX0hFSUdIVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9IRUlHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnJwKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1ZSUCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9WUlApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnBuKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1ZQTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9WUE4pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnVwKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1ZVUCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9WVVApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkUHJvamVjdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCURyM2RDb25zdGFudHMuQVRUUl9QUk9KRUNUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHIzZENvbnN0YW50cy5BVFRSX1BST0pFQ1RJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkRGlzdGFuY2UoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElTVEFOQ0UpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElTVEFOQ0UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkRm9jYWxMZW5ndGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRk9DQUxfTEVOR1RIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHIzZENvbnN0YW50cy5BVFRSX0ZPQ0FMX0xFTkdUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyM2RTaGFkb3dTbGFudCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCURyM2RDb25zdGFudHMuQVRUUl9TSEFET1dfU0xBTlQpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9TSEFET1dfU0xBTlQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkU2hhZGVNb2RlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1NIQURFX01PREUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfU0hBREVfTU9ERSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RBbWJpZW50Q29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfQU1CSUVOVF9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9BTUJJRU5UX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RMaWdodGluZ01vZGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfTElHSFRJTkdfTU9ERSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHIzZENvbnN0YW50cy5BVFRSX0xJR0hUSU5HX01PREUpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TZXJpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1Nlcmllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWI2NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1Nlcmllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LlNlcmllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTZXJpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBTZXJpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4ODk1ODU5OTI0MjA3MDYxNDg5TDsKLQotCXByb3RlY3RlZCBTZXJpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0QXR0YWNoZWRBeGlzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0FUVEFDSEVEX0FYSVMpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQVRUQUNIRURfQVhJUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tHYWluTWFya2VyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja0dhaW5NYXJrZXJFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTVkMTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja0dhaW5NYXJrZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LlN0b2NrR2Fpbk1hcmtlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTdG9ja0dhaW5NYXJrZXJFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlTdG9ja0dhaW5NYXJrZXJFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5NDYyODA5NDUwMTA4Mjg5MEw7Ci0KLQlwcm90ZWN0ZWQgU3RvY2tHYWluTWFya2VyRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1N0b2NrTG9zc01hcmtlckVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzOWYwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5TdG9ja0xvc3NNYXJrZXJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJU3RvY2tMb3NzTWFya2VyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2NTIwODYxOTQ3Mzg4OTMwNzhMOwotCi0JcHJvdGVjdGVkIFN0b2NrTG9zc01hcmtlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja1JhbmdlTGluZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tSYW5nZUxpbmVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQ3YWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja1JhbmdlTGluZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuU3RvY2tSYW5nZUxpbmVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgU3RvY2tSYW5nZUxpbmVFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlTdG9ja1JhbmdlTGluZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzMjgyMzc0NTc2NjQ2Njc2NzJMOwotCi0JcHJvdGVjdGVkIFN0b2NrUmFuZ2VMaW5lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9UaXRsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzFmYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5TVkdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUaXRsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRpdGxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDcyMjk3NTQ4Nzc2MTE4NTQwMkw7Ci0KLQlwcm90ZWN0ZWQgVGl0bGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvV2FsbEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvV2FsbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTU4MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1dhbGxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LldhbGxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgV2FsbEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdhbGxFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODY4OTY2MDkzNDk5OTUzOTEzNUw7Ci0KLQlwcm90ZWN0ZWQgV2FsbEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JRWRpdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NvbnRlbnQvSUVkaXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjFlZWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JRWRpdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudDsKLQotcHVibGljIGludGVyZmFjZSBJRWRpdExpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBvbkVkaXQoSUVkaXRhYmxlIHRhcmdldCwgU3RyaW5nIHRvcGljKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NvbnRlbnQvSUVkaXRhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NvbnRlbnQvSUVkaXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWMwN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lFZGl0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRhYmxlIHsKLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgZGF0YSk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKTsKLQotCXB1YmxpYyB2b2lkIGluc2VydChJRWRpdGFibGUgZGF0YSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmFmMTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JU3R5bGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGFibGUgewotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlRWxlbWVudCBzdHlsZSk7Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlKCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JU3R5bGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzY5MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudDsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVMaXN0ZW5lciB7Ci0JcHVibGljIHZvaWQgb25TdHlsZShJU3R5bGFibGUgdGFyZ2V0LCBTdHJpbmcgdG9waWMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9EcjNkQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyM2QvRHIzZENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZhMGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9EcjNkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZDsKLQotcHVibGljIGZpbmFsIGNsYXNzIERyM2RDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERSM0RfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRyM2Q6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElHSFQgPSAibGlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TQ0VORSA9ICJzY2VuZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJRkZVU0VfQ09MT1IgPSAiZGlmZnVzZS1jb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkFCTEVEID0gImVuYWJsZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TUEVDVUxBUiA9ICJzcGVjdWxhciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1ZSUCA9ICJ2cnAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WUE4gPSAidnBuIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVlVQID0gInZ1cCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BST0pFQ1RJT04gPSAicHJvamVjdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1RBTkNFID0gImRpc3RhbmNlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9DQUxfTEVOR1RIID0gImZvY2FsLWxlbmd0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NIQURPV19TTEFOVCA9ICJzaGFkb3ctc2xhbnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TSEFERV9NT0RFID0gInNoYWRlLW1vZGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTUJJRU5UX0NPTE9SID0gImFtYmllbnQtY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MSUdIVElOR19NT0RFID0gImxpZ2h0aW5nLW1vZGUiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9MaWdodEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9MaWdodEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiOGI3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyM2QvTGlnaHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTGlnaHRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZERpZmZ1c2VDb2xvcigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZERpcmVjdGlvbigpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RFbmFibGVkKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyRHIzZFNwZWN1bGFyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL1NjZW5lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL1NjZW5lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIxMzM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9TY2VuZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2NlbmVFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9pbXBsL0RyM2ROb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvRHIzZE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmNhMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvRHIzZE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRHIzZE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KERyM2RDb25zdGFudHMuRUxFTUVOVF9MSUdIVCwgTGlnaHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHIzZENvbnN0YW50cy5FTEVNRU5UX1NDRU5FLCBTY2VuZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvTGlnaHRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvTGlnaHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTllY2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9pbXBsL0xpZ2h0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuTGlnaHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlnaHRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTGlnaHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjI2NTYzMTk4MjQyMzgzMTI3NUw7Ci0KLQlwcm90ZWN0ZWQgTGlnaHRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2REaWZmdXNlQ29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElGRlVTRV9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9ESUZGVVNFX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZERpcmVjdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCURyM2RDb25zdGFudHMuQVRUUl9ESVJFQ1RJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElSRUNUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RFbmFibGVkKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX0VOQUJMRUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9FTkFCTEVEKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJEcjNkU3BlY3VsYXIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfU1BFQ1VMQVIpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9TUEVDVUxBUikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvU2NlbmVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvU2NlbmVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM4MGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9pbXBsL1NjZW5lRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZC5TY2VuZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTY2VuZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2NlbmVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzA2MzIxNjIxNDQzODE1Mzk2NUw7Ci0KLQlwcm90ZWN0ZWQgU2NlbmVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYUNpcmNsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhQ2lyY2xlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI2NjVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhQ2lyY2xlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXJlYUNpcmNsZUVsZW1lbnQgZXh0ZW5kcyBJbWFnZU1hcEFyZWFFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYVBvbHlnb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYVBvbHlnb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmZlY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0FyZWFQb2x5Z29uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXJlYVBvbHlnb25FbGVtZW50IGV4dGVuZHMgSW1hZ2VNYXBBcmVhRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0FyZWFSZWN0YW5nbGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYVJlY3RhbmdsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZGFjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYVJlY3RhbmdsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFyZWFSZWN0YW5nbGVFbGVtZW50IGV4dGVuZHMgSW1hZ2VNYXBBcmVhRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NhcHRpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ2FwdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkOGUxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ2FwdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ2FwdGlvbkVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NpcmNsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9DaXJjbGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YmRkNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NpcmNsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ2lyY2xlRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ29ubmVjdG9yRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0Nvbm5lY3RvckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxODhkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ29ubmVjdG9yRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Db250cm9sRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NvbnRyb2xFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTgxMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NvbnRyb2xFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZpeGVkVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnRyb2xFbGVtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29udHJvbEVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0NvbnRyb2woKTsKLQotCXB1YmxpYyBGb3JtQ29udHJvbEVsZW1lbnQgZ2V0Rm9ybUNvbnRyb2xFbGVtZW50KCk7Ci0KLQlwdWJsaWMgRml4ZWRUZXh0RWxlbWVudCBnZXRGb3JtTGFiZWxGaXhlZFRleHRFbGVtZW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0N1c3RvbVNoYXBlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0N1c3RvbVNoYXBlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMyMmI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9DdXN0b21TaGFwZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tU2hhcGVFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9EcmF3Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRHJhd0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzUxZWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9EcmF3Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEcmF3Q29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBEUkFXX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpkcmF3aW5nOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0UgPSAicGFnZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZSQU1FID0gImZyYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfT0JKRUNUID0gIm9iamVjdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX09CSkVDVF9PTEUgPSAib2JqZWN0LW9sZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0lNQUdFID0gImltYWdlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfR1JBRElFTlQgPSAiZ3JhZGllbnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9IQVRDSCA9ICJoYXRjaCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZJTExfSU1BR0UgPSAiZmlsbC1pbWFnZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX09QQUNJVFkgPSAib3BhY2l0eSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NUUk9LRV9EQVNIID0gInN0cm9rZS1kYXNoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSU1BR0VfTUFQID0gImltYWdlLW1hcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FSRUFfQ0lSQ0xFID0gImFyZWEtY2lyY2xlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQVJFQV9QT0xZR09OID0gImFyZWEtcG9seWdvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FSRUFfUkVDVEFOR0xFID0gImFyZWEtcmVjdGFuZ2xlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUkVDVCA9ICJyZWN0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElORSA9ICJsaW5lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUE9MWUxJTkUgPSAicG9seWxpbmUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QT0xZR09OID0gInBvbHlnb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9SRUdVTEFSX1BPTFlHT04gPSAicmVndWxhci1wb2x5Z29uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFUSCA9ICJwYXRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0lSQ0xFID0gImNpcmNsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0VMTElQU0UgPSAiZWxsaXBzZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0cgPSAiZyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfVEhVTUJOQUlMID0gInBhZ2UtdGh1bWJuYWlsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTUVBU1VSRSA9ICJtZWFzdXJlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0FQVElPTiA9ICJjYXB0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ09OTkVDVE9SID0gImNvbm5lY3RvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRST0wgPSAiY29udHJvbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NVU1RPTV9TSEFQRSA9ICJjdXN0b20tc2hhcGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9URVhUX0JPWCA9ICJ0ZXh0LWJveCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1pfSU5ERVggPSAiei1pbmRleCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05PVElGWV9PTl9VUERBVEVfT0ZfUkFOR0VTID0gIm5vdGlmeS1vbi11cGRhdGUtb2YtcmFuZ2VzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RST0tFID0gInN0cm9rZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUUk9LRV9EQVNIID0gInN0cm9rZS1kYXNoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUFSS0VSX1NUQVJUX1dJRFRIID0gIm1hcmtlci1zdGFydC13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUktFUl9FTkRfV0lEVEggPSAibWFya2VyLWVuZC13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX09QQUNJVFkgPSAib3BhY2l0eSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX09QQUNJVFlfTkFNRSA9ICJvcGFjaXR5LW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMID0gImZpbGwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMX0NPTE9SID0gImZpbGwtY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMX0dSQURJRU5UX05BTUUgPSAiZmlsbC1ncmFkaWVudC1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfR1JBRElFTlRfU1RFUF9DT1VOVCA9ICJncmFkaWVudC1zdGVwLWNvdW50IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRklMTF9JTUFHRV9OQU1FID0gImZpbGwtaW1hZ2UtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZJTExfSU1BR0VfV0lEVEggPSAiZmlsbC1pbWFnZS13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZJTExfSU1BR0VfSEVJR0hUID0gImZpbGwtaW1hZ2UtaGVpZ2h0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlRfWCA9ICJmaWxsLWltYWdlLXJlZi1wb2ludC14IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlRfWSA9ICJmaWxsLWltYWdlLXJlZi1wb2ludC15IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlQgPSAiZmlsbC1pbWFnZS1yZWYtcG9pbnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9USUxFX1JFUEVBVF9PRkZTRVQgPSAidGlsZS1yZXBlYXQtb2Zmc2V0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RZTEUgPSAic3R5bGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFlMRV9OQU1FID0gInN0eWxlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVNURVJfUEFHRV9OQU1FID0gIm1hc3Rlci1wYWdlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9DT0xPUiA9ICJzdGFydC1jb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VORF9DT0xPUiA9ICJlbmQtY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9JTlRFTlNJVFkgPSAic3RhcnQtaW50ZW5zaXR5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX0lOVEVOU0lUWSA9ICJlbmQtaW50ZW5zaXR5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQU5HTEUgPSAiYW5nbGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CT1JERVIgPSAiYm9yZGVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ09MT1IgPSAiY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNUQU5DRSA9ICJkaXN0YW5jZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1JPVEFUSU9OID0gInJvdGF0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBUlQgPSAic3RhcnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkQgPSAiZW5kIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRE9UUzEgPSAiZG90czEiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ET1RTMV9MRU5HVEggPSAiZG90czEtbGVuZ3RoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRE9UUzIgPSAiZG90czIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ET1RTMl9MRU5HVEggPSAiZG90czItbGVuZ3RoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ1ggPSAiY3giOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DWSA9ICJjeSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JBQ0tHUk9VTkRfU0laRSA9ICJiYWNrZ3JvdW5kLXNpemUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05UUk9MID0gImNvbnRyb2wiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVBUSU9OX0lEID0gImNhcHRpb24taWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQVZfT1JERVIgPSAibmF2LW9yZGVyIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRWxsaXBzZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9FbGxpcHNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA4YTEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9FbGxpcHNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBFbGxpcHNlRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRmlsbEltYWdlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ZpbGxJbWFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0ZDNjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRmlsbEltYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGxJbWFnZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWExpbmtIcmVmKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYTGlua1R5cGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhMaW5rU2hvdygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWExpbmtBY3R1YXRlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ZyYW1lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ZyYW1lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA3N2UwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9GcmFtZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBGcmFtZUVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVFbmRDZWxsQWRkcmVzcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVFbmRYKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUVuZFkoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdaSW5kZXgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1dpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKTsKLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCk7Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9HRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDExMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEdFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9HcmFkaWVudEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9HcmFkaWVudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYTAyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvR3JhZGllbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgR3JhZGllbnRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEaXNwbGF5TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3RhcnRDb2xvcigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0VuZENvbG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q3goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdDeSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0YXJ0SW50ZW5zaXR5KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RW5kSW50ZW5zaXR5KCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3QW5nbGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdCb3JkZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSGF0Y2hFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSGF0Y2hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjIxY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0hhdGNoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEhhdGNoRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0NvbG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzdGFuY2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdSb3RhdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjMTRlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSW1hZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSW1hZ2VFbGVtZW50IGV4dGVuZHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci0JU3RyaW5nIGdldEF0dHJYbGlua0hyZWYoKTsKLQotCVN0cmluZyBnZXRBdHRyWGxpbmtUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0QXR0clhsaW5rU2hvdygpOwotCi0JU3RyaW5nIGdldEF0dHJYbGlua0FjdHVhdGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSW1hZ2VNYXBBcmVhRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ltYWdlTWFwQXJlYUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5OTU0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSW1hZ2VNYXBBcmVhRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJbWFnZU1hcEFyZWFFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZU1hcEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZU1hcEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxOTYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSW1hZ2VNYXBFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBJbWFnZU1hcEVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLQlwdWJsaWMgSW1hZ2VFbGVtZW50IGdldEltYWdlRWxlbWVudHMoKTsKLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRBcmVhRWxlbWVudHMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvTGluZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9MaW5lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY2MTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9MaW5lRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBMaW5lRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvTWVhc3VyZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9NZWFzdXJlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRmNDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9NZWFzdXJlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBNZWFzdXJlRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvT2JqZWN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L09iamVjdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjYjBhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvT2JqZWN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdEVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Tm90aWZ5T25VcGRhdGVPZlJhbmdlcygpOwotCi0JcHVibGljIHZvaWQgc2V0QXR0clhsaW5rSHJlZihTdHJpbmcgaHJlZik7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua0hyZWYoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rVHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtTaG93KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua0FjdHVhdGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzUHJlc2VudGF0aW9uVGFibGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvT2JqZWN0T2xlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L09iamVjdE9sZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5NWU3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvT2JqZWN0T2xlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdE9sZUVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9PcGFjaXR5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L09wYWNpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzRjN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L09wYWNpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3BhY2l0eUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3BsYXlOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdGFydCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0VuZCgpOwotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0FuZ2xlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Qm9yZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUGFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYzE3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUGFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uTm90ZXNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgT0RGRWxlbWVudCBjcmVhdGVPYmplY3QobG9uZyB4LCBsb25nIHksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TWFzdGVyUGFnZU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYXZPcmRlcigpOwotCi0JcHVibGljIGludCBnZXRQYWdlSW5kZXgoKTsKLQotCXB1YmxpYyBMaXN0PE9ERkVsZW1lbnQ+IGdldENoaWxkTm9kZXNJbk5hdk9yZGVyKCk7Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RHJhd2luZ09iamVjdEVsZW1lbnRzKCk7Ci0KLQlwdWJsaWMgTm90ZXNFbGVtZW50IGdldFByZXNlbnRhdGlvbk5vdGVzRWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9QYWdlVGh1bWJuYWlsRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VUaHVtYm5haWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NWMxNzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VUaHVtYm5haWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VUaHVtYm5haWxFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9QYXRoRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhdGhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2VkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhdGhFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhdGhFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Qb2x5Z29uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BvbHlnb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODZjNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BvbHlnb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBvbHlnb25FbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Qb2x5bGluZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Qb2x5bGluZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyYjdhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUG9seWxpbmVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBvbHlsaW5lRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUmVjdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9SZWN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGFlNDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9SZWN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBSZWN0RWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUmVndWxhclBvbHlnb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUmVndWxhclBvbHlnb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWRjOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1JlZ3VsYXJQb2x5Z29uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBSZWd1bGFyUG9seWdvbkVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1N0cm9rZURhc2hFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvU3Ryb2tlRGFzaEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyM2VjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvU3Ryb2tlRGFzaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBTdHJva2VEYXNoRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0RvdHMxKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RG90czFMZW5ndGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdEb3RzMigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0RvdHMyTGVuZ3RoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzdGFuY2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvVGV4dEJveEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9UZXh0Qm94RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTgzY2JjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9UZXh0Qm94RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFRleHRCb3hFbGVtZW50IGV4dGVuZHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQXJlYUNpcmNsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhQ2lyY2xlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwMGFkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhQ2lyY2xlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5BcmVhQ2lyY2xlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEFyZWFDaXJjbGVFbGVtZW50SW1wbCBleHRlbmRzIEltYWdlTWFwQXJlYUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQXJlYUNpcmNsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ5NjM4MjM3NTI4NzMxOTgwMTBMOwotCi0JcHJvdGVjdGVkIEFyZWFDaXJjbGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhUG9seWdvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjg5ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQXJlYVBvbHlnb25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkFyZWFQb2x5Z29uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEFyZWFQb2x5Z29uRWxlbWVudEltcGwgZXh0ZW5kcyBJbWFnZU1hcEFyZWFFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUFyZWFQb2x5Z29uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc3ODc4NTI0MDYzNjAzMzA5MTFMOwotCi0JcHJvdGVjdGVkIEFyZWFQb2x5Z29uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQXJlYVJlY3RhbmdsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhUmVjdGFuZ2xlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5YTQ3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhUmVjdGFuZ2xlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5BcmVhUmVjdGFuZ2xlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEFyZWFSZWN0YW5nbGVFbGVtZW50SW1wbCBleHRlbmRzIEltYWdlTWFwQXJlYUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQXJlYVJlY3RhbmdsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI2NDkxNDE4NzM1MzcxNjY3MDNMOwotCi0JcHJvdGVjdGVkIEFyZWFSZWN0YW5nbGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9DYXB0aW9uRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NhcHRpb25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDYyYzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NhcHRpb25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNhcHRpb25FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQ2FwdGlvbkVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ2FwdGlvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNzMzNDIyOTY4Nzc1MDA5MTJMOwotCi0JcHJvdGVjdGVkIENhcHRpb25FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9DaXJjbGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ2lyY2xlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMDEzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9DaXJjbGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNpcmNsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDaXJjbGVFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNpcmNsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyNDQ2NTIzMzgwMzg5ODU2OTFMOwotCi0JcHJvdGVjdGVkIENpcmNsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0Nvbm5lY3RvckVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9Db25uZWN0b3JFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjRjOTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0Nvbm5lY3RvckVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ29ubmVjdG9yRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENvbm5lY3RvckVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ29ubmVjdG9yRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMzNjEyMzcyMDAzODA0NzY3OEw7Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdG9yRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ29udHJvbEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9Db250cm9sRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlMzA3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9Db250cm9sRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5Db250cm9sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZpeGVkVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29udHJvbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5PZmZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIENvbnRyb2xFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNvbnRyb2xFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDQ4MzU4NDY2OTA2NDk2ODE5NUw7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0NvbnRyb2woKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ09OVFJPTCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9DT05UUk9MKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZvcm1Db250cm9sRWxlbWVudCBnZXRGb3JtQ29udHJvbEVsZW1lbnQoKSB7Ci0JCU5vZGVMaXN0IG5sID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHRoaXMsCi0JCQkJImFuY2VzdG9yOjoqLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkrIE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0ZPUk1TCi0JCQkJCQkrICInXS8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZPUk0KLQkJCQkJCSsgIiddLypbYXR0cmlidXRlOjoqW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSdpZCddPSciICsgZ2V0QXR0ckRyYXdDb250cm9sKCkKLQkJCQkJCSsgIiddIik7Ci0KLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPT0gMSkpIHsKLQkJCUVsZW1lbnQgY29udHJvbCA9IChFbGVtZW50KSBubC5pdGVtKDApOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKEZvcm1Db250cm9sRWxlbWVudCkgY29udHJvbDsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJCSJkcmF3OmlkIHNob3VsZCBzcGVjaWZ5IHRoZSBpZCBvZiBGb3JtQ29udHJvbEVsZW1lbnQiKQotCQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigibmFtZXNwYWNlIDogIiArIGNvbnRyb2wuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigibG9jYWxuYW1lIDogIiArIGNvbnRyb2wuZ2V0TG9jYWxOYW1lKCkpOwotCQkJCVN5c3RlbS5lcnIKLQkJCQkJCS5wcmludGxuKCJ0ZXh0IGNvbnRlbnQgOiAiICsgY29udHJvbC5nZXRUZXh0Q29udGVudCgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJkcmF3OmNvbnRyb2wgc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbnQgb25lIGZvcm06cHJvcGVydHkgZWxlbWVudCIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRml4ZWRUZXh0RWxlbWVudCBnZXRGb3JtTGFiZWxGaXhlZFRleHRFbGVtZW50KCkgewotCQlTdHJpbmcgZHJhd0NvbnRyb2wgPSBnZXRBdHRyRHJhd0NvbnRyb2woKTsKLQkJTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QodGhpcywKLQkJCQkiYW5jZXN0b3I6OiovKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCSsgT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCSsgT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfRk9STVMKLQkJCQkJCSsgIiddLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBGb3JtQ29uc3RhbnRzLkVMRU1FTlRfRk9STQotCQkJCQkJKyAiJ10vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCSsgRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkVMRU1FTlRfRklYRURfVEVYVAotCQkJCQkJKyAiJ11bYXR0cmlidXRlOjoqW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRm9ybUNvbnN0YW50cy5BVFRSX0ZPUgotCQkJCQkJKyAiJ109JyIgKyBkcmF3Q29udHJvbCArICInXSIpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA9PSAxKSkgewotCQkJRWxlbWVudCB0ZXh0ID0gKEVsZW1lbnQpIG5sLml0ZW0oMCk7Ci0JCQlpZiAodGV4dCBpbnN0YW5jZW9mIEZpeGVkVGV4dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKEZpeGVkVGV4dEVsZW1lbnQpIHRleHQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDEpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkiZHJhdzpjb250cm9sIHNob3VsZCBub3QgaGF2ZSBtb3JlIHRoYW50IG9uZSBmb3JtIGxhYmVsIGZpZWxkIGVsZW1lbnQiKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0N1c3RvbVNoYXBlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0N1c3RvbVNoYXBlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0ZGRmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9DdXN0b21TaGFwZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ3VzdG9tU2hhcGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQ3VzdG9tU2hhcGVFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUN1c3RvbVNoYXBlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM1NTcwNzk2ODE5MjE1MjA4NEw7Ci0KLQlwcm90ZWN0ZWQgQ3VzdG9tU2hhcGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9EcmF3Tm9kZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0RyYXdOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjNhNTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0RyYXdOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuQWJzdHJhY3RPREZOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIERyYXdOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T0RGTm9kZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiB0YWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQVJFQV9DSVJDTEUsCi0JCQkJQXJlYUNpcmNsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQVJFQV9QT0xZR09OLAotCQkJCUFyZWFQb2x5Z29uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9BUkVBX1JFQ1RBTkdMRSwKLQkJCQlBcmVhUmVjdGFuZ2xlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9DQVBUSU9OLCBDYXB0aW9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9DSVJDTEUsIENpcmNsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ09OTkVDVE9SLCBDb25uZWN0b3JFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NPTlRST0wsIENvbnRyb2xFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NVU1RPTV9TSEFQRSwKLQkJCQlDdXN0b21TaGFwZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRUxMSVBTRSwgRWxsaXBzZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwCi0JCQkJLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRklMTF9JTUFHRSwKLQkJCQkJCUZpbGxJbWFnZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRlJBTUUsIEZyYW1lRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9HLCBHRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9HUkFESUVOVCwgR3JhZGllbnRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0hBVENILCBIYXRjaEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfSU1BR0UsIEltYWdlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9JTUFHRV9NQVAsIEltYWdlTWFwRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9MSU5FLCBMaW5lRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9NRUFTVVJFLCBNZWFzdXJlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9PQkpFQ1QsIE9iamVjdEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwCi0JCQkJLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfT0JKRUNUX09MRSwKLQkJCQkJCU9iamVjdE9sZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfT1BBQ0lUWSwgT3BhY2l0eUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFHRSwgUGFnZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFHRV9USFVNQk5BSUwsCi0JCQkJUGFnZVRodW1ibmFpbEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFUSCwgUGF0aEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUdPTiwgUG9seWdvbkVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUxJTkUsIFBvbHlsaW5lRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUNULCBSZWN0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUdVTEFSX1BPTFlHT04sCi0JCQkJUmVndWxhclBvbHlnb25FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX1NUUk9LRV9EQVNILAotCQkJCVN0cm9rZURhc2hFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX1RFWFRfQk9YLCBUZXh0Qm94RWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9FbGxpcHNlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0VsbGlwc2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTJmNGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0VsbGlwc2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkVsbGlwc2VFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRWxsaXBzZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRWxsaXBzZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NDYzMDU0MzY3ODUxMDY1NTRMOwotCi0JcHJvdGVjdGVkIEVsbGlwc2VFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9GaWxsSW1hZ2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvRmlsbEltYWdlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmYmMyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9GaWxsSW1hZ2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GaWxsSW1hZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi54bGluay5YTGlua0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEZpbGxJbWFnZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBGaWxsSW1hZ2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1ODc0ODA2NTM0MzMwNjIxNjY3TDsKLQotCXByb3RlY3RlZCBGaWxsSW1hZ2VFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEaXNwbGF5TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWExpbmtIcmVmKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhMaW5rVHlwZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9UWVBFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1RZUEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYTGlua1Nob3coKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfU0hPVykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9TSE9XKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWExpbmtBY3R1YXRlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0FDVFVBVEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfQUNUVUFURSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9GcmFtZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9GcmFtZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmQ2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvRnJhbWVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GcmFtZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5TVkdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBGcmFtZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRnJhbWVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMDIyNzc5NDgyNjA4NzUyNDQ4TDsKLQotCXByb3RlY3RlZCBGcmFtZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVFbmRDZWxsQWRkcmVzcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9FTkRfQ0VMTF9BRERSRVNTKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0VORF9DRUxMX0FERFJFU1MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUVuZFgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRU5EX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRU5EX1gpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUVuZFkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRU5EX1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRU5EX1kpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3WkluZGV4KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1pfSU5ERVgpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9aX0lOREVYKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfSEVJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX0hFSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTGlzdDxOb2RlPiBnZXRDaGlsZEVsZW1lbnRzKCkgewotCQlMaXN0PE5vZGU+IGxpc3QgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCU5vZGVMaXN0IG5sID0gdGhpcy5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KSB7Ci0JCQkJbGlzdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIGdldENoaWxkRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9HRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0dFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNkZGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0dFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkdFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgR0VsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMgR0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ5NTg0ODY3MDA3NDYxNzYyMDJMOwotCi0JcHJvdGVjdGVkIEdFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9HcmFkaWVudEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9HcmFkaWVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTczZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvR3JhZGllbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuR3JhZGllbnRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgR3JhZGllbnRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JhZGllbnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MjMyMzYxMjQxMzk4MzMyMzAzTDsKLQotCXByb3RlY3RlZCBHcmFkaWVudEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3BsYXlOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ESVNQTEFZX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RZTEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RZTEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3RhcnRDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVEFSVF9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVEFSVF9DT0xPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdFbmRDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9FTkRfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRU5EX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0YXJ0SW50ZW5zaXR5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUQVJUX0lOVEVOU0lUWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVEFSVF9JTlRFTlNJVFkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RW5kSW50ZW5zaXR5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0VORF9JTlRFTlNJVFkpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRU5EX0lOVEVOU0lUWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdBbmdsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9BTkdMRSkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0FOR0xFKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0JvcmRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9CT1JERVIpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQk9SREVSKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0N4KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NYKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NYKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0N5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0hhdGNoRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0hhdGNoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzN2ZlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9IYXRjaEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkhhdGNoRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEhhdGNoRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhhdGNoRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM4OTg1NDY0Njc5Njc3MDM2OEw7Ci0KLQlwcm90ZWN0ZWQgSGF0Y2hFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEaXNwbGF5TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0NvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NPTE9SKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3RhbmNlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1RBTkNFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1RBTkNFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1JvdGF0aW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1JPVEFUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1JPVEFUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ltYWdlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ltYWdlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhMjM1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9JbWFnZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rLlhMaW5rQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgSW1hZ2VFbGVtZW50SW1wbCBleHRlbmRzIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJSW1hZ2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjU3Mjc5NDA2ODc5MzcxODk0Nkw7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rSHJlZigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9IUkVGKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua1R5cGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfVFlQRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9UWVBFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtTaG93KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1NIT1cpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfU0hPVyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rQWN0dWF0ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9BQ1RVQVRFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0FDVFVBVEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSW1hZ2VNYXBBcmVhRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ltYWdlTWFwQXJlYUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MjBhYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSW1hZ2VNYXBBcmVhRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZU1hcEFyZWFFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotYWJzdHJhY3QgY2xhc3MgSW1hZ2VNYXBBcmVhRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBJbWFnZU1hcEFyZWFFbGVtZW50IHsKLQotCXByb3RlY3RlZCBJbWFnZU1hcEFyZWFFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9JbWFnZU1hcEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9JbWFnZU1hcEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZmM5YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSW1hZ2VNYXBFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuSW1hZ2VNYXBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBJbWFnZU1hcEVsZW1lbnRJbXBsIGV4dGVuZHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlJbWFnZU1hcEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NzA2MTM1NzI5MzgzMzE3Njc2TDsKLQotCXByb3RlY3RlZCBJbWFnZU1hcEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEltYWdlRWxlbWVudCBnZXRJbWFnZUVsZW1lbnRzKCkgewotCQlGcmFtZUVsZW1lbnQgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoKTsKLQkJaWYgKGZyYW1lICE9IG51bGwpIHsKLQkJCU5vZGVMaXN0IG5sID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHRoaXMsCi0JCQkJCSIuLypbbmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9JTUFHRSArICInXSIpOwotCQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPT0gMSkpCi0JCQkJcmV0dXJuIChJbWFnZUVsZW1lbnQpIG5sLml0ZW0oMCk7Ci0JCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDEpKSB7Ci0JCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJCSJkcmF3OmltYWdlIGhhcyBtb3JlIHRoYW4gb25lIHRleHQ6c2VxdWVuY2UgZWxlbWVudHMuIikKLQkJCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0QXJlYUVsZW1lbnRzKCkgewotCQlyZXR1cm4gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHRoaXMsICIuLypbIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9BUkVBX0NJUkNMRSArICInKSIKLQkJCQkrICIgb3IgKG5hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0FSRUFfUE9MWUdPTgotCQkJCSsgIicpIiArICIgb3IgKG5hbWVzcGFjZS11cmkoKT0nIgotCQkJCSsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkgKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQVJFQV9SRUNUQU5HTEUgKyAiJykiICsgIl0iKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvTGluZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9MaW5lRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3ZjFhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9MaW5lRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5MaW5lRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExpbmVFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIExpbmVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTA3OTEyMTYxODYzMzE1OTM2Mkw7Ci0KLQlwcm90ZWN0ZWQgTGluZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL01lYXN1cmVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvTWVhc3VyZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDJhZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvTWVhc3VyZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuTWVhc3VyZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBNZWFzdXJlRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNZWFzdXJlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcwMDc0MDE4NTYyOTg3Mzc2MDNMOwotCi0JcHJvdGVjdGVkIE1lYXN1cmVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9PYmplY3RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvT2JqZWN0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNjYyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9PYmplY3RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3Lk9iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Cb2R5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50Q29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rLlhMaW5rQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgT2JqZWN0RWxlbWVudEltcGwgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU9iamVjdEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM3MTM1MTExNTI0NjUwMzI5MTlMOwotCi0JcHJvdGVjdGVkIE9iamVjdEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0clhsaW5rSHJlZihTdHJpbmcgaHJlZikgewotCQlpZiAoaHJlZiA9PSBudWxsKSB7Ci0JCQlyZW1vdmVBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9IUkVGLCBocmVmLnRyaW0oKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05vdGlmeU9uVXBkYXRlT2ZSYW5nZXMoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTk9USUZZX09OX1VQREFURV9PRl9SQU5HRVMpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTk9USUZZX09OX1VQREFURV9PRl9SQU5HRVMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua0hyZWYoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9IUkVGKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtUeXBlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1RZUEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfVFlQRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rU2hvdygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9TSE9XKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1NIT1cpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua0FjdHVhdGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfQUNUVUFURSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9BQ1RVQVRFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZW50YXRpb25UYWJsZSgpIHsKLQkJT0RGRG9jdW1lbnQgZG9jID0gKE9ERkRvY3VtZW50KSB0aGlzLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJRG9jdW1lbnRDb250ZW50RWxlbWVudCBjb250ZW50ID0gKERvY3VtZW50Q29udGVudEVsZW1lbnQpIGRvYwotCQkJCS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJQ29udGVudFR5cGUgdHlwZSA9IGNvbnRlbnQuZ2V0Qm9keUVsZW1lbnQoKS5nZXRDb250ZW50KCkKLQkJCQkuZ2V0Q29udGVudFR5cGUoKTsKLQkJaWYgKHR5cGUgIT0gQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBmaWxlVXJsID0gZG9jLmdldFVSTCgpOwotCQlTdHJpbmcgb2JqVXJsID0gdGhpcy5nZXRBdHRyWGxpbmtIcmVmKCk7Ci0JCWlmIChvYmpVcmwuc3RhcnRzV2l0aCgiLi8iKSkgewotCQkJb2JqVXJsID0gb2JqVXJsLnN1YnN0cmluZygyKTsKLQkJfQotCQlvYmpVcmwgPSBvYmpVcmwgKyAiLyIgKyBPREZDb25zdGFudHMuT0RGX0NPTlRFTlRfRklMRU5BTUU7Ci0KLQkJT0RGUGFyc2VyIHBhcnNlciA9IG5ldyBPREZQYXJzZXIoKTsKLQkJRG9jdW1lbnQgb2JqRG9jID0gcGFyc2VyLmdldERvY3VtZW50KGZpbGVVcmwsIG9ialVybCk7Ci0JCWlmIChvYmpEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlFbGVtZW50IG9ialJvb3QgPSBvYmpEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmICghKG9ialJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudENvbnRlbnRFbGVtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQm9keUVsZW1lbnQgb2JqQm9keSA9ICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgb2JqUm9vdCkKLQkJCQkuZ2V0Qm9keUVsZW1lbnQoKTsKLQkJaWYgKG9iakJvZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29udGVudEJhc2VFbGVtZW50IG9iakNvbnRlbnRCYXNlID0gb2JqQm9keS5nZXRDb250ZW50KCk7Ci0JCWlmICgob2JqQ29udGVudEJhc2UgIT0gbnVsbCkKLQkJCQkmJiAob2JqQ29udGVudEJhc2UuZ2V0Q29udGVudFR5cGUoKSA9PSBDb250ZW50VHlwZS5TUFJFQURTSEVFVCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09iamVjdE9sZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9PYmplY3RPbGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTRjMGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09iamVjdE9sZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5PYmplY3RPbGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE9iamVjdE9sZUVsZW1lbnRJbXBsIGV4dGVuZHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBPYmplY3RPbGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODUzNTk3OTY1ODkwODA5NTUwN0w7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0T2xlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9PcGFjaXR5RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09wYWNpdHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU1YjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09wYWNpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5PcGFjaXR5RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE9wYWNpdHlFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgT3BhY2l0eUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01Njk1NTI2NTM1ODU5MDE5OTQ4TDsKLQotCXByb3RlY3RlZCBPcGFjaXR5RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdGFydCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVEFSVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVEFSVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdFbmQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRU5EKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0VORCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdBbmdsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9BTkdMRSkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0FOR0xFKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0JvcmRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9CT1JERVIpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQk9SREVSKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BhZ2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2IyOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLk5vdGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLlByZXNlbnRhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBQYWdlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBhZ2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTk4ODQxMzYyMjIzNzk1NDkwTDsKLQotCXByaXZhdGUgQ29udGVudEJhc2VFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBQYWdlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBjcmVhdGVPYmplY3QobG9uZyB4LCBsb25nIHksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRQYWdlSW5kZXgoKSB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlFbGVtZW50IHJvb3QgPSBvZGZEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotCQkJQm9keUVsZW1lbnQgYm9keSA9ICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgcm9vdCkuZ2V0Qm9keUVsZW1lbnQoKTsKLQkJCWNvbnRlbnRFbGVtZW50ID0gYm9keS5nZXRDb250ZW50KCk7Ci0JCX0KLQotCQlpZiAoY29udGVudEVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlOb2RlTGlzdCBsaXN0ID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KGNvbnRlbnRFbGVtZW50LAotCQkJCSIuLypbbmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFCi0JCQkJCQkrICInXSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGxpc3QuaXRlbShpKS5lcXVhbHModGhpcykpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdNYXN0ZXJQYWdlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9NQVNURVJfUEFHRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX01BU1RFUl9QQUdFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmF2T3JkZXIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFWX09SREVSKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BVl9PUkRFUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgY2xhc3MgTmF2T3JkZXJDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxPREZFbGVtZW50PiB7Ci0JCS8qCi0JCSAqIHByaXZhdGUgYm9vbGVhbiBpc1RpdGxlU2hhcGUoT0RGRWxlbWVudCBzaGFwZSkgeyB0cnkgeyBpZigKLQkJICogInRpdGxlIj09c2hhcGUuZ2V0QXR0cmlidXRlTlMoUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkgKiBQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9DTEFTUykgKSB7IHJldHVybiB0cnVlOyB9IH0KLQkJICogY2F0Y2goRXhjZXB0aW9uIGUpIHt9IHJldHVybiBmYWxzZTsgfQotCQkgKi8KLQotCQlwcml2YXRlIGludCBnZXROYXZPcmRlcihPREZFbGVtZW50IHNoYXBlLCBTdHJpbmcgbmF2T3JkZXJzKSB7Ci0JCQlTdHJpbmcgaWQgPSBzaGFwZS5nZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0lEKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJaW50IGluZGV4ID0gbmF2T3JkZXJzLmluZGV4T2YoaWQpOwotCQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJCXJldHVybiBpbmRleDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmF2T3JkZXJzLmxlbmd0aCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZ2V0Wk9yZGVyKE9ERkVsZW1lbnQgc2hhcGUpIHsKLQkJCU5vZGUgcGFyZW50ID0gc2hhcGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgUGFnZUVsZW1lbnQpKQotCQkJCXJldHVybiAtMTsKLQotCQkJaW50IGluZGV4ID0gMDsKLQkJCU5vZGUgcHJlU2liID0gc2hhcGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAocHJlU2liICE9IG51bGwpIHsKLQkJCQlpZiAocHJlU2liIGluc3RhbmNlb2YgT0RGRWxlbWVudCkKLQkJCQkJaW5kZXgrKzsKLQkJCQlwcmVTaWIgPSBwcmVTaWIuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT0RGRWxlbWVudCBhLCBPREZFbGVtZW50IGIpIHsKLQkJCS8qCi0JCQkgKiBpZiggaXNUaXRsZVNoYXBlKGEpICkgeyByZXR1cm4gLTE7IH0KLQkJCSAqLwotCQkJU3RyaW5nIG5hdk9yZGVycyA9IGdldEF0dHJEcmF3TmF2T3JkZXIoKTsKLQkJCWlmIChuYXZPcmRlcnMgIT0gbnVsbCkgewotCQkJCWludCBvRGVsdGEgPSBnZXROYXZPcmRlcihhLCBuYXZPcmRlcnMpCi0JCQkJCQktIGdldE5hdk9yZGVyKGIsIG5hdk9yZGVycyk7Ci0JCQkJaWYgKG9EZWx0YSAhPSAwKSB7Ci0JCQkJCXJldHVybiBvRGVsdGE7Ci0JCQkJfQotCQkJfQotCQkJaW50IG9EZWx0YSA9IGdldFpPcmRlcihhKSAtIGdldFpPcmRlcihiKTsKLQkJCWlmIChvRGVsdGEgIT0gMCkgewotCQkJCXJldHVybiBvRGVsdGE7Ci0JCQl9Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3Q8T0RGRWxlbWVudD4gZ2V0Q2hpbGROb2Rlc0luTmF2T3JkZXIoKSB7Ci0JCUxpc3Q8T0RGRWxlbWVudD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9ERkVsZW1lbnQ+KCk7Ci0JCU5vZGVMaXN0IG5sID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChubC5pdGVtKGkpIGluc3RhbmNlb2YgT0RGRWxlbWVudCkgewotCQkJCWNoaWxkcmVuLmFkZCgoT0RGRWxlbWVudCkgbmwuaXRlbShpKSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIG5hdk9yZGVyID0gZ2V0QXR0ckRyYXdOYXZPcmRlcigpOwotCQlpZiAobmF2T3JkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBjaGlsZHJlbjsKLQotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBuZXcgTmF2T3JkZXJDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiBnZXQgZHJhd2luZyBlbGVtZW50cyBsaXN0ZWQgYmVsb3cgImRyYXc6cmVjdCIgImRyYXc6bGluZSIgImRyYXc6cG9seWxpbmUiCi0JICogImRyYXc6cG9seWdvbiIgImRyYXc6cmVndWxhci1wb2x5Z29uIiAiZHJhdzpwYXRoIiAiZHJhdzpjaXJjbGUiCi0JICogImRyYXc6ZWxsaXBzZSIgImRyYXc6ZyIgImRyYXc6cGFnZS10aHVtYm5haWwiICJkcmF3Om1lYXN1cmUiCi0JICogImRyYXc6Y2FwdGlvbiIgImRyYXc6Y29ubmVjdG9yIiAiZHJhdzpjdXN0b20tc2hhcGUiICJkcjNkOnNjZW5lIgotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXREcmF3aW5nT2JqZWN0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QodGhpcywgIi4vKlsobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUNUICsgIicpIG9yIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9MSU5FICsgIicpIG9yIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9QT0xZTElORSArICInKSBvciIKLQkJCQkrICIobmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUdPTgotCQkJCSsgIicpIG9yIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUdVTEFSX1BPTFlHT04gKyAiJykgb3IiCi0JCQkJKyAiKG5hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX1BBVEggKyAiJykgb3IiCi0JCQkJKyAiKG5hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NJUkNMRQotCQkJCSsgIicpIG9yIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9FTExJUFNFICsgIicpIG9yIgotCQkJCSsgIihuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9HICsgIicpIG9yIgotCQkJCSsgIihuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFX1RIVU1CTkFJTAotCQkJCSsgIicpIG9yIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9NRUFTVVJFICsgIicpIG9yIgotCQkJCSsgIihuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DQVBUSU9OCi0JCQkJKyAiJykgb3IiICsgIihuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkrIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NPTk5FQ1RPUiArICInKSBvciIKLQkJCQkrICIobmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ1VTVE9NX1NIQVBFCi0JCQkJKyAiJykgb3IiICsgIihuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkrIERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCSsgRHIzZENvbnN0YW50cy5FTEVNRU5UX1NDRU5FICsgIicpXSIpOwotCX0KLQotCXB1YmxpYyBOb3Rlc0VsZW1lbnQgZ2V0UHJlc2VudGF0aW9uTm90ZXNFbGVtZW50KCkgewotCQlOb2RlTGlzdCBubCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLCAiLi8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCSsgUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJCi0JCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgUHJlc2VudGF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfTk9URVMKLQkJCQkrICInXSIpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA9PSAxKSkKLQkJCXJldHVybiAoTm90ZXNFbGVtZW50KSBubC5pdGVtKDApOwotCQllbHNlIGlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJkcmF3OnBhZ2UgaGFzIG1vcmUgdGhhbiBvbmUgcHJlc2VudGF0aW9uOm5vdGVzIGVsZW1lbnQiKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BhZ2VUaHVtYm5haWxFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZVRodW1ibmFpbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTg2NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZVRodW1ibmFpbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUGFnZVRodW1ibmFpbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQYWdlVGh1bWJuYWlsRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWdlVGh1bWJuYWlsRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzEzNzM5MjEyODkwOTk0NDU0TDsKLQotCXByb3RlY3RlZCBQYWdlVGh1bWJuYWlsRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGF0aEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9QYXRoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyNDdiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9QYXRoRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYXRoRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBhdGhFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBhdGhFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjUzOTQ5MjQ5MTU1MTk1ODc2MUw7Ci0KLQlwcm90ZWN0ZWQgUGF0aEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BvbHlnb25FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZWM2MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUG9seWdvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQb2x5Z29uRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQb2x5Z29uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDQyMTAyNDM0NDE2MzQ1MzY2Mkw7Ci0KLQlwcm90ZWN0ZWQgUG9seWdvbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BvbHlsaW5lRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BvbHlsaW5lRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwY2RjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9Qb2x5bGluZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUG9seWxpbmVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUG9seWxpbmVFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBvbHlsaW5lRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgyMjYzODcwNTgyMDI2ODQxMDdMOwotCi0JcHJvdGVjdGVkIFBvbHlsaW5lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUmVjdEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWN0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhMzYwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWN0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5SZWN0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFJlY3RFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJlY3RFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTk5MzEzMTc2MTQ4MzkyMjFMOwotCi0JcHJvdGVjdGVkIFJlY3RFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWd1bGFyUG9seWdvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWd1bGFyUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTI4YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUmVndWxhclBvbHlnb25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlJlZ3VsYXJQb2x5Z29uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFJlZ3VsYXJQb2x5Z29uRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlSZWd1bGFyUG9seWdvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyNDAyNTExMzU2NjU3Mzc1MTlMOwotCi0JcHJvdGVjdGVkIFJlZ3VsYXJQb2x5Z29uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvU3Ryb2tlRGFzaEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9TdHJva2VEYXNoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ZjE3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9TdHJva2VEYXNoRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuU3Ryb2tlRGFzaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTdHJva2VEYXNoRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFN0cm9rZURhc2hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MjEwMDM3NTMyODM1NDgwNTU3TDsKLQotCXByb3RlY3RlZCBTdHJva2VEYXNoRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdEb3RzMSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMSkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RPVFMxKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0RvdHMxTGVuZ3RoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RPVFMxX0xFTkdUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMV9MRU5HVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3RG90czIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRE9UUzIpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMikpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEb3RzMkxlbmd0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMl9MRU5HVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRE9UUzJfTEVOR1RIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3RhbmNlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1RBTkNFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1RBTkNFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1RleHRCb3hFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvVGV4dEJveEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWIyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvVGV4dEJveEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5UZXh0Qm94RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRleHRCb3hFbGVtZW50SW1wbCBleHRlbmRzIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGV4dEJveEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMzE4MzIzMzk1OTEwODYxMjE4TDsKLQotCXByb3RlY3RlZCBUZXh0Qm94RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0J1dHRvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9CdXR0b25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzI5ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0J1dHRvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9DaGVja2JveEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9DaGVja2JveEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhNzljZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vQ2hlY2tib3hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotcHVibGljIGludGVyZmFjZSBDaGVja2JveEVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Db2x1bW5FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vQ29sdW1uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI0YzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Db2x1bW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotcHVibGljIGludGVyZmFjZSBDb2x1bW5FbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vQ29tYm9ib3hFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vQ29tYm9ib3hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDQ4ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0NvbWJvYm94RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tYm9ib3hFbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRGF0ZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9EYXRlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQwZTA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9EYXRlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIERhdGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0ZpeGVkVGV4dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9GaXhlZFRleHRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjc4YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0ZpeGVkVGV4dEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEZpeGVkVGV4dEVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1Gb3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmNTRkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGb3JtQ29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBGT1JNX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpmb3JtOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0JVVFRPTiA9ICJidXR0b24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEVDS0JPWCA9ICJjaGVja2JveCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTFVNTiA9ICJjb2x1bW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT01CT0JPWCA9ICJjb21ib2JveCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RBVEUgPSAiZGF0ZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZJWEVEX1RFWFQgPSAiZml4ZWQtdGV4dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZPUk1BVFRFRF9URVhUID0gImZvcm1hdHRlZC10ZXh0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRk9STSA9ICJmb3JtIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRlJBTUUgPSAiZnJhbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9JVEVNID0gIml0ZW0iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSVNUQk9YID0gImxpc3Rib3giOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OVU1CRVIgPSAibnVtYmVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfT1BUSU9OID0gIm9wdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BST1BFUlRZID0gInByb3BlcnR5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUkFESU8gPSAicmFkaW8iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9URVhUQVJFQSA9ICJ0ZXh0YXJlYSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFQgPSAidGV4dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0FVVE9NQVRJQ19GT0NVUyA9ICJhdXRvbWF0aWMtZm9jdXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUFBMWV9ERVNJR05fTU9ERSA9ICJhcHBseS1kZXNpZ24tbW9kZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0xBQkVMID0gImxhYmVsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVEFCX0lOREVYID0gInRhYi1pbmRleCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RBQl9TVE9QID0gInRhYi1zdG9wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9SID0gImZvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTlRST0xfSU1QTEVNRU5UQVRJT04gPSAiY29udHJvbC1pbXBsZW1lbnRhdGlvbiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1Db250cm9sRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1Db250cm9sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzQ5ZTczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Gb3JtQ29udHJvbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBGb3JtQ29udHJvbEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtTGFiZWwoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1UYWJJbmRleCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckZvcm1UYWJTdG9wKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtQ29udHJvbEltcGxlbWVudGF0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzYTUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBGb3JtRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Gb3JtYXR0ZWRUZXh0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1hdHRlZFRleHRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTM2MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1hdHRlZFRleHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotcHVibGljIGludGVyZmFjZSBGb3JtYXR0ZWRUZXh0RWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0ZyYW1lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0ZyYW1lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M5ODk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9GcmFtZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEZyYW1lRWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0l0ZW1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vSXRlbUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1MTRjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vSXRlbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1FbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vTGlzdGJveEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9MaXN0Ym94RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODAxZDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9MaXN0Ym94RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdGJveEVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9OdW1iZXJFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vTnVtYmVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZmMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9OdW1iZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotcHVibGljIGludGVyZmFjZSBOdW1iZXJFbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vT3B0aW9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL09wdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5NTM1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vT3B0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3B0aW9uRWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1Byb3BlcnR5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1Byb3BlcnR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIzMWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Qcm9wZXJ0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vUmFkaW9FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vUmFkaW9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmZlODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1JhZGlvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUmFkaW9FbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vVGV4dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9UZXh0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWM1ZjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9UZXh0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dEVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9UZXh0YXJlYUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9UZXh0YXJlYUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1MGRmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vVGV4dGFyZWFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotcHVibGljIGludGVyZmFjZSBUZXh0YXJlYUVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0J1dHRvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9CdXR0b25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg0MjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0J1dHRvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uQnV0dG9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEJ1dHRvbkVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJ1dHRvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTc1NTUyOTI0NzQ0MzcyNDA2TDsKLQotCXByb3RlY3RlZCBCdXR0b25FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9DaGVja2JveEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9DaGVja2JveEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYWMwMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ2hlY2tib3hFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkNoZWNrYm94RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoZWNrYm94RWxlbWVudEltcGwgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ2hlY2tib3hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM3MDU1ODY0MTIzODA2OTAxNUw7Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Db2x1bW5FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ29sdW1uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjZGJkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Db2x1bW5FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDb2x1bW5FbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb2x1bW5FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODgyNTE0Mzk0OTc2MTkyNTMwM0w7Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ29tYm9ib3hFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ29tYm9ib3hFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYzNjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0NvbWJvYm94RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Db21ib2JveEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDb21ib2JveEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNvbWJvYm94RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzIwMzExMjYxODk1MzM2MTYzNkw7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9ib3hFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9EYXRlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0RhdGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUxNTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0RhdGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRGF0ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBEYXRlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERhdGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NjYzNTc1NTcyMTIxOTkwMTE5TDsKLQotCXByb3RlY3RlZCBEYXRlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRml4ZWRUZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0ZpeGVkVGV4dEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmYxYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRml4ZWRUZXh0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5GaXhlZFRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGaXhlZFRleHRFbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlGaXhlZFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY4NjQ3NjI1MDAwNTYzODI5NEw7Ci0KLQlwcm90ZWN0ZWQgRml4ZWRUZXh0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtRm9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybUNvbnN0YW50cy5BVFRSX0ZPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1Db25zdGFudHMuQVRUUl9GT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUNvbnRyb2xFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUNvbnRyb2xFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFmNzkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1Db250cm9sRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnRyb2xFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotYWJzdHJhY3QgY2xhc3MgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRm9ybUNvbnRyb2xFbGVtZW50IHsKLQlwcm90ZWN0ZWQgRm9ybUNvbnRyb2xFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1MYWJlbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1Db25zdGFudHMuQVRUUl9MQUJFTCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1Db25zdGFudHMuQVRUUl9MQUJFTCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1UYWJJbmRleCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1Db25zdGFudHMuQVRUUl9UQUJfSU5ERVgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfVEFCX0lOREVYKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckZvcm1UYWJTdG9wKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9JTkRFWCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUyhGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9TVE9QKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1Db250cm9sSW1wbGVtZW50YXRpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfQ09OVFJPTF9JTVBMRU1FTlRBVElPTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1Db25zdGFudHMuQVRUUl9DT05UUk9MX0lNUExFTUVOVEFUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODVlNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEZvcm1FbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRm9ybUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODQ2NTQ0NTQzMzczMjM2MjU3TDsKLQotCXByb3RlY3RlZCBGb3JtRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybU5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Gb3JtTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YzgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Gb3JtTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkFic3RyYWN0T0RGTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBGb3JtTm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9ERk5vZGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gdGFnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0JVVFRPTiwgQnV0dG9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9DSEVDS0JPWCwgQ2hlY2tib3hFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0NPTFVNTiwgQ29sdW1uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9DT01CT0JPWCwgQ29tYm9ib3hFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0RBVEUsIERhdGVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcAotCQkJCS5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZJWEVEX1RFWFQsCi0JCQkJCQlGaXhlZFRleHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZPUk1BVFRFRF9URVhULAotCQkJCUZvcm1hdHRlZFRleHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZPUk0sIEZvcm1FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZSQU1FLCBGcmFtZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfSVRFTSwgSXRlbUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfTElTVEJPWCwgTGlzdGJveEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfTlVNQkVSLCBOdW1iZXJFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX09QVElPTiwgT3B0aW9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9QUk9QRVJUWSwgUHJvcGVydHlFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX1JBRElPLCBSYWRpb0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfVEVYVEFSRUEsIFRleHRhcmVhRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9URVhULCBUZXh0RWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Gb3JtYXR0ZWRUZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1hdHRlZFRleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIzOWU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1hdHRlZFRleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1hdHRlZFRleHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRm9ybWF0dGVkVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUZvcm1hdHRlZFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTEzMDk5NTE5OTQ4Mzc1MjkyMkw7Ci0KLQlwcm90ZWN0ZWQgRm9ybWF0dGVkVGV4dEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0ZyYW1lRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0ZyYW1lRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxNzgxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9GcmFtZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRnJhbWVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRnJhbWVFbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cyBGcmFtZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xOTI3Mjg2NDIxNDc5NTMwMTNMOwotCi0JcHJvdGVjdGVkIEZyYW1lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvSXRlbUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9JdGVtRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2MDdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9JdGVtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5JdGVtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEl0ZW1FbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cyBJdGVtRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1MDIyMDY5ODkyNzY0MjI0NTlMOwotCi0JcHJvdGVjdGVkIEl0ZW1FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9MaXN0Ym94RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0xpc3Rib3hFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTVjZTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0xpc3Rib3hFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkxpc3Rib3hFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdGJveEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUxpc3Rib3hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTU1MDU3MjUyMzA1NDg3NTQ3TDsKLQotCXByb3RlY3RlZCBMaXN0Ym94RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvTnVtYmVyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL051bWJlckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzE1ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvTnVtYmVyRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5OdW1iZXJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTnVtYmVyRWxlbWVudEltcGwgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTnVtYmVyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQzMzE3MDY1NTA3Njk0MDIxNTZMOwotCi0JcHJvdGVjdGVkIE51bWJlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL09wdGlvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9PcHRpb25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmNkZjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL09wdGlvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uT3B0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE9wdGlvbkVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE9wdGlvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDk5NTY3OTQ0NjEyMjUyNDc1MEw7Ci0KLQlwcm90ZWN0ZWQgT3B0aW9uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvUHJvcGVydHlFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvUHJvcGVydHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyNGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1Byb3BlcnR5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLlByb3BlcnR5RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFByb3BlcnR5RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTkzOTYwNjAzMDYxODU0NTQ0Mkw7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9SYWRpb0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9SYWRpb0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGRkMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvUmFkaW9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLlJhZGlvRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFJhZGlvRWxlbWVudEltcGwgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUmFkaW9FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjczNDI4NTkxODcxNDI4MTQ1NEw7Ci0KLQlwcm90ZWN0ZWQgUmFkaW9FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjFhMjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjk1NDYxMzIzMjAyMzYyNDkxTDsKLQotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvVGV4dGFyZWFFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvVGV4dGFyZWFFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFjOTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1RleHRhcmVhRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5UZXh0YXJlYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUZXh0YXJlYUVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRleHRhcmVhRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTE5NDI3MDc5ODc5NjE4MTI1MEw7Ci0KLQlwcm90ZWN0ZWQgVGV4dGFyZWFFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm1hdC9Gb3JtYXRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybWF0L0Zvcm1hdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUwZWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybWF0L0Zvcm1hdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm1hdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIEZvcm1hdENvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRk9STUFUX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp4c2wtZm8tY29tcGF0aWJsZToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQUNLR1JPVU5EX0NPTE9SID0gImJhY2tncm91bmQtY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CUkVBS19CRUZPUkUgPSAiYnJlYWstYmVmb3JlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT0xPUiA9ICJjb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUkdJTl9MRUZUID0gIm1hcmdpbi1sZWZ0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BBR0VfV0lEVEggPSAicGFnZS13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BBR0VfSEVJR0hUID0gInBhZ2UtaGVpZ2h0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQk9SREVSID0gImJvcmRlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9UT1AgPSAiYm9yZGVyLXRvcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQk9SREVSX1JJR0hUID0gImJvcmRlci1yaWdodCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BBRERJTkcgPSAicGFkZGluZyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9tYW5pZmVzdC9NYW5pZmVzdENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9tYW5pZmVzdC9NYW5pZmVzdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdjMjk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbWFuaWZlc3QvTWFuaWZlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5tYW5pZmVzdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1hbmlmZXN0Q29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6bWFuaWZlc3Q6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRU5DUllQVElPTl9EQVRBID0gImVuY3J5cHRpb24tZGF0YSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvTnVtYmVyQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkYjRiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXI7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdW1iZXJDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIE5VTUJFUl9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6ZGF0YXN0eWxlOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05VTUJFUiA9ICJudW1iZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9URVhUID0gInRleHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OVU1CRVJfU1RZTEUgPSAibnVtYmVyLXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUlOX0lOVEVHRVJfRElHSVRTID0gIm1pbi1pbnRlZ2VyLWRpZ2l0cyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RFQ0lNQUxfUExBQ0VTID0gImRlY2ltYWwtcGxhY2VzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfR1JPVVBJTkcgPSAiZ3JvdXBpbmciOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL051bWJlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL051bWJlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhYWFlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBOdW1iZXJFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGludCBnZXRBdHRyTnVtYmVyTWluSW50ZWdlckRpZ2l0cygpOwotCi0JcHVibGljIGludCBnZXRBdHRyTnVtYmVyRGVjaW1hbFBsYWNlcygpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ck51bWJlckdyb3VwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvTnVtYmVyU3R5bGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJTdHlsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5MjYzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJTdHlsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIE51bWJlclN0eWxlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL1RleHRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9UZXh0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU4YzlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL1RleHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBUZXh0RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvTnVtYmVyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvTnVtYmVyRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1NmNkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlckVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuTnVtYmVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuTnVtYmVyRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE51bWJlckVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBOdW1iZXJFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzcxMjYzMjk2NzQwMzA1MTQ4OUw7Ci0KLQlwcm90ZWN0ZWQgTnVtYmVyRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOdW1iZXJNaW5JbnRlZ2VyRGlnaXRzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCU51bWJlckNvbnN0YW50cy5BVFRSX01JTl9JTlRFR0VSX0RJR0lUUykpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCQlOdW1iZXJDb25zdGFudHMuQVRUUl9NSU5fSU5URUdFUl9ESUdJVFMpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOdW1iZXJEZWNpbWFsUGxhY2VzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCU51bWJlckNvbnN0YW50cy5BVFRSX0RFQ0lNQUxfUExBQ0VTKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlOdW1iZXJDb25zdGFudHMuTlVNQkVSX05BTUVTUEFDRV9VUkksCi0JCQkJCU51bWJlckNvbnN0YW50cy5BVFRSX0RFQ0lNQUxfUExBQ0VTKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ck51bWJlckdyb3VwaW5nKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCU51bWJlckNvbnN0YW50cy5BVFRSX0dST1VQSU5HKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlOdW1iZXJDb25zdGFudHMuTlVNQkVSX05BTUVTUEFDRV9VUkksCi0JCQkJCU51bWJlckNvbnN0YW50cy5BVFRSX0dST1VQSU5HKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlck5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlck5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjc5MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvaW1wbC9OdW1iZXJOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuTnVtYmVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE51bWJlck5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KE51bWJlckNvbnN0YW50cy5FTEVNRU5UX05VTUJFUiwgTnVtYmVyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE51bWJlckNvbnN0YW50cy5FTEVNRU5UX1RFWFQsIFRleHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoTnVtYmVyQ29uc3RhbnRzLkVMRU1FTlRfTlVNQkVSX1NUWUxFLAotCQkJCU51bWJlclN0eWxlRWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlclN0eWxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvTnVtYmVyU3R5bGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBkOTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvTnVtYmVyU3R5bGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLk51bWJlclN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBOdW1iZXJTdHlsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOdW1iZXJTdHlsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02OTk2MTkyMDE3NDQyMTQ4MDk4TDsKLQotCXByb3RlY3RlZCBOdW1iZXJTdHlsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2RmOTk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUZXh0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NDQwNTAyNTg2NzYxNzIyNTkzTDsKLQotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvQXV0b21hdGljU3R5bGVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvQXV0b21hdGljU3R5bGVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTlmZjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBBdXRvbWF0aWNTdHlsZXNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0eWxlRWxlbWVudCBnZXRTdHlsZUVsZW1lbnRCeU5hbWUoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIGxvbmcgZ2V0U3R5bGVFbGVtZW50U2l6ZSgpOwotCi0JcHVibGljIFN0eWxlRWxlbWVudCBnZXRTdHlsZUVsZW1lbnQobG9uZyBpbmRleCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUVsZW1lbnQoU3R5bGVFbGVtZW50IGVsZW1lbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0JvZHlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Cb2R5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWI1M2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0JvZHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuQ29udGVudEJhc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQm9keUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgQ29udGVudEJhc2VFbGVtZW50IGdldENvbnRlbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9DaGFydEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0NoYXJ0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJjM2ZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0NoYXJ0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkxlZ2VuZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LlBsb3RBcmVhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuVGl0bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBDaGFydEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudCBnZXRDaGFydENoYXJ0RWxlbWVudCgpOwotCi0JcHVibGljIFRpdGxlRWxlbWVudCBnZXRDaGFydFRpdGxlRWxlbWVudCgpOwotCi0JcHVibGljIFBsb3RBcmVhRWxlbWVudCBnZXRDaGFydFBsb3RBcmVhRWxlbWVudCgpOwotCi0JcHVibGljIExlZ2VuZEVsZW1lbnQgZ2V0Q2hhcnRMZWdlbmRFbGVtZW50KCk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldENoYXJ0VGFibGVFbGVtZW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRG9jdW1lbnRDb250ZW50RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRG9jdW1lbnRDb250ZW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDM0YjlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0RvY3VtZW50Q29udGVudEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBEb2N1bWVudENvbnRlbnRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGRvdWJsZSBnZXRBdHRyT2ZmaWNlVmVyc2lvbigpOwotCi0JcHVibGljIEJvZHlFbGVtZW50IGdldEJvZHlFbGVtZW50KCk7Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFN0cmluZyB1cmkpOwotCi0JcHVibGljIFN0eWxlRWxlbWVudCBjcmVhdGVTdHlsZShTdHJpbmcgZmFtaWx5KTsKLQotCXB1YmxpYyBGb250RmFjZURlY2xzRWxlbWVudCBnZXRGb250RmFjZURlY2xzRWxlbWVudCgpOwotCi0JcHVibGljIEF1dG9tYXRpY1N0eWxlc0VsZW1lbnQgZ2V0QXV0b21hdGljU3R5bGVzRWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0RvY3VtZW50U3R5bGVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRG9jdW1lbnRTdHlsZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzc1YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRG9jdW1lbnRTdHlsZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFN0eWxlc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlkb3VibGUgZ2V0QXR0ck9mZmljZVZlcnNpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9EcmF3aW5nRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRHJhd2luZ0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NWY2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9EcmF3aW5nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlRWxlbWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERyYXdpbmdFbGVtZW50IGV4dGVuZHMgQ29udGVudEJhc2VFbGVtZW50IHsKLQlwdWJsaWMgUGFnZUVsZW1lbnQgZ2V0UGFnZShsb25nIGlkeCk7Ci0KLQlwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpOwotCi0JcHVibGljIFBhZ2VFbGVtZW50IGNyZWF0ZVBhZ2UobG9uZyBpZHgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRm9udEZhY2VEZWNsc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0ZvbnRGYWNlRGVjbHNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMDYyYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRm9udEZhY2VEZWNsc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEZvbnRGYWNlRGVjbHNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRm9ybXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Gb3Jtc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MGE3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Gb3Jtc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEZvcm1zRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvTWFzdGVyU3R5bGVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvTWFzdGVyU3R5bGVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdkY2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL01hc3RlclN0eWxlc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIE1hc3RlclN0eWxlc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL09mZmljZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvT2ZmaWNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MGVhMTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvT2ZmaWNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgT2ZmaWNlQ29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBPRkZJQ0VfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm9mZmljZToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ET0NVTUVOVF9DT05URU5UID0gImRvY3VtZW50LWNvbnRlbnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ET0NVTUVOVF9TVFlMRVMgPSAiZG9jdW1lbnQtc3R5bGVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQVVUT01BVElDX1NUWUxFUyA9ICJhdXRvbWF0aWMtc3R5bGVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQk9EWSA9ICJib2R5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVCA9ICJ0ZXh0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUFJFU0VOVEFUSU9OID0gInByZXNlbnRhdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NQUkVBRFNIRUVUID0gInNwcmVhZHNoZWV0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRFJBV0lORyA9ICJkcmF3aW5nIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0hBUlQgPSAiY2hhcnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GT05UX0ZBQ0VfREVDTFMgPSAiZm9udC1mYWNlLWRlY2xzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRk9STVMgPSAiZm9ybXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NQVNURVJfU1RZTEVTID0gIm1hc3Rlci1zdHlsZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UWVBFID0gInZhbHVlLXR5cGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUWUxFX1NPVVJDRSA9ICJzdHlsZS1zb3VyY2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRU5VQkFSX1ZJU0lCTEUgPSAibWVudWJhci12aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfT0JKRUNUQkFSX1ZJU0lCTEUgPSAib2JqZWN0YmFyLXZpc2libGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9UT09MQkFSX1ZJU0lCTEUgPSAidG9vbGJhci12aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRlVOQ1RJT05CQVJfVklTSUJMRSA9ICJmdW5jdGlvbmJhci12aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBVFVTQkFSX1ZJU0lCTEUgPSAic3RhdHVzYmFyLXZpc2libGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ST1dfQ09MVU1OX0hFQURFUl9WSVNJQkxFID0gInJvdy1jb2x1bW4taGVhZGVyLXZpc2libGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT1JNVUxBQkFSX1RPR0dMRSA9ICJmb3JtdWxhYmFyLXRvZ2dsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0hZUEVSTElOS0JBUl9UT0dHTEUgPSAiaHlwZXJsaW5rYmFyLXRvZ2dsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RJVExFID0gInRpdGxlIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9QcmVzZW50YXRpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9QcmVzZW50YXRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2Y0YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvUHJlc2VudGF0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZTsKLQotcHVibGljIGludGVyZmFjZSBQcmVzZW50YXRpb25FbGVtZW50IGV4dGVuZHMgRHJhd2luZ0VsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvU3ByZWFkU2hlZXRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9TcHJlYWRTaGVldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4YjlmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9TcHJlYWRTaGVldEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNwcmVhZFNoZWV0RWxlbWVudCBleHRlbmRzIENvbnRlbnRCYXNlRWxlbWVudCB7Ci0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlU3RydWN0dXJlUHJvdGVjdGVkKCk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlKGxvbmcgaWR4KTsKLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVCeU5hbWUoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIGxvbmcgZ2V0VGFibGVTaXplKCk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGNyZWF0ZVRhYmxlKGxvbmcgaWR4LCBTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldEFjdGl2ZVRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9UZXh0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvVGV4dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmYzFmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9UZXh0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5UZXh0UmFuZ2U7Ci0KLQotcHVibGljIGludGVyZmFjZSBUZXh0RWxlbWVudCBleHRlbmRzIENvbnRlbnRCYXNlRWxlbWVudCwgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlUZXh0UmFuZ2Ugc2VsZWN0KGxvbmcgc2VsdG9weCwgbG9uZyBzZWx0b3B5LCBsb25nIHNlbGVuZHgsIGxvbmcgc2VsZW5keSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDg3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9BdXRvbWF0aWNTdHlsZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkF1dG9tYXRpY1N0eWxlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEF1dG9tYXRpY1N0eWxlc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlBdXRvbWF0aWNTdHlsZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzg5MjY4MDcxNTAyNzM3ODI2TDsKLQotCXByb3RlY3RlZCBBdXRvbWF0aWNTdHlsZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGVFbGVtZW50QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0U3R5bGVFbGVtZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlRWxlbWVudChsb25nIGluZGV4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVFbGVtZW50KFN0eWxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0JvZHlFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Cb2R5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljN2Y1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0JvZHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBCb2R5RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJvZHlFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg0NzkzNzAzMDA4Njk5OTY1M0w7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzPiB2YWxpZEJvZHlSb290RWxlbWVudCA9IG5ldyBWZWN0b3I8Q2xhc3M+KCk7Ci0Jc3RhdGljIHsKLQkJdmFsaWRCb2R5Um9vdEVsZW1lbnQuYWRkKERyYXdpbmdFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXZhbGlkQm9keVJvb3RFbGVtZW50LmFkZChTcHJlYWRTaGVldEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdmFsaWRCb2R5Um9vdEVsZW1lbnQuYWRkKENoYXJ0RWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBCb2R5RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudEJhc2VFbGVtZW50IGdldENvbnRlbnQoKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBDb250ZW50QmFzZUVsZW1lbnQpCi0JCQkJCXJldHVybiAoQ29udGVudEJhc2VFbGVtZW50KSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0NoYXJ0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvQ2hhcnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2NlZDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvQ2hhcnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuTGVnZW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuUGxvdEFyZWFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5DaGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklDb250ZW50UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIENoYXJ0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENoYXJ0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODUzNzcxNzM3ODI1MTA3MTUxNUw7Ci0KLQlwcm90ZWN0ZWQgQ2hhcnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRFbGVtZW50IGdldENoYXJ0Q2hhcnRFbGVtZW50KCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJaWYgKChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgIT0gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudCkKLQkJCQkJcmV0dXJuIChvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRFbGVtZW50KSBjaGlsZHJlbgotCQkJCQkJCS5pdGVtKGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0Q2hhcnRUaXRsZUVsZW1lbnQoKSB7Ci0JCW9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydEVsZW1lbnQgY2hhcnRDaGFydEVsZW1udCA9IGdldENoYXJ0Q2hhcnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hhcnRDaGFydEVsZW1udC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmICgoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmdldExlbmd0aCgpICE9IDApKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRpdGxlRWxlbWVudCkKLQkJCQkJcmV0dXJuIChUaXRsZUVsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBsb3RBcmVhRWxlbWVudCBnZXRDaGFydFBsb3RBcmVhRWxlbWVudCgpIHsKLQkJb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudCBjaGFydENoYXJ0RWxlbW50ID0gZ2V0Q2hhcnRDaGFydEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGFydENoYXJ0RWxlbW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgIT0gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgUGxvdEFyZWFFbGVtZW50KQotCQkJCQlyZXR1cm4gKFBsb3RBcmVhRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGVnZW5kRWxlbWVudCBnZXRDaGFydExlZ2VuZEVsZW1lbnQoKSB7Ci0JCW9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydEVsZW1lbnQgY2hhcnRDaGFydEVsZW1udCA9IGdldENoYXJ0Q2hhcnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hhcnRDaGFydEVsZW1udC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmICgoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmdldExlbmd0aCgpICE9IDApKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIExlZ2VuZEVsZW1lbnQpCi0JCQkJCXJldHVybiAoTGVnZW5kRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldENoYXJ0VGFibGVFbGVtZW50KCkgewotCQlvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRFbGVtZW50IGNoYXJ0Q2hhcnRFbGVtbnQgPSBnZXRDaGFydENoYXJ0RWxlbWVudCgpOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGNoYXJ0Q2hhcnRFbGVtbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0JCQkJCXJldHVybiAoVGFibGVFbGVtZW50KSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlLkNIQVJUOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFJhbmdlIGNyZWF0ZVJhbmdlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50Q29udGVudEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50Q29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTBlM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Eb2N1bWVudENvbnRlbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQXV0b21hdGljU3R5bGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkZvbnRGYWNlRGVjbHNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuT2ZmaWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIERvY3VtZW50Q29udGVudEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEb2N1bWVudENvbnRlbnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjAxMDk3NDk3NTQwNTYxMTY2NEw7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRDb250ZW50RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJPZmZpY2VWZXJzaW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZFUlNJT04pKSB7Ci0JCQlyZXR1cm4gbmV3IERvdWJsZShnZXRBdHRyaWJ1dGVOUygKLQkJCQkJT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9WRVJTSU9OKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgRm9udEZhY2VEZWNsc0VsZW1lbnQgZ2V0Rm9udEZhY2VEZWNsc0VsZW1lbnQoKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBGb250RmFjZURlY2xzRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKEZvbnRGYWNlRGVjbHNFbGVtZW50KSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXV0b21hdGljU3R5bGVzRWxlbWVudCBnZXRBdXRvbWF0aWNTdHlsZXNFbGVtZW50KCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJaWYgKChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgIT0gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgQXV0b21hdGljU3R5bGVzRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKEF1dG9tYXRpY1N0eWxlc0VsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBCb2R5RWxlbWVudCBnZXRCb2R5RWxlbWVudCgpIHsKLQkJTm9kZUxpc3QgYm9keSA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLAotCQkJCSIuLypbbmFtZXNwYWNlLXVyaSgpPSciICsgT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBPZmZpY2VDb25zdGFudHMuRUxFTUVOVF9CT0RZCi0JCQkJCQkrICInXSIpOwotCQlpZiAoKGJvZHkgPT0gbnVsbCkgfHwgKGJvZHkuZ2V0TGVuZ3RoKCkgIT0gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oIk9ERiBkb2N1bWVudCBtdXN0IGhhdmUgb25lIG9mZmljZTpib2R5IGVsZW1lbnQiKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKEJvZHlFbGVtZW50KSBib2R5Lml0ZW0oMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShTdHJpbmcgdXJpKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgY3JlYXRlU3R5bGUoU3RyaW5nIGZhbWlseSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50U3R5bGVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvRG9jdW1lbnRTdHlsZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjU4YTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvRG9jdW1lbnRTdHlsZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50U3R5bGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLk9mZmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIERvY3VtZW50U3R5bGVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCURvY3VtZW50U3R5bGVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTEyNTU4NzExMjkyMzE2ODMyMEw7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRTdHlsZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ck9mZmljZVZlcnNpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpIHsKLQkJCXJldHVybiBuZXcgRG91YmxlKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZFUlNJT04pKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RyYXdpbmdFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9EcmF3aW5nRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmODJhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RyYXdpbmdFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRyYXdpbmdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JQ29udGVudFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBEcmF3aW5nRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERyYXdpbmdFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTMyNDE2MTk3NTI1NjM5NTEwOUw7Ci0KLQlwcm90ZWN0ZWQgRHJhd2luZ0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIENvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGUuRFJBVzsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUGFnZUVsZW1lbnQgZ2V0UGFnZShsb25nIGlkeCkgewotCQlOb2RlTGlzdCBubCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLCAiLi8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCSsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkgKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFHRSArICInXSIpOwotCQlpZiAoKGlkeCA8IDApIHx8IChpZHggPj0gbmwuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIHBhZ2UgaW5kZXgiKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoUGFnZUVsZW1lbnQpIG5sLml0ZW0oKGludCkgaWR4KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpIHsKLQkJcmV0dXJuIFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCgKLQkJCQl0aGlzLAotCQkJCSIuLypbbmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFCi0JCQkJCQkrICInXSIpLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBQYWdlRWxlbWVudCBjcmVhdGVQYWdlKGxvbmcgaWR4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvRm9udEZhY2VEZWNsc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0ZvbnRGYWNlRGVjbHNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJjNzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvRm9udEZhY2VEZWNsc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRm9udEZhY2VEZWNsc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGb250RmFjZURlY2xzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUZvbnRGYWNlRGVjbHNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NzczMjgyMzQwNjczNjczMDE5TDsKLQotCXByb3RlY3RlZCBGb250RmFjZURlY2xzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Gb3Jtc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0Zvcm1zRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ZjI4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0Zvcm1zRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Gb3Jtc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGb3Jtc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBGb3Jtc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkwODAyOTg2MDMyNTU4MDg5N0w7Ci0KLQlwcm90ZWN0ZWQgRm9ybXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL01hc3RlclN0eWxlc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL01hc3RlclN0eWxlc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjI4NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9NYXN0ZXJTdHlsZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLk1hc3RlclN0eWxlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBNYXN0ZXJTdHlsZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWFzdGVyU3R5bGVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI1NTI4OTI1MTYyMDU3MTUyOTVMOwotCi0JcHJvdGVjdGVkIE1hc3RlclN0eWxlc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvT2ZmaWNlTm9kZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvT2ZmaWNlTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwNTY3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL09mZmljZU5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkFic3RyYWN0T0RGTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5PZmZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgT2ZmaWNlTm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9ERk5vZGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gdGFnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfQVVUT01BVElDX1NUWUxFUywKLQkJCQlBdXRvbWF0aWNTdHlsZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfQk9EWSwgQm9keUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChPZmZpY2VDb25zdGFudHMuRUxFTUVOVF9DSEFSVCwgQ2hhcnRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfRE9DVU1FTlRfQ09OVEVOVCwKLQkJCQlEb2N1bWVudENvbnRlbnRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfRE9DVU1FTlRfU1RZTEVTLAotCQkJCURvY3VtZW50U3R5bGVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0RSQVdJTkcsIERyYXdpbmdFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfRk9OVF9GQUNFX0RFQ0xTLAotCQkJCUZvbnRGYWNlRGVjbHNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfRk9STVMsIEZvcm1zRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX01BU1RFUl9TVFlMRVMsCi0JCQkJTWFzdGVyU3R5bGVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX1BSRVNFTlRBVElPTiwKLQkJCQlQcmVzZW50YXRpb25FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfU1BSRUFEU0hFRVQsCi0JCQkJU3ByZWFkU2hlZXRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfVEVYVCwgVGV4dEVsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9QcmVzZW50YXRpb25FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9QcmVzZW50YXRpb25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE4ZDMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvUHJlc2VudGF0aW9uRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5QcmVzZW50YXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUHJlc2VudGF0aW9uRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQcmVzZW50YXRpb25FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjMyNjg4NjMxNzAxMzkzOTE0MUw7Ci0KLQlwcm90ZWN0ZWQgUHJlc2VudGF0aW9uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZS5QUkVTRU5UQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9TcHJlYWRTaGVldEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL1NwcmVhZFNoZWV0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiMTU1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL1NwcmVhZFNoZWV0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlNwcmVhZFNoZWV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSUNvbnRlbnRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIFNwcmVhZFNoZWV0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVNwcmVhZFNoZWV0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE2OTg2NTk4NTQ4MTAwNTIzMDVMOwotCi0JcHJvdGVjdGVkIFNwcmVhZFNoZWV0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZS5TUFJFQURTSEVFVDsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGFibGVTdHJ1Y3R1cmVQcm90ZWN0ZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RSVUNUVVJFX1BST1RFQ1RFRCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFJVQ1RVUkVfUFJPVEVDVEVEKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGUobG9uZyBpZHgpIHsKLQkJTm9kZUxpc3QgbmwgPSBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRSk7Ci0JCXJldHVybiAoVGFibGVFbGVtZW50KSBubC5pdGVtKChpbnQpIGlkeCk7Ci0JfQotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFRhYmxlU2l6ZSgpIHsKLQkJTm9kZUxpc3QgbmwgPSBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRSk7Ci0JCXJldHVybiBubC5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGNyZWF0ZVRhYmxlKGxvbmcgaWR4LCBTdHJpbmcgbmFtZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0QWN0aXZlVGFibGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGI1Y2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSUNvbnRlbnRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsLklUZXh0RWxlbWVudENvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUZXh0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzcyODkxMDA3NTk4ODQzOTE2M0w7Ci0KLQlwcm90ZWN0ZWQgVGV4dEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBzZWxlY3QobG9uZyBzZWx0b3B4LCBsb25nIHNlbHRvcHksIGxvbmcgc2VsZW5keCwKLQkJCWxvbmcgc2VsZW5keSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlLldSSVRFOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFJhbmdlIGNyZWF0ZVJhbmdlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vTm90ZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9Ob3Rlc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZTE0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9Ob3Rlc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIE5vdGVzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwgSUVkaXRhYmxlLAotCQlJVGV4dEVsZW1lbnRDb250YWluZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcHJlc2VudGF0aW9uL1ByZXNlbnRhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmMxNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJlc2VudGF0aW9uQ29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnByZXNlbnRhdGlvbjoxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OT1RFUyA9ICJub3RlcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVlfSEVBREVSID0gImRpc3BsYXktaGVhZGVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElTUExBWV9GT09URVIgPSAiZGlzcGxheS1mb290ZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZX1BBR0VfTlVNQkVSID0gImRpc3BsYXktcGFnZS1udW1iZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZX0RBVEVfVElNRSA9ICJkaXNwbGF5LWRhdGUtdGltZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1NfVkFMVUVfTk9URVMgPSAibm90ZXMiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcHJlc2VudGF0aW9uL2ltcGwvTm90ZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vaW1wbC9Ob3Rlc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODc1ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vaW1wbC9Ob3Rlc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5Ob3Rlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBOb3Rlc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE5vdGVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzgxMDI5MjUwODg4NDYwNDMyMkw7Ci0KLQlwcm90ZWN0ZWQgTm90ZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9pbXBsL1ByZXNlbnRhdGlvbk5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9pbXBsL1ByZXNlbnRhdGlvbk5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZGQzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vaW1wbC9QcmVzZW50YXRpb25Ob2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uUHJlc2VudGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbk5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KFByZXNlbnRhdGlvbkNvbnN0YW50cy5FTEVNRU5UX05PVEVTLCBOb3Rlc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9DZWxsUmFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvQ2VsbFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Mzk1MzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9DZWxsUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNlbGxFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIENlbGxSYW5nZSBleHRlbmRzIElDb250ZW50UmFuZ2UgewotCXB1YmxpYyB2b2lkIHNldENlbGxSYW5nZShsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSk7Ci0KLQlwdWJsaWMgVGFibGVDZWxsRWxlbWVudCBnZXRDZWxsKGxvbmcgY29sdW1uLCBsb25nIHJvdyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0lDb250ZW50Q3Vyc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0lDb250ZW50Q3Vyc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDZiMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9JQ29udGVudEN1cnNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50Q3Vyc29yIHsKLQlwdWJsaWMgdm9pZCBmb2N1cyhJQ29udGVudFJhbmdlIHJhbmdlKTsKLQotCXB1YmxpYyBJQ29udGVudFJhbmdlIGdldFNlbGVjdGlvbigpOwotCi0JcHVibGljIHZvaWQgbmV4dCgpOwotCi0JcHVibGljIHZvaWQgcHJldigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvSUNvbnRlbnRSYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9JQ29udGVudFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzU3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9JQ29udGVudFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50UmFuZ2UgZXh0ZW5kcyBJRWRpdGFibGUsIElTdHlsYWJsZSB7Ci0JU3RyaW5nIGdldFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvSVRleHRFbGVtZW50Q29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0lUZXh0RWxlbWVudENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2QwN2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvSVRleHRFbGVtZW50Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpOwotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvVGFibGVDZWxsUmFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvVGFibGVDZWxsUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYmM2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL1RhYmxlQ2VsbFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQ2VsbFJhbmdlIGV4dGVuZHMgQ2VsbFJhbmdlIHsKLQlUYWJsZUVsZW1lbnQgZ2V0VGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvVGV4dFJhbmdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL1RleHRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjdkODlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvVGV4dFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dFJhbmdlIGV4dGVuZHMgSUNvbnRlbnRSYW5nZSwgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlUZXh0UmFuZ2Ugc2VsZWN0KGxvbmcgc2VsdG9weCwgbG9uZyBzZWx0b3B5LCBsb25nIHNlbGVuZHgsIGxvbmcgc2VsZW5keSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9pbXBsL0lUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvaW1wbC9JVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjAzMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9pbXBsL0lUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldENoaWxkTGlzdChFbGVtZW50IGVsKSB7Ci0JCUxpc3Q8Tm9kZT4gbGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJTm9kZUxpc3QgbmwgPSBlbC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJVGV4dEVsZW1lbnRDb250YWluZXIpIHsKLQkJCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldENvbnRlbnRTaXplKEVsZW1lbnQgZWwpIHsKLQkJcmV0dXJuIGdldENoaWxkTGlzdChlbCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcihFbGVtZW50IGVsKSB7Ci0JCXJldHVybiBnZXRDaGlsZExpc3QoZWwpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvQ2hhcnRQcm9wZXJ0aWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9DaGFydFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzE1ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9DaGFydFByb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhcnRQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRGlyZWN0aW9uKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRKYXBhbmVzZUNhbmRsZVN0aWNrKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRTdG9ja1dpdGhWb2x1bWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFRocmVlRGltZW5zaW9uYWwoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydERlZXAoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydExpbmVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydEludGVycG9sYXRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0U3ltYm9sVHlwZSgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VmVydGljYWwoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0TGluZXNVc2VkKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRDb25uZWN0QmFycygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRTZXJpZXNTb3VyY2UoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydE1lYW5WYWx1ZSgpOwotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRFcnJvck1hcmdpbigpOwotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRFcnJvckxvd2VyTGltaXQoKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JVcHBlckxpbWl0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydEVycm9yQ2F0ZWdvcnkoKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JQZXJjZW50YWdlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFJlZ3Jlc3Npb25UeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydERhdGFMYWJlbE51bWJlcigpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0RGF0YUxhYmVsVGV4dCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0RGF0YUxhYmVsU3ltYm9sKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnREaXNwbGF5TGFiZWwoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFRpY2tNYXJrc01ham9ySW5uZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFRpY2tNYXJrc01ham9yT3V0ZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydExvZ2FyaXRobWljKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUZXh0T3ZlcmxhcCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRleHRMaW5lQnJlYWsoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0TGFiZWxBcnJhbmdlbWVudCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VmlzaWJsZSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyQ2hhcnRHYXBXaWR0aCgpOwotCi0JcHVibGljIGludCBnZXRBdHRyQ2hhcnRPdmVybGFwKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFNvbGlkVHlwZSgpOwotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRPcmlnaW4oKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0TWluaW11bSgpOwotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRNYXhpbXVtKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9EZWZhdWx0U3R5bGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0RlZmF1bHRTdHlsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NWRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0RlZmF1bHRTdHlsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBEZWZhdWx0U3R5bGVFbGVtZW50IGV4dGVuZHMgU3R5bGVFbGVtZW50IHsKLQlTdHJpbmcgZ2V0QXR0clN0eWxlRmFtaWx5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9EcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0RyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxY2Q5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0RyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBEcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clByZXNlbnRhdGlvbkRpc3BsYXlIZWFkZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5Rm9vdGVyKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyUHJlc2VudGF0aW9uRGlzcGxheVBhZ2VOdW1iZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5RGF0ZVRpbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdCYWNrZ3JvdW5kU2l6ZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGwoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0ZvbnRGYWNlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9Gb250RmFjZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNGE1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0ZvbnRGYWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEZvbnRGYWNlRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnRm9udEZhbWlseSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnRm9udEZhbWlseUdlbmVyaWMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFBpdGNoKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9HcmFwaGljUHJvcGVydGllc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzYxZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9HcmFwaGljUHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkdyYWRpZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5PcGFjaXR5RWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBHcmFwaGljUHJvcGVydGllc0VsZW1lbnQgZXh0ZW5kcyBTdHlsZVByb3BlcnRpZXNCYXNlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3Ryb2tlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3Ryb2tlRGFzaCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnU3Ryb2tlV2lkdGgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1N0cm9rZUNvbG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TWFya2VyU3RhcnRXaWR0aCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd01hcmtlckVuZFdpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdTdHJva2VPcGFjaXR5KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3T3BhY2l0eSgpOwotCi0JcHVibGljIE9wYWNpdHlFbGVtZW50IGdldEF0dHJEcmF3T3BhY2l0eU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbENvbG9yKCk7Ci0KLQlwdWJsaWMgR3JhZGllbnRFbGVtZW50IGdldEF0dHJEcmF3RmlsbEdyYWRpZW50TmFtZSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0dyYWRpZW50U3RlcENvdW50KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZVdpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlSGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVJlcGVhdCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZVJlZlBvaW50WCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZVJlZlBvaW50WSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZVJlZlBvaW50KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3VGlsZVJlcGVhdE9mZnNldCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVIb3Jpem9udGFsUG9zKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9MaXN0TGV2ZWxQcm9wZXJ0aWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9MaXN0TGV2ZWxQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJmOTYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvTGlzdExldmVsUHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBMaXN0TGV2ZWxQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clNwYWNlQmVmb3JlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyU3BhY2VCZWZvcmUoU3RyaW5nIGxlbmd0aCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJMYWJlbFdpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTGFiZWxXaWR0aChTdHJpbmcgd2lkdGgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9NYXBFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hcEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjY2E0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hcEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTWFwRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlQ29uZGl0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUFwcGx5U3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUJhc2VDZWxsQWRkcmVzcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvTWFzdGVyUGFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvTWFzdGVyUGFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiYWJiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hc3RlclBhZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIE1hc3RlclBhZ2VFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVBhZ2VMYXlvdXROYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGVOYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYWdlTGF5b3V0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYWdlTGF5b3V0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODA0MmYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvUGFnZUxheW91dEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZUxheW91dEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5OTVkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpblRvcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luQm90dG9tKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5MZWZ0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5SaWdodCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0UGFnZVdpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRQYWdlSGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVByaW50T3JpZW50YXRpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OWE5MTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIFRhYlN0b3BzRWxlbWVudCBnZXRUYWJTdG9wc0VsZW1lbnQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdExpbmVIZWlnaHQoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJGb3JtYXRMaW5lSGVpZ2h0KFN0cmluZyBoZWlnaHQpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVMaW5lSGVpZ2h0QXRMZWFzdCgpOwotCi0JcHVibGljIHZvaWQgc2V0QXR0clN0eWxlTGluZUhlaWdodEF0TGVhc3QoU3RyaW5nIGhlaWdodCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRUZXh0QWxpZ24oKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJGb3JtYXRUZXh0QWxpZ24oU3RyaW5nIGFsaWduKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlVmVydGljYWxBbGlnbigpOwotCi0JcHVibGljIHZvaWQgc2V0QXR0clN0eWxlVmVydGljYWxBbGlnbihTdHJpbmcgYWxpZ24pOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luTGVmdCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luUmlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpblRvcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luQm90dG9tKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCYWNrZ3JvdW5kQ29sb3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhYTY3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1N0eWxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3R5bGVDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFNUWUxFX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpzdHlsZToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ERUZBVUxUX1NUWUxFID0gImRlZmF1bHQtc3R5bGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TVFlMRSA9ICJzdHlsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX1BST1BFUlRJRVMgPSAidGFibGUtcHJvcGVydGllcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTID0gInRhYmxlLWNvbHVtbi1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfUk9XX1BST1BFUlRJRVMgPSAidGFibGUtcm93LXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9DRUxMX1BST1BFUlRJRVMgPSAidGFibGUtY2VsbC1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRk9OVF9GQUNFID0gImZvbnQtZmFjZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFRfUFJPUEVSVElFUyA9ICJ0ZXh0LXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEFSVF9QUk9QRVJUSUVTID0gImNoYXJ0LXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9HUkFQSElDX1BST1BFUlRJRVMgPSAiZ3JhcGhpYy1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFSQUdSQVBIX1BST1BFUlRJRVMgPSAicGFyYWdyYXBoLXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQUdFX0xBWU9VVCA9ICJwYWdlLWxheW91dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfTEFZT1VUX1BST1BFUlRJRVMgPSAicGFnZS1sYXlvdXQtcHJvcGVydGllcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RSQVdJTkdfUEFHRV9QUk9QRVJUSUVTID0gImRyYXdpbmctcGFnZS1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTUFTVEVSX1BBR0UgPSAibWFzdGVyLXBhZ2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NQVAgPSAibWFwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPTlRfUElUQ0ggPSAiZm9udC1waXRjaCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBTUlMWSA9ICJmYW1pbHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVNURVJfUEFHRV9OQU1FID0gIm1hc3Rlci1wYWdlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQVJFTlRfU1RZTEVfTkFNRSA9ICJwYXJlbnQtc3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RBVEFfU1RZTEVfTkFNRSA9ICJkYXRhLXN0eWxlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQUdFX0xBWU9VVF9OQU1FID0gInBhZ2UtbGF5b3V0LW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT0xVTU5fV0lEVEggPSAiY29sdW1uLXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX09QVElNQUxfQ09MVU1OX1dJRFRIID0gInVzZS1vcHRpbWFsLWNvbHVtbi13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1dSSVRJTkdfTU9ERSA9ICJ3cml0aW5nLW1vZGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ST1dfSEVJR0hUID0gInJvdy1oZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfT1BUSU1BTF9ST1dfSEVJR0hUID0gInVzZS1vcHRpbWFsLXJvdy1oZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX05BTUUgPSAiZm9udC1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfR0VORVJJQyA9ICJmb250LWZhbWlseS1nZW5lcmljIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfQVNJQU4gPSAiZm9udC1mYW1pbHktYXNpYW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX1BJVENIX0FTSUFOID0gImZvbnQtcGl0Y2gtYXNpYW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX1NJWkVfQVNJQU4gPSAiZm9udC1zaXplLWFzaWFuIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfQ09NUExFWCA9ICJmb250LWZhbWlseS1jb21wbGV4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9QSVRDSF9DT01QTEVYID0gImZvbnQtcGl0Y2gtY29tcGxleCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPTlRfU0laRV9DT01QTEVYID0gImZvbnQtc2l6ZS1jb21wbGV4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfUkVQRUFUID0gInJlcGVhdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BSSU5UX09SSUVOVEFUSU9OID0gInByaW50LW9yaWVudGF0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU0hBRE9XID0gInNoYWRvdyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTkRJVElPTiA9ICJjb25kaXRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUFBMWV9TVFlMRV9OQU1FID0gImFwcGx5LXN0eWxlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFX0NFTExfQUREUkVTUyA9ICJiYXNlLWNlbGwtYWRkcmVzcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RFWFRfVU5ERVJMSU5FX1NUWUxFID0gInRleHQtdW5kZXJsaW5lLXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVEVYVF9QT1NJVElPTiA9ICJ0ZXh0LXBvc2l0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNX0ZPUk1BVCA9ICJudW0tZm9ybWF0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNX1BSRUZJWCA9ICJudW0tcHJlZml4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNX1NVRkZJWCA9ICJudW0tc3VmZml4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfV0lEVEggPSAid2lkdGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0hPUklaT05UQUxfUE9TID0gImhvcml6b250YWwtcG9zIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ0VMTF9QUk9URUNUID0gImNlbGwtcHJvdGVjdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBDRUxMX1BST1RFQ1RfVkFMVUVfTk9UX0RFRklORUQgPSAwOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ0VMTF9QUk9URUNUX1ZBTFVFX05PTkUgPSAxOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ0VMTF9QUk9URUNUX1ZBTFVFX1BST1RFQ1RFRCA9IDI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBDRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOID0gMzsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRCA9IDQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9TdHlsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mjc4M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9TdHlsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxlTGlzdGVuZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBTdHlsZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZU1hc3RlclBhZ2VOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVBhcmVudFN0eWxlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVEYXRhU3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGNyZWF0ZUNoaWxkKFN0cmluZyBmYW1pbHkpOwotCi0JcHVibGljIFN0cmluZyBnZXRGYW1pbHkoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3R5bGVQcm9wZXJ0aWVzQmFzZSBnZXRQcm9wZXJ0eUVsZW1lbnQobG9uZyBpZHgpOwotCi0JcHVibGljIGxvbmcgZ2V0UHJvcGVydHlTaXplKCk7Ci0KLQlwdWJsaWMgdm9pZCBwdXRQcm9wZXJ0eUVsZW1lbnQoU3R5bGVQcm9wZXJ0aWVzQmFzZSBwcm9wZXJ0eSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVQcm9wZXJ0aWVzQmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9TdHlsZVByb3BlcnRpZXNCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGQ2YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9TdHlsZVByb3BlcnRpZXNCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0eWxlUHJvcGVydGllc0Jhc2UgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYlN0b3BFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYlN0b3BFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDVhNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJTdG9wRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRhYlN0b3BFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyUG9zaXRpb24oKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJQb3NpdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFiU3RvcHNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYlN0b3BzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQyZDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFiU3RvcHNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGFiU3RvcHNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpOwotCi0JcHVibGljIFRhYlN0b3BFbGVtZW50IGdldFRhYlN0b3BFbGVtZW50KGxvbmcgaWR4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNjAzYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0QmFja2dyb3VuZENvbG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXIoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJvcmRlclRvcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyQm90dG9tKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXJMZWZ0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXJSaWdodCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0UGFkZGluZygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVTaGFkb3coKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0clN0eWxlQ2VsbFByb3RlY3QoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmUzNjlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQgZXh0ZW5kcyBTdHlsZVByb3BlcnRpZXNCYXNlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCcmVha0JlZm9yZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVDb2x1bW5XaWR0aCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clN0eWxlVXNlT3B0aW1hbENvbHVtbldpZHRoKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlUHJvcGVydGllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1MGRhMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlUHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBUYWJsZVByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlRGlzcGxheSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVXaWR0aCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVXcml0aW5nTW9kZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVCb3JkZXJNb2RlbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjUwNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlUm93SGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCcmVha0JlZm9yZSgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clN0eWxlVXNlT3B0aW1hbFJvd0hlaWdodCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGV4dFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RleHRQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ4ODhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGV4dFByb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dFByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250RmFtaWx5R2VuZXJpYygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250UGl0Y2goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udEZhbWlseUFzaWFuKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaEFzaWFuKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRTaXplQXNpYW4oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udEZhbWlseUNvbXBsZXgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFBpdGNoQ29tcGxleCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250U2l6ZUNvbXBsZXgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlVGV4dFVuZGVybGluZVN0eWxlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVRleHRQb3NpdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Rm9udEZhbWlseSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Rm9udFNpemUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEZvbnRTdHlsZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Rm9udFdlaWdodCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Q29sb3IoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9DaGFydFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0NoYXJ0UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTYyMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0NoYXJ0UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuQ2hhcnRQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoYXJ0UHJvcGVydGllc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDaGFydFByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MzgxNTU3NjQ0Nzc1MDM5NTMzTDsKLQotCXByb3RlY3RlZCBDaGFydFByb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZURpcmVjdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9ESVJFQ1RJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRElSRUNUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0SmFwYW5lc2VDYW5kbGVTdGljaygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9KQVBBTkVTRV9DQU5ETEVfU1RJQ0spKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfSkFQQU5FU0VfQ0FORExFX1NUSUNLKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFN0b2NrV2l0aFZvbHVtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9TVE9DS19XSVRIX1ZPTFVNRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9TVE9DS19XSVRIX1ZPTFVNRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUaHJlZURpbWVuc2lvbmFsKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RIUkVFX0RJTUVOU0lPTkFMKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RIUkVFX0RJTUVOU0lPTkFMKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydERlZXAoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREVFUCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9ERUVQKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydExpbmVzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0xJTkVTKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0xJTkVTKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0SW50ZXJwb2xhdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9JTlRFUlBPTEFUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0lOVEVSUE9MQVRJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFN5bWJvbFR5cGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfU1lNQk9MX1RZUEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfU1lNQk9MX1RZUEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRWZXJ0aWNhbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9WRVJUSUNBTCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9WRVJUSUNBTCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJDaGFydExpbmVzVXNlZCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MSU5FU19VU0VEKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0xJTkVTX1VTRUQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRDb25uZWN0QmFycygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9DT05ORUNUX0JBUlMpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ09OTkVDVF9CQVJTKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0U2VyaWVzU291cmNlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1NFUklFU19TT1VSQ0UpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfU0VSSUVTX1NPVVJDRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydE1lYW5WYWx1ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9NRUFOX1ZBTFVFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX01FQU5fVkFMVUUpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRFcnJvck1hcmdpbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9NQVJHSU4pKSB7Ci0JCQlyZXR1cm4gbmV3IERvdWJsZShnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9NQVJHSU4pKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JMb3dlckxpbWl0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0VSUk9SX0xPV0VSX0xJTUlUKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfTE9XRVJfTElNSVQpKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JVcHBlckxpbWl0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0VSUk9SX1VQUEVSX0xJTUlUKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfVVBQRVJfTElNSVQpKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0RXJyb3JDYXRlZ29yeSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9DQVRFR09SWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9DQVRFR09SWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JQZXJjZW50YWdlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0VSUk9SX1BFUkNFTlRBR0UpKSB7Ci0JCQlyZXR1cm4gbmV3IERvdWJsZShnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9QRVJDRU5UQUdFKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFJlZ3Jlc3Npb25UeXBlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1JFR1JFU1NJT05fVFlQRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9SRUdSRVNTSU9OX1RZUEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydERhdGFMYWJlbE51bWJlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9EQVRBX0xBQkVMX05VTUJFUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9EQVRBX0xBQkVMX05VTUJFUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydERhdGFMYWJlbFRleHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREFUQV9MQUJFTF9URVhUKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RBVEFfTEFCRUxfVEVYVCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnREYXRhTGFiZWxTeW1ib2woKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREFUQV9MQUJFTF9TWU1CT0wpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREFUQV9MQUJFTF9TWU1CT0wpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0RGlzcGxheUxhYmVsKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RJU1BMQVlfTEFCRUwpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRElTUExBWV9MQUJFTCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUaWNrTWFya3NNYWpvcklubmVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RJQ0tfTUFSS1NfTUFKT1JfSU5ORVIpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVElDS19NQVJLU19NQUpPUl9JTk5FUikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUaWNrTWFya3NNYWpvck91dGVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RJQ0tfTUFSS1NfTUFKT1JfT1VURVIpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVElDS19NQVJLU19NQUpPUl9PVVRFUikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRMb2dhcml0aG1pYygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MT0dBUklUSE1JQykpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MT0dBUklUSE1JQykpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUZXh0T3ZlcmxhcCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9URVhUX09WRVJMQVApKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVEVYVF9PVkVSTEFQKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUZXh0TGluZUJyZWFrKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJVGV4dENvbnN0YW50cy5BVFRSX0xJTkVfQlJFQUspKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9MSU5FX0JSRUFLKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0TGFiZWxBcnJhbmdlbWVudCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MQUJFTF9BUlJBTkdFTUVOVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MQUJFTF9BUlJBTkdFTUVOVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFZpc2libGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVklTSUJMRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9WSVNJQkxFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0R2FwV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfR0FQX1dJRFRIKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0dBUF9XSURUSCkpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0T3ZlcmxhcCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9PVkVSTEFQKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX09WRVJMQVApKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFNvbGlkVHlwZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9TT0xJRF9UWVBFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1NPTElEX1RZUEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydE9yaWdpbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9PUklHSU4pKSB7Ci0JCQlyZXR1cm4gbmV3IERvdWJsZShnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9PUklHSU4pKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0TWluaW11bSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9NSU5JTVVNKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTUlOSU1VTSkpLmRvdWJsZVZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xLjA7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRNYXhpbXVtKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX01BWElNVU0pKSB7Ci0JCQlyZXR1cm4gbmV3IERvdWJsZShnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9NQVhJTVVNKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0RlZmF1bHRTdHlsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvRGVmYXVsdFN0eWxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYzZhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvRGVmYXVsdFN0eWxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLkRlZmF1bHRTdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRGVmYXVsdFN0eWxlRWxlbWVudEltcGwgZXh0ZW5kcyBTdHlsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRGVmYXVsdFN0eWxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTI2OTIzNjE2OTAwNzExMDMzM0w7Ci0KLQlwcm90ZWN0ZWQgRGVmYXVsdFN0eWxlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZhbWlseSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GQU1JTFkpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRkFNSUxZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9EcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0RyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGI5Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0RyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLlByZXNlbnRhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuRHJhd2luZ1BhZ2VQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIERyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzgxMjYyMDg2ODY3NjU0OTAxMUw7Ci0KLQlwcm90ZWN0ZWQgRHJhd2luZ1BhZ2VQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5SGVhZGVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfSEVBREVSKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfSEVBREVSKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5Rm9vdGVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfRk9PVEVSKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfRk9PVEVSKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5UGFnZU51bWJlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFByZXNlbnRhdGlvbkNvbnN0YW50cy5QUkVTRU5UQVRJT05fTkFNRVNQQUNFX1VSSSwKLQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9ESVNQTEFZX1BBR0VfTlVNQkVSKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfUEFHRV9OVU1CRVIpKQotCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5RGF0ZVRpbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLkFUVFJfRElTUExBWV9EQVRFX1RJTUUpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5QUkVTRU5UQVRJT05fTkFNRVNQQUNFX1VSSSwKLQkJCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLkFUVFJfRElTUExBWV9EQVRFX1RJTUUpKQotCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdCYWNrZ3JvdW5kU2l6ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9CQUNLR1JPVU5EX1NJWkUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQkFDS0dST1VORF9TSVpFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGwoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9Gb250RmFjZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvRm9udEZhY2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU4ZjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9Gb250RmFjZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLkZvbnRGYWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5TVkdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGb250RmFjZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBGb250RmFjZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4ODYyMzY2NjM5MTkwNzcwNjFMOwotCi0JcHJvdGVjdGVkIEZvbnRGYWNlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z0ZvbnRGYW1pbHkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFkpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdGb250RmFtaWx5R2VuZXJpYygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQlTVkdDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9HRU5FUklDKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZX0dFTkVSSUMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1BJVENIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfUElUQ0gpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0dyYXBoaWNQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9HcmFwaGljUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2JhNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0dyYXBoaWNQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZpbGxJbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuR3JhZGllbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3Lk9wYWNpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5HcmFwaGljUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuU1ZHQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MTUwMTcxODcwMDg3Mjk3MDI3TDsKLQotCXByb3RlY3RlZCBHcmFwaGljUHJvcGVydGllc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHJva2UoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RST0tFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUUk9LRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHJva2VEYXNoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUUk9LRV9EQVNIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUUk9LRV9EQVNIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnU3Ryb2tlV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfU1RST0tFX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX1NUUk9LRV9XSURUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1N0cm9rZUNvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX1NUUk9LRV9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9TVFJPS0VfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TWFya2VyU3RhcnRXaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9NQVJLRVJfU1RBUlRfV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTUFSS0VSX1NUQVJUX1dJRFRIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd01hcmtlckVuZFdpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX01BUktFUl9FTkRfV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTUFSS0VSX0VORF9XSURUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1N0cm9rZU9wYWNpdHkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfU1RST0tFX09QQUNJVFkpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfU1RST0tFX09QQUNJVFkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3T3BhY2l0eSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9PUEFDSVRZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX09QQUNJVFkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT3BhY2l0eUVsZW1lbnQgZ2V0QXR0ckRyYXdPcGFjaXR5TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9PUEFDSVRZX05BTUUpKSB7Ci0JCQlTdHJpbmcgc3RyID0gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9PUEFDSVRZX05BTUUpOwotCQkJT0RGRWxlbWVudCBvcGFjaXR5RWxlbWVudCA9IGZpbmRFbGVtZW50QnlBdHRyVmFsdWVGcm9tU3R5bGVEb2MoCi0JCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkVMRU1FTlRfT1BBQ0lUWSwKLQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksIERyYXdDb25zdGFudHMuQVRUUl9OQU1FLAotCQkJCQlzdHIpOwotCQkJaWYgKChvcGFjaXR5RWxlbWVudCAhPSBudWxsKQotCQkJCQkmJiAob3BhY2l0eUVsZW1lbnQgaW5zdGFuY2VvZiBPcGFjaXR5RWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gKE9wYWNpdHlFbGVtZW50KSBvcGFjaXR5RWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTEwpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgR3JhZGllbnRFbGVtZW50IGdldEF0dHJEcmF3RmlsbEdyYWRpZW50TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0dSQURJRU5UX05BTUUpKSB7Ci0JCQlTdHJpbmcgc3RyID0gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0dSQURJRU5UX05BTUUpOwotCQkJT0RGRWxlbWVudCBmaWxsR3JhZGllbnRFbGVtZW50ID0gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZUZyb21TdHlsZURvYygKLQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuRUxFTUVOVF9HUkFESUVOVCwKLQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksIERyYXdDb25zdGFudHMuQVRUUl9OQU1FLAotCQkJCQlzdHIpOwotCQkJaWYgKChmaWxsR3JhZGllbnRFbGVtZW50ICE9IG51bGwpCi0JCQkJCSYmIChmaWxsR3JhZGllbnRFbGVtZW50IGluc3RhbmNlb2YgR3JhZGllbnRFbGVtZW50KSkgewotCQkJCXJldHVybiAoR3JhZGllbnRFbGVtZW50KSBmaWxsR3JhZGllbnRFbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdHcmFkaWVudFN0ZXBDb3VudCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9HUkFESUVOVF9TVEVQX0NPVU5UKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfR1JBRElFTlRfU1RFUF9DT1VOVCkpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsQ29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9OQU1FKSkgewotCQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9OQU1FKTsKLQkJCU9ERkVsZW1lbnQgZmlsbEltYWdlRWxlbWVudCA9IGZpbmRFbGVtZW50QnlBdHRyVmFsdWVGcm9tU3R5bGVEb2MoCi0JCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRklMTF9JTUFHRSwKLQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksIERyYXdDb25zdGFudHMuQVRUUl9OQU1FLAotCQkJCQlzdHIpOwotCQkJaWYgKChmaWxsSW1hZ2VFbGVtZW50ICE9IG51bGwpCi0JCQkJCSYmIChmaWxsSW1hZ2VFbGVtZW50IGluc3RhbmNlb2YgRmlsbEltYWdlRWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gKChGaWxsSW1hZ2VFbGVtZW50KSBmaWxsSW1hZ2VFbGVtZW50KS5nZXRBdHRyWExpbmtIcmVmKCkKLQkJCQkJCS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsSW1hZ2VXaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlSGVpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfSEVJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfSEVJR0hUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVSZXBlYXQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUkVQRUFUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1JFUEVBVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsSW1hZ2VSZWZQb2ludFgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlRfWCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX1JFRl9QT0lOVF9YKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZVJlZlBvaW50WSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX1JFRl9QT0lOVF9ZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfUkVGX1BPSU5UX1kpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlUmVmUG9pbnQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3VGlsZVJlcGVhdE9mZnNldCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9USUxFX1JFUEVBVF9PRkZTRVQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfVElMRV9SRVBFQVRfT0ZGU0VUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVIb3Jpem9udGFsUG9zKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0hPUklaT05UQUxfUE9TKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0hPUklaT05UQUxfUE9TKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9NYXBFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL01hcEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmRmM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL01hcEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLk1hcEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTWFwRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1hcEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NTk2Nzg4NTI3MTY1MTk2NDEwTDsKLQotCXByb3RlY3RlZCBNYXBFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlQ29uZGl0aW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0NPTkRJVElPTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9DT05ESVRJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUFwcGx5U3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0FQUExZX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfQVBQTFlfU1RZTEVfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlQmFzZUNlbGxBZGRyZXNzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0JBU0VfQ0VMTF9BRERSRVNTKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0JBU0VfQ0VMTF9BRERSRVNTKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9NYXN0ZXJQYWdlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9NYXN0ZXJQYWdlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhY2IxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvTWFzdGVyUGFnZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuTWFzdGVyUGFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTWFzdGVyUGFnZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBNYXN0ZXJQYWdlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjcxOTU4NDczMTg2NDg5NTg0OEw7Ci0KLQlwcm90ZWN0ZWQgTWFzdGVyUGFnZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlUGFnZUxheW91dE5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUEFHRV9MQVlPVVRfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9QQUdFX0xBWU9VVF9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhZ2VMYXlvdXRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhZ2VMYXlvdXRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTcyNDAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYWdlTGF5b3V0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuUGFnZUxheW91dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUGFnZUxheW91dEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBQYWdlTGF5b3V0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjM1Mzk1MjcwNzY5ODQ3MzI1MEw7Ci0KLQlwcm90ZWN0ZWQgUGFnZUxheW91dEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMzU1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQuRm9ybWF0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5QYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTEwNzY2NjgzOTYyMTE5NzkwTDsKLQotCXByb3RlY3RlZCBQYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5Ub3AoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX1RPUCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fVE9QKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luQm90dG9tKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9CT1RUT00pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX0JPVFRPTSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpbkxlZnQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX0xFRlQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX0xFRlQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5SaWdodCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fUklHSFQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX1JJR0hUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0UGFnZVdpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1BBR0VfV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfUEFHRV9XSURUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdFBhZ2VIZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfUEFHRV9IRUlHSFQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfUEFHRV9IRUlHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVByaW50T3JpZW50YXRpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUFJJTlRfT1JJRU5UQVRJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUFJJTlRfT1JJRU5UQVRJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGVjY2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm1hdC5Gb3JtYXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFiU3RvcHNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUGFyYWdyYXBoUHJvcGVydGllc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU2NDc2ODcyODU1NzMxOTc4OTFMOwotCi0JcHJvdGVjdGVkIFBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdExpbmVIZWlnaHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVMaW5lSGVpZ2h0QXRMZWFzdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRUZXh0QWxpZ24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfVEVYVF9BTElHTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9URVhUX0FMSUdOKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVWZXJ0aWNhbEFsaWduKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1ZFUlRJQ0FMX0FMSUdOKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1ZFUlRJQ0FMX0FMSUdOKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRhYlN0b3BzRWxlbWVudCBnZXRUYWJTdG9wc0VsZW1lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ckZvcm1hdExpbmVIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyU3R5bGVMaW5lSGVpZ2h0QXRMZWFzdChTdHJpbmcgaGVpZ2h0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyRm9ybWF0VGV4dEFsaWduKFN0cmluZyBhbGlnbikgewotCQlpZiAoYWxpZ24gIT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfVkVSVElDQUxfQUxJR04sIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyU3R5bGVWZXJ0aWNhbEFsaWduKFN0cmluZyBhbGlnbikgewotCQlpZiAoYWxpZ24gIT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfVEVYVF9BTElHTiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5MZWZ0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9MRUZUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9MRUZUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luUmlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX1JJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9SSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpblRvcCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fVE9QKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9UT1ApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5Cb3R0b20oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX0JPVFRPTSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fQk9UVE9NKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0QmFja2dyb3VuZENvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JBQ0tHUk9VTkRfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQkFDS0dST1VORF9DT0xPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvU3R5bGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1N0eWxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5NTgyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvU3R5bGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVQcm9wZXJ0aWVzQmFzZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFN0eWxlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFN0eWxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTA3NTc1NDExOTI0ODM0NjY0NUw7Ci0KLQlwcm90ZWN0ZWQgU3R5bGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgY3JlYXRlQ2hpbGQoU3RyaW5nIGZhbWlseSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZBTUlMWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GQU1JTFkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0eWxlUHJvcGVydGllc0Jhc2UgZ2V0UHJvcGVydHlFbGVtZW50KGxvbmcgaWR4KSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCU5vZGVMaXN0IG5sID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFN0eWxlUHJvcGVydGllc0Jhc2UpIHsKLQkJCQlpZiAoaWR4ID09IGNvdW50KQotCQkJCQlyZXR1cm4gKFN0eWxlUHJvcGVydGllc0Jhc2UpIG5vZGU7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRQcm9wZXJ0eVNpemUoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCU5vZGVMaXN0IG5sID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFN0eWxlUHJvcGVydGllc0Jhc2UpIHsKLQkJCQljb3VudCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRQcm9wZXJ0eUVsZW1lbnQoU3R5bGVQcm9wZXJ0aWVzQmFzZSBwcm9wZXJ0eSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVNYXN0ZXJQYWdlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9NQVNURVJfUEFHRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX01BU1RFUl9QQUdFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVBhcmVudFN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9QQVJFTlRfU1RZTEVfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9QQVJFTlRfU1RZTEVfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRGF0YVN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9EQVRBX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfREFUQV9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9TdHlsZU5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvU3R5bGVOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI3NWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9TdHlsZU5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuQWJzdHJhY3RPREZOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU3R5bGVOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T0RGTm9kZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiB0YWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0RFRkFVTFRfU1RZTEUsCi0JCQkJRGVmYXVsdFN0eWxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfU1RZTEUsIFN0eWxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfUFJPUEVSVElFUywKLQkJCQlUYWJsZVByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DT0xVTU5fUFJPUEVSVElFUywKLQkJCQlUYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9ST1dfUFJPUEVSVElFUywKLQkJCQlUYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DRUxMX1BST1BFUlRJRVMsCi0JCQkJVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0ZPTlRfRkFDRSwgRm9udEZhY2VFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9URVhUX1BST1BFUlRJRVMsCi0JCQkJVGV4dFByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9DSEFSVF9QUk9QRVJUSUVTLAotCQkJCUNoYXJ0UHJvcGVydGllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0dSQVBISUNfUFJPUEVSVElFUywKLQkJCQlHcmFwaGljUHJvcGVydGllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1BBUkFHUkFQSF9QUk9QRVJUSUVTLAotCQkJCVBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9QQUdFX0xBWU9VVCwKLQkJCQlQYWdlTGF5b3V0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfUEFHRV9MQVlPVVRfUFJPUEVSVElFUywKLQkJCQlQYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0RSQVdJTkdfUEFHRV9QUk9QRVJUSUVTLAotCQkJCURyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX01BU1RFUl9QQUdFLAotCQkJCU1hc3RlclBhZ2VFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9NQVAsIE1hcEVsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm1hdC5Gb3JtYXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NTk4MDYzMTg5ODk5MTgwMjIwTDsKLQotCXByb3RlY3RlZCBUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0QmFja2dyb3VuZENvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JBQ0tHUk9VTkRfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQkFDS0dST1VORF9DT0xPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJvcmRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVIpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQk9SREVSKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyVG9wKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9UT1ApKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQk9SREVSX1RPUCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJvcmRlckJvdHRvbSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVJfQk9UVE9NKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9CT1RUT00pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXJMZWZ0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9MRUZUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9MRUZUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyUmlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQk9SREVSX1JJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9SSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdFBhZGRpbmcoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfUEFERElORykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9QQURESU5HKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVTaGFkb3coKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfU0hBRE9XKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1NIQURPVyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDRUxMX1BST1RFQ1RfVkFMVUVfTk9ORSA9ICJub25lIjsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDRUxMX1BST1RFQ1RfVkFMVUVfUFJPVEVDVEVEID0gInByb3RlY3RlZCI7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0VMTF9QUk9URUNUX1ZBTFVFX0ZPUk1VTEFfSElEREVOID0gImZvcm11bGEtaGlkZGVuIjsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOX0FORF9QUk9URUNURUQgPSAiaGlkZGVuLWFuZC1wcm90ZWN0ZWQiOwotCi0JcHVibGljIGludCBnZXRBdHRyU3R5bGVDZWxsUHJvdGVjdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9DRUxMX1BST1RFQ1QpKSB7Ci0JCQlTdHJpbmcgc3RyID0gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9DRUxMX1BST1RFQ1QpOwotCQkJaWYgKHN0ci5lcXVhbHMoQ0VMTF9QUk9URUNUX1ZBTFVFX05PTkUpKSB7Ci0JCQkJcmV0dXJuIFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9OT05FOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzKENFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRCkpIHsKLQkJCQlyZXR1cm4gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX0hJRERFTl9BTkRfUFJPVEVDVEVEOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgdmFsID0gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX05PVF9ERUZJTkVEOwotCQkJCVN0cmluZ1tdIHZhbHVlcyA9IHN0ci5zcGxpdCgiICIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh2YWx1ZXNbaV0uZXF1YWxzKENFTExfUFJPVEVDVF9WQUxVRV9QUk9URUNURUQpKSB7Ci0JCQkJCQlpZiAodmFsID09IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9ISURERU4pCi0JCQkJCQkJdmFsID0gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX0hJRERFTl9BTkRfUFJPVEVDVEVEOwotCQkJCQkJZWxzZQotCQkJCQkJCXZhbCA9IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9QUk9URUNURUQ7Ci0JCQkJCX0gZWxzZSBpZiAodmFsdWVzW2ldCi0JCQkJCQkJLmVxdWFscyhDRUxMX1BST1RFQ1RfVkFMVUVfRk9STVVMQV9ISURERU4pKSB7Ci0JCQkJCQlpZiAodmFsID09IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9QUk9URUNURUQpCi0JCQkJCQkJdmFsID0gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX0hJRERFTl9BTkRfUFJPVEVDVEVEOwotCQkJCQkJZWxzZQotCQkJCQkJCXZhbCA9IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9ISURERU47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX05PVF9ERUZJTkVEOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2MzMGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQuRm9ybWF0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY5MTk4MjI3ODM2MzgzNzYxMEw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJyZWFrQmVmb3JlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JSRUFLX0JFRk9SRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CUkVBS19CRUZPUkUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUNvbHVtbldpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0NPTFVNTl9XSURUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9DT0xVTU5fV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyU3R5bGVVc2VPcHRpbWFsQ29sdW1uV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfVVNFX09QVElNQUxfQ09MVU1OX1dJRFRIKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1VTRV9PUFRJTUFMX0NPTFVNTl9XSURUSCkpCi0JCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZVByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OGM0NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5UYWJsZVByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRhYmxlUHJvcGVydGllc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZVByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NjgzMzgxMTE5MTM1MTY1TDsKLQotCXByb3RlY3RlZCBUYWJsZVByb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGFibGVEaXNwbGF5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0RJU1BMQVkpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRElTUExBWSkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVdpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1dJRFRIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVXcml0aW5nTW9kZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9XUklUSU5HX01PREUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfV1JJVElOR19NT0RFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVCb3JkZXJNb2RlbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9CT1JERVJfTU9ERUwpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQk9SREVSX01PREVMKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlUm93UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2Q1MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlUm93UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm1hdC5Gb3JtYXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlUm93UHJvcGVydGllc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MzUxMjE3ODgyMzk0MzAwOTYxTDsKLQotCXByb3RlY3RlZCBUYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVJvd0hlaWdodCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9ST1dfSEVJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1JPV19IRUlHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCcmVha0JlZm9yZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CUkVBS19CRUZPUkUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQlJFQUtfQkVGT1JFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clN0eWxlVXNlT3B0aW1hbFJvd0hlaWdodCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9VU0VfT1BUSU1BTF9ST1dfSEVJR0hUKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1VTRV9PUFRJTUFMX1JPV19IRUlHSFQpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UZXh0UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGV4dFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDJmZGMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UZXh0UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQuRm9ybWF0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGV4dFByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGV4dFByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGV4dFByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTI0ODc2NTA0OTEwNzM2ODI3OUw7Ci0KLQlwcm90ZWN0ZWQgVGV4dFByb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnROYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRGb250U2l6ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9GT05UX1NJWkUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfRk9OVF9TSVpFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Rm9udFN0eWxlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfU1RZTEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfRk9OVF9TVFlMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEZvbnRXZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfRk9OVF9XRUlHSFQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfRk9OVF9XRUlHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9DT0xPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CQUNLR1JPVU5EX0NPTE9SKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JBQ0tHUk9VTkRfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRGb250RmFtaWx5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250RmFtaWx5R2VuZXJpYygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9HRU5FUklDKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZX0dFTkVSSUMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1BJVENIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfUElUQ0gpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRGYW1pbHlBc2lhbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9BU0lBTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9BU0lBTik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFBpdGNoQXNpYW4oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9QSVRDSF9BU0lBTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1BJVENIX0FTSUFOKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250U2l6ZUFzaWFuKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfU0laRV9BU0lBTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1NJWkVfQVNJQU4pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRGYW1pbHlDb21wbGV4KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZX0NPTVBMRVgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFlfQ09NUExFWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFBpdGNoQ29tcGxleCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1BJVENIX0NPTVBMRVgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9QSVRDSF9DT01QTEVYKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250U2l6ZUNvbXBsZXgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9TSVpFX0NPTVBMRVgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9TSVpFX0NPTVBMRVgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVRleHRVbmRlcmxpbmVTdHlsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9URVhUX1VOREVSTElORV9TVFlMRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9URVhUX1VOREVSTElORV9TVFlMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlVGV4dFBvc2l0aW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1RFWFRfUE9TSVRJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfVEVYVF9QT1NJVElPTik7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9EZXNjRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvRGVzY0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlYzMwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9EZXNjRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2ZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJRWRpdGFibGUgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3ZnL1NWR0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvU1ZHQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjQwZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvU1ZHQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU1ZHQ29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBTVkdfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnN2Zy1jb21wYXRpYmxlOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RJVExFID0gInRpdGxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfREVTQyA9ICJkZXNjIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfV0lEVEggPSAid2lkdGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9IRUlHSFQgPSAiaGVpZ2h0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfWCA9ICJ4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfWSA9ICJ5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX0ZBTUlMWV9HRU5FUklDID0gImZvbnQtZmFtaWx5LWdlbmVyaWMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFJPS0VfV0lEVEggPSAic3Ryb2tlLXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RST0tFX0NPTE9SID0gInN0cm9rZS1jb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUUk9LRV9PUEFDSVRZID0gInN0cm9rZS1vcGFjaXR5IjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9UaXRsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3ZnL1RpdGxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI2ZGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3ZnL1RpdGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2ZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgVGl0bGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSUVkaXRhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL0Rlc2NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9EZXNjRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxYTg5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL0Rlc2NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLkRlc2NFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLWNsYXNzIERlc2NFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MTAyMjUzNTM3MDIwMDc4NzU3TDsKLQotCXByb3RlY3RlZCBEZXNjRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlyZXR1cm4gKChUZXh0KSBjaGlsZCkuZ2V0RGF0YSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0KElFZGl0YWJsZSBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9TVkdOb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9TVkdOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWYyOWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3ZnL2ltcGwvU1ZHTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuQWJzdHJhY3RPREZOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTVkdOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T0RGTm9kZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiB0YWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJdGFnTWFwLnB1dChTVkdDb25zdGFudHMuRUxFTUVOVF9USVRMRSwgVGl0bGVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU1ZHQ29uc3RhbnRzLkVMRU1FTlRfREVTQywgRGVzY0VsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9UaXRsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjOWVjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotY2xhc3MgVGl0bGVFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGl0bGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODc3MDYwODg2NDQxMTcyODY4MEw7Ci0KLQlwcm90ZWN0ZWQgVGl0bGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCXJldHVybiAoKFRleHQpIGNoaWxkKS5nZXREYXRhKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL0NvdmVyZWRUYWJsZUNlbGxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL0NvdmVyZWRUYWJsZUNlbGxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGExODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9Db3ZlcmVkVGFibGVDZWxsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvdmVyZWRUYWJsZUNlbGxFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlLAotCQlJVGV4dEVsZW1lbnRDb250YWluZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ2VsbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDZWxsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg2ODNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDZWxsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQ2VsbEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck9mZmljZVZhbHVlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJPZmZpY2VWYWx1ZVR5cGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRm9ybXVsYSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zUmVwZWF0ZWQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1NwYW5uZWQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVDb2xJbmRleCgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZVJvd0luZGV4KCk7Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlQ29sU2l6ZSgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZVJvd1NpemUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29sdW1uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUNvbHVtbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNTZmNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29sdW1uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBUYWJsZUNvbHVtbkVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlU3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVEZWZhdWx0Q2VsbFN0eWxlTmFtZSgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlRWxlbWVudCgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZUNvbHVtbkluZGV4KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUNvbHVtbnNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29sdW1uc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmYTNhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29sdW1uc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVDb2x1bW5zRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4NzI2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUNvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRhYmxlOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFID0gInRhYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfUk9XID0gInRhYmxlLXJvdyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT1ZFUkVEX1RBQkxFX0NFTEwgPSAiY292ZXJlZC10YWJsZS1jZWxsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfSEVBREVSX0NPTFVNTlMgPSAidGFibGUtaGVhZGVyLWNvbHVtbnMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9IRUFERVJfUk9XUyA9ICJ0YWJsZS1oZWFkZXItcm93cyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX1JPV1MgPSAidGFibGUtcm93cyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX0NPTFVNTlMgPSAidGFibGUtY29sdW1ucyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUWUxFX05BTUUgPSAic3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NFTExfUkFOR0VfQUREUkVTUyA9ICJjZWxsLXJhbmdlLWFkZHJlc3MiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkRfQ0VMTF9BRERSRVNTID0gImVuZC1jZWxsLWFkZHJlc3MiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkRfWCA9ICJlbmQtY2VsbC14IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1kgPSAiZW5kLWNlbGwteSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVkgPSAiZGlzcGxheSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPUk1VTEEgPSAiZm9ybXVsYSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05VTUJFUl9ST1dTX1JFUEVBVEVEID0gIm51bWJlci1yb3dzLXJlcGVhdGVkIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNQkVSX0NPTFVNTlNfUkVQRUFURUQgPSAibnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1CRVJfQ09MVU1OU19TUEFOTkVEID0gIm51bWJlci1jb2x1bW5zLXNwYW5uZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0NFTExfU1RZTEVfTkFNRSA9ICJkZWZhdWx0LWNlbGwtc3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0FUVFJfUFJJTlQgPSAiYXR0ci1wcmludCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9NT0RFTCA9ICJib3JkZXItbW9kZWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFJVQ1RVUkVfUFJPVEVDVEVEID0gInN0cnVjdHVyZS1wcm90ZWN0ZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9URUNURUQgPSAicHJvdGVjdGVkIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxYTk3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGludGVyZmFjZSBUYWJsZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlTmFtZSgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlQXR0clByaW50KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGFibGVQcm90ZWN0ZWQoKTsKLQotCXB1YmxpYyBDb250ZW50QmFzZUVsZW1lbnQgZ2V0Q29udGVudCgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCk7Ci0KLQlwdWJsaWMgVGFibGVDb2x1bW5FbGVtZW50IGdldFRhYmxlQ29sdW1uQ2hpbGQoaW50IGNvbHVtbik7Ci0KLQlwdWJsaWMgVGFibGVSb3dFbGVtZW50IGdldFRhYmxlUm93Q2hpbGQoaW50IHJvdyk7Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlQ29sdW1uU2l6ZSgpOwotCi0JcHVibGljIExpc3QgZ2V0VGFibGVDb2x1bW5DaGlsZHJlbigpOwotCi0JcHVibGljIGludCBnZXRUYWJsZVJvd1NpemUoKTsKLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlUm93Q2hpbGRyZW4oKTsKLQotCXB1YmxpYyBib29sZWFuIGhhc1RhYmxlQ2VsbFN0eWxlKGludCBjb2x1bW4sIGludCByb3cpOwotCi0JcHVibGljIFRhYmxlUm93RWxlbWVudCBhcHBlbmROZXdUYWJsZVJvd0VsZW1lbnQoKTsKLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRUYWJsZUhlYWRlckNvbHVtbnMoKTsKLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRUYWJsZUhlYWRlclJvd3MoKTsKLQotCXB1YmxpYyBTZXF1ZW5jZUVsZW1lbnQgZ2V0VGV4dFNlcXVlbmNlRWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGI3YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBUYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlRWxlbWVudCgpOwotCi0JcHVibGljIExpc3QgZ2V0VGFibGVDb2x1bUNoaWxkcmVuKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlSGVhZGVyUm93c0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVIZWFkZXJSb3dzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE0NDQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVIZWFkZXJSb3dzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVIZWFkZXJSb3dzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKTsKLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlUm93Q2hpbGRyZW4oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVSb3dFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlUm93RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJiZGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVSb3dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBUYWJsZVJvd0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRhYmxlTnVtYmVyUm93c1JlcGVhdGVkKCk7Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlSW5kZXgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0Um93SW5kZXgoKTsKLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVFbGVtZW50KCk7Ci0KLQlwdWJsaWMgTGlzdCBnZXRUYWJsZUNlbGxDaGlsZHJlbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVSb3dzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZVJvd3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWZiNmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZVJvd3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBUYWJsZVJvd3NFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIExpc3QgZ2V0VGFibGVSb3dDaGlsZHJlbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9Db3ZlcmVkVGFibGVDZWxsRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9Db3ZlcmVkVGFibGVDZWxsRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MDE0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLkNvdmVyZWRUYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENvdmVyZWRUYWJsZUNlbGxFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDb3ZlcmVkVGFibGVDZWxsRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTczNzMyODM1ODgwNDg2MzI2NjNMOwotCi0JcHJvdGVjdGVkIENvdmVyZWRUYWJsZUNlbGxFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlRWxlbWVudCBzdHlsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlKCkgewotCQlFbGVtZW50IHJvb3QgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgT0RGRWxlbWVudEltcGwpIHsKLQkJCVN0cmluZyBzdHlsZU5hbWUgPSBnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJCU9ERkVsZW1lbnQgZWxlbSA9ICgoT0RGRWxlbWVudEltcGwpIHJvb3QpLmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfU1RZTEUsCi0JCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSwgc3R5bGVOYW1lKTsKLQkJCWlmICgoZWxlbSAhPSBudWxsKSAmJiAoZWxlbSBpbnN0YW5jZW9mIFN0eWxlRWxlbWVudCkpCi0JCQkJcmV0dXJuIChTdHlsZUVsZW1lbnQpIGVsZW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVDZWxsRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUNlbGxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhmN2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUNlbGxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLk9mZmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuaW1wbC5JVGV4dEVsZW1lbnRDb250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZVJvd0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLWNsYXNzIFRhYmxlQ2VsbEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlQ2VsbEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NjE3NTM2OTM5NzYwODIwMzk3TDsKLQotCXByb3RlY3RlZCBUYWJsZUNlbGxFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IGdldFRhYmxlRWxlbWVudCgpOwotCQlyZXR1cm4gdGFibGVFbGVtZW50LmdldFRhYmxlSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlRWxlbWVudCgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IG51bGw7Ci0KLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJCXRhYmxlRWxlbWVudCA9IChUYWJsZUVsZW1lbnQpIHBhcmVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdGFibGVFbGVtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVDb2xJbmRleCgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IGdldFRhYmxlRWxlbWVudCgpOwotCQlpZiAodGFibGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJTGlzdCByb3dMaXN0ID0gdGFibGVFbGVtZW50LmdldFRhYmxlUm93Q2hpbGRyZW4oKTsKLQkJaWYgKHJvd0xpc3QgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvd0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRhYmxlUm93RWxlbWVudCByb3cgPSAoVGFibGVSb3dFbGVtZW50KSByb3dMaXN0LmdldChpKTsKLQkJCUxpc3QgY2VsbExpc3QgPSByb3cuZ2V0VGFibGVDZWxsQ2hpbGRyZW4oKTsKLQkJCWlmIChjZWxsTGlzdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjZWxsTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlpZiAoY2VsbExpc3QuZ2V0KGopLmVxdWFscyh0aGlzKSkgewotCQkJCQkJcmV0dXJuIGo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZVJvd0luZGV4KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gZ2V0VGFibGVFbGVtZW50KCk7Ci0JCWlmICh0YWJsZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlMaXN0IHJvd0xpc3QgPSB0YWJsZUVsZW1lbnQuZ2V0VGFibGVSb3dDaGlsZHJlbigpOwotCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm93TGlzdC5zaXplKCk7IGkrKykgewotCQkJVGFibGVSb3dFbGVtZW50IHJvdyA9IChUYWJsZVJvd0VsZW1lbnQpIHJvd0xpc3QuZ2V0KGkpOwotCQkJTGlzdCBjZWxsTGlzdCA9IHJvdy5nZXRUYWJsZUNlbGxDaGlsZHJlbigpOwotCQkJaWYgKGNlbGxMaXN0ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNlbGxMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCWlmIChjZWxsTGlzdC5nZXQoaikuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJCQlyZXR1cm4gaTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlQ29sU2l6ZSgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IGdldFRhYmxlRWxlbWVudCgpOwotCQlpZiAodGFibGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJTGlzdCByb3dMaXN0ID0gdGFibGVFbGVtZW50LmdldFRhYmxlUm93Q2hpbGRyZW4oKTsKLQkJaWYgKHJvd0xpc3QgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvd0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRhYmxlUm93RWxlbWVudCByb3cgPSAoVGFibGVSb3dFbGVtZW50KSByb3dMaXN0LmdldChpKTsKLQkJCUxpc3QgY2VsbExpc3QgPSByb3cuZ2V0VGFibGVDZWxsQ2hpbGRyZW4oKTsKLQkJCWlmIChjZWxsTGlzdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjZWxsTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlpZiAoY2VsbExpc3QuZ2V0KGopLmVxdWFscyh0aGlzKSkgewotCQkJCQkJcmV0dXJuIGNlbGxMaXN0LnNpemUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZVJvd1NpemUoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBnZXRUYWJsZUVsZW1lbnQoKTsKLQkJaWYgKHRhYmxlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCUxpc3Qgcm93TGlzdCA9IHRhYmxlRWxlbWVudC5nZXRUYWJsZVJvd0NoaWxkcmVuKCk7Ci0JCWlmIChyb3dMaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJcmV0dXJuIHJvd0xpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck9mZmljZVZhbHVlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZBTFVFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZBTFVFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyT2ZmaWNlVmFsdWVUeXBlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZBTFVFX1RZUEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSSwKLQkJCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkFMVUVfVFlQRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRm9ybXVsYSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9GT1JNVUxBKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0ZPUk1VTEEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCkpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1NwYW5uZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX0NPTFVNTlNfU1BBTk5FRCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19TUEFOTkVEKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZU5TKE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSSwKLQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9WQUxVRSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyT2ZmaWNlVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZUVsZW1lbnQgc3R5bGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0eWxlRWxlbWVudCBnZXRTdHlsZSgpIHsKLQkJRWxlbWVudCByb290ID0gZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIE9ERkVsZW1lbnRJbXBsKSB7Ci0JCQlTdHJpbmcgc3R5bGVOYW1lID0gZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCQlPREZFbGVtZW50IGVsZW0gPSAoKE9ERkVsZW1lbnRJbXBsKSByb290KS5maW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLAotCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsIHN0eWxlTmFtZSk7Ci0JCQlpZiAoKGVsZW0gIT0gbnVsbCkgJiYgKGVsZW0gaW5zdGFuY2VvZiBTdHlsZUVsZW1lbnQpKQotCQkJCXJldHVybiAoU3R5bGVFbGVtZW50KSBlbGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENvbnRlbnRTaXplKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDaGlsZEl0ZXJhdG9yKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVDb2x1bW5FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlQ29sdW1uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNGRiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVDb2x1bW5FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29sdW1uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotY2xhc3MgVGFibGVDb2x1bW5FbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZUNvbHVtbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02NDgxNDMyNDk2MzA5ODQ2NDAxTDsKLQotCXByb3RlY3RlZCBUYWJsZUNvbHVtbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zUmVwZWF0ZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX0NPTFVNTlNfUkVQRUFURUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX0NPTFVNTlNfUkVQRUFURUQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZURlZmF1bHRDZWxsU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0VMTF9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0VMTF9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGUgPSBnZXRUYWJsZUVsZW1lbnQoKTsKLQkJaWYgKHRhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiB0YWJsZS5nZXRUYWJsZUluZGV4KCk7Ci0JfQotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBudWxsOwotCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCQl0YWJsZUVsZW1lbnQgPSAoVGFibGVFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiB0YWJsZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUNvbHVtbkluZGV4KCkgewotCQlpbnQgY29sdW1uU3RhcnRJbmRleCA9IDA7Ci0JCU5vZGVMaXN0IGxpc3QgPSBnZXRUYWJsZUVsZW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksICJ0YWJsZS1jb2x1bW4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChsaXN0Lml0ZW0oaSkuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJcmV0dXJuIGNvbHVtblN0YXJ0SW5kZXg7Ci0JCQl9Ci0JCQlpZiAoKChUYWJsZUNvbHVtbkVsZW1lbnQpIGxpc3QuaXRlbShpKSkuaGFzQXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX0NPTFVNTlNfUkVQRUFURUQpKSB7Ci0JCQkJY29sdW1uU3RhcnRJbmRleCArPSAoKFRhYmxlQ29sdW1uRWxlbWVudCkgbGlzdC5pdGVtKGkpKQotCQkJCQkJLmdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQljb2x1bW5TdGFydEluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlRWxlbWVudCBzdHlsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUNvbHVtbnNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlQ29sdW1uc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOGEyNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlQ29sdW1uc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29sdW1uc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJsZUNvbHVtbnNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVDb2x1bW5zRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY1NDgzOTQwMjI0NjM1NzU1NDBMOwotCi0JcHJvdGVjdGVkIFRhYmxlQ29sdW1uc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc4NzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuQ29udGVudEJhc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuaW1wbC5JVGV4dEVsZW1lbnRDb250YWluZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlSGVhZGVyUm93c0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVSb3dzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBUYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhYmxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEwNzI4MTQ3ODU0OTY5NTMyNDlMOwotCi0JcHJvdGVjdGVkIFRhYmxlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlQXR0clByaW50KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0FUVFJfUFJJTlQpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQVRUUl9QUklOVCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGFibGVQcm90ZWN0ZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfUFJPVEVDVEVEKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1BST1RFQ1RFRCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlSW5kZXgoKSB7Ci0JCU5vZGVMaXN0IGxpc3QgPSBnZXRDb250ZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLCAidGFibGUiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChsaXN0Lml0ZW0oaSkuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBUYWJsZUNvbHVtbkVsZW1lbnQgZ2V0VGFibGVDb2x1bW5DaGlsZChpbnQgY29sdW1uKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uRWxlbWVudCkgewotCQkJCQlpZiAoY291bnQgPT0gY29sdW1uKQotCQkJCQkJcmV0dXJuIChUYWJsZUNvbHVtbkVsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCWNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUYWJsZVJvd0VsZW1lbnQgZ2V0VGFibGVSb3dDaGlsZChpbnQgcm93KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlUm93RWxlbWVudCkgewotCQkJCQlpZiAoY291bnQgPT0gcm93KQotCQkJCQkJcmV0dXJuIChUYWJsZVJvd0VsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCWNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVDb2x1bW5TaXplKCkgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KSB7Ci0JCQkJCWludCBsZW4gPSAoKFRhYmxlQ29sdW1uRWxlbWVudCkgY2hpbGQpCi0JCQkJCQkJLmdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpOwotCQkJCQlpZiAobGVuID4gMCkKLQkJCQkJCXNpemUgKz0gbGVuOwotCQkJCQllbHNlCi0JCQkJCQlzaXplKys7Ci0JCQkJfSBlbHNlIGlmICgoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50KQotCQkJCQkJfHwgKGNoaWxkIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KSkgewotCQkJCQlOb2RlTGlzdCBncmFuZENoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdyYW5kQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBncmFuZENoaWxkID0gZ3JhbmRDaGlsZHJlbi5pdGVtKGopOwotCQkJCQkJaWYgKGdyYW5kQ2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpIHsKLQkJCQkJCQlpbnQgbGVuID0gKChUYWJsZUNvbHVtbkVsZW1lbnQpIGdyYW5kQ2hpbGQpCi0JCQkJCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQkJCQkJaWYgKGxlbiA+IDApCi0JCQkJCQkJCXNpemUgKz0gbGVuOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJc2l6ZSsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlQ29sdW1uQ2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gY29sTGlzdCA9IG51bGw7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KSB7Ci0JCQkJCWlmIChjb2xMaXN0ID09IG51bGwpCi0JCQkJCQljb2xMaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJCQljb2xMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfSBlbHNlIGlmICgoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50KQotCQkJCQkJfHwgKGNoaWxkIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KSkgewotCQkJCQlOb2RlTGlzdCBncmFuZENoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdyYW5kQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBncmFuZENoaWxkID0gZ3JhbmRDaGlsZHJlbi5pdGVtKGopOwotCQkJCQkJaWYgKGdyYW5kQ2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpIHsKLQkJCQkJCQlpZiAoY29sTGlzdCA9PSBudWxsKQotCQkJCQkJCQljb2xMaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJCQkJCWNvbExpc3QuYWRkKGdyYW5kQ2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2xMaXN0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVSb3dTaXplKCkgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KSB7Ci0JCQkJCWludCBsZW4gPSAoKFRhYmxlUm93RWxlbWVudCkgY2hpbGQpCi0JCQkJCQkJLmdldEF0dHJUYWJsZU51bWJlclJvd3NSZXBlYXRlZCgpOwotCQkJCQlpZiAobGVuID4gMCkKLQkJCQkJCXNpemUgKz0gbGVuOwotCQkJCQllbHNlCi0JCQkJCQlzaXplKys7Ci0JCQkJfSBlbHNlIGlmICgoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUhlYWRlclJvd3NFbGVtZW50KQotCQkJCQkJfHwgKGNoaWxkIGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KSkgewotCQkJCQlOb2RlTGlzdCBncmFuZENoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGdyYW5kQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJTm9kZSBncmFuZENoaWxkID0gZ3JhbmRDaGlsZHJlbi5pdGVtKGopOwotCQkJCQkJaWYgKGdyYW5kQ2hpbGQgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQkJCQlpbnQgbGVuID0gKChUYWJsZVJvd0VsZW1lbnQpIGdyYW5kQ2hpbGQpCi0JCQkJCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyUm93c1JlcGVhdGVkKCk7Ci0JCQkJCQkJaWYgKGxlbiA+IDApCi0JCQkJCQkJCXNpemUgKz0gbGVuOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJc2l6ZSsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlUm93Q2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gcm93TGlzdCA9IG51bGw7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQkJaWYgKHJvd0xpc3QgPT0gbnVsbCkKLQkJCQkJCXJvd0xpc3QgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCQkJCXJvd0xpc3QuYWRkKGNoaWxkcmVuLml0ZW0oaSkpOwotCQkJCX0gZWxzZSBpZiAoKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZUhlYWRlclJvd3NFbGVtZW50KQotCQkJCQkJfHwgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZVJvd3NFbGVtZW50KSkgewotCQkJCQlOb2RlTGlzdCBncmFuZENoaWxkcmVuID0gY2hpbGRyZW4uaXRlbShpKS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JhbmRDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlpZiAoZ3JhbmRDaGlsZHJlbi5pdGVtKGopIGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KSB7Ci0JCQkJCQkJaWYgKHJvd0xpc3QgPT0gbnVsbCkKLQkJCQkJCQkJcm93TGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJCQkJCQlyb3dMaXN0LmFkZChncmFuZENoaWxkcmVuLml0ZW0oaikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb3dMaXN0OwotCX0KLQotCXB1YmxpYyBDb250ZW50QmFzZUVsZW1lbnQgZ2V0Q29udGVudCgpIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRCYXNlRWxlbWVudCBjb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQkJRWxlbWVudCByb290ID0gb2RmRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50Q29udGVudEVsZW1lbnQpIHsKLQkJCUJvZHlFbGVtZW50IGJvZHkgPSAoKERvY3VtZW50Q29udGVudEVsZW1lbnQpIHJvb3QpLmdldEJvZHlFbGVtZW50KCk7Ci0JCQljb250ZW50RWxlbWVudCA9IGJvZHkuZ2V0Q29udGVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1RhYmxlQ2VsbFN0eWxlKGludCBjb2x1bW4sIGludCByb3cpIHsKLQkJVGFibGVSb3dFbGVtZW50IHJvd0VsZW1lbnQgPSBnZXRUYWJsZVJvd0NoaWxkKHJvdyk7Ci0JCUxpc3QgY2VsbEVsZW1zID0gcm93RWxlbWVudC5nZXRUYWJsZUNlbGxDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMCwgY29sQ291bnQgPSAwOyBpIDwgY2VsbEVsZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUNlbGxFbGVtZW50IGNlbGxFbGVtID0gKFRhYmxlQ2VsbEVsZW1lbnQpIGNlbGxFbGVtcy5nZXQoaSk7Ci0JCQlpZiAoY2VsbEVsZW0uaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCkpIHsKLQkJCQljb2xDb3VudCArPSBjZWxsRWxlbS5nZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zUmVwZWF0ZWQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29sQ291bnQrKzsKLQkJCX0KLQkJCWlmIChjb2xDb3VudCAtIDEgPj0gY29sdW1uKQotCQkJCXJldHVybiBjZWxsRWxlbS5oYXNBdHRyaWJ1dGVOUygKLQkJCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVSb3dFbGVtZW50IGFwcGVuZE5ld1RhYmxlUm93RWxlbWVudCgpIHsKLQkJU3RyaW5nIHRhYmxlUHJlZml4ID0gdGhpcwotCQkJCS5sb29rdXBQcmVmaXgoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSk7Ci0JCVRhYmxlUm93RWxlbWVudCByb3dFbGVtZW50ID0gKFRhYmxlUm93RWxlbWVudCkgZ2V0T3duZXJEb2N1bWVudCgpCi0JCQkJLmNyZWF0ZUVsZW1lbnQoCi0JCQkJCQl0YWJsZVByZWZpeCArICI6IiArIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfUk9XKTsKLQkJcmV0dXJuIChUYWJsZVJvd0VsZW1lbnQpIHRoaXMuYXBwZW5kQ2hpbGQocm93RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldFRhYmxlSGVhZGVyQ29sdW1ucygpIHsKLQkJcmV0dXJuIFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLCAiLi8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCSsgVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkrIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfSEVBREVSX0NPTFVNTlMgKyAiJ10iKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0VGFibGVIZWFkZXJSb3dzKCkgewotCQlyZXR1cm4gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHRoaXMsICIuLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJKyBUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCSsgVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9IRUFERVJfUk9XUyArICInXSIpOwotCX0KLQotCXB1YmxpYyBTZXF1ZW5jZUVsZW1lbnQgZ2V0VGV4dFNlcXVlbmNlRWxlbWVudCgpIHsKLQkJTm9kZUxpc3QgZm5sID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHRoaXMsCi0JCQkJImZvbGxvd2luZy1zaWJsaW5nOjoqW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1AKLQkJCQkJCSsgIiddWzFdIiArICIvKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VRVUVOQ0UgKyAiJ10iKTsKLQkJaWYgKChmbmwgIT0gbnVsbCkgJiYgKGZubC5nZXRMZW5ndGgoKSA9PSAxKSkKLQkJCXJldHVybiAoU2VxdWVuY2VFbGVtZW50KSBmbmwuaXRlbSgwKTsKLQkJaWYgKChmbmwgIT0gbnVsbCkgJiYgKGZubC5nZXRMZW5ndGgoKSA+IDEpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkiZHJhdzppbWFnZSBoYXMgbW9yZSB0aGFuIG9uZSB0ZXh0OnNlcXVlbmNlIGVsZW1lbnRzLiIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCU5vZGVMaXN0IHBubCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLAotCQkJCSJwcmVjZWRpbmctc2libGluZzo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIFRleHRDb25zdGFudHMuRUxFTUVOVF9QCi0JCQkJCQkrICInXVsxXSIgKyAiLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFUVVFTkNFICsgIiddIik7Ci0JCWlmICgocG5sICE9IG51bGwpICYmIChwbmwuZ2V0TGVuZ3RoKCkgPT0gMSkpCi0JCQlyZXR1cm4gKFNlcXVlbmNlRWxlbWVudCkgcG5sLml0ZW0oMCk7Ci0JCWlmICgocG5sICE9IG51bGwpICYmIChwbmwuZ2V0TGVuZ3RoKCkgPiAxKSkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJImRyYXc6aW1hZ2UgaGFzIG1vcmUgdGhhbiBvbmUgdGV4dDpzZXF1ZW5jZSBlbGVtZW50cy4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENvbnRlbnRTaXplKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDaGlsZEl0ZXJhdG9yKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQzZTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb2x1bW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIFRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjgzNjc4MDUwMjQwNzU4MDYyOUw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlSW5kZXgoKSB7Ci0JCXJldHVybiBnZXRUYWJsZUVsZW1lbnQoKS5nZXRUYWJsZUluZGV4KCk7Ci0JfQotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBudWxsOwotCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCQl0YWJsZUVsZW1lbnQgPSAoVGFibGVFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiB0YWJsZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VGFibGVDb2x1bUNoaWxkcmVuKCkgewotCQlMaXN0PE5vZGU+IGNvbHVtbkxpc3QgPSBudWxsOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KSB7Ci0JCQkJaWYgKGNvbHVtbkxpc3QgPT0gbnVsbCkKLQkJCQkJY29sdW1uTGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJCQljb2x1bW5MaXN0LmFkZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb2x1bW5MaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUhlYWRlclJvd3NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlSGVhZGVyUm93c0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ZmZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlSGVhZGVyUm93c0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlSGVhZGVyUm93c0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotY2xhc3MgVGFibGVIZWFkZXJSb3dzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlSGVhZGVyUm93c0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDgwNzg5MjQ4MTkxNjE2MTc4MzhMOwotCi0JcHJvdGVjdGVkIFRhYmxlSGVhZGVyUm93c0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCkgewotCQlyZXR1cm4gZ2V0VGFibGVFbGVtZW50KCkuZ2V0VGFibGVJbmRleCgpOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVFbGVtZW50KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gbnVsbDsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSB7Ci0JCQkJdGFibGVFbGVtZW50ID0gKFRhYmxlRWxlbWVudCkgcGFyZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gdGFibGVFbGVtZW50OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlUm93Q2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gcm93TGlzdCA9IG51bGw7Ci0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJCQlyb3dMaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJCXJvd0xpc3QuYWRkKGNoaWxkcmVuLml0ZW0oaSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJvd0xpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlTm9kZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZU5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NTUyYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBUYWJsZU5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEUsIFRhYmxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfUk9XLCBUYWJsZVJvd0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0NPTFVNTiwKLQkJCQlUYWJsZUNvbHVtbkVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0NFTEwsCi0JCQkJVGFibGVDZWxsRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfQ09WRVJFRF9UQUJMRV9DRUxMLAotCQkJCUNvdmVyZWRUYWJsZUNlbGxFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9IRUFERVJfQ09MVU1OUywKLQkJCQlUYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9IRUFERVJfUk9XUywKLQkJCQlUYWJsZUhlYWRlclJvd3NFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9ST1dTLAotCQkJCVRhYmxlUm93c0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0NPTFVNTlMsCi0JCQkJVGFibGVDb2x1bW5zRWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVSb3dFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlUm93RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyZTU1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVSb3dFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLmltcGwuSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZVJvd0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIFRhYmxlUm93RWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVSb3dFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NTE1MjY4MjExNTk5NzIwODI5TDsKLQotCXByb3RlY3RlZCBUYWJsZVJvd0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJSb3dzUmVwZWF0ZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX1JPV1NfUkVQRUFURUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX1JPV1NfUkVQRUFURUQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlSW5kZXgoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBnZXRUYWJsZUVsZW1lbnQoKTsKLQkJcmV0dXJuIHRhYmxlRWxlbWVudC5nZXRUYWJsZUluZGV4KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dJbmRleCgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IGdldFRhYmxlRWxlbWVudCgpOwotCQlpZiAodGFibGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJTm9kZUxpc3QgbGlzdCA9IHRhYmxlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksICJ0YWJsZS1yb3ciKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGxpc3QuaXRlbShpKS5lcXVhbHModGhpcykpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBudWxsOwotCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCQl0YWJsZUVsZW1lbnQgPSAoVGFibGVFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHRhYmxlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRUYWJsZUNlbGxDaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjZWxsTGlzdCA9IG51bGw7Ci0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZUNlbGxFbGVtZW50KSB7Ci0JCQkJaWYgKGNlbGxMaXN0ID09IG51bGwpCi0JCQkJCWNlbGxMaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJCWNlbGxMaXN0LmFkZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjZWxsTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZUVsZW1lbnQgc3R5bGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0eWxlRWxlbWVudCBnZXRTdHlsZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlUm93c0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVSb3dzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlMTMwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVSb3dzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVSb3dzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotY2xhc3MgVGFibGVSb3dzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhYmxlUm93c0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4OTA1MTIyMzY3Mjc5NzMzNzRMOwotCi0JcHJvdGVjdGVkIFRhYmxlUm93c0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VGFibGVSb3dDaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiByb3dMaXN0ID0gbnVsbDsKLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlUm93RWxlbWVudCkgewotCQkJCWlmIChyb3dMaXN0ID09IG51bGwpCi0JCQkJCXJvd0xpc3QgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCQkJcm93TGlzdC5hZGQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcm93TGlzdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViOTdjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEFFbGVtZW50IGV4dGVuZHMgSUVkaXRhYmxlLCBPREZFbGVtZW50LCBJVGV4dEVsZW1lbnRDb250YWluZXIsCi0JCUlUZXh0Q29udGVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyT2ZmaWNlVGl0bGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZW5hbWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyB1cmwpOwotCi0JcHVibGljIE9ERkVsZW1lbnQgZ2V0SHJlZkVsZW1lbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOTcwMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FscGhhYmV0aWNhbEluZGV4RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEFscGhhYmV0aWNhbEluZGV4RWxlbWVudCBleHRlbmRzIElUZXh0RWxlbWVudENvbnRhaW5lciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FscGhhYmV0aWNhbEluZGV4U291cmNlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FscGhhYmV0aWNhbEluZGV4U291cmNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI0YTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9BbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBBbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQm9va21hcmtFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQm9va21hcmtFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzdjNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0Jvb2ttYXJrRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEJvb2ttYXJrRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQ2hhbmdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNmM2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZUVuZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VFbmRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDlmYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZUVuZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBDaGFuZ2VFbmRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQ2hhbmdlU3RhcnRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQ2hhbmdlU3RhcnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzVhYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZVN0YXJ0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIENoYW5nZVN0YXJ0RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0hFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvSEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlYjU2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvSEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBIRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwgSUVkaXRhYmxlLAotCQlJVGV4dEVsZW1lbnRDb250YWluZXIgewotCXB1YmxpYyBpbnQgZ2V0QXR0clRleHRPdXRsaW5lTGV2ZWwoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUZXh0UmVzdGFydE51bWJlcmluZygpOwotCi0JcHVibGljIGludCBnZXRBdHRyVGV4dFN0YXJ0VmFsdWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUZXh0SXNMaXN0SGVhZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0lUZXh0Q29udGVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0lUZXh0Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjE4ZmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JVGV4dENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0Q29udGVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0luZGV4Qm9keUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JbmRleEJvZHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZWVkYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0luZGV4Qm9keUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotcHVibGljIGludGVyZmFjZSBJbmRleEJvZHlFbGVtZW50IGV4dGVuZHMgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvSW5kZXhUaXRsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JbmRleFRpdGxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODgyMjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JbmRleFRpdGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4VGl0bGVFbGVtZW50IGV4dGVuZHMgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDUyYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBMaXN0RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwKLQkJSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlwdWJsaWMgbG9uZyBnZXRTaXplKCk7Ci0KLQlwdWJsaWMgTGlzdEl0ZW1FbGVtZW50IGdldEl0ZW0obG9uZyBpZHgpOwotCi0JcHVibGljIHZvaWQgYXBwZW5kSXRlbShMaXN0SXRlbUVsZW1lbnQgaXRlbSk7Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoTGlzdEl0ZW1FbGVtZW50IGl0ZW0sIGxvbmcgaWR4KTsKLQotCXB1YmxpYyBsb25nIGdldExpc3RMZXZlbCgpOwotCi0JcHVibGljIExpc3RFbGVtZW50IGdldFRvcExldmVsTGlzdEVsZW1lbnQoKTsKLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0TGlzdExldmVsU3R5bGVFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdEhlYWRlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0SGVhZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQ2NTc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0SGVhZGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdEhlYWRlckVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RJdGVtRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RJdGVtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzA1ODgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0SXRlbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RJdGVtRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwKLQkJSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4YTcyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50IGV4dGVuZHMgU3R5bGVFbGVtZW50IHsKLQlwdWJsaWMgbG9uZyBnZXRBdHRyTGV2ZWwoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckJ1bGxldENoYXIoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJCdWxsZXRDaGFyKFN0cmluZyBjaGFyYWN0ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3OWVhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50IGV4dGVuZHMgU3R5bGVFbGVtZW50IHsKLQlwdWJsaWMgbG9uZyBnZXRBdHRyTGV2ZWwoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck51bUZvcm1hdCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTnVtUHJlZml4KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOdW1TdWZmaXgoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdFN0eWxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RTdHlsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2NWI0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdFN0eWxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RTdHlsZUVsZW1lbnQgZXh0ZW5kcyBTdHlsZUVsZW1lbnQgewotCXB1YmxpYyBsb25nIGdldExpc3RMZXZlbFN0eWxlQnVsbGV0U2l6ZSgpOwotCi0JcHVibGljIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCBnZXRMaXN0TGV2ZWxTdHlsZUJ1bGxldChsb25nIGlkeCk7Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRMaXN0TGV2ZXJTdHlsZUJ1bGxldChMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQgZWxlbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvUEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYyYjM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFBFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlLCBJRWRpdGFibGUsCi0JCUlUZXh0Q29udGVudCwgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvUGFnZU51bWJlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QYWdlTnVtYmVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ3YzMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QYWdlTnVtYmVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VOdW1iZXJFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTZkODc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGludCBnZXRBdHRyVGV4dEMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU2VjdGlvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TZWN0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQxOTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TZWN0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3Rpb25FbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlLCBJRWRpdGFibGUsCi0JCUlUZXh0Q29udGVudCwgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU2VxdWVuY2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU2VxdWVuY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTNjNzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1NlcXVlbmNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsIElFZGl0YWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1NwYW5FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU3BhbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNWM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU3BhbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBTcGFuRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RhYkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTdhMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RhYkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBUYWJFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGludCBnZXRBdHRyVGV4dFRhYlJlZigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJsZU9mQ29udGVudEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJsZU9mQ29udGVudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4MGNhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFibGVPZkNvbnRlbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVPZkNvbnRlbnRFbGVtZW50IGV4dGVuZHMgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODNiZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UZXh0Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGV4dENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkwMTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UZXh0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRleHRDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFRFWFRfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRleHQ6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQSA9ICJhIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQUxQSEFCRVRJQ0FMX0lOREVYID0gImFscGhhYmV0aWNhbC1pbmRleCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FMUEhBQkVUSUNBTF9JTkRFWF9TT1VSQ0UgPSAiYWxwaGFiZXRpY2FsLWluZGV4LXNvdXJjZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0JPT0tNQVJLID0gImJvb2ttYXJrIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSCA9ICJoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSU5ERVhfQk9EWSA9ICJpbmRleC1ib2R5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSU5ERVhfVElUTEUgPSAiaW5kZXgtdGl0bGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSVNUID0gImxpc3QiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSVNUX0lURU0gPSAibGlzdC1pdGVtIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElTVF9MRVZFTF9TVFlMRV9CVUxMRVQgPSAibGlzdC1sZXZlbC1zdHlsZS1idWxsZXQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSVNUX0xFVkVMX1NUWUxFX05VTUJFUiA9ICJsaXN0LWxldmVsLXN0eWxlLW51bWJlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJU1RfSEVBREVSID0gImxpc3QtaGVhZGVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUCA9ICJwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUyA9ICJzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU0VDVElPTiA9ICJzZWN0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU1BBTiA9ICJzcGFuIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU0VRVUVOQ0UgPSAic2VxdWVuY2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUIgPSAidGFiIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfT0ZfQ09OVEVOVCA9ICJ0YWJsZS1vZi1jb250ZW50IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfT0ZfQ09OVEVOVF9TT1VSQ0UgPSAidGFibGUtb2YtY29udGVudC1zb3VyY2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UUkFDS0VEX0NIQU5HRVMgPSAidHJhY2tlZC1jaGFuZ2VzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NIQU5HRV9TVEFSVCA9ICJjaGFuZ2Utc3RhcnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEFOR0VfRU5EID0gImNoYW5nZS1lbmQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQUdFX05VTUJFUiA9ICJwYWdlLW51bWJlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RZTEVfTkFNRSA9ICJzdHlsZS1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTElORV9CUkVBSyA9ICJsaW5lLWJyZWFrIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfT1VUTElORV9MRVZFTCA9ICJvdXRsaW5lLWxldmVsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfUkVTVEFSVF9OVU1CRVJJTkcgPSAicmVzdGFydC1udW1iZXJpbmciOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9WQUxVRSA9ICJzdGFydC12YWx1ZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0lTX0xJU1RfSEVBREVSID0gImlzLWxpc3QtaGVhZGVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQyA9ICJjIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVEFCX1JFRiA9ICJ0YWItcmVmIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTEVWRUwgPSAibGV2ZWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT1JNVUxBID0gImZvcm11bGEiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZID0gImRpc3BsYXkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZX1ZBTFVFX05PTkUgPSAibm9uZSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RyYWNrZWRDaGFuZ2VzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RyYWNrZWRDaGFuZ2VzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIzYjJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UcmFja2VkQ2hhbmdlc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBUcmFja2VkQ2hhbmdlc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9BRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0FFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNkODRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0FFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuT2ZmaWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsLklUZXh0RWxlbWVudENvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkJvb2ttYXJrRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi54bGluay5YTGlua0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotY2xhc3MgQUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBBRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg0MTI5ODcxODE4MjkzODU3TDsKLQotCXByb3RlY3RlZCBBRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJPZmZpY2VUaXRsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSSwKLQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9USVRMRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9USVRMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9UWVBFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1RZUEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlbmFtZSkgewotCQlzZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfVFlQRSwgdHlwZW5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9IUkVGKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyB1cmwpIHsKLQkJc2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYsIHVybCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgZGF0YSkgewotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdGhpcy5zZXRUZXh0Q29udGVudCgoU3RyaW5nKSBkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2JqZWN0IGZvciB0ZXh0OmEgc2V0VmFsdWUgZnVuY3Rpb24uIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0KElFZGl0YWJsZSBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q29udGVudFNpemUodGhpcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENoaWxkSXRlcmF0b3IodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBJbnRlcm5hbCBsaW5rIGxpdGVyYWwgaXMgbm90IGRlZmluZWQgaW4gT0RGIHNwZWMuIFRoaXMgZnVuY3Rpb24gbWlnaHQgbm90Ci0JICogYmUgY29tcGF0aWJsZSB3aXRoIE9wZW5PZmZpY2UuCi0JICovCi0JcHVibGljIE9ERkVsZW1lbnQgZ2V0SHJlZkVsZW1lbnQoKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotCQlpZiAoWExpbmtDb25zdGFudHMuTElOS19UWVBFX1NJTVBMRS5lcXVhbHModHlwZSkpIHsKLQkJCVN0cmluZyBocmVmID0gZ2V0SHJlZigpOwotCQkJaWYgKChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgJiYgKGhyZWYuZW5kc1dpdGgoInxvdXRsaW5lIikpKSB7IC8vIGxpbmsKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBoZWFkZXIKLQkJCQlTdHJpbmcgb3V0bGluZUNvbnRlbnRzID0gaHJlZi5zdWJzdHJpbmcoMSwgaHJlZi5sZW5ndGgoKSAtIDgpOwotCQkJCS8vIGNhbGN1bGF0ZSBsaXN0IGxldmVsIG9mIGhlYWRpbmcgZWxlbWVudAotCQkJCS8vIGlmIGxldmVsPT0xLCBpdCBpcyBub3QgaW5jbHVkZWQgd2l0aGluIGxpc3Qgc3RydWN0dXJlCi0JCQkJaW50IGxldmVsID0gMDsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQlpbnQgaW5kZXhFbmRQb3MgPSBvdXRsaW5lQ29udGVudHMuaW5kZXhPZignLicpOwotCQkJCQlpZiAoaW5kZXhFbmRQb3MgPT0gLTEpCi0JCQkJCQlicmVhazsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBwcmVmaXhudW0gPSBvdXRsaW5lQ29udGVudHMuc3Vic3RyaW5nKDAsCi0JCQkJCQkJCWluZGV4RW5kUG9zKTsKLQkJCQkJCW5ldyBJbnRlZ2VyKHByZWZpeG51bSkuaW50VmFsdWUoKTsKLQkJCQkJCW91dGxpbmVDb250ZW50cyA9IG91dGxpbmVDb250ZW50cy5zdWJzdHJpbmcoMikudHJpbSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJbGV2ZWwrKzsKLQkJCQl9Ci0KLQkJCQkvLyBzZWFyY2ggaGVhZGluZyBlbGVtZW50IGZyb20gbGlzdCBzdHJ1Y3R1cmUsIGlmIGxpc3QgbGV2ZWwgaXMKLQkJCQkvLyBtb3JlIHRoYW4gMQotCQkJCWlmIChsZXZlbCA+IDEpIHsKLQkJCQkJTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QoCi0JCQkJCQkJZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpLAotCQkJCQkJCSIuLy8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkJCQkrIFRleHRDb25zdGFudHMuRUxFTUVOVF9ICi0JCQkJCQkJCQkrICInXVthdHRyaWJ1dGU6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkJCQkrIFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkJCSsgVGV4dENvbnN0YW50cy5BVFRSX09VVExJTkVfTEVWRUwgKyAiJ109JyIKLQkJCQkJCQkJCSsgbGV2ZWwgKyAiJ10iKTsKLQkJCQkJaWYgKG5sICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCU9ERkVsZW1lbnQgZWxlbSA9IChPREZFbGVtZW50KSBubC5pdGVtKGkpOwotCQkJCQkJCVN0cmluZyBjb250ZW50ID0gZWxlbS5nZXRUZXh0Q29udGVudCgpOwotCQkJCQkJCWlmICgoY29udGVudCAhPSBudWxsKQotCQkJCQkJCQkJJiYgKG91dGxpbmVDb250ZW50cy5lcXVhbHMoY29udGVudC50cmltKCkpKSkgewotCQkJCQkJCQlyZXR1cm4gZWxlbTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzZWFyY2ggaGVhZGluZyBlbGVtZW50IGZyb20gaGVhZGluZyBlbGVtZW50cyB3aGljaCBhcmUgbm90Ci0JCQkJLy8gaW5jbHVkZWQgaW4gbGlzdCBzdHJ1Y3R1cmUKLQkJCQlOb2RlTGlzdCBoRWxlbUxpc3QgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QoCi0JCQkJCQlnZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0JCQkJCQkiLi8vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfSCArICInXSIKLQkJCQkJCQkJKyAiW3BhcmVudDo6KltuYW1lc3BhY2UtdXJpKCkhPSciCi0JCQkJCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCQkJKyAiJyBvciBsb2NhbC1uYW1lKCkhPSciCi0JCQkJCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfSVRFTQotCQkJCQkJCQkrICInXVtuYW1lc3BhY2UtdXJpKCkhPSciCi0JCQkJCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCQkJKyAiJyBvciBsb2NhbC1uYW1lKCkhPSciCi0JCQkJCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfSEVBREVSICsgIiddXSIpOwotCQkJCWludCBpbmRleEVuZFBvcyA9IGhyZWYuaW5kZXhPZignLicpOwotCQkJCWlmIChpbmRleEVuZFBvcyAhPSAtMSkgewotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJb3V0bGluZUNvbnRlbnRzID0gaHJlZi5zdWJzdHJpbmcoaW5kZXhFbmRQb3MgKyAxLAotCQkJCQkJCWhyZWYubGVuZ3RoKCkgLSA4KS50cmltKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRleCA9IG5ldyBJbnRlZ2VyKGhyZWYuc3Vic3RyaW5nKDEsIGluZGV4RW5kUG9zKSkKLQkJCQkJCQkJLmludFZhbHVlKCkgLSAxOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJaWYgKChoRWxlbUxpc3QgIT0gbnVsbCkKLQkJCQkJCQkJJiYgKGhFbGVtTGlzdC5nZXRMZW5ndGgoKSA+IGluZGV4KSkgewotCQkJCQkJCU9ERkVsZW1lbnQgZWxlbSA9IChPREZFbGVtZW50KSBoRWxlbUxpc3QKLQkJCQkJCQkJCS5pdGVtKGluZGV4KTsKLQkJCQkJCQlTdHJpbmcgY29udGVudCA9IGVsZW0uZ2V0VGV4dENvbnRlbnQoKTsKLQkJCQkJCQlpZiAoKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCQkJCSYmIChvdXRsaW5lQ29udGVudHMuZXF1YWxzKGNvbnRlbnQudHJpbSgpKSkpIHsKLQkJCQkJCQkJcmV0dXJuIGVsZW07Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gaWYgaHJlZiBVUkkgZG9lcyBub3Qgc3RhcnQgd2l0aCBudW1iZXIsIG9yIGxpbmsgdGFyZ2V0IGNhbm5vdAotCQkJCS8vIGJlIGZvdW5kLAotCQkJCS8vIHNlYXJjaCBoZWFkaW5nIGVsZW1lbnQgYnkgaXRzIHRleHQgY29udGVudAotCQkJCW91dGxpbmVDb250ZW50cyA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA4KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGhFbGVtTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCU9ERkVsZW1lbnQgZWxlbSA9IChPREZFbGVtZW50KSBoRWxlbUxpc3QuaXRlbShpKTsKLQkJCQkJU3RyaW5nIGNvbnRlbnQgPSBlbGVtLmdldFRleHRDb250ZW50KCk7Ci0JCQkJCWlmICgoY29udGVudCAhPSBudWxsKQotCQkJCQkJCSYmIChvdXRsaW5lQ29udGVudHMuZXF1YWxzKGNvbnRlbnQudHJpbSgpKSkpIHsKLQkJCQkJCXJldHVybiBlbGVtOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoaHJlZi5zdGFydHNXaXRoKCIjIikpICYmIChocmVmLmVuZHNXaXRoKCJ8Z3JhcGhpYyIpKSkgeyAvLyBsaW5rCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBncmFwaGljCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9iamVjdAotCQkJCVN0cmluZyBkcmF3TmFtZSA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA4KTsKLQkJCQlyZXR1cm4gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZShEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCURyYXdDb25zdGFudHMuRUxFTUVOVF9GUkFNRSwKLQkJCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUsIGRyYXdOYW1lKTsKLQkJCX0gZWxzZSBpZiAoKGhyZWYuc3RhcnRzV2l0aCgiIyIpKSAmJiAoaHJlZi5lbmRzV2l0aCgifHRhYmxlIikpKSB7IC8vIGxpbmsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRhYmxlCi0JCQkJU3RyaW5nIHRhYmxlTmFtZSA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA2KTsKLQkJCQlyZXR1cm4gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZSgKLQkJCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFLAotCQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTkFNRSwgdGFibGVOYW1lKTsKLQkJCX0gZWxzZSBpZiAoKGhyZWYuc3RhcnRzV2l0aCgiIyIpKSAmJiAoaHJlZi5lbmRzV2l0aCgifGZyYW1lIikpKSB7IC8vIGxpbmsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZyYW1lCi0JCQkJU3RyaW5nIGZyYW1lTmFtZSA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA2KTsKLQkJCQlyZXR1cm4gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZShEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCURyYXdDb25zdGFudHMuRUxFTUVOVF9GUkFNRSwKLQkJCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUsIGZyYW1lTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgJiYgKGhyZWYuZW5kc1dpdGgoInxvbGUiKSkpIHsgLy8gbGluawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIE9MRQotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9iamVjdAotCQkJCVN0cmluZyBvbGVOYW1lID0gaHJlZi5zdWJzdHJpbmcoMSwgaHJlZi5sZW5ndGgoKSAtIDQpOwotCQkJCXJldHVybiBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX0ZSQU1FLAotCQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSwgb2xlTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgJiYgKGhyZWYuZW5kc1dpdGgoInxyZWdpb24iKSkpIHsgLy8gbGluawotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc2VjdGlvbiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGFibGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29udGVudHMKLQkJCQlTdHJpbmcgcmVnaW9uTmFtZSA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA3KTsKLQkJCQlPREZFbGVtZW50IGVsZW0gPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VDVElPTiwKLQkJCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX05BTUUsIHJlZ2lvbk5hbWUpOwotCQkJCWlmIChlbGVtICE9IG51bGwpCi0JCQkJCXJldHVybiBlbGVtOwotCQkJCWVsZW0gPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5FTEVNRU5UX1RBQkxFX09GX0NPTlRFTlQsCi0JCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuQVRUUl9OQU1FLCByZWdpb25OYW1lKTsKLQkJCQlpZiAoZWxlbSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZWxlbTsKLQkJCQllbGVtID0gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZShUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuRUxFTUVOVF9JTkRFWF9USVRMRSwKLQkJCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX05BTUUsIHJlZ2lvbk5hbWUpOwotCQkJCWlmIChlbGVtICE9IG51bGwpCi0JCQkJCXJldHVybiBlbGVtOwotCQkJfSBlbHNlIGlmIChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgeyAvLyBsaW5rIGZvciBib29rbWFyawotCQkJCVN0cmluZyBib29rbWFya05hbWUgPSBocmVmLnN1YnN0cmluZygxKTsKLQkJCQlPREZFbGVtZW50IGVsZW0gPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfQk9PS01BUkssCi0JCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuQVRUUl9OQU1FLCBib29rbWFya05hbWUpOwotCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgQm9va21hcmtFbGVtZW50KQotCQkJCQlyZXR1cm4gZWxlbTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMxMGEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0FscGhhYmV0aWNhbEluZGV4RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkFscGhhYmV0aWNhbEluZGV4RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEFscGhhYmV0aWNhbEluZGV4RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUFscGhhYmV0aWNhbEluZGV4RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjU3NTE0ODE3OTEwNTE1NTkwNEw7Ci0KLQlwcm90ZWN0ZWQgQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9BbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9BbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2N2QzYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQWxwaGFiZXRpY2FsSW5kZXhTb3VyY2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQWxwaGFiZXRpY2FsSW5kZXhTb3VyY2VFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4ODU4ODkxMzU0NTcyMjU0MzM4TDsKLQotCXByb3RlY3RlZCBBbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9Cb29rbWFya0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9Cb29rbWFya0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTU2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQm9va21hcmtFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuQm9va21hcmtFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQm9va21hcmtFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQm9va21hcmtFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NDIzMzQ4MDg0NjA2NjA0NDQyTDsKLQotCXByb3RlY3RlZCBCb29rbWFya0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9DaGFuZ2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRkMzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5DaGFuZ2VFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQ2hhbmdlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENoYW5nZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkyMTQ2NzMzMTUxODE5OTQ5OUw7Ci0KLQlwdWJsaWMgQ2hhbmdlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGlFbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgaUVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVuZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9DaGFuZ2VFbmRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMzNjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVuZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5DaGFuZ2VTdGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDaGFuZ2VFbmRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ2hhbmdlU3RhcnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTUyMzYzMzk5NjUwNjAyNzcwTDsKLQotCXB1YmxpYyBDaGFuZ2VFbmRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgaUVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBpRWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQ2hhbmdlU3RhcnRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQ2hhbmdlU3RhcnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzkzNmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZVN0YXJ0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkNoYW5nZVN0YXJ0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoYW5nZVN0YXJ0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNoYW5nZVN0YXJ0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkzNjY3NjE3NTM1OTAzMzk4OEw7Ci0KLQlwdWJsaWMgQ2hhbmdlU3RhcnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgaUVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBpRWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9IRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1YzAyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9IRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLmltcGwuSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5IRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgSEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjc2Mzk1MzUxNDEzNjA1MjUxMEw7Ci0KLQlwcm90ZWN0ZWQgSEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGV4dE91dGxpbmVMZXZlbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9PVVRMSU5FX0xFVkVMKSkKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX09VVExJTkVfTEVWRUwpKS5pbnRWYWx1ZSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRleHRSZXN0YXJ0TnVtYmVyaW5nKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJVGV4dENvbnN0YW50cy5BVFRSX1JFU1RBUlRfTlVNQkVSSU5HKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX1JFU1RBUlRfTlVNQkVSSU5HKSkuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJUZXh0U3RhcnRWYWx1ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9TVEFSVF9WQUxVRSkpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9TVEFSVF9WQUxVRSkpLmludFZhbHVlKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGV4dElzTGlzdEhlYWRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9JU19MSVNUX0hFQURFUikpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9JU19MSVNUX0hFQURFUikpLmJvb2xlYW5WYWx1ZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgZGF0YSkgewotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdGhpcy5zZXRUZXh0Q29udGVudCgoU3RyaW5nKSBkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2JqZWN0IGZvciB0ZXh0Omggc2V0VmFsdWUgZnVuY3Rpb24uIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSW5kZXhCb2R5RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0luZGV4Qm9keUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjIyOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSW5kZXhCb2R5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkluZGV4Qm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBJbmRleEJvZHlFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgSW5kZXhCb2R5RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwODk0NzY3NTcwMDM1NDIyNUw7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhCb2R5RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSW5kZXhUaXRsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9JbmRleFRpdGxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmMjljNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9JbmRleFRpdGxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkluZGV4VGl0bGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgSW5kZXhUaXRsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBJbmRleFRpdGxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkyMTg2NDgyODE0Mzg3NTQ2M0w7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhUaXRsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDIzODMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RJdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RTdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBMaXN0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTGlzdEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xODE2MDczMzYxOTIxNTY5NjA2TDsKLQotCXByb3RlY3RlZCBMaXN0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRTaXplKCkgewotCQlyZXR1cm4gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KAotCQkJCXRoaXMsCi0JCQkJIi4vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSdsaXN0LWl0ZW0nXSIpLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlbUVsZW1lbnQgZ2V0SXRlbShsb25nIGlkeCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0aGlzLAotCQkJCSIuLypbbmFtZXNwYWNlLXVyaSgpPSciICsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nbGlzdC1pdGVtJ11bIiArIChpZHggKyAxKSArICJdIik7Ci0JCWlmICgobm9kZUxpc3QgIT0gbnVsbCkgJiYgKG5vZGVMaXN0LmdldExlbmd0aCgpID09IDEpCi0JCQkJJiYgKG5vZGVMaXN0Lml0ZW0oMCkgaW5zdGFuY2VvZiBMaXN0SXRlbUVsZW1lbnQpKQotCQkJcmV0dXJuIChMaXN0SXRlbUVsZW1lbnQpIG5vZGVMaXN0Lml0ZW0oMCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCUxpc3RFbGVtZW50IHRvcExldmVsTGlzdCA9IGdldFRvcExldmVsTGlzdEVsZW1lbnQoKTsKLQkJU3RyaW5nIHN0eWxlTmFtZSA9IHRvcExldmVsTGlzdAotCQkJCS5nZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJT0RGRWxlbWVudCBlbGVtID0gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZSgKLQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVF9TVFlMRSwKLQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLCBTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsCi0JCQkJc3R5bGVOYW1lKTsKLQkJaWYgKChlbGVtICE9IG51bGwpICYmIChlbGVtIGluc3RhbmNlb2YgTGlzdFN0eWxlRWxlbWVudCkpCi0JCQlyZXR1cm4gKFN0eWxlRWxlbWVudCkgZWxlbTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kSXRlbShMaXN0SXRlbUVsZW1lbnQgaXRlbSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoTGlzdEl0ZW1FbGVtZW50IGl0ZW0sIGxvbmcgaWR4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldExpc3RMZXZlbCgpIHsKLQkJbG9uZyBsZXZlbCA9IDE7Ci0JCUxpc3RFbGVtZW50IHRvcExpc3RFbGVtID0gdGhpczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCU5vZGUgcGFyZW50ID0gdG9wTGlzdEVsZW0uZ2V0UGFyZW50Tm9kZSgpOwotCQkJTm9kZSBncGFyZW50ID0gbnVsbDsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQlncGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBMaXN0SXRlbUVsZW1lbnQpCi0JCQkJCSYmIChncGFyZW50ICE9IG51bGwpICYmIChncGFyZW50IGluc3RhbmNlb2YgTGlzdEVsZW1lbnQpKSB7Ci0JCQkJdG9wTGlzdEVsZW0gPSAoTGlzdEVsZW1lbnQpIGdwYXJlbnQ7Ci0JCQkJbGV2ZWwrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCXB1YmxpYyBMaXN0RWxlbWVudCBnZXRUb3BMZXZlbExpc3RFbGVtZW50KCkgewotCQlMaXN0RWxlbWVudCB0b3BMaXN0RWxlbSA9IHRoaXM7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlOb2RlIHBhcmVudCA9IHRvcExpc3RFbGVtLmdldFBhcmVudE5vZGUoKTsKLQkJCU5vZGUgZ3BhcmVudCA9IG51bGw7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJZ3BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgTGlzdEl0ZW1FbGVtZW50KQotCQkJCQkmJiAoZ3BhcmVudCAhPSBudWxsKSAmJiAoZ3BhcmVudCBpbnN0YW5jZW9mIExpc3RFbGVtZW50KSkgewotCQkJCXRvcExpc3RFbGVtID0gKExpc3RFbGVtZW50KSBncGFyZW50OwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wTGlzdEVsZW07Ci0JfQotCi0JcHVibGljIFN0eWxlRWxlbWVudCBnZXRMaXN0TGV2ZWxTdHlsZUVsZW1lbnQoKSB7Ci0JCWxvbmcgbGV2ZWwgPSBnZXRMaXN0TGV2ZWwoKTsKLQkJU3R5bGVFbGVtZW50IHN0eWxlID0gZ2V0U3R5bGUoKTsKLQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBzdHlsZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTdHlsZUVsZW1lbnQpIHsKLQkJCQlpZiAoKGNoaWxkIGluc3RhbmNlb2YgTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50KQotCQkJCQkJJiYgKCgoTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50KSBjaGlsZCkKLQkJCQkJCQkJLmdldEF0dHJMZXZlbCgpID09IGxldmVsKSkgewotCQkJCQlyZXR1cm4gKFN0eWxlRWxlbWVudCkgY2hpbGQ7Ci0JCQkJfSBlbHNlIGlmICgoY2hpbGQgaW5zdGFuY2VvZiBMaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQpCi0JCQkJCQkmJiAoKChMaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQpIGNoaWxkKQotCQkJCQkJCQkuZ2V0QXR0ckxldmVsKCkgPT0gbGV2ZWwpKSB7Ci0JCQkJCXJldHVybiAoU3R5bGVFbGVtZW50KSBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RIZWFkZXJFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEhlYWRlckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTE0YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEhlYWRlckVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RIZWFkZXJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdEhlYWRlckVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUxpc3RIZWFkZXJFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzkxNTkxNzIyMzUyODU5ODMxTDsKLQotCXByb3RlY3RlZCBMaXN0SGVhZGVyRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEl0ZW1FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEl0ZW1FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAyMWZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RJdGVtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdEl0ZW1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdEl0ZW1FbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMaXN0SXRlbUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMzU2MzI2MDQ2NzAxMjMwMTVMOwotCi0JcHJvdGVjdGVkIExpc3RJdGVtRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmExN2VhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbC5TdHlsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50SW1wbCBleHRlbmRzIFN0eWxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MjgwMzAwNjk2NDA5OTk3ODg2TDsKLQotCXByb3RlY3RlZCBMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEF0dHJMZXZlbCgpIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9MRVZFTCkpLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQnVsbGV0Q2hhcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyQnVsbGV0Q2hhcihTdHJpbmcgY2hhcmFjdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODlkMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbC5TdHlsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RMZXZlbFN0eWxlTnVtYmVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50SW1wbCBleHRlbmRzIFN0eWxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE4ODcxMDUzODk0MzQ4MDMyNTZMOwotCi0JcHJvdGVjdGVkIExpc3RMZXZlbFN0eWxlTnVtYmVyRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0QXR0ckxldmVsKCkgewotCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJVGV4dENvbnN0YW50cy5BVFRSX0xFVkVMKSkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOdW1Gb3JtYXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTlVNX0ZPUk1BVCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTnVtUHJlZml4KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05VTV9QUkVGSVgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck51bVN1ZmZpeCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OVU1fU1VGRklYKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdFN0eWxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RTdHlsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2RkM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdFN0eWxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbC5TdHlsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0U3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdFN0eWxlRWxlbWVudEltcGwgZXh0ZW5kcyBTdHlsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTGlzdFN0eWxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODgyOTQ2Nzg5MjYzODQ5MDA1OEw7Ci0KLQlwcm90ZWN0ZWQgTGlzdFN0eWxlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMaXN0TGV2ZWxTdHlsZUJ1bGxldFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCBnZXRMaXN0TGV2ZWxTdHlsZUJ1bGxldChsb25nIGlkeCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZExpc3RMZXZlclN0eWxlQnVsbGV0KExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCBlbGVtKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9QRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1BFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGZmOGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1BFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLmltcGwuSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5QRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODA0NDU0MjA1MzE4MDM0ODYwMEw7Ci0KLQlwcm90ZWN0ZWQgUEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0eWxlRWxlbWVudCBnZXRTdHlsZSgpIHsKLQkJU3RyaW5nIHN0eWxlTmFtZSA9IGdldEF0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJT0RGRWxlbWVudCBzdHlsZSA9IGZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLAotCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksIFN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSwKLQkJCQlzdHlsZU5hbWUpOwotCQlpZiAoKHN0eWxlICE9IG51bGwpICYmIChzdHlsZSBpbnN0YW5jZW9mIFN0eWxlRWxlbWVudCkpCi0JCQlyZXR1cm4gKFN0eWxlRWxlbWVudCkgc3R5bGU7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRleHRDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXRoaXMuc2V0VGV4dENvbnRlbnQoKFN0cmluZykgZGF0YSk7Ci0JCX0gZWxzZSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIG9iamVjdCBmb3IgdGV4dDpwIHNldFZhbHVlIGZ1bmN0aW9uLiIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0KElFZGl0YWJsZSBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENvbnRlbnRTaXplKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDaGlsZEl0ZXJhdG9yKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9QYWdlTnVtYmVyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1BhZ2VOdW1iZXJFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTc0NmVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1BhZ2VOdW1iZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5QYWdlTnVtYmVyRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBhZ2VOdW1iZXJFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWdlTnVtYmVyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjA2NDY4MzkyMDA2ODgxMjg0N0w7Ci0KLQlwcm90ZWN0ZWQgUGFnZU51bWJlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OGYzOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgU0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBTRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTg2NTI0MzQyODAxNjQ2MDM2OEw7Ci0KLQlwcm90ZWN0ZWQgU0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGV4dEMoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfQykpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9DKSkuaW50VmFsdWUoKTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TZWN0aW9uRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NlY3Rpb25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmRiMzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NlY3Rpb25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZWN0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFNlY3Rpb25FbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlTZWN0aW9uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjc5ODgxODk4NTg0MTc5NjU0NEw7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydChJRWRpdGFibGUgZGF0YSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TZXF1ZW5jZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TZXF1ZW5jZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzYxYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU2VxdWVuY2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNlcXVlbmNlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFNlcXVlbmNlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJU2VxdWVuY2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNDc1OTI5MDY2NTM0MDIxNTE1TDsKLQotCXByb3RlY3RlZCBTZXF1ZW5jZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgZGF0YSkgewotCQkvLyBUT0RPIHZhbGlkYXRlIHN0eWxlOm51bS1mb3JtYXQgYXR0cmlidXRlCi0JCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0aGlzLnNldFRleHRDb250ZW50KChTdHJpbmcpIGRhdGEpOwotCQl9IGVsc2UgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigiaW52YWxpZCBvYmplY3QgZm9yIHRleHQ6cCBzZXRWYWx1ZSBmdW5jdGlvbi4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydChJRWRpdGFibGUgZGF0YSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NwYW5FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU3BhbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjczZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU3BhbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNwYW5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgU3BhbkVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNwYW5FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzIxOTE2MTIzNjY1NDg0NjM2MUw7Ci0KLQlwcm90ZWN0ZWQgU3BhbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI0M2M5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UYWJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRleHRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGFiRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyODA5NjMzOTg4NjA4ODAxOTlMOwotCi0JcHJvdGVjdGVkIFRhYkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGV4dFRhYlJlZigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9UQUJfUkVGKSkKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX1RBQl9SRUYpKS5pbnRWYWx1ZSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYmxlT2ZDb250ZW50RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYmxlT2ZDb250ZW50RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NzhhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJsZU9mQ29udGVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UYWJsZU9mQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJsZU9mQ29udGVudEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZU9mQ29udGVudEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI4ODI0ODUyNjg1NTk0MTAzNDJMOwotCi0JcHJvdGVjdGVkIFRhYmxlT2ZDb250ZW50RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTFhOWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg1ODg5MTM1NDU3MjI1NDMzOEw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGV4dE5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhNDgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkFic3RyYWN0T0RGTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBUZXh0Tm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9ERk5vZGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gdGFnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0EsIEFFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0FMUEhBQkVUSUNBTF9JTkRFWCwKLQkJCQlBbHBoYWJldGljYWxJbmRleEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfQUxQSEFCRVRJQ0FMX0lOREVYX1NPVVJDRSwKLQkJCQlBbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfQk9PS01BUkssIEJvb2ttYXJrRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9ILCBIRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAKLQkJCQkucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9JTkRFWF9CT0RZLAotCQkJCQkJSW5kZXhCb2R5RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9JTkRFWF9USVRMRSwKLQkJCQlJbmRleFRpdGxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9MSVNULCBMaXN0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9MSVNUX0lURU0sIExpc3RJdGVtRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9MSVNUX0xFVkVMX1NUWUxFX0JVTExFVCwKLQkJCQlMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVF9MRVZFTF9TVFlMRV9OVU1CRVIsCi0JCQkJTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcAotCQkJCS5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfU1RZTEUsCi0JCQkJCQlMaXN0U3R5bGVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfSEVBREVSLAotCQkJCUxpc3RIZWFkZXJFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1AsIFBFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1MsIFNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFQ1RJT04sIFNlY3Rpb25FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFUVVFTkNFLCBTZXF1ZW5jZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU1BBTiwgU3BhbkVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfVEFCLCBUYWJFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1RBQkxFX09GX0NPTlRFTlQsCi0JCQkJVGFibGVPZkNvbnRlbnRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1RBQkxFX09GX0NPTlRFTlRfU09VUkNFLAotCQkJCVRhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9UUkFDS0VEX0NIQU5HRVMsCi0JCQkJVHJhY2tlZENoYW5nZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0NIQU5HRSwgQ2hhbmdlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9DSEFOR0VfU1RBUlQsCi0JCQkJQ2hhbmdlU3RhcnRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcAotCQkJCS5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0NIQU5HRV9FTkQsCi0JCQkJCQlDaGFuZ2VFbmRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1BBR0VfTlVNQkVSLAotCQkJCVBhZ2VOdW1iZXJFbGVtZW50SW1wbC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoT0RGRG9jdW1lbnQgb2RmRG9jLCBTdHJpbmcgdGFnTmFtZSwKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlDbGFzcyBjcyA9IChDbGFzcykgdGFnTWFwLmdldCh0YWdOYW1lKTsKLQkJaWYgKG51bGwgPT0gY3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoRWxlbWVudCkgZmluZEVsZW1lbnRDb25zdHJhY3RvcihjcykubmV3SW5zdGFuY2UoCi0JCQkJCW5ldyBPYmplY3RbXSB7IG9kZkRvYywgZWxlbWVudCB9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RyYWNrZWRDaGFuZ2VzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RyYWNrZWRDaGFuZ2VzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwYTM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UcmFja2VkQ2hhbmdlc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UcmFja2VkQ2hhbmdlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUcmFja2VkQ2hhbmdlc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUcmFja2VkQ2hhbmdlc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04ODY0OTQwOTQ5OTc1NTA0MDM3TDsKLQotCXByb3RlY3RlZCBUcmFja2VkQ2hhbmdlc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9PREZGaWxlVXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9PREZGaWxlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhZjU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvT0RGRmlsZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLQotcHVibGljIGNsYXNzIE9ERkZpbGVVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzT0RGRmlsZShTdHJpbmcgc1VybCkgewotCQlpZiAoc1VybCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzVXJsLmVuZHNXaXRoKE9ERkNvbnN0YW50cy5PRFRfU1VGRklYKQotCQkJCXx8IHNVcmwuZW5kc1dpdGgoT0RGQ29uc3RhbnRzLk9EU19TVUZGSVgpCi0JCQkJfHwgc1VybC5lbmRzV2l0aChPREZDb25zdGFudHMuT0RQX1NVRkZJWCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50VHlwZSBnZXRPREZGaWxlVHlwZShTdHJpbmcgc1VybCkgewotCQlpZiAoc1VybCA9PSBudWxsKQotCQkJcmV0dXJuIENvbnRlbnRUeXBlLk5PTkU7Ci0KLQkJaWYgKHNVcmwuZW5kc1dpdGgoT0RGQ29uc3RhbnRzLk9EVF9TVUZGSVgpKQotCQkJcmV0dXJuIENvbnRlbnRUeXBlLldSSVRFOwotCQllbHNlIGlmIChzVXJsLmVuZHNXaXRoKE9ERkNvbnN0YW50cy5PRFNfU1VGRklYKSkKLQkJCXJldHVybiBDb250ZW50VHlwZS5TUFJFQURTSEVFVDsKLQkJZWxzZSBpZiAoc1VybC5lbmRzV2l0aChPREZDb25zdGFudHMuT0RQX1NVRkZJWCkpCi0JCQlyZXR1cm4gQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OOwotCi0JCXJldHVybiBDb250ZW50VHlwZS5OT05FOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9PREZXcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9PREZXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3YjY1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvT0RGV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT2RmUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgT0RGV3JpdGVyIHsKLQlwcml2YXRlIHZvaWQgYWRkRmlsZVRvWmlwKFppcE91dHB1dFN0cmVhbSB6b3MsIFN0cmluZyBpbnB1dERpciwgRmlsZSBmaWxlKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24gewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmcgZW50cnkgPSBmaWxlLmdldFBhdGgoKTsKLQkJCWVudHJ5ID0gZW50cnkuc3Vic3RyaW5nKGlucHV0RGlyLmxlbmd0aCgpICsgMSk7Ci0JCQllbnRyeSA9IGVudHJ5LnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpOwotCQkJWmlwRW50cnkgdGFyZ2V0ID0gbmV3IFppcEVudHJ5KGVudHJ5ICsgIi8iKTsKLQkJCXRhcmdldC5zZXRTaXplKDApOwotCQkJem9zLnB1dE5leHRFbnRyeSh0YXJnZXQpOwotCQkJem9zLmNsb3NlRW50cnkoKTsKLQotCQkJRmlsZVtdIGZpbGVMaXN0ID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRGaWxlVG9aaXAoem9zLCBpbnB1dERpciwgZmlsZUxpc3RbaV0pOwotCQkJfQotCQl9IGVsc2UgewotCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQlTdHJpbmcgZW50cnkgPSBmaWxlLmdldFBhdGgoKTsKLQkJCWVudHJ5ID0gZW50cnkuc3Vic3RyaW5nKGlucHV0RGlyLmxlbmd0aCgpICsgMSk7Ci0JCQllbnRyeSA9IGVudHJ5LnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpOwotCQkJWmlwRW50cnkgdGFyZ2V0ID0gbmV3IFppcEVudHJ5KGVudHJ5KTsKLQkJCXpvcy5wdXROZXh0RW50cnkodGFyZ2V0KTsKLQkJCWJ5dGUgYnVmW10gPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCWludCBjb3VudDsKLQkJCXdoaWxlICgoY291bnQgPSBiaXMucmVhZChidWYsIDAsIDEwMjQpKSAhPSAtMSkgewotCQkJCXpvcy53cml0ZShidWYsIDAsIGNvdW50KTsKLQkJCX0KLQkJCWJpcy5jbG9zZSgpOwotCQkJem9zLmNsb3NlRW50cnkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gdW56aXBPREZGaWxlKFN0cmluZyBvZGZOYW1lLCBTdHJpbmcgb3V0cHV0RGlyKSB7Ci0JCUxpc3Q8U3RyaW5nPiBvdXRwdXRGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlaaXBJbnB1dFN0cmVhbSB6aXMgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCQotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwob2RmTmFtZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQl6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZSh1cmwudG9VUkkoKSkpKTsKLQkJCX0gZWxzZSB7CQkJCi0JCQkJemlzID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ob2RmTmFtZSkpOwotCQkJfQotCQkJWmlwRW50cnkgemVudCA9IG51bGw7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCQkJd2hpbGUgKCh6ZW50ID0gemlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0JCQkJZmlsZU5hbWUgPSB6ZW50LmdldE5hbWUoKTsKLQkJCQlpZiAoZmlsZU5hbWUuY29udGFpbnMoIi8iKSkgewotCQkJCQlpbnQgbGFzdEluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi8iKTsKLQkJCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShvdXRwdXREaXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCkpOwotCQkJCQlpZiAoIWRpci5leGlzdHMoKSkgewotCQkJCQkJZGlyLm1rZGlycygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZmlsZU5hbWUuZW5kc1dpdGgoIi8iKSkgewotCQkJCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHppcyk7Ci0JCQkJCVN0cmluZyBvdXRwdXRGaWxlID0gb3V0cHV0RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJCQkJb3V0cHV0RmlsZUxpc3QuYWRkKG91dHB1dEZpbGUpOwotCQkJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCQkJCWludCBzaXplOwotCQkJCQkJd2hpbGUgKChzaXplID0gYmlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLQkJCQkJCQlmb3Mud3JpdGUoYnVmZmVyLCAwLCBzaXplKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWZvcy5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJemlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0cHV0RmlsZUxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlT0RGRmlsZShTdHJpbmcgaW5wdXREaXIsIFN0cmluZyBvdXRwdXRPREZOYW1lKSB7Ci0JCUZpbGUgaW5wdXREaXJGaWxlID0gbmV3IEZpbGUoaW5wdXREaXIpOwotCQlpZiAoaW5wdXREaXJGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVVSTCB1cmwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKG91dHB1dE9ERk5hbWUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCQkJCQotCQkJdHJ5IHsKLQkJCQlGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQl6aXBGaWxlID0gbmV3IEZpbGUodXJsLnRvVVJJKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXppcEZpbGUgPSBuZXcgRmlsZShvdXRwdXRPREZOYW1lKTsKLQkJCQl9Ci0JCQkJCi0JCQkJRmlsZVtdIGZpbGVMaXN0ID0gaW5wdXREaXJGaWxlLmxpc3RGaWxlcygpOwotCQkJCVppcE91dHB1dFN0cmVhbSB6b3MgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAl6aXBGaWxlKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlhZGRGaWxlVG9aaXAoem9zLCBpbnB1dERpciwgZmlsZUxpc3RbaV0pOwotCQkJCX0KLQkJCQl6b3MuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJtRGlyKEZpbGUgZGVsZXRlZERpcikgewotCQlGaWxlW10gZmlsZXMgPSBkZWxldGVkRGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIXJtRGlyKGZpbGVzW2ldKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQlyZXR1cm4gZGVsZXRlZERpci5kZWxldGUoKTsKLQl9Ci0KLQkvKgotCSAqIE9ERkRvY3VtZW50IGRvYyAtLSBtb2RpZmllZCBjb250ZW50LnhtbCBTdHJpbmcgb3V0RmlsZSAtLSBvdXRwdXQgT0RGIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlT0RGRmlsZShPREZEb2N1bWVudCBkb2MsIFN0cmluZyBvdXRGaWxlKSB7Ci0JCVN0cmluZyBpbkZpbGUgPSBkb2MuZ2V0VVJMKCk7Ci0KLQkJLy8gY3JlYXRlIHRtcCBkaXJlY3RvcnkKLQkJSVBhdGggdG1wRGlyID0gT2RmUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKCJ0bXAiKTsKLQkJRmlsZSB0bXBEaXJGaWxlID0gdG1wRGlyLnRvRmlsZSgpOwotCQl0bXBEaXJGaWxlLm1rZGlyKCk7Ci0JCVN0cmluZyB0bXBEaXJQYXRoID0gdG1wRGlyRmlsZS5nZXRQYXRoKCk7Ci0KLQkJLy8gdW56aXAgT0RGIGZpbGUKLQkJT0RGV3JpdGVyIG9kZldyaXRlciA9IG5ldyBPREZXcml0ZXIoKTsKLQkJb2RmV3JpdGVyLnVuemlwT0RGRmlsZShpbkZpbGUsIHRtcERpclBhdGgpOwotCi0JCS8vIHNhdmUgY29udGVudC54bWwKLQkJdHJ5IHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gd3JpdGVyID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wRGlyUGF0aAotCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKQotCQkJCQkrIE9ERkNvbnN0YW50cy5PREZfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCQlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0JCQlSZXN1bHQgdGFyZ2V0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdEZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0oc291cmNlLCB0YXJnZXQpOwotCQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJLy8gc2F2ZSBPREYgZmlsZQotCQlvZGZXcml0ZXIuY3JlYXRlT0RGRmlsZSh0bXBEaXJQYXRoLCBvdXRGaWxlKTsKLQotCQkvLyByZW1vdmUgdG1wIGRpcmVjdG9yeQotCQlybURpcih0bXBEaXJGaWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Rml4RW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Rml4RW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjJhZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUZpeEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmFjY2Vzc2liaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEJhc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ29udHJvbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GcmFtZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuVGV4dEJveEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29udHJvbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudENvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuT2ZmaWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuU3ByZWFkU2hlZXRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uTm90ZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uUHJlc2VudGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZVByb3BlcnRpZXNCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ2VsbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29sdW1uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNlcXVlbmNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlGaXhFbmdpbmUgewotCXByaXZhdGUgZG91YmxlIG9kZlZlcnNpb24gPSAtMS4wOwotCi0JcHVibGljIEFjY2Vzc2liaWxpdHlGaXhFbmdpbmUoKSB7Ci0JfQotCi0JcHVibGljIEFjY2Vzc2liaWxpdHlGaXhFbmdpbmUoZG91YmxlIG9kZlZlcnNpb24pIHsKLQkJdGhpcy5vZGZWZXJzaW9uID0gb2RmVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaXhTaG9ydERlc2MoT0RGRWxlbWVudCB0YXJnZXQsIFN0cmluZyBzaG9ydERlc2MpIHsKLQkJaWYgKChzaG9ydERlc2MgPT0gbnVsbCkgfHwgKHNob3J0RGVzYy5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSB7Ci0JCQlPREZFbGVtZW50IHNob3J0RGVzY0VsZW0gPSBudWxsOwotCQkJaWYgKG9kZlZlcnNpb24gIT0gLTEuMCkgewotCQkJCXNob3J0RGVzY0VsZW0gPSAoKERyYXdpbmdPYmplY3RCYXNlRWxlbWVudCkgdGFyZ2V0KQotCQkJCQkJLmdldFNob3J0RGVzY0VsZW1lbnQob2RmVmVyc2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCXNob3J0RGVzY0VsZW0gPSAoKERyYXdpbmdPYmplY3RCYXNlRWxlbWVudCkgdGFyZ2V0KQotCQkJCQkJLmdldFNob3J0RGVzY0VsZW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKHNob3J0RGVzY0VsZW0gPT0gbnVsbCkgewotCQkJCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIE9ERkRvY3VtZW50KSB7Ci0JCQkJCUVsZW1lbnQgbmV3RWxlbSA9IG51bGw7Ci0JCQkJCU9ERkRvY3VtZW50IG9kZkRvYyA9ICgoT0RGRG9jdW1lbnQpIGRvYyk7Ci0JCQkJCVN0cmluZyBzdmdQcmVmaXggPSB0YXJnZXQKLQkJCQkJCQkubG9va3VwUHJlZml4KFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSk7Ci0JCQkJCWlmIChzdmdQcmVmaXggPT0gbnVsbCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQlpZiAoKG9kZlZlcnNpb24gPT0gMS4wKQotCQkJCQkJCXx8ICgob2RmVmVyc2lvbiA9PSAtMS4wKSAmJiAob2RmRG9jLmdldE9ERlZlcnNpb24oKSA9PSAxLjApKSkgewotCQkJCQkJbmV3RWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KHN2Z1ByZWZpeCArICI6IgotCQkJCQkJCQkrIFNWR0NvbnN0YW50cy5FTEVNRU5UX0RFU0MpOwotCQkJCQkJbmV3RWxlbS5zZXRUZXh0Q29udGVudChzaG9ydERlc2MpOwotCQkJCQl9IGVsc2UgaWYgKChvZGZWZXJzaW9uID4gMS4wKQotCQkJCQkJCXx8ICgob2RmVmVyc2lvbiA9PSAtMS4wKSAmJiAob2RmRG9jLmdldE9ERlZlcnNpb24oKSA+IDEuMCkpKSB7Ci0JCQkJCQluZXdFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoc3ZnUHJlZml4ICsgIjoiCi0JCQkJCQkJCSsgU1ZHQ29uc3RhbnRzLkVMRU1FTlRfVElUTEUpOwotCQkJCQkJbmV3RWxlbS5zZXRUZXh0Q29udGVudChzaG9ydERlc2MpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5ld0VsZW0gIT0gbnVsbCkgewotCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQpIHsKLQkJCQkJCQlFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtKTsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEVsZW1lbnQpIHsKLQkJCQkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQobmV3RWxlbSk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNob3J0RGVzY0VsZW0uc2V0VGV4dENvbnRlbnQoc2hvcnREZXNjKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZml4TG9uZ0Rlc2MoT0RGRWxlbWVudCB0YXJnZXQsIFN0cmluZyBsb25nRGVzYykgewotCQlpZiAoKGxvbmdEZXNjID09IG51bGwpIHx8IChsb25nRGVzYy5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSB7Ci0JCQlPREZFbGVtZW50IGxvbmdEZXNjRWxlbSA9IG51bGw7Ci0JCQlpZiAob2RmVmVyc2lvbiAhPSAtMS4wKSB7Ci0JCQkJbG9uZ0Rlc2NFbGVtID0gKChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIHRhcmdldCkKLQkJCQkJCS5nZXRMb25nRGVzY0VsZW1lbnQob2RmVmVyc2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCWxvbmdEZXNjRWxlbSA9ICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSB0YXJnZXQpCi0JCQkJCQkuZ2V0TG9uZ0Rlc2NFbGVtZW50KCk7Ci0JCQl9Ci0KLQkJCWlmIChsb25nRGVzY0VsZW0gPT0gbnVsbCkgewotCQkJCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIE9ERkRvY3VtZW50KSB7Ci0JCQkJCUVsZW1lbnQgbmV3RWxlbSA9IG51bGw7Ci0JCQkJCU9ERkRvY3VtZW50IG9kZkRvYyA9ICgoT0RGRG9jdW1lbnQpIGRvYyk7Ci0JCQkJCUVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpIHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKChvZGZWZXJzaW9uID4gMS4wKQotCQkJCQkJCXx8ICgob2RmVmVyc2lvbiA9PSAtMS4wKSAmJiAob2RmRG9jLmdldE9ERlZlcnNpb24oKSA+IDEuMCkpKSB7Ci0JCQkJCQlTdHJpbmcgc3ZnUHJlZml4ID0gdGFyZ2V0Ci0JCQkJCQkJCS5sb29rdXBQcmVmaXgoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJKTsKLQkJCQkJCWlmIChzdmdQcmVmaXggPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJCW5ld0VsZW0gPSBkb2MuY3JlYXRlRWxlbWVudChzdmdQcmVmaXggKyAiOiIKLQkJCQkJCQkJKyBTVkdDb25zdGFudHMuRUxFTUVOVF9ERVNDKTsKLQkJCQkJCW5ld0VsZW0uc2V0VGV4dENvbnRlbnQobG9uZ0Rlc2MpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5ld0VsZW0gIT0gbnVsbCkgewotCQkJCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQpIHsKLQkJCQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQobmV3RWxlbSk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERyYXdpbmdPYmplY3RFbGVtZW50KSB7Ci0JCQkJCQkJdGFyZ2V0LmFwcGVuZENoaWxkKG5ld0VsZW0pOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsb25nRGVzY0VsZW0uc2V0VGV4dENvbnRlbnQobG9uZ0Rlc2MpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kUmVwZWF0ZWRUYWJsZVJvdyhUYWJsZVJvd0VsZW1lbnQgcm93KSB7Ci0JCWludCByZXBlYXQgPSByb3cuZ2V0QXR0clRhYmxlTnVtYmVyUm93c1JlcGVhdGVkKCk7Ci0JCWlmIChyZXBlYXQgIT0gLTEpIHsKLQkJCU5vZGUgcm93UGFyZW50ID0gcm93LmdldFBhcmVudE5vZGUoKTsKLQkJCXJvdy5yZW1vdmVBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9ST1dTX1JFUEVBVEVEKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0IC0gMTsgaSsrKSB7Ci0JCQkJVGFibGVSb3dFbGVtZW50IGNsb25lUm93ID0gKFRhYmxlUm93RWxlbWVudCkgcm93Ci0JCQkJCQkuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlyb3dQYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lUm93LCByb3cpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZml4VGFibGVSb3dIZWFkZXIoT0RGRWxlbWVudCB0YXJnZXQsIGludCBoZWFkZXJOdW0pIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJTm9kZUxpc3QgdGVzdG5sID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkuZ2V0VGFibGVIZWFkZXJSb3dzKCk7Ci0JCQlpZiAoKHRlc3RubCAhPSBudWxsKSAmJiAodGVzdG5sLmdldExlbmd0aCgpID4gMCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlEb2N1bWVudCBkb2MgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIE9ERkRvY3VtZW50KSB7Ci0JCQkJU3RyaW5nIHRhYmxlUHJlZml4ID0gdGFyZ2V0Ci0JCQkJCQkubG9va3VwUHJlZml4KFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkkpOwotCQkJCWlmICh0YWJsZVByZWZpeCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQlFbGVtZW50IGhlYWRlclJvdyA9IGRvYy5jcmVhdGVFbGVtZW50KHRhYmxlUHJlZml4ICsgIjoiCi0JCQkJCQkrIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfSEVBREVSX1JPV1MpOwotCi0JCQkJTGlzdCByb3dMaXN0ID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkuZ2V0VGFibGVSb3dDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm93TGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlleHBhbmRSZXBlYXRlZFRhYmxlUm93KChUYWJsZVJvd0VsZW1lbnQpIHJvd0xpc3QuZ2V0KGkpKTsKLQkJCQl9Ci0KLQkJCQlyb3dMaXN0ID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkuZ2V0VGFibGVSb3dDaGlsZHJlbigpOwotCQkJCWlmICgocm93TGlzdC5zaXplKCkgPT0gMCkgfHwgKGhlYWRlck51bSA+IHJvd0xpc3Quc2l6ZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJTm9kZSBuZXdIZWFkZXJSb3cgPSB0YXJnZXQuaW5zZXJ0QmVmb3JlKGhlYWRlclJvdywKLQkJCQkJCShOb2RlKSByb3dMaXN0LmdldCgwKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJOdW07IGkrKykgewotCQkJCQlUYWJsZVJvd0VsZW1lbnQgcm93ID0gKFRhYmxlUm93RWxlbWVudCkgcm93TGlzdC5nZXQoaSk7Ci0JCQkJCW5ld0hlYWRlclJvdy5hcHBlbmRDaGlsZChyb3cpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFJlcGVhdGVkVGFibGVDb2x1bW4oVGFibGVDb2x1bW5FbGVtZW50IGNvbCkgewotCQlpbnQgcmVwZWF0ID0gY29sLmdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpOwotCQlpZiAocmVwZWF0ICE9IC0xKSB7Ci0JCQlOb2RlIGNvbFBhcmVudCA9IGNvbC5nZXRQYXJlbnROb2RlKCk7Ci0JCQljb2wucmVtb3ZlQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdCAtIDE7IGkrKykgewotCQkJCVRhYmxlQ29sdW1uRWxlbWVudCBjbG9uZUNvbCA9IChUYWJsZUNvbHVtbkVsZW1lbnQpIGNvbAotCQkJCQkJLmNsb25lTm9kZShmYWxzZSk7Ci0JCQkJY29sUGFyZW50Lmluc2VydEJlZm9yZShjbG9uZUNvbCwgY29sKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpeFRhYmxlQ29sdW1uSGVhZGVyKE9ERkVsZW1lbnQgdGFyZ2V0LCBpbnQgaGVhZGVyTnVtKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCU5vZGVMaXN0IHRlc3RubCA9ICgoVGFibGVFbGVtZW50KSB0YXJnZXQpLmdldFRhYmxlSGVhZGVyQ29sdW1ucygpOwotCQkJaWYgKCh0ZXN0bmwgIT0gbnVsbCkgJiYgKHRlc3RubC5nZXRMZW5ndGgoKSA+IDApKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBPREZEb2N1bWVudCkgewotCQkJCVN0cmluZyB0YWJsZVByZWZpeCA9IHRhcmdldAotCQkJCQkJLmxvb2t1cFByZWZpeChUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJKTsKLQkJCQlpZiAodGFibGVQcmVmaXggPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJRWxlbWVudCBoZWFkZXJDb2x1bW4gPSBkb2MuY3JlYXRlRWxlbWVudCh0YWJsZVByZWZpeCArICI6IgotCQkJCQkJKyBUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0hFQURFUl9DT0xVTU5TKTsKLQotCQkJCUxpc3QgY29sTGlzdCA9ICgoVGFibGVFbGVtZW50KSB0YXJnZXQpLmdldFRhYmxlQ29sdW1uQ2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJZXhwYW5kUmVwZWF0ZWRUYWJsZUNvbHVtbigoVGFibGVDb2x1bW5FbGVtZW50KSBjb2xMaXN0Ci0JCQkJCQkJLmdldChpKSk7Ci0JCQkJfQotCi0JCQkJY29sTGlzdCA9ICgoVGFibGVFbGVtZW50KSB0YXJnZXQpLmdldFRhYmxlQ29sdW1uQ2hpbGRyZW4oKTsKLQkJCQlpZiAoKGNvbExpc3Quc2l6ZSgpID09IDApIHx8IChoZWFkZXJOdW0gPiBjb2xMaXN0LnNpemUoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCU5vZGUgbmV3SGVhZGVyQ29sdW1uID0gdGFyZ2V0Lmluc2VydEJlZm9yZShoZWFkZXJDb2x1bW4sCi0JCQkJCQkoTm9kZSkgY29sTGlzdC5nZXQoMCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyTnVtOyBpKyspIHsKLQkJCQkJVGFibGVDb2x1bW5FbGVtZW50IGNvbCA9IChUYWJsZUNvbHVtbkVsZW1lbnQpIGNvbExpc3QKLQkJCQkJCQkuZ2V0KGkpOwotCQkJCQluZXdIZWFkZXJDb2x1bW4uYXBwZW5kQ2hpbGQoY29sKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpeFRhYmxlQ2FwdGlvbihPREZFbGVtZW50IHRhcmdldCwgU3RyaW5nIGNhcHRpb24pIHsKLQkJaWYgKChjYXB0aW9uID09IG51bGwpIHx8IChjYXB0aW9uLmxlbmd0aCgpID09IDApKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCVNlcXVlbmNlRWxlbWVudCB0ZXN0ID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkKLQkJCQkJLmdldFRleHRTZXF1ZW5jZUVsZW1lbnQoKTsKLQkJCWlmICh0ZXN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlEb2N1bWVudCBkb2MgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIE9ERkRvY3VtZW50KSB7Ci0JCQkJLy8gYWRkIHRleHQ6cCBlbGVtZW50IG5leHQgdG8gdGFibGU6dGFibGUgZWxlbWVudAotCQkJCUVsZW1lbnQgbmV3UEVsZW0gPSBudWxsOwotCQkJCVN0cmluZyB0ZXh0UHJlZml4ID0gdGFyZ2V0Ci0JCQkJCQkubG9va3VwUHJlZml4KFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJKTsKLQkJCQlpZiAodGV4dFByZWZpeCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJU3RyaW5nIHN0eWxlUHJlZml4ID0gdGFyZ2V0Ci0JCQkJCQkubG9va3VwUHJlZml4KFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkkpOwotCQkJCWlmIChzdHlsZVByZWZpeCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQlFbGVtZW50IHBFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQodGV4dFByZWZpeCArICI6IgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfUCk7Ci0JCQkJcEVsZW0uc2V0QXR0cmlidXRlKHRleHRQcmVmaXggKyAiOiIKLQkJCQkJCSsgVGV4dENvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUsICJUYWJsZSIpOwotCQkJCU5vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJCQlOb2RlIG5leHROb2RlID0gdGFyZ2V0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHROb2RlID09IG51bGwpIHsKLQkJCQkJbmV3UEVsZW0gPSAoRWxlbWVudCkgcGFyZW50LmFwcGVuZENoaWxkKHBFbGVtKTsKLQkJCQl9IGVsc2UgewotCQkJCQluZXdQRWxlbSA9IChFbGVtZW50KSBwYXJlbnQuaW5zZXJ0QmVmb3JlKHBFbGVtLCBuZXh0Tm9kZSk7Ci0JCQkJfQotCi0JCQkJaWYgKG5ld1BFbGVtICE9IG51bGwpIHsKLQkJCQkJbmV3UEVsZW0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJUYWJsZSAiKSk7Ci0KLQkJCQkJLy8gc2V0IGNvbnRlbnQgb2YgdGV4dDpwIGVsZW1lbnQKLQkJCQkJRWxlbWVudCBzZXFFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQodGV4dFByZWZpeCArICI6IgotCQkJCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFUVVFTkNFKTsKLQkJCQkJc2VxRWxlbS5zZXRBdHRyaWJ1dGUodGV4dFByZWZpeCArICI6IgotCQkJCQkJCSsgVGV4dENvbnN0YW50cy5BVFRSX05BTUUsICJUYWJsZSIpOwotCQkJCQlzZXFFbGVtLnNldEF0dHJpYnV0ZSh0ZXh0UHJlZml4ICsgIjoiCi0JCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkFUVFJfRk9STVVMQSwgIm9vb3c6VGFibGUrMSIpOwotCQkJCQlzZXFFbGVtLnNldEF0dHJpYnV0ZShzdHlsZVByZWZpeCArICI6IgotCQkJCQkJCSsgU3R5bGVDb25zdGFudHMuQVRUUl9OVU1fRk9STUFULCAiMSIpOwotCQkJCQluZXdQRWxlbS5hcHBlbmRDaGlsZChzZXFFbGVtKTsKLQkJCQkJVGV4dCBjYXB0aW9uVGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiIDogIiArIGNhcHRpb24pOwotCQkJCQluZXdQRWxlbS5hcHBlbmRDaGlsZChjYXB0aW9uVGV4dCk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Zvcm1MYWJlbEZpeENhcGFibGUoT0RGRWxlbWVudCB0YXJnZXQpIHsKLQkJZmluYWwgU3RyaW5nIENPTlRST0xfSU1QTF9DSEVDS0JPWCA9ICJjb20uc3VuLnN0YXIuZm9ybS5jb21wb25lbnQuQ2hlY2tCb3giOwotCQlmaW5hbCBTdHJpbmcgQ09OVFJPTF9JTVBMX09QVElPTkJVVFRPTiA9ICJjb20uc3VuLnN0YXIuZm9ybS5jb21wb25lbnQuT3B0aW9uQnV0dG9uIjsKLQkJZmluYWwgU3RyaW5nIENPTlRST0xfSU1QTF9QVVNIQlVUVE9OID0gImNvbS5zdW4uc3Rhci5mb3JtLmNvbXBvbmVudC5QdXNoQnV0dG9uIjsKLQkJZmluYWwgU3RyaW5nIENPTlRST0xfSU1QTF9SQURJT0JVVFRPTiA9ICJjb20uc3VuLnN0YXIuZm9ybS5jb21wb25lbnQuUmFkaW9CdXR0b24iOwotCQlmaW5hbCBTdHJpbmcgQ09OVFJPTF9JTVBMX0dST1VQQk9YID0gImNvbS5zdW4uc3Rhci5mb3JtLmNvbXBvbmVudC5Hcm91cEJveCI7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xFbGVtZW50KSB7Ci0JCQlGb3JtQ29udHJvbEVsZW1lbnQgZm9ybUNvbnRyb2wgPSAoKENvbnRyb2xFbGVtZW50KSB0YXJnZXQpCi0JCQkJCS5nZXRGb3JtQ29udHJvbEVsZW1lbnQoKTsKLQkJCVN0cmluZyBjb250cm9sSW1wbCA9IGZvcm1Db250cm9sLmdldEF0dHJGb3JtQ29udHJvbEltcGxlbWVudGF0aW9uKCk7Ci0JCQlpZiAoKGNvbnRyb2xJbXBsLmVuZHNXaXRoKENPTlRST0xfSU1QTF9DSEVDS0JPWCkpCi0JCQkJCXx8IChjb250cm9sSW1wbC5lbmRzV2l0aChDT05UUk9MX0lNUExfT1BUSU9OQlVUVE9OKSkKLQkJCQkJfHwgKGNvbnRyb2xJbXBsLmVuZHNXaXRoKENPTlRST0xfSU1QTF9QVVNIQlVUVE9OKSkKLQkJCQkJfHwgKGNvbnRyb2xJbXBsLmVuZHNXaXRoKENPTlRST0xfSU1QTF9SQURJT0JVVFRPTikpCi0JCQkJCXx8IChjb250cm9sSW1wbC5lbmRzV2l0aChDT05UUk9MX0lNUExfR1JPVVBCT1gpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZml4Rm9ybUxhYmVsKE9ERkVsZW1lbnQgdGFyZ2V0LCBTdHJpbmcgbGFiZWwpIHsKLQkJaWYgKChsYWJlbCA9PSBudWxsKSB8fCAobGFiZWwubGVuZ3RoKCkgPT0gMCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xFbGVtZW50KSB7Ci0JCQlGb3JtQ29udHJvbEVsZW1lbnQgZm9ybUNvbnRyb2wgPSAoKENvbnRyb2xFbGVtZW50KSB0YXJnZXQpCi0JCQkJCS5nZXRGb3JtQ29udHJvbEVsZW1lbnQoKTsKLQkJCWlmIChmb3JtQ29udHJvbC5oYXNBdHRyaWJ1dGVOUyhGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybUNvbnN0YW50cy5BVFRSX0xBQkVMKSkgewotCQkJCWZvcm1Db250cm9sLnJlbW92ZUF0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRm9ybUNvbnN0YW50cy5BVFRSX0xBQkVMKTsKLQkJCX0KLQkJCVN0cmluZyBmb3JtUHJlZml4ID0gZm9ybUNvbnRyb2wuZ2V0UHJlZml4KCk7Ci0JCQlmb3JtQ29udHJvbC5zZXRBdHRyaWJ1dGUoZm9ybVByZWZpeCArICI6IgotCQkJCQkrIEZvcm1Db25zdGFudHMuQVRUUl9MQUJFTCwgbGFiZWwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpeEZvcm1UYWJTdG9wKE9ERkVsZW1lbnQgdGFyZ2V0LCBib29sZWFuIHRhYlN0b3ApIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xFbGVtZW50KSB7Ci0JCQlGb3JtQ29udHJvbEVsZW1lbnQgZm9ybUNvbnRyb2wgPSAoKENvbnRyb2xFbGVtZW50KSB0YXJnZXQpCi0JCQkJCS5nZXRGb3JtQ29udHJvbEVsZW1lbnQoKTsKLQkJCWlmIChmb3JtQ29udHJvbC5oYXNBdHRyaWJ1dGVOUyhGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9TVE9QKSkgewotCQkJCWZvcm1Db250cm9sLnJlbW92ZUF0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9TVE9QKTsKLQkJCX0KLQkJCVN0cmluZyBmb3JtUHJlZml4ID0gZm9ybUNvbnRyb2wuZ2V0UHJlZml4KCk7Ci0JCQlmb3JtQ29udHJvbC5zZXRBdHRyaWJ1dGUoZm9ybVByZWZpeCArICI6IgotCQkJCQkrIEZvcm1Db25zdGFudHMuQVRUUl9UQUJfU1RPUCwgbmV3IEJvb2xlYW4odGFiU3RvcCkKLQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW52aXNpYmxlRWxlbWVudChPREZFbGVtZW50IGVsZW0pIHsKLQkJTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwKLQkJCQkuZXZhbFhQYXRoTm9kZUxpc3QoZWxlbSwgIi4vYW5jZXN0b3I6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFQ1RJT04gKyAiJ10iCi0JCQkJCQkrICJbYXR0cmlidXRlOjoqW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgVGV4dENvbnN0YW50cy5BVFRSX0RJU1BMQVkKLQkJCQkJCSsgIiddPSciICsgVGV4dENvbnN0YW50cy5BVFRSX0RJU1BMQVlfVkFMVUVfTk9ORSArICInXSIpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDApKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEludmlzaWJsZVNlY3Rpb25OYW1lKE9ERkVsZW1lbnQgZWxlbSkgewotCQlOb2RlTGlzdCBubCA9IFhQYXRoVXRpbAotCQkJCS5ldmFsWFBhdGhOb2RlTGlzdChlbGVtLCAiLi9hbmNlc3Rvcjo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VDVElPTiArICInXSIKLQkJCQkJCSsgIlthdHRyaWJ1dGU6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBUZXh0Q29uc3RhbnRzLkFUVFJfRElTUExBWQotCQkJCQkJKyAiJ109JyIgKyBUZXh0Q29uc3RhbnRzLkFUVFJfRElTUExBWV9WQUxVRV9OT05FICsgIiddIik7Ci0JCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCWlmIChubC5pdGVtKDApIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgc2VjdGlvbiA9IChFbGVtZW50KSBubC5pdGVtKDApOwotCQkJCWlmIChzZWN0aW9uLmhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX05BTUUpKSB7Ci0JCQkJCXJldHVybiBzZWN0aW9uLmdldEF0dHJpYnV0ZU5TKAotCQkJCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCVRleHRDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcm90ZWN0ZWRFbGVtZW50KE9ERkVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUNvbnRlbnRUeXBlIHR5cGUgPSBDb250ZW50VHlwZS5OT05FOwotCQlFbGVtZW50IGNvbnRlbnQgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50Q29udGVudEVsZW1lbnQpIHsKLQkJCXR5cGUgPSAoKERvY3VtZW50Q29udGVudEVsZW1lbnQpIGNvbnRlbnQpLmdldEJvZHlFbGVtZW50KCkKLQkJCQkJLmdldENvbnRlbnQoKS5nZXRDb250ZW50VHlwZSgpOwotCQl9Ci0JCWlmICh0eXBlICE9IENvbnRlbnRUeXBlLlNQUkVBRFNIRUVUKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBTcHJlYWRTaGVldEVsZW1lbnQpIHsKLQkJCVNwcmVhZFNoZWV0RWxlbWVudCBzcHJlYWRzaGVldCA9IChTcHJlYWRTaGVldEVsZW1lbnQpIHRhcmdldDsKLQkJCXJldHVybiBzcHJlYWRzaGVldC5nZXRBdHRyVGFibGVTdHJ1Y3R1cmVQcm90ZWN0ZWQoKTsKLQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCVRhYmxlRWxlbWVudCB0YWJsZSA9IChUYWJsZUVsZW1lbnQpIHRhcmdldDsKLQkJCXJldHVybiB0YWJsZS5nZXRBdHRyVGFibGVQcm90ZWN0ZWQoKTsKLQkJfSBlbHNlIHsKLQkJCVNwcmVhZFNoZWV0RWxlbWVudCBzcHJlYWRzaGVldCA9IG51bGw7Ci0JCQlUYWJsZUVsZW1lbnQgdGFibGUgPSBudWxsOwotCQkJSVN0eWxhYmxlIGNlbGwgPSBudWxsOwotCi0JCQlpZiAoKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlQ2VsbEVsZW1lbnQpCi0JCQkJCXx8ICh0YXJnZXQgaW5zdGFuY2VvZiBDb3ZlcmVkVGFibGVDZWxsRWxlbWVudCkpIHsKLQkJCQljZWxsID0gKElTdHlsYWJsZSkgdGFyZ2V0OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBjZWxsTGlzdCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdCh0YXJnZXQsCi0JCQkJCQkiLi9hbmNlc3Rvcjo6KlsobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkJCSsgVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSQotCQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkJKyBUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0NFTEwgKyAiJykiCi0JCQkJCQkJCSsgIiBvciAobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkJCSsgVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSQotCQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkJKyBUYWJsZUNvbnN0YW50cy5FTEVNRU5UX0NPVkVSRURfVEFCTEVfQ0VMTAotCQkJCQkJCQkrICInKV0iKTsKLQkJCQlpZiAoKGNlbGxMaXN0ICE9IG51bGwpICYmIChjZWxsTGlzdC5nZXRMZW5ndGgoKSA9PSAxKSkgewotCQkJCQlOb2RlIG5vZGUgPSBjZWxsTGlzdC5pdGVtKDApOwotCQkJCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBUYWJsZUNlbGxFbGVtZW50KQotCQkJCQkJCXx8IChub2RlIGluc3RhbmNlb2YgQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnQpKSB7Ci0JCQkJCQljZWxsID0gKElTdHlsYWJsZSkgbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjZWxsID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlOb2RlTGlzdCB0YWJsZUxpc3QgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QodGFyZ2V0LAotCQkJCQkiLi9hbmNlc3Rvcjo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCQkrIFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkkKLQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkrIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEUgKyAiJ10iCi0JCQkJCQkJKyAiW3BhcmVudDo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCQkrIE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSQotCQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJCSsgT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfU1BSRUFEU0hFRVQgKyAiJ11dIik7Ci0JCQlpZiAoKHRhYmxlTGlzdCAhPSBudWxsKSAmJiAodGFibGVMaXN0LmdldExlbmd0aCgpID09IDEpKSB7Ci0JCQkJTm9kZSBub2RlID0gdGFibGVMaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpIHsKLQkJCQkJdGFibGUgPSAoVGFibGVFbGVtZW50KSBub2RlOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0YWJsZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJTm9kZSB0YWJsZVBhcmVudCA9IHRhYmxlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICh0YWJsZVBhcmVudCBpbnN0YW5jZW9mIFNwcmVhZFNoZWV0RWxlbWVudCkgewotCQkJCXNwcmVhZHNoZWV0ID0gKFNwcmVhZFNoZWV0RWxlbWVudCkgdGFibGVQYXJlbnQ7Ci0JCQl9Ci0JCQlpZiAoc3ByZWFkc2hlZXQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChzcHJlYWRzaGVldC5nZXRBdHRyVGFibGVTdHJ1Y3R1cmVQcm90ZWN0ZWQoKQotCQkJCQl8fCB0YWJsZS5nZXRBdHRyVGFibGVQcm90ZWN0ZWQoKSkgewotCQkJCWludCBjZWxsUHJvdGVjdCA9IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9OT1RfREVGSU5FRDsKLQotCQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0gPSBjZWxsLmdldFN0eWxlKCk7Ci0JCQkJaWYgKHN0eWxlRWxlbSAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3R5bGVFbGVtLmdldFByb3BlcnR5U2l6ZSgpOyBpKyspIHsKLQkJCQkJCVN0eWxlUHJvcGVydGllc0Jhc2UgcHJvcCA9IHN0eWxlRWxlbQotCQkJCQkJCQkuZ2V0UHJvcGVydHlFbGVtZW50KGkpOwotCQkJCQkJaWYgKHByb3AgaW5zdGFuY2VvZiBUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudCkgewotCQkJCQkJCVRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50IGNlbGxQcm9wID0gKFRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50KSBwcm9wOwotCQkJCQkJCWNlbGxQcm90ZWN0ID0gY2VsbFByb3AuZ2V0QXR0clN0eWxlQ2VsbFByb3RlY3QoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoY2VsbFByb3RlY3QgPT0gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX1BST1RFQ1RFRCkKLQkJCQkJCXx8IChjZWxsUHJvdGVjdCA9PSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOX0FORF9QUk9URUNURUQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoY2VsbFByb3RlY3QgPT0gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX05PVF9ERUZJTkVEKSB7Ci0JCQkJCWlmICh0YWJsZS5oYXNBdHRyaWJ1dGVOUygKLQkJCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfUFJPVEVDVEVEKSkKLQkJCQkJCXJldHVybiB0YWJsZS5nZXRBdHRyVGFibGVQcm90ZWN0ZWQoKTsKLQkJCQkJaWYgKHNwcmVhZHNoZWV0Lmhhc0F0dHJpYnV0ZU5TKAotCQkJCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFJVQ1RVUkVfUFJPVEVDVEVEKSkKLQkJCQkJCXJldHVybiBzcHJlYWRzaGVldC5nZXRBdHRyVGFibGVTdHJ1Y3R1cmVQcm90ZWN0ZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWFrZXJOb3Rlc0NvbnRlbnQoTm90ZXNFbGVtZW50IG5vdGVzLCBTdHJpbmcgY29udGVudCkgewotCQlTdHJpbmdbXSBjb250ZW50TGlzdCA9IGNvbnRlbnQuc3BsaXQoIlxuIik7Ci0KLQkJTm9kZUxpc3QgZnJhbWVMaXN0ID0gbm90ZXMuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0ZSQU1FKTsKLQkJaWYgKChmcmFtZUxpc3QgPT0gbnVsbCkgfHwgKGZyYW1lTGlzdC5nZXRMZW5ndGgoKSA8PSAwKSkKLQkJCXJldHVybjsKLQotCQlGcmFtZUVsZW1lbnQgbm90ZXNGcmFtZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IGZyYW1lTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBGcmFtZUVsZW1lbnQpIHsKLQkJCQlGcmFtZUVsZW1lbnQgZnJhbWUgPSAoRnJhbWVFbGVtZW50KSBub2RlOwotCQkJCVN0cmluZyBwcmVzZW50YXRpb25DbGFzcyA9IGZyYW1lLmdldEF0dHJpYnV0ZU5TKAotCQkJCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1MpOwotCQkJCWlmICgocHJlc2VudGF0aW9uQ2xhc3MgIT0gbnVsbCkKLQkJCQkJCSYmIChwcmVzZW50YXRpb25DbGFzcwotCQkJCQkJCQkuZXF1YWxzKFByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0NMQVNTX1ZBTFVFX05PVEVTKSkpIHsKLQkJCQkJbm90ZXNGcmFtZSA9IGZyYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobm90ZXNGcmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGVMaXN0IHRleHRCb3hMaXN0ID0gbm90ZXNGcmFtZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuRUxFTUVOVF9URVhUX0JPWCk7Ci0JCWlmICgodGV4dEJveExpc3QgPT0gbnVsbCkgfHwgKHRleHRCb3hMaXN0LmdldExlbmd0aCgpICE9IDEpKQotCQkJcmV0dXJuOwotCi0JCURvY3VtZW50IGRvYyA9IG5vdGVzLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJVGV4dEJveEVsZW1lbnQgdGV4dEJveCA9IChUZXh0Qm94RWxlbWVudCkgdGV4dEJveExpc3QuaXRlbSgwKTsKLQkJTm9kZUxpc3QgcExpc3QgPSB0ZXh0Qm94LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksIFRleHRDb25zdGFudHMuRUxFTUVOVF9QKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlQRWxlbWVudCBwRWxlbSA9IG51bGw7Ci0JCQlpZiAoKGkgPT0gMCkgJiYgKHBMaXN0ICE9IG51bGwpICYmIChwTGlzdC5nZXRMZW5ndGgoKSA9PSAxKSkgewotCQkJCXBFbGVtID0gKFBFbGVtZW50KSBwTGlzdC5pdGVtKDApOwotCQkJfSBlbHNlIHsKLQkJCQlwRWxlbSA9IChQRWxlbWVudCkgZG9jLmNyZWF0ZUVsZW1lbnROUygKLQkJCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5FTEVNRU5UX1ApOwotCQkJfQotCQkJdGV4dEJveC5hcHBlbmRDaGlsZChwRWxlbSk7Ci0KLQkJCVRleHQgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZShjb250ZW50TGlzdFtpXSk7Ci0JCQlwRWxlbS5hcHBlbmRDaGlsZCh0ZXh0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L1NjcmVlblJlYWRlclNpbXVsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvU2NyZWVuUmVhZGVyU2ltdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGJlMjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvU2NyZWVuUmVhZGVyU2ltdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5hY2Nlc3NpYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuVGV4dEV4dHJhY3RvcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNjcmVlblJlYWRlclNpbXVsYXRvciBleHRlbmRzIFRleHRFeHRyYWN0b3IgewotCXZvaWQgc2V0RG9jdW1lbnQoT0RGRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0Jdm9pZCBzZXRFbGVtZW50KE9ERkVsZW1lbnQgZWxlbWVudCk7Ci0KLQlTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnRDb250ZW50KCk7Ci0KLQlTdHJpbmcgZ2V0RWxlbWVudENvbnRlbnQoT0RGRWxlbWVudCBlbGVtKTsKLQotCVN0cmluZyBnZXREb2N1bWVudENvbnRlbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L1NpbXVsYXRvckNyZWF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L1NpbXVsYXRvckNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0MWU3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9TaW11bGF0b3JDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5hY2Nlc3NpYmlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eS5pbXBsLlNjcmVlblJlYWRlclNpbXVsYXRvckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBTaW11bGF0b3JDcmVhdG9yIHsKLQlzdGF0aWMgcHVibGljIFNjcmVlblJlYWRlclNpbXVsYXRvciBjcmVhdGVTaW11bGF0b3JDb250cm9sbGVyKCkgewotCQlyZXR1cm4gKFNjcmVlblJlYWRlclNpbXVsYXRvcikgKG5ldyBTY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L2ltcGwvU2NyZWVuUmVhZGVyU2ltdWxhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvaW1wbC9TY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmM4ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvaW1wbC9TY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBhZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudENvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuUHJlc2VudGF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlNwcmVhZFNoZWV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uTm90ZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eS5TY3JlZW5SZWFkZXJTaW11bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLmltcGwuVGV4dEV4dHJhY3RvckltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBTY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsIGltcGxlbWVudHMgU2NyZWVuUmVhZGVyU2ltdWxhdG9yIHsKLQlwcml2YXRlIE9ERkVsZW1lbnQgY3VyRWxlbSA9IG51bGw7Ci0KLQlwcml2YXRlIFRleHRFeHRyYWN0b3JJbXBsIHRleHRFeHRyYWN0b3I7Ci0KLQlwdWJsaWMgU2NyZWVuUmVhZGVyU2ltdWxhdG9ySW1wbCgpIHsKLQkJdGV4dEV4dHJhY3RvciA9IG5ldyBUZXh0RXh0cmFjdG9ySW1wbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KE9ERkRvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuY3VyRWxlbSA9IChPREZFbGVtZW50KSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdGhpcy50ZXh0RXh0cmFjdG9yLnNldERvY3VtZW50KGRvY3VtZW50LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KE9ERkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmN1ckVsZW0gPSBlbGVtZW50OwotCQl0aGlzLnRleHRFeHRyYWN0b3Iuc2V0RG9jdW1lbnQoCi0JCQkJKE9ERkRvY3VtZW50KSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgdGhpcyk7Ci0JfQotCi0JLy8gZm9yIE5vdGVzOCwgTm90ZXM4IHNhdmUgZG9jdW1lbnQgYnkgT0RGIDEuMSBzY2hlbWEsCi0JLy8gYnV0IG9kZjp2ZXJzaW9uIGlzIHNldCBhcyAxLjAKLQkvLyBpZiBzcGVjaWZ5IG9kZjp2ZXJzaW9uIGJ5IHRoaXMgZnVuY3Rpb24sCi0JLy8gZG8gbm90IHVzZSBvZGY6dmVyc2lvbiBkZWZpbmVkIGluIGVhY2ggT0RGIGZpbGUKLQlwdWJsaWMgdm9pZCBzZXRPZGZWZXJzaW9uKGRvdWJsZSBvZGZWZXJzaW9uKSB7Ci0JCXRoaXMudGV4dEV4dHJhY3Rvci5zZXRPZGZWZXJzaW9uKG9kZlZlcnNpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVBhZ2VFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLCBQYWdlRWxlbWVudCBwYWdlKSB7Ci0JCS8qCi0JCSAqIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFnZS5nZXRDaGlsZE5vZGVzKCk7IGZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJICogaisrKSB7IE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGopOwotCQkgKi8KLQkJTGlzdDxPREZFbGVtZW50PiBjaGlsZHJlbiA9IHBhZ2UuZ2V0Q2hpbGROb2Rlc0luTmF2T3JkZXIoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5zaXplKCk7IGorKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLmdldChqKTsKLQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KQotCQkJCQkmJiAoIShjaGlsZCBpbnN0YW5jZW9mIE5vdGVzRWxlbWVudCkpKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IGdldEVsZW1lbnRDb250ZW50KChPREZFbGVtZW50KSBjaGlsZCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoc3RyKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4dHJhY3RDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLCBPREZFbGVtZW50IGVsZW0sCi0JCQlib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCXJldHVybiB0ZXh0RXh0cmFjdG9yLmV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLCAoT0RGRWxlbWVudCkgZWxlbSwKLQkJCQllbmFibGVTdHlsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50Q29udGVudChPREZFbGVtZW50IGVsZW0pIHsKLQkJc2V0RWxlbWVudChlbGVtKTsKLQotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0JCWlmIChlbGVtIGluc3RhbmNlb2YgUGFnZUVsZW1lbnQpIHsKLQkJCXdyaXRlUGFnZUVsZW1lbnRDb250ZW50KHdyaXRlciwgKFBhZ2VFbGVtZW50KSBlbGVtKTsKLQkJfSBlbHNlIHsKLQkJCWV4dHJhY3RDb250ZW50KHdyaXRlciwgbnVsbCwgKE9ERkVsZW1lbnQpIGVsZW0sIGZhbHNlKTsKLQkJfQotCi0JCVN0cmluZyBzdHIgPSAiIjsKLQkJdHJ5IHsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQlzdHIgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudENvbnRlbnQoY3VyRWxlbSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dERvY3VtZW50Q29udGVudChUZXh0RWxlbWVudCB0ZXh0RWxlbSkgewotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZXh0RWxlbS5nZXRDaGlsZEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgc3RyID0gZ2V0RWxlbWVudENvbnRlbnQoKE9ERkVsZW1lbnQpIGNoaWxkKTsKLQkJCQlpZiAoc3RyICE9IG51bGwpCi0JCQkJCXdyaXRlci53cml0ZShzdHIpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzdHIgPSAiIjsKLQkJdHJ5IHsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQlzdHIgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNwcmVhZHNoZWV0RG9jdW1lbnRDb250ZW50KFNwcmVhZFNoZWV0RWxlbWVudCBzcHJlYWRFbGVtKSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ByZWFkRWxlbS5nZXRUYWJsZVNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUVsZW1lbnQgdGFibGUgPSBzcHJlYWRFbGVtLmdldFRhYmxlKGkpOwotCQkJU3RyaW5nIHN0ciA9IGdldEVsZW1lbnRDb250ZW50KHRhYmxlKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkKLQkJCQl3cml0ZXIud3JpdGUoc3RyICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gIiI7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQkJc3RyID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVzZW50YXRpb25Eb2N1bWVudENvbnRlbnQoUHJlc2VudGF0aW9uRWxlbWVudCBwcmVzZW5FbGVtKSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlc2VuRWxlbS5nZXRQYWdlU2l6ZSgpOyBpKyspIHsKLQkJCVBhZ2VFbGVtZW50IHBhZ2UgPSBwcmVzZW5FbGVtLmdldFBhZ2UoaSk7Ci0JCQlOb3Rlc0VsZW1lbnQgbm90ZXMgPSBwYWdlLmdldFByZXNlbnRhdGlvbk5vdGVzRWxlbWVudCgpOwotCQkJd3JpdGVyLndyaXRlKCJQYWdlICIpOwotCQkJd3JpdGVyLndyaXRlKGkgKyAxKTsKLQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJd3JpdGVyLndyaXRlKGdldEVsZW1lbnRDb250ZW50KHBhZ2UpKTsKLQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJd3JpdGVyLndyaXRlKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCQkJd3JpdGVyLndyaXRlKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7Ci0JCQl3cml0ZXIud3JpdGUoIlNwZWFrZXIgTm90ZXMiKTsKLQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJd3JpdGVyLndyaXRlKGdldEVsZW1lbnRDb250ZW50KG5vdGVzKSk7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9ICIiOwotCQl0cnkgewotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJCXN0ciA9IHdyaXRlci50b1N0cmluZygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudENvbnRlbnQoKSB7Ci0JCWlmIChjdXJFbGVtID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudCByb290ID0gY3VyRWxlbS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotCQkJQm9keUVsZW1lbnQgYm9keSA9ICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgcm9vdCkuZ2V0Qm9keUVsZW1lbnQoKTsKLQkJCUNvbnRlbnRCYXNlRWxlbWVudCBjb250ZW50ID0gYm9keS5nZXRDb250ZW50KCk7Ci0JCQlDb250ZW50VHlwZSB0eXBlID0gY29udGVudC5nZXRDb250ZW50VHlwZSgpOwotCQkJaWYgKCh0eXBlLmVxdWFscyhDb250ZW50VHlwZS5XUklURSkpCi0JCQkJCSYmIChjb250ZW50IGluc3RhbmNlb2YgVGV4dEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGdldFRleHREb2N1bWVudENvbnRlbnQoKFRleHRFbGVtZW50KSBjb250ZW50KTsKLQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQpCi0JCQkJCSYmIChjb250ZW50IGluc3RhbmNlb2YgU3ByZWFkU2hlZXRFbGVtZW50KSkgewotCQkJCXJldHVybiBnZXRTcHJlYWRzaGVldERvY3VtZW50Q29udGVudCgoU3ByZWFkU2hlZXRFbGVtZW50KSBjb250ZW50KTsKLQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OKQotCQkJCQkmJiAoY29udGVudCBpbnN0YW5jZW9mIFByZXNlbnRhdGlvbkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbkRvY3VtZW50Q29udGVudCgoUHJlc2VudGF0aW9uRWxlbWVudCkgY29udGVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgY29udGVudCBlbGVtZW50IikucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIG9kZiBkb2N1bWVudCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL09ERkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY4NTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBPREZDb252ZXJ0ZXIgZXh0ZW5kcyBUZXh0RXh0cmFjdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCA9ICJhY3RmLW9kZi1jb250ZW50LWlkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9BVFRSX09ERl9UQUdOQU1FID0gIm9kZi10YWduYW1lIjsKLQotCXZvaWQgc2V0RG9jdW1lbnQoT0RGRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0Jdm9pZCBjb252ZXJ0RG9jdW1lbnQoU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGVuYWJsZVN0eWxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyQ3JlYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTI5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuaW1wbC5IVE1MQ29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgT0RGQ29udmVydGVyQ3JlYXRvciB7Ci0Jc3RhdGljIHB1YmxpYyBPREZDb252ZXJ0ZXIgY3JlYXRlSFRNTENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChPREZDb252ZXJ0ZXIpIChuZXcgSFRNTENvbnZlcnRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL09ERkNvbnZlcnRlclV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL09ERkNvbnZlcnRlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzJhYTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgT0RGQ29udmVydGVyVXRpbHMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRYTUxDaGFyYWN0ZXIoU3RyaW5nIHZhbCkgewotCQlTdHJpbmcgbmV3VmFsID0gdmFsLnJlcGxhY2VBbGwoIiYiLCAiJmFtcDsiKTsKLQkJbmV3VmFsID0gbmV3VmFsLnJlcGxhY2VBbGwoIjwiLCAiJmx0OyIpOwotCQluZXdWYWwgPSBuZXdWYWwucmVwbGFjZUFsbCgiPiIsICImZ3Q7Iik7Ci0JCXJldHVybiBuZXdWYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9UZXh0RXh0cmFjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL1RleHRFeHRyYWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ZjFjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL1RleHRFeHRyYWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBUZXh0RXh0cmFjdG9yIHsKLQlib29sZWFuIGV4dHJhY3RDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLCBPREZFbGVtZW50IGVsZW0sCi0JCQlib29sZWFuIGVuYWJsZVN0eWxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvaW1wbC9IVE1MQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL2ltcGwvSFRNTENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmViOTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvaW1wbC9IVE1MQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUGFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuVGV4dEJveEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Cb2R5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50Q29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5QcmVzZW50YXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuU3ByZWFkU2hlZXRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5Ob3Rlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLkRlZmF1bHRTdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLkZvbnRGYWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRhYmxlUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRleHRQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDZWxsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb2x1bW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbHVtbnNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlSGVhZGVyUm93c0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5BRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5DaGFuZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkNoYW5nZUVuZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuQ2hhbmdlU3RhcnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RJdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RTdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU2VxdWVuY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNwYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRhYkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuT0RGQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi54bGluay5YTGlua0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEhUTUxDb252ZXJ0ZXIgaW1wbGVtZW50cyBPREZDb252ZXJ0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VOQ09ESU5HID0gIlVURjgiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ERl9DU1NfRklMRSA9ICJPREYuY3NzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0hFQURFUiA9ICI8aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcvPiIKLQkJCSsgIjxtZXRhIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcgaHR0cC1lcXVpdj0nQ29udGVudC10eXBlJy8+PHRpdGxlPjwvdGl0bGU+IgotCQkJKyAiPGxpbmsgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgaHJlZj0nIgotCQkJKyBPREZfQ1NTX0ZJTEUKLQkJCSsgIicvPjwvaGVhZD4iOwotCi0JcHJpdmF0ZSBkb3VibGUgb2RmVmVyc2lvbiA9IC0xLjA7Ci0KLQlwcml2YXRlIE9ERkVsZW1lbnQgY3VyRWxlbSA9IG51bGw7Ci0KLQlwcml2YXRlIFRleHRFeHRyYWN0b3JJbXBsIHRleHRFeHRyYWN0b3I7Ci0KLQlwdWJsaWMgSFRNTENvbnZlcnRlcigpIHsKLQkJdGV4dEV4dHJhY3RvciA9IG5ldyBUZXh0RXh0cmFjdG9ySW1wbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KE9ERkRvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuY3VyRWxlbSA9IChPREZFbGVtZW50KSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdGhpcy50ZXh0RXh0cmFjdG9yLnNldERvY3VtZW50KGRvY3VtZW50LCB0aGlzKTsKLQl9Ci0KLQkvLyBmb3IgTm90ZXM4LCBOb3Rlczggc2F2ZSBkb2N1bWVudCBieSBPREYgMS4xIHNjaGVtYSwKLQkvLyBidXQgb2RmOnZlcnNpb24gaXMgc2V0IGFzIDEuMAotCS8vIGlmIHNwZWNpZnkgb2RmOnZlcnNpb24gYnkgdGhpcyBmdW5jdGlvbiwKLQkvLyBkbyBub3QgdXNlIG9kZjp2ZXJzaW9uIGRlZmluZWQgaW4gZWFjaCBPREYgZmlsZQotCXB1YmxpYyB2b2lkIHNldE9kZlZlcnNpb24oZG91YmxlIG9kZlZlcnNpb24pIHsKLQkJdGhpcy5vZGZWZXJzaW9uID0gb2RmVmVyc2lvbjsKLQkJdGhpcy50ZXh0RXh0cmFjdG9yLnNldE9kZlZlcnNpb24ob2RmVmVyc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SFRNTFRhZ05hbWUoT0RGRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgSW1hZ2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gImltZyI7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEhFbGVtZW50KSB7Ci0JCQlpbnQgbGV2ZWwgPSAoKEhFbGVtZW50KSBlbGVtKS5nZXRBdHRyVGV4dE91dGxpbmVMZXZlbCgpOwotCQkJaWYgKGxldmVsID4gNikKLQkJCQlsZXZlbCA9IDY7Ci0JCQlyZXR1cm4gImgiICsgbGV2ZWw7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIExpc3RFbGVtZW50KSB7Ci0JCQlTdHlsZUVsZW1lbnQgc3R5bGUgPSAoKExpc3RFbGVtZW50KSBlbGVtKQotCQkJCQkuZ2V0TGlzdExldmVsU3R5bGVFbGVtZW50KCk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJCWlmIChzdHlsZSBpbnN0YW5jZW9mIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gInVsIjsKLQkJCQl9IGVsc2UgaWYgKHN0eWxlIGluc3RhbmNlb2YgTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAib2wiOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgVGFibGVDZWxsRWxlbWVudCkgewotCQkJTm9kZSBwYXJlbnQgPSBlbGVtLmdldFBhcmVudE5vZGUoKTsKLQkJCU5vZGUgZ3BhcmVudCA9IG51bGw7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJZ3BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KQotCQkJCQkmJiAoZ3BhcmVudCAhPSBudWxsKQotCQkJCQkmJiAoZ3BhcmVudCBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyUm93c0VsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuICJ0aCI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAidGQiOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFBFbGVtZW50KQotCQkJdGFnTmFtZSA9ICJwIjsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBBRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAiYSI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgU3BhbkVsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYkVsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFNlcXVlbmNlRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAic3BhbiI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgU0VsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIExpc3RJdGVtRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAibGkiOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAidGFibGUiOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyUm93c0VsZW1lbnQpCi0JCQl0YWdOYW1lID0gInRoZWFkIjsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpCi0JCQl0YWdOYW1lID0gInRyIjsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJsZUNvbHVtbnNFbGVtZW50KQotCQkJdGFnTmFtZSA9ICJjb2xncm91cCI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KQotCQkJdGFnTmFtZSA9ICJjb2wiOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIENoYW5nZUVsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIENoYW5nZVN0YXJ0RWxlbWVudCkKLQkJCXRhZ05hbWUgPSAic3BhbiI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgQ2hhbmdlRW5kRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAic3BhbiI7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQl0YWdOYW1lID0gImRpdiI7Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0eWxlQ2xhc3NOYW1lKE9ERkVsZW1lbnQgZWxlbSkgewotCQlTdHJpbmcgc3R5bGVDbGFzc05hbWUgPSBudWxsOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIExpc3RFbGVtZW50KSB7Ci0JCQlMaXN0RWxlbWVudCB0b3BMaXN0RWxlbSA9ICgoTGlzdEVsZW1lbnQpIGVsZW0pCi0JCQkJCS5nZXRUb3BMZXZlbExpc3RFbGVtZW50KCk7Ci0JCQlsb25nIGxldmVsID0gKChMaXN0RWxlbWVudCkgZWxlbSkuZ2V0TGlzdExldmVsKCk7Ci0JCQlzdHlsZUNsYXNzTmFtZSA9IHRvcExpc3RFbGVtLmdldEF0dHJpYnV0ZU5TKAotCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpCi0JCQkJCSsgbGV2ZWw7Ci0JCX0gZWxzZSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ciA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKCJzdHlsZS1uYW1lIi5lcXVhbHMoYXR0ci5nZXRMb2NhbE5hbWUoKSkpIHsKLQkJCQkJaWYgKHN0eWxlQ2xhc3NOYW1lID09IG51bGwpCi0JCQkJCQlzdHlsZUNsYXNzTmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJCQkJZWxzZQotCQkJCQkJc3R5bGVDbGFzc05hbWUgKz0gIiAiOwotCQkJCQlzdHlsZUNsYXNzTmFtZSArPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3R5bGVDbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXh0cmFjdENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsIE9ERkVsZW1lbnQgZWxlbSwKLQkJCWJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJU3RyaW5nIGh0bWxUYWcgPSBnZXRIVE1MVGFnTmFtZShlbGVtKTsKLQkJLy8gd3JpdGUgdGFnIG5hbWUKLQkJaWYgKGh0bWxUYWcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3cml0ZXIud3JpdGUoIjwiICsgaHRtbFRhZyArICIgIiArIE9VVFBVVF9BVFRSX09ERl9UQUdOQU1FCi0JCQkJCQkrICI9JyIgKyBlbGVtLmdldFRhZ05hbWUoKSArICInIGlkPSciCi0JCQkJCQkrIGVsZW0uZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKQotCQkJCQkJKyAiJyBuYW1lPSciCi0JCQkJCQkrIGVsZW0uZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKSArICInICIKLQkJCQkJCSsgT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQgKyAiPSciCi0JCQkJCQkrIGVsZW0uZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKSArICInIik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmIChlbmFibGVTdHlsZSkgewotCQkJCVN0cmluZyBzdHlsZUNsYXNzTmFtZSA9IGdldFN0eWxlQ2xhc3NOYW1lKGVsZW0pOwotCQkJCWlmIChzdHlsZUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoIiBjbGFzcz0nIiArIHN0eWxlQ2xhc3NOYW1lICsgIiciKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZUVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgaHJlZiA9ICgoSW1hZ2VFbGVtZW50KSBlbGVtKS5nZXRBdHRyWGxpbmtIcmVmKCk7Ci0JCQkJaWYgKCFocmVmLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJiAhaHJlZi5zdGFydHNXaXRoKCJodHRwczovLyIpCi0JCQkJCQkmJiAhaHJlZi5zdGFydHNXaXRoKCJmaWxlOi8vIikKLQkJCQkJCSYmICFocmVmLnN0YXJ0c1dpdGgoImNocm9tZTovLyIpKSB7Ci0JCQkJCXRleHRFeHRyYWN0b3IuZXh0cmFjdEVtYmVkRmlsZShlbGVtLCBkaXIsIGhyZWYpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl3cml0ZXIud3JpdGUoIiBzcmM9JyIgKyBocmVmICsgIiciKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCi0JCQkJT0RGRWxlbWVudCBvZGZFbGVtID0gbnVsbDsKLQkJCQlpZiAodGhpcy5vZGZWZXJzaW9uICE9IC0xLjApIHsKLQkJCQkJb2RmRWxlbSA9ICgoSW1hZ2VFbGVtZW50KSBlbGVtKQotCQkJCQkJCS5nZXRTaG9ydERlc2NFbGVtZW50KG9kZlZlcnNpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9kZkVsZW0gPSAoKEltYWdlRWxlbWVudCkgZWxlbSkuZ2V0U2hvcnREZXNjRWxlbWVudCgpOwotCQkJCX0KLQotCQkJCWlmIChvZGZFbGVtICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGFsdFRleHQgPSAoU3RyaW5nKSAoKElFZGl0YWJsZSkgb2RmRWxlbSkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGFsdFRleHQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl3cml0ZXIud3JpdGUoIiBhbHQ9JyIgKyBhbHRUZXh0ICsgIiciKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRnJhbWVFbGVtZW50IGZyYW1lRWxlbSA9ICgoSW1hZ2VFbGVtZW50KSBlbGVtKQotCQkJCQkJCS5nZXRGcmFtZUVsZW1lbnQoKTsKLQkJCQkJaWYgKGZyYW1lRWxlbSAhPSBudWxsKSB7Ci0JCQkJCQlUZXh0Qm94RWxlbWVudCBjYXB0aW9uRWxlbSA9IG51bGw7Ci0JCQkJCQlpZiAob2RmVmVyc2lvbiAhPSAtMS4wKSB7Ci0JCQkJCQkJY2FwdGlvbkVsZW0gPSBmcmFtZUVsZW0KLQkJCQkJCQkJCS5nZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudChvZGZWZXJzaW9uKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2FwdGlvbkVsZW0gPSBmcmFtZUVsZW0KLQkJCQkJCQkJCS5nZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudCgpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2FwdGlvbkVsZW0gIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBjYXB0aW9uVGV4dCA9IGNhcHRpb25FbGVtLmdldFRleHRDb250ZW50KCk7Ci0JCQkJCQkJaWYgKGNhcHRpb25UZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXdyaXRlci53cml0ZSgiIGFsdD0nJyIpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgd2lkdGggPSBmcmFtZUVsZW0uZ2V0QXR0clN2Z1dpZHRoKCk7Ci0JCQkJCQlpZiAod2lkdGggPT0gbnVsbCkKLQkJCQkJCQl3aWR0aCA9ICJhdXRvIjsKLQkJCQkJCVN0cmluZyBoZWlnaHQgPSBmcmFtZUVsZW0uZ2V0QXR0clN2Z0hlaWdodCgpOwotCQkJCQkJaWYgKGhlaWdodCA9PSBudWxsKQotCQkJCQkJCWhlaWdodCA9ICJhdXRvIjsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd3JpdGVyLndyaXRlKCIgc3R5bGU9J3dpZHRoOiIgKyB3aWR0aCArICI7aGVpZ2h0OiIKLQkJCQkJCQkJCSsgaGVpZ2h0ICsgIjsnIik7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEFFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKEFFbGVtZW50KSBlbGVtKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKFhMaW5rQ29uc3RhbnRzLkxJTktfVFlQRV9TSU1QTEUuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCVN0cmluZyBocmVmID0gKChBRWxlbWVudCkgZWxlbSkuZ2V0SHJlZigpOwotCQkJCQlpZiAoaHJlZi5zdGFydHNXaXRoKCIjIikpIHsKLQkJCQkJCU9ERkVsZW1lbnQgbGlua0VsZW0gPSAoKEFFbGVtZW50KSBlbGVtKQotCQkJCQkJCQkuZ2V0SHJlZkVsZW1lbnQoKTsKLQkJCQkJCWlmIChsaW5rRWxlbSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJd3JpdGVyCi0JCQkJCQkJCQkJLndyaXRlKCIgaHJlZj0nIyIKLQkJCQkJCQkJCQkJCSsgbGlua0VsZW0KLQkJCQkJCQkJCQkJCQkJLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpCi0JCQkJCQkJCQkJCQkrICInIik7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd3JpdGVyLndyaXRlKCIgaHJlZj0nIiArIGhyZWYgKyAiJyIpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpIHsKLQkJCQlpbnQgcmVwZWF0ID0gKChUYWJsZUNvbHVtbkVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQkJaWYgKHJlcGVhdCA+IDEpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZSgiPiIpOwotCQkJCQkJd3JpdGVyLndyaXRlKCI8LyIgKyBodG1sVGFnICsgIj5cbiIpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCByZXBlYXQ7IGkrKykKLQkJCQkJCQl3cml0ZXIud3JpdGUoIjwiICsgaHRtbFRhZyArICIvPlxuIik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlQ2VsbEVsZW1lbnQpIHsKLQkJCQlpbnQgc3BhbiA9ICgoVGFibGVDZWxsRWxlbWVudCkgZWxlbSkKLQkJCQkJCS5nZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zU3Bhbm5lZCgpOwotCQkJCWlmIChzcGFuID4gMSkgewotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLndyaXRlKCIgY29sc3Bhbj0nIiArIHNwYW4gKyAiJyIpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWludCByZXBlYXQgPSAoKFRhYmxlQ2VsbEVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQkJaWYgKHJlcGVhdCA+IDEpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZSgiPiIpOwotCQkJCQkJd3JpdGVyLndyaXRlKCI8LyIgKyBodG1sVGFnICsgIj5cbiIpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCByZXBlYXQ7IGkrKykKLQkJCQkJCQl3cml0ZXIud3JpdGUoIjwiICsgaHRtbFRhZyArICIvPlxuIik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQl3cml0ZXIud3JpdGUoIj4iKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gdGV4dEV4dHJhY3Rvci5leHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQllbGVtLCBlbmFibGVTdHlsZSk7Ci0KLQkJLy8gd3JpdGUgY2xvc2UgdGFnCi0JCWlmIChodG1sVGFnICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJd3JpdGVyLndyaXRlKCI8LyIgKyBodG1sVGFnICsgIj5cbiIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udmVydFRleHREb2MoUHJpbnRXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwKLQkJCVRleHRFbGVtZW50IHRleHRFbGVtLCBib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRleHRFbGVtLmdldENoaWxkSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPREZFbGVtZW50IGNoaWxkID0gKE9ERkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsIGNoaWxkLCBlbmFibGVTdHlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udmVydFNwcmVhZHNoZWV0RG9jKFByaW50V3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlTcHJlYWRTaGVldEVsZW1lbnQgc3ByZWFkRWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwcmVhZEVsZW0uZ2V0VGFibGVTaXplKCk7IGkrKykgewotCQkJVGFibGVFbGVtZW50IHRhYmxlID0gc3ByZWFkRWxlbS5nZXRUYWJsZShpKTsKLQkJCXdyaXRlci53cml0ZSgiPGgxPiIgKyB0YWJsZS5nZXRBdHRyVGFibGVOYW1lKCkgKyAiPC9oMT4iKTsKLQkJCWV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLCB0YWJsZSwgZW5hYmxlU3R5bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRQcmVzZW50YXRpb25Eb2MoUHJpbnRXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwKLQkJCVByZXNlbnRhdGlvbkVsZW1lbnQgcHJlc2VuRWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZXNlbkVsZW0uZ2V0UGFnZVNpemUoKTsgaSsrKSB7Ci0JCQlQYWdlRWxlbWVudCBwYWdlID0gcHJlc2VuRWxlbS5nZXRQYWdlKGkpOwotCQkJd3JpdGVyLndyaXRlKCI8ZGl2IiArICIgIiArIE9VVFBVVF9BVFRSX09ERl9UQUdOQU1FICsgIj0nIgotCQkJCQkrIHBhZ2UuZ2V0VGFnTmFtZSgpICsgIicgaWQ9JyIKLQkJCQkJKyBwYWdlLmdldEF0dHJpYnV0ZShPVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCkKLQkJCQkJKyAiJyBuYW1lPSciCi0JCQkJCSsgcGFnZS5nZXRBdHRyaWJ1dGUoT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpICsgIicgIgotCQkJCQkrIE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEICsgIj0nIgotCQkJCQkrIHBhZ2UuZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKQotCQkJCQkrICInPjxoMT5QYWdlICIgKyAoaSArIDEpICsgIjwvaDE+Iik7Ci0JCQkvKgotCQkJICogTm9kZUxpc3QgY2hpbGRyZW4gPSBwYWdlLmdldENoaWxkTm9kZXMoKTsgZm9yIChpbnQgaiA9IDA7IGogPAotCQkJICogY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgeyBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShqKTsKLQkJCSAqLwotCQkJTGlzdDxPREZFbGVtZW50PiBjaGlsZHJlbiA9IHBhZ2UuZ2V0Q2hpbGROb2Rlc0luTmF2T3JkZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uZ2V0KGopOwotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KQotCQkJCQkJJiYgKCEoY2hpbGQgaW5zdGFuY2VvZiBOb3Rlc0VsZW1lbnQpKSkgewotCQkJCQlleHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwgKE9ERkVsZW1lbnQpIGNoaWxkLCBlbmFibGVTdHlsZSk7Ci0JCQkJfQotCQkJfQotCQkJTm90ZXNFbGVtZW50IG5vdGVzRWxlbSA9IHBhZ2UuZ2V0UHJlc2VudGF0aW9uTm90ZXNFbGVtZW50KCk7Ci0JCQlpZiAobm90ZXNFbGVtICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGUoIjxoMj5Ob3RlcyBvZiBQYWdlICIgKyAoaSArIDEpICsgIjwvaDI+Iik7Ci0JCQkJZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsIChPREZFbGVtZW50KSBub3Rlc0VsZW0sIGVuYWJsZVN0eWxlKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgiPC9kaXY+Iik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udmVydERvY3VtZW50KFByaW50V3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWlmIChjdXJFbGVtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnQgcm9vdCA9IGN1ckVsZW0uZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50Q29udGVudEVsZW1lbnQpIHsKLQkJCXdyaXRlci53cml0ZShIVE1MX0hFQURFUik7Ci0JCQl3cml0ZXIud3JpdGUoIjxib2R5PiIpOwotCi0JCQlCb2R5RWxlbWVudCBib2R5ID0gKChEb2N1bWVudENvbnRlbnRFbGVtZW50KSByb290KS5nZXRCb2R5RWxlbWVudCgpOwotCQkJQ29udGVudEJhc2VFbGVtZW50IGNvbnRlbnQgPSBib2R5LmdldENvbnRlbnQoKTsKLQkJCUNvbnRlbnRUeXBlIHR5cGUgPSBjb250ZW50LmdldENvbnRlbnRUeXBlKCk7Ci0JCQlpZiAoKHR5cGUuZXF1YWxzKENvbnRlbnRUeXBlLldSSVRFKSkKLQkJCQkJJiYgKGNvbnRlbnQgaW5zdGFuY2VvZiBUZXh0RWxlbWVudCkpIHsKLQkJCQljb252ZXJ0VGV4dERvYyh3cml0ZXIsIGRpciwgKFRleHRFbGVtZW50KSBjb250ZW50LCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKENvbnRlbnRUeXBlLlNQUkVBRFNIRUVUKQotCQkJCQkmJiAoY29udGVudCBpbnN0YW5jZW9mIFNwcmVhZFNoZWV0RWxlbWVudCkpIHsKLQkJCQljb252ZXJ0U3ByZWFkc2hlZXREb2Mod3JpdGVyLCBkaXIsCi0JCQkJCQkoU3ByZWFkU2hlZXRFbGVtZW50KSBjb250ZW50LCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTikKLQkJCQkJJiYgKGNvbnRlbnQgaW5zdGFuY2VvZiBQcmVzZW50YXRpb25FbGVtZW50KSkgewotCQkJCWNvbnZlcnRQcmVzZW50YXRpb25Eb2Mod3JpdGVyLCBkaXIsCi0JCQkJCQkoUHJlc2VudGF0aW9uRWxlbWVudCkgY29udGVudCwgZW5hYmxlU3R5bGUpOwotCQkJfSBlbHNlIHsKLQkJCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIGNvbnRlbnQgZWxlbWVudCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQl3cml0ZXIud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7Ci0JCX0gZWxzZSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIG9kZiBkb2N1bWVudCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDc3NWYWx1ZUJ5VGV4dFByb3BlcnRpZXNFbGVtZW50KFByaW50V3JpdGVyIHdyaXRlciwKLQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgdGV4dFByb3BzID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1RFWFRfUFJPUEVSVElFUyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFByb3BzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCVRleHRQcm9wZXJ0aWVzRWxlbWVudCBwcm9wID0gKFRleHRQcm9wZXJ0aWVzRWxlbWVudCkgdGV4dFByb3BzCi0JCQkJCS5pdGVtKGkpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gcHJvcC5nZXRBdHRyU3R5bGVGb250TmFtZSgpOwotCQkJaWYgKGZvbnROYW1lICE9IG51bGwpIHsKLQkJCQlPREZFbGVtZW50IGZvbnRGYWNlRWxlbSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJCS5maW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0ZPTlRfRkFDRSwKLQkJCQkJCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FLCBmb250TmFtZSk7Ci0JCQkJaWYgKGZvbnRGYWNlRWxlbSA9PSBudWxsKSB7Ci0JCQkJCWZvbnRGYWNlRWxlbSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJCQkuZmluZEVsZW1lbnRCeUF0dHJWYWx1ZUZyb21TdHlsZURvYygKLQkJCQkJCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0ZPTlRfRkFDRSwKLQkJCQkJCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsIGZvbnROYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKGZvbnRGYWNlRWxlbSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmb250RmFtaWx5ID0gKChGb250RmFjZUVsZW1lbnQpIGZvbnRGYWNlRWxlbSkKLQkJCQkJCQkuZ2V0QXR0clN2Z0ZvbnRGYW1pbHkoKTsKLQkJCQkJd3JpdGVyLndyaXRlKCJmb250LWZhbWlseToiICsgZm9udEZhbWlseSArICI7Iik7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGZvbnRTaXplID0gcHJvcC5nZXRBdHRyRm9ybWF0Rm9udFNpemUoKTsKLQkJCWlmIChmb250U2l6ZSAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJmb250LXNpemU6IiArIGZvbnRTaXplICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBmb250Q29sb3IgPSBwcm9wLmdldEF0dHJGb3JtYXRDb2xvcigpOwotCQkJaWYgKGZvbnRDb2xvciAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJjb2xvcjoiICsgZm9udENvbG9yICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBiYWNrZ3JvdW5kQ29sb3IgPSBwcm9wLmdldEF0dHJGb3JtYXRCYWNrZ3JvdW5kQ29sb3IoKTsKLQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgiYmFja2dyb3VuZC1jb2xvcjoiICsgYmFja2dyb3VuZENvbG9yICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBmb250V2VpZ2h0ID0gcHJvcC5nZXRBdHRyRm9ybWF0Rm9udFdlaWdodCgpOwotCQkJaWYgKChmb250V2VpZ2h0ICE9IG51bGwpICYmIChmb250V2VpZ2h0LmVxdWFscygiYm9sZCIpKSkgewotCQkJCXdyaXRlci53cml0ZSgiZm9udC13ZWlnaHQ6Ym9sZDsiKTsKLQkJCX0KLQkJCVN0cmluZyBmb250U3R5bGUgPSBwcm9wLmdldEF0dHJGb3JtYXRGb250U3R5bGUoKTsKLQkJCWlmICgoZm9udFN0eWxlICE9IG51bGwpICYmIChmb250U3R5bGUuZXF1YWxzKCJpdGFsaWMiKSkpIHsKLQkJCQl3cml0ZXIud3JpdGUoImZvbnQtc3R5bGU6aXRhbGljOyIpOwotCQkJfQotCQkJU3RyaW5nIHVuZGVyTGluZVN0eWxlID0gcHJvcC5nZXRBdHRyU3R5bGVUZXh0VW5kZXJsaW5lU3R5bGUoKTsKLQkJCWlmICgodW5kZXJMaW5lU3R5bGUgIT0gbnVsbCkgJiYgKHVuZGVyTGluZVN0eWxlLmVxdWFscygic29saWQiKSkpIHsKLQkJCQl3cml0ZXIud3JpdGUoInRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Iik7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dFBvc2l0aW9uID0gcHJvcC5nZXRBdHRyU3R5bGVUZXh0UG9zaXRpb24oKTsKLQkJCWlmICh0ZXh0UG9zaXRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHRleHRQb3NpdGlvblZhbHMgPSB0ZXh0UG9zaXRpb24uc3BsaXQoIiAiKTsKLQkJCQlpZiAodGV4dFBvc2l0aW9uVmFscy5sZW5ndGggPT0gMikgewotCQkJCQlpZiAodGV4dFBvc2l0aW9uVmFsc1swXS5lcXVhbHMoInN1cGVyIikpIHsKLQkJCQkJCXdyaXRlci53cml0ZSgidmVydGljYWwtYWxpZ246c3VwZXI7Iik7Ci0JCQkJCX0gZWxzZSBpZiAodGV4dFBvc2l0aW9uVmFsc1swXS5lcXVhbHMoInN1YiIpKSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoInZlcnRpY2FsLWFsaWduOnN1YjsiKTsKLQkJCQkJfQotCQkJCQl3cml0ZXIud3JpdGUoImZvbnQtc2l6ZToiICsgdGV4dFBvc2l0aW9uVmFsc1sxXSArICI7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50KFByaW50V3JpdGVyIHdyaXRlciwKLQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgcGFyYVByb3BzID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1BBUkFHUkFQSF9QUk9QRVJUSUVTKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhUHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJUGFyYWdyYXBoUHJvcGVydGllc0VsZW1lbnQgcHJvcCA9IChQYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudCkgcGFyYVByb3BzCi0JCQkJCS5pdGVtKGkpOwotCQkJU3RyaW5nIGJhY2tncm91bmRDb2xvciA9IHByb3AuZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpOwotCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJiYWNrZ3JvdW5kLWNvbG9yOiIgKyBiYWNrZ3JvdW5kQ29sb3IgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIHRleHRBbGlnbiA9IHByb3AuZ2V0QXR0ckZvcm1hdFRleHRBbGlnbigpOwotCQkJaWYgKHRleHRBbGlnbiAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJ0ZXh0LWFsaWduOiIgKyB0ZXh0QWxpZ24gKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIHZlcnRpY2FsQWxpZ24gPSBwcm9wLmdldEF0dHJTdHlsZVZlcnRpY2FsQWxpZ24oKTsKLQkJCWlmICh2ZXJ0aWNhbEFsaWduICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGUoInZlcnRpY2FsLWFsaWduOiIgKyB2ZXJ0aWNhbEFsaWduICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBtYXJnaW5MZWZ0ID0gcHJvcC5nZXRBdHRyRm9ybWF0TWFyZ2luTGVmdCgpOwotCQkJaWYgKG1hcmdpbkxlZnQgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgibWFyZ2luLWxlZnQ6IiArIG1hcmdpbkxlZnQgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIG1hcmdpblJpZ2h0ID0gcHJvcC5nZXRBdHRyRm9ybWF0TWFyZ2luUmlnaHQoKTsKLQkJCWlmIChtYXJnaW5SaWdodCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJtYXJnaW4tcmlnaHQ6IiArIG1hcmdpblJpZ2h0ICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBtYXJnaW5Ub3AgPSBwcm9wLmdldEF0dHJGb3JtYXRNYXJnaW5Ub3AoKTsKLQkJCWlmIChtYXJnaW5Ub3AgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgibWFyZ2luLXRvcDoiICsgbWFyZ2luVG9wICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBtYXJnaW5Cb3R0b20gPSBwcm9wLmdldEF0dHJGb3JtYXRNYXJnaW5Cb3R0b20oKTsKLQkJCWlmIChtYXJnaW5Cb3R0b20gIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgibWFyZ2luLWJvdHRvbToiICsgbWFyZ2luQm90dG9tICsgIjsiKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc1ZhbHVlQnlHcmFwaGljUHJvcGVydGllc0VsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLAotCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSkgewotCQlOb2RlTGlzdCBncmFwaGljUHJvcHMgPSBzdHlsZUVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfR1JBUEhJQ19QUk9QRVJUSUVTKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmFwaGljUHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50IHByb3AgPSAoR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50KSBncmFwaGljUHJvcHMKLQkJCQkJLml0ZW0oaSk7Ci0JCQlTdHJpbmcgaG9yaXpvbnRhbFBvcyA9IHByb3AuZ2V0QXR0clN0eWxlSG9yaXpvbnRhbFBvcygpOwotCQkJaWYgKGhvcml6b250YWxQb3MgIT0gbnVsbCkgewotCQkJCWlmIChob3Jpem9udGFsUG9zLmVxdWFscygibGVmdCIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgidGV4dC1hbGlnbjpsZWZ0OyIpOwotCQkJCX0gZWxzZSBpZiAoaG9yaXpvbnRhbFBvcy5lcXVhbHMoImNlbnRlciIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgidGV4dC1hbGlnbjpjZW50ZXI7Iik7Ci0JCQkJfSBlbHNlIGlmIChob3Jpem9udGFsUG9zLmVxdWFscygicmlnaHQiKSkgewotCQkJCQl3cml0ZXIud3JpdGUoInRleHQtYWxpZ246cmlnaHQ7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVRhYmxlUHJvcGVydGllc0VsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLAotCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSkgewotCQlOb2RlTGlzdCB0YWJsZVByb3BzID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX1BST1BFUlRJRVMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlUHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJVGFibGVQcm9wZXJ0aWVzRWxlbWVudCBwcm9wID0gKFRhYmxlUHJvcGVydGllc0VsZW1lbnQpIHRhYmxlUHJvcHMKLQkJCQkJLml0ZW0oaSk7Ci0JCQlTdHJpbmcgd2lkdGggPSBwcm9wLmdldEF0dHJTdHlsZVdpZHRoKCk7Ci0JCQlpZiAod2lkdGggIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgid2lkdGg6IiArIHdpZHRoICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBib3JkZXJNb2RlbCA9IHByb3AuZ2V0QXR0clRhYmxlQm9yZGVyTW9kZWwoKTsKLQkJCWlmIChib3JkZXJNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGJvcmRlck1vZGVsLmVxdWFscygiY29sbGFwc2luZyIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyIpOwotCQkJCX0gZWxzZSBpZiAoYm9yZGVyTW9kZWwuZXF1YWxzKCJzZXBhcmF0aW5nIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQoCi0JCQlQcmludFdyaXRlciB3cml0ZXIsIFN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgdGFibGVDb2xQcm9wcyA9IHN0eWxlRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DT0xVTU5fUFJPUEVSVElFUyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVDb2xQcm9wcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50IHByb3AgPSAoVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudCkgdGFibGVDb2xQcm9wcwotCQkJCQkuaXRlbShpKTsKLQkJCVN0cmluZyB3aWR0aCA9IHByb3AuZ2V0QXR0clN0eWxlQ29sdW1uV2lkdGgoKTsKLQkJCWlmICh3aWR0aCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJ3aWR0aDoiICsgd2lkdGggKyAiOyIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50KFByaW50V3JpdGVyIHdyaXRlciwKLQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgdGFibGVDZWxsUHJvcHMgPSBzdHlsZUVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfQ0VMTF9QUk9QRVJUSUVTKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUNlbGxQcm9wcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudCBwcm9wID0gKFRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50KSB0YWJsZUNlbGxQcm9wcwotCQkJCQkuaXRlbShpKTsKLQkJCVN0cmluZyBib3JkZXIgPSBwcm9wLmdldEF0dHJGb3JtYXRCb3JkZXIoKTsKLQkJCWlmIChib3JkZXIgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgiYm9yZGVyOiIgKyBib3JkZXIgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJvcmRlckxlZnQgPSBwcm9wLmdldEF0dHJGb3JtYXRCb3JkZXJMZWZ0KCk7Ci0JCQlpZiAoYm9yZGVyTGVmdCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJib3JkZXItbGVmdDoiICsgYm9yZGVyTGVmdCArICI7Iik7Ci0JCQl9Ci0JCQlTdHJpbmcgYm9yZGVyUmlnaHQgPSBwcm9wLmdldEF0dHJGb3JtYXRCb3JkZXJSaWdodCgpOwotCQkJaWYgKGJvcmRlclJpZ2h0ICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGUoImJvcmRlci1yaWdodDoiICsgYm9yZGVyUmlnaHQgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJvcmRlclRvcCA9IHByb3AuZ2V0QXR0ckZvcm1hdEJvcmRlclRvcCgpOwotCQkJaWYgKGJvcmRlclRvcCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJib3JkZXItdG9wOiIgKyBib3JkZXJUb3AgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJvcmRlckJvdHRvbSA9IHByb3AuZ2V0QXR0ckZvcm1hdEJvcmRlckJvdHRvbSgpOwotCQkJaWYgKGJvcmRlckJvdHRvbSAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJib3JkZXItYm90dG9tOiIgKyBib3JkZXJCb3R0b20gKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJhY2tncm91bmRDb2xvciA9IHByb3AuZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpOwotCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJiYWNrZ3JvdW5kLWNvbG9yOiIgKyBiYWNrZ3JvdW5kQ29sb3IgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIHBhZGRpbmcgPSBwcm9wLmdldEF0dHJGb3JtYXRQYWRkaW5nKCk7Ci0JCQlpZiAocGFkZGluZyAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJwYWRkaW5nOiIgKyBwYWRkaW5nICsgIjsiKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc1ZhbHVlQnlTdHlsZVN0eWxlRWxlbWVudChQcmludFdyaXRlciB3cml0ZXIsCi0JCQlTdHlsZUVsZW1lbnQgc3R5bGVFbGVtKSB7Ci0JCVN0cmluZyBwYXJlbnRTdHlsZU5hbWUgPSBzdHlsZUVsZW0uZ2V0QXR0clN0eWxlUGFyZW50U3R5bGVOYW1lKCk7Ci0JCWlmIChwYXJlbnRTdHlsZU5hbWUgIT0gbnVsbCkgewotCQkJT0RGRWxlbWVudCBwYXJlbnRTdHlsZSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJLmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLAotCQkJCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FLCBwYXJlbnRTdHlsZU5hbWUpOwotCQkJaWYgKHBhcmVudFN0eWxlID09IG51bGwpIHsKLQkJCQlwYXJlbnRTdHlsZSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJCS5maW5kRWxlbWVudEJ5QXR0clZhbHVlRnJvbVN0eWxlRG9jKAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsIHBhcmVudFN0eWxlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50U3R5bGUgIT0gbnVsbCkgewotCQkJCXdyaXRlQ3NzVmFsdWVCeVN0eWxlU3R5bGVFbGVtZW50KHdyaXRlciwKLQkJCQkJCShTdHlsZUVsZW1lbnQpIHBhcmVudFN0eWxlKTsKLQkJCX0KLQkJfQotCi0JCXdyaXRlQ3NzVmFsdWVCeVRleHRQcm9wZXJ0aWVzRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JCXdyaXRlQ3NzVmFsdWVCeVBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50KHdyaXRlciwgc3R5bGVFbGVtKTsKLQkJd3JpdGVDc3NWYWx1ZUJ5R3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50KHdyaXRlciwgc3R5bGVFbGVtKTsKLQkJd3JpdGVDc3NWYWx1ZUJ5VGFibGVQcm9wZXJ0aWVzRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JCXdyaXRlQ3NzVmFsdWVCeVRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQod3JpdGVyLCBzdHlsZUVsZW0pOwotCQl3cml0ZUNzc1ZhbHVlQnlUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzQnlTdHlsZURlZmF1bHRTdHlsZUVsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLAotCQkJT0RGRG9jdW1lbnQgZG9jKSB7Ci0JCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3Qgc3R5bGVEZWZhdWx0U3R5bGVMaXN0ID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KHJvb3QsCi0JCQkJIi4vLypbbmFtZXNwYWNlLXVyaSgpPSciICsgU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkrIFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfREVGQVVMVF9TVFlMRSArICInXSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlRGVmYXVsdFN0eWxlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlEZWZhdWx0U3R5bGVFbGVtZW50IHN0eWxlRWxlbSA9IChEZWZhdWx0U3R5bGVFbGVtZW50KSBzdHlsZURlZmF1bHRTdHlsZUxpc3QKLQkJCQkJLml0ZW0oaSk7Ci0JCQlTdHJpbmcgc3R5bGVGYW1pbHkgPSBzdHlsZUVsZW0uZ2V0QXR0clN0eWxlRmFtaWx5KCk7Ci0JCQlpZiAoc3R5bGVGYW1pbHkgIT0gbnVsbCkgewotCQkJCWlmIChzdHlsZUZhbWlseS5lcXVhbHMoInBhcmFncmFwaCIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgicCB7Iik7Ci0JCQkJfSBlbHNlIGlmIChzdHlsZUZhbWlseS5lcXVhbHMoInRhYmxlIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJ0YWJsZSB7Iik7Ci0JCQkJfSBlbHNlIGlmIChzdHlsZUZhbWlseS5lcXVhbHMoInRhYmxlLXJvdyIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgidHIgeyIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiLiIgKyBzdHlsZUZhbWlseSArICIgeyIpOwotCQkJCX0KLQkJCQl3cml0ZUNzc1ZhbHVlQnlTdHlsZVN0eWxlRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JCQkJd3JpdGVyLndyaXRlKCJ9XG4iKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc0J5U3R5bGVTdHlsZUVsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLCBPREZEb2N1bWVudCBkb2MpIHsKLQkJRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBzdHlsZVN0eWxlTGlzdCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdChyb290LAotCQkJCSIuLy8qW25hbWVzcGFjZS11cmkoKT0nIiArIFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfU1RZTEUKLQkJCQkJCSsgIiddIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3R5bGVTdHlsZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSA9IChTdHlsZUVsZW1lbnQpIHN0eWxlU3R5bGVMaXN0Lml0ZW0oaSk7Ci0JCQlTdHJpbmcgc3R5bGVOYW1lID0gc3R5bGVFbGVtLmdldE5hbWUoKTsKLQkJCXN0eWxlTmFtZSA9IHN0eWxlTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCAiXFxcXFxcLiIpOwotCQkJd3JpdGVyLndyaXRlKCIuIiArIHN0eWxlTmFtZSArICIgeyIpOwotCQkJd3JpdGVDc3NWYWx1ZUJ5U3R5bGVTdHlsZUVsZW1lbnQod3JpdGVyLCBzdHlsZUVsZW0pOwotCQkJd3JpdGVyLndyaXRlKCJ9XG4iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc0J5TGlzdFN0eWxlRWxlbWVudChQcmludFdyaXRlciB3cml0ZXIsIE9ERkRvY3VtZW50IGRvYykgewotCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGxpc3RTdHlsZUxpc3QgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3Qocm9vdCwKLQkJCQkiLi8vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkrIFRleHRDb25zdGFudHMuRUxFTUVOVF9MSVNUX1NUWUxFICsgIiddIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFN0eWxlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlMaXN0U3R5bGVFbGVtZW50IHN0eWxlRWxlbSA9IChMaXN0U3R5bGVFbGVtZW50KSBsaXN0U3R5bGVMaXN0Ci0JCQkJCS5pdGVtKGkpOwotCQkJU3RyaW5nIHN0eWxlTmFtZSA9IHN0eWxlRWxlbS5nZXROYW1lKCk7Ci0JCQlzdHlsZU5hbWUgPSBzdHlsZU5hbWUucmVwbGFjZUFsbCgiXFwuIiwgIlxcXFxcXC4iKTsKLQkJCU5vZGVMaXN0IG5sID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVF9MRVZFTF9TVFlMRV9OVU1CRVIpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBubC5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50IHN0eWxlTnVtRWxlbSA9IChMaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQpIG5sCi0JCQkJCQkuaXRlbShqKTsKLQkJCQl3cml0ZXIud3JpdGUoIi4iICsgc3R5bGVOYW1lICsgc3R5bGVOdW1FbGVtLmdldEF0dHJMZXZlbCgpCi0JCQkJCQkrICIgeyIpOwotCQkJCVN0cmluZyBmb3JtYXQgPSBzdHlsZU51bUVsZW0uZ2V0QXR0ck51bUZvcm1hdCgpOwotCQkJCWlmIChmb3JtYXQuZXF1YWxzKCIxIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbDsiKTsKLQkJCQl9IGVsc2UgaWYgKGZvcm1hdC5lcXVhbHMoImkiKSkgewotCQkJCQl3cml0ZXIud3JpdGUoImxpc3Qtc3R5bGUtdHlwZTpsb3dlci1yb21hbjsiKTsKLQkJCQl9IGVsc2UgaWYgKGZvcm1hdC5lcXVhbHMoIkkiKSkgewotCQkJCQl3cml0ZXIud3JpdGUoImxpc3Qtc3R5bGUtdHlwZTp1cHBlci1yb21hbjsiKTsKLQkJCQl9IGVsc2UgaWYgKGZvcm1hdC5lcXVhbHMoImEiKSkgewotCQkJCQl3cml0ZXIud3JpdGUoImxpc3Qtc3R5bGUtdHlwZTpsb3dlci1hbHBoYTsiKTsKLQkJCQl9IGVsc2UgaWYgKGZvcm1hdC5lcXVhbHMoIkEiKSkgewotCQkJCQl3cml0ZXIud3JpdGUoImxpc3Qtc3R5bGUtdHlwZTp1cHBlci1hbHBoYTsiKTsKLQkJCQl9Ci0JCQkJd3JpdGVyLndyaXRlKCJ9XG4iKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc0ZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJdHJ5IHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsIEhUTUxfRU5DT0RJTkcpOwotCQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIob3N3KTsKLQotCQkJT0RGRG9jdW1lbnQgc3R5bGVEb2MgPSAoKE9ERkRvY3VtZW50KSBjdXJFbGVtLmdldE93bmVyRG9jdW1lbnQoKSkKLQkJCQkJLmdldFN0eWxlRG9jdW1lbnQoKTsKLQkJCS8vIHdyaXRlIGRlZmF1bHQgY3NzIHN0eWxlIGJ5IHVzaW5nIHN0eWxlcy54bWwKLQkJCXdyaXRlQ3NzQnlTdHlsZURlZmF1bHRTdHlsZUVsZW1lbnQocHcsIHN0eWxlRG9jKTsKLQotCQkJLy8gd3JpdGUgY3NzIHN0eWxlIGJ5IHVzaW5nIHN0eWxlcy54bWwKLQkJCXdyaXRlQ3NzQnlTdHlsZVN0eWxlRWxlbWVudChwdywgc3R5bGVEb2MpOwotCi0JCQkvLyB3cml0ZSBjc3Mgc3R5bGUgYnkgdXNpbmcgY29udGVudC54bWwKLQkJCU9ERkRvY3VtZW50IGNvbnRlbnREb2MgPSAoT0RGRG9jdW1lbnQpIGN1ckVsZW0uZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJd3JpdGVDc3NCeVN0eWxlU3R5bGVFbGVtZW50KHB3LCAoT0RGRG9jdW1lbnQpIGN1ckVsZW0KLQkJCQkJLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0KLQkJCS8vIHdyaXRlIGFkZGl0aW9uYWwgY3NzIHN0eWxlIGZvciBsaXN0IHN0cnVjdHVyZQotCQkJd3JpdGVDc3NCeUxpc3RTdHlsZUVsZW1lbnQocHcsIGNvbnRlbnREb2MpOwotCi0JCQlwdy5mbHVzaCgpOwotCQkJcHcuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnZlcnREb2N1bWVudChTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlTdHJpbmcgZGlyTmFtZSA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCWlmICghZGlyLmV4aXN0cygpKQotCQkJZGlyLm1rZGlycygpOwotCi0JCWlmIChlbmFibGVTdHlsZSkgewotCQkJU3RyaW5nIGNzc0ZpbGVOYW1lID0gZGlyTmFtZSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKQotCQkJCQkrIE9ERl9DU1NfRklMRTsKLQkJCXdyaXRlQ3NzRmlsZShjc3NGaWxlTmFtZSk7Ci0JCX0KLQotCQl0cnkgewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgSFRNTF9FTkNPRElORyk7Ci0JCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihvc3cpOwotCQkJY29udmVydERvY3VtZW50KHB3LCBkaXIsIGVuYWJsZVN0eWxlKTsKLQkJCXB3LmZsdXNoKCk7Ci0JCQlwdy5jbG9zZSgpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9pbXBsL1RleHRFeHRyYWN0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL2ltcGwvVGV4dEV4dHJhY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3YTI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL2ltcGwvVGV4dEV4dHJhY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEJhc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuU2NlbmVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNhcHRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNpcmNsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ29ubmVjdG9yRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5Db250cm9sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5DdXN0b21TaGFwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRWxsaXBzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRnJhbWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkltYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZU1hcEFyZWFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkltYWdlTWFwRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5MaW5lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5PYmplY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBhZ2VUaHVtYm5haWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBvbHlnb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBvbHlsaW5lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5SZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5SZWd1bGFyUG9seWdvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuVGV4dEJveEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRml4ZWRUZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29udHJvbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ2VsbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuUGFnZU51bWJlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGFiRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRyYWNrZWRDaGFuZ2VzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuT0RGQ29udmVydGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLlRleHRFeHRyYWN0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUZXh0RXh0cmFjdG9ySW1wbCBpbXBsZW1lbnRzIFRleHRFeHRyYWN0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX05PX0FMVCA9ICJbaW1hZ2VdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFTUFQX05PX0FMVCA9ICJbaW1hZ2VtYXBdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9OT19BTFQgPSAiW29iamVjdF0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1RBQkxFID0gIlt0YWJsZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVEJPWF9OT19BTFQgPSAiW3RleHQgYm94XSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBUSU9OX05PX0FMVCA9ICJbY2FwdGlvbl0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lSQ0xFX05PX0FMVCA9ICJbY2lyY2xlXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfTk9fQUxUID0gIltjb25uZWN0b3JdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTVNIQVBFX05PX0FMVCA9ICJbY3VzdG9tIHNoYXBlXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTExJUFNFX05PX0FMVCA9ICJbZWxsaXBzZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVfTk9fQUxUID0gIltmcmFtZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR19OT19BTFQgPSAiW2dyb3VwXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRU1BUEFSRUFfTk9fQUxUID0gIltpbWFnZW1hcCBhcmVhXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX05PX0FMVCA9ICJbbGluZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MWUdPTl9OT19BTFQgPSAiW3BvbHlnb25dIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPTFlMSU5FX05PX0FMVCA9ICJbcG9seWdvbiBsaW5lXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNUX05PX0FMVCA9ICJbcmVjdGFuZ2xlXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdVTEFSUE9MWUdPTl9OT19BTFQgPSAiW3BvbHlnb25dIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDRU5FX05PX0FMVCA9ICJbM0Qgc2hhcGVdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05TSEFQRV9OT19BTFQgPSAiW2dyYXBoaWMgc2hhcGVdIjsKLQotCXByaXZhdGUgVGV4dEV4dHJhY3RvciBjb252ZXJ0ZXI7Ci0KLQlwcml2YXRlIGRvdWJsZSBvZGZWZXJzaW9uID0gLTEuMDsKLQotCXByaXZhdGUgT0RGRWxlbWVudCBjdXJFbGVtID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KE9ERkRvY3VtZW50IGRvY3VtZW50LCBUZXh0RXh0cmFjdG9yIGNvbnZlcnRlcikgewotCQl0aGlzLmN1ckVsZW0gPSAoT0RGRWxlbWVudCkgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCX0KLQotCS8vIGZvciBOb3RlczgsIE5vdGVzOCBzYXZlIGRvY3VtZW50IGJ5IE9ERiAxLjEgc2NoZW1hLAotCS8vIGJ1dCBvZGY6dmVyc2lvbiBpcyBzZXQgYXMgMS4wCi0JLy8gaWYgc3BlY2lmeSBvZGY6dmVyc2lvbiBieSB0aGlzIGZ1bmN0aW9uLAotCS8vIGRvIG5vdCB1c2Ugb2RmOnZlcnNpb24gZGVmaW5lZCBpbiBlYWNoIE9ERiBmaWxlCi0JcHVibGljIHZvaWQgc2V0T2RmVmVyc2lvbihkb3VibGUgb2RmVmVyc2lvbikgewotCQl0aGlzLm9kZlZlcnNpb24gPSBvZGZWZXJzaW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZUNvbnRyb2xFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLAotCQkJQ29udHJvbEVsZW1lbnQgZWxlbSkgewotCQlGb3JtQ29udHJvbEVsZW1lbnQgZm9ybSA9ICgoQ29udHJvbEVsZW1lbnQpIGVsZW0pCi0JCQkJLmdldEZvcm1Db250cm9sRWxlbWVudCgpOwotCQlpZiAoZm9ybSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmICghKGZvcm0gaW5zdGFuY2VvZiBGaXhlZFRleHRFbGVtZW50KSkgewotCQkJCQl3cml0ZXIud3JpdGUoIltmb3JtIGNvbnRyb2xdIik7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIGZvcm1MYWJlbCA9IGZvcm0uZ2V0QXR0ckZvcm1MYWJlbCgpOwotCQkJCWlmIChmb3JtTGFiZWwgIT0gbnVsbCkgewotCQkJCQlpZiAoIShmb3JtIGluc3RhbmNlb2YgRml4ZWRUZXh0RWxlbWVudCkpIHsKLQkJCQkJCXdyaXRlci53cml0ZSgiICIpOwotCQkJCQl9Ci0JCQkJCXdyaXRlci53cml0ZShmb3JtTGFiZWwpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVGcmFtZUVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLAotCQkJRnJhbWVFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSAoKEZyYW1lRWxlbWVudCkgZWxlbSkuZ2V0Q2hpbGRJdGVyYXRvcigpOwotCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9ERkVsZW1lbnQgZmlyc3RDb250ZW50ID0gKE9ERkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpcnN0Q29udGVudCAhPSBudWxsKSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQlmaXJzdENvbnRlbnQsIGVuYWJsZVN0eWxlKTsKLQkJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJLy8gaWYgdGhpcyBmcmFtZSBoYXMgaW1hZ2UgbWFwCi0JCQkJCU9ERkVsZW1lbnQgc2Vjb25kQ29udGVudCA9IChPREZFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKChzZWNvbmRDb250ZW50ICE9IG51bGwpCi0JCQkJCQkJJiYgKHNlY29uZENvbnRlbnQgaW5zdGFuY2VvZiBJbWFnZU1hcEVsZW1lbnQpKSB7Ci0JCQkJCQlhZGRlZFRleHRDb250ZW50IHw9IGNvbnZlcnRlci5leHRyYWN0Q29udGVudCh3cml0ZXIsCi0JCQkJCQkJCWRpciwgc2Vjb25kQ29udGVudCwgZW5hYmxlU3R5bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRlZFRleHRDb250ZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZUltYWdlTWFwRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlJbWFnZU1hcEVsZW1lbnQgZWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlib29sZWFuIGFkZGVkVGV4dENvbnRlbnQgPSBmYWxzZTsKLQkJTm9kZUxpc3QgbmwgPSAoKEltYWdlTWFwRWxlbWVudCkgZWxlbSkuZ2V0QXJlYUVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCShJbWFnZU1hcEFyZWFFbGVtZW50KSBubC5pdGVtKGkpLCBlbmFibGVTdHlsZSk7Ci0JCX0KLQkJcmV0dXJuIGFkZGVkVGV4dENvbnRlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHdyaXRlVGV4dEJveEVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLAotCQkJVGV4dEJveEVsZW1lbnQgZWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlib29sZWFuIGFkZGVkVGV4dENvbnRlbnQgPSBmYWxzZTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlTdHJpbmcgc3RyID0gKChUZXh0KSBjaGlsZCkuZ2V0RGF0YSgpLnRyaW0oKTsKLQkJCQlpZiAoc3RyLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJc3RyID0gT0RGQ29udmVydGVyVXRpbHMuY29udmVydFhNTENoYXJhY3RlcihzdHIpOwotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLndyaXRlKHN0cik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJYWRkZWRUZXh0Q29udGVudCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpIHsKLQkJCQlhZGRlZFRleHRDb250ZW50IHw9IGNvbnZlcnRlci5leHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJCShPREZFbGVtZW50KSBjaGlsZCwgZW5hYmxlU3R5bGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRlZFRleHRDb250ZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZVRhYkVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIFRhYkVsZW1lbnQgZWxlbSkgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKCJcdCIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZVNFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLCBTRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtLmhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9DKSkgewotCQkJaW50IGMgPSAoKFNFbGVtZW50KSBlbGVtKS5nZXRBdHRyVGV4dEMoKTsKLQkJCWlmIChjID4gMCkgewotCQkJCVN0cmluZyB2YWx1ZSA9ICIiOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYzsgaSsrKQotCQkJCQl2YWx1ZSArPSAiICI7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLndyaXRlKHZhbHVlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQl3cml0ZXIud3JpdGUoIiAiKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZUN1c3RvbVNoYXBlRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlDdXN0b21TaGFwZUVsZW1lbnQgZWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlib29sZWFuIGFkZGVkVGV4dENvbnRlbnQgPSBmYWxzZTsKLQkJTm9kZUxpc3QgcExpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksIFRleHRDb25zdGFudHMuRUxFTUVOVF9QKTsKLQkJaWYgKChwTGlzdCAhPSBudWxsKSAmJiAocExpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkpIHsgLy8gaWYgdGhpcyBjdXN0b20KLQkJCQkJCQkJCQkJCQkJCS8vIHNoYXBlIGlzIGNhcHRpb24KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgcEVsZW0gPSBwTGlzdC5pdGVtKGkpOwotCQkJCVN0cmluZyBjb250ZW50ID0gcEVsZW0uZ2V0VGV4dENvbnRlbnQoKTsKLQkJCQlpZiAoKGNvbnRlbnQgIT0gbnVsbCkgJiYgKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSkgewotCQkJCQlhZGRlZFRleHRDb250ZW50IHw9IGNvbnZlcnRlci5leHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJCQkoT0RGRWxlbWVudCkgcExpc3QuaXRlbShpKSwgZW5hYmxlU3R5bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghYWRkZWRUZXh0Q29udGVudCkgewotCQkJSUVkaXRhYmxlIHNob3J0RGVzYyA9IG51bGw7Ci0JCQlpZiAob2RmVmVyc2lvbiAhPSAtMS4wKSB7Ci0JCQkJc2hvcnREZXNjID0gKElFZGl0YWJsZSkgKChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0U2hvcnREZXNjRWxlbWVudChvZGZWZXJzaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvcnREZXNjID0gKElFZGl0YWJsZSkgKChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0U2hvcnREZXNjRWxlbWVudCgpOwotCQkJfQotCi0JCQlpZiAoc2hvcnREZXNjID09IG51bGwpIHsKLQkJCQlPREZEb2N1bWVudCBkb2MgPSAoT0RGRG9jdW1lbnQpIGVsZW0uZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCWlmICgoZG9jLmdldE9ERlZlcnNpb24oKSA+IDEuMCkKLQkJCQkJCXx8ICgob2RmVmVyc2lvbiAhPSAtMS4wKSAmJiAob2RmVmVyc2lvbiA+IDEuMCkpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoQ1VTVE9NU0hBUEVfTk9fQUxUKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhZGRlZFRleHRDb250ZW50ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIHNob3J0RGVzYy5nZXRWYWx1ZSgpOwotCQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLndyaXRlKHN0cik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJYWRkZWRUZXh0Q29udGVudCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRlZFRleHRDb250ZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZURyYXdpbmdPYmplY3RCYXNlRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwKLQkJCUZpbGUgZGlyLCBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQgZWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlib29sZWFuIGFkZGVkVGV4dENvbnRlbnQgPSBmYWxzZTsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZUVsZW1lbnQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgUGFnZVRodW1ibmFpbEVsZW1lbnQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTm9kZUxpc3QgcExpc3QgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksIFRleHRDb25zdGFudHMuRUxFTUVOVF9QKTsKLQkJaWYgKChwTGlzdCAhPSBudWxsKSAmJiAocExpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkpIHsgLy8gaWYgdGhpcyBjdXN0b20KLQkJCQkJCQkJCQkJCQkJCS8vIHNoYXBlIGlzIGNhcHRpb24KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgcEVsZW0gPSBwTGlzdC5pdGVtKGkpOwotCQkJCVN0cmluZyBjb250ZW50ID0gcEVsZW0uZ2V0VGV4dENvbnRlbnQoKTsKLQkJCQlpZiAoKGNvbnRlbnQgIT0gbnVsbCkgJiYgKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSkgewotCQkJCQlhZGRlZFRleHRDb250ZW50IHw9IGNvbnZlcnRlci5leHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJCQkoT0RGRWxlbWVudCkgcExpc3QuaXRlbShpKSwgZW5hYmxlU3R5bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghYWRkZWRUZXh0Q29udGVudCkgewotCQkJSUVkaXRhYmxlIHNob3J0RGVzYyA9IG51bGw7Ci0JCQlpZiAob2RmVmVyc2lvbiAhPSAtMS4wKSB7Ci0JCQkJc2hvcnREZXNjID0gKElFZGl0YWJsZSkgKChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0U2hvcnREZXNjRWxlbWVudChvZGZWZXJzaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvcnREZXNjID0gKElFZGl0YWJsZSkgKChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0U2hvcnREZXNjRWxlbWVudCgpOwotCQkJfQotCi0JCQlpZiAoc2hvcnREZXNjID09IG51bGwpIHsKLQkJCQlPREZEb2N1bWVudCBkb2MgPSAoT0RGRG9jdW1lbnQpIGVsZW0uZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCWlmICgoZWxlbSBpbnN0YW5jZW9mIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQpCi0JCQkJCQl8fCAoKGRvYy5nZXRPREZWZXJzaW9uKCkgPiAxLjApIHx8ICgob2RmVmVyc2lvbiAhPSAtMS4wKSAmJiAob2RmVmVyc2lvbiA+IDEuMCkpKSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKElNQUdFX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgSW1hZ2VNYXBFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShJTUFHRU1BUF9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIE9iamVjdEVsZW1lbnQpIHsKLQkJCQkJCQlpZiAoKChPYmplY3RFbGVtZW50KSBlbGVtKS5pc1ByZXNlbnRhdGlvblRhYmxlKCkpCi0JCQkJCQkJCXdyaXRlci53cml0ZShPQkpFQ1RfVEFCTEUpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJd3JpdGVyLndyaXRlKE9CSkVDVF9OT19BTFQpOwotCQkJCQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgQ2FwdGlvbkVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKENBUFRJT05fTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBUZXh0Qm94RWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoVEVYVEJPWF9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIENpcmNsZUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKENJUkNMRV9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIENvbm5lY3RvckVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKENPTk5FQ1RPUl9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbVNoYXBlRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoQ1VTVE9NU0hBUEVfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBFbGxpcHNlRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoRUxMSVBTRV9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEZyYW1lRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoRlJBTUVfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBHRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoR19OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEltYWdlTWFwQXJlYUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKElNQUdFTUFQQVJFQV9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIExpbmVFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShMSU5FX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUG9seWdvbkVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKFBPTFlHT05fTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBQb2x5bGluZUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKFBPTFlMSU5FX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUmVjdEVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKFJFQ1RfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBSZWd1bGFyUG9seWdvbkVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKFJFR1VMQVJQT0xZR09OX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgU2NlbmVFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShTQ0VORV9OT19BTFQpOwotCQkJCQkJZWxzZQotCQkJCQkJCXdyaXRlci53cml0ZShVTktOT1dOU0hBUEVfTk9fQUxUKTsKLQotCQkJCQkJd3JpdGVyLndyaXRlKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJYWRkZWRUZXh0Q29udGVudCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgc2hvcnREZXNjLmdldFZhbHVlKCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoc3RyKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQlhZGRlZFRleHRDb250ZW50ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkZGVkVGV4dENvbnRlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHdyaXRlVGFibGVDZWxsRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlUYWJsZUNlbGxFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRvQ2VsbCA9IHdyaXRlT0RGRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJKE9ERkVsZW1lbnQpIGVsZW0sIGVuYWJsZVN0eWxlKTsKLQkJaWYgKCFhZGRlZFRvQ2VsbCkgewotCQkJdHJ5IHsKLQkJCQl3cml0ZXIud3JpdGUoIiZuYnNwOyIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHdyaXRlT0RGRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlPREZFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICgoVGV4dCkgY2hpbGQpLmdldERhdGEoKS50cmltKCk7Ci0JCQkJaWYgKHN0ci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCXN0ciA9IE9ERkNvbnZlcnRlclV0aWxzLmNvbnZlcnRYTUxDaGFyYWN0ZXIoc3RyKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZShzdHIpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWFkZGVkVGV4dENvbnRlbnQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoT0RGRWxlbWVudCkgY2hpbGQsIGVuYWJsZVN0eWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHRyYWN0RW1iZWRGaWxlKE9ERkVsZW1lbnQgZWxlbSwgRmlsZSBkaXIsIFN0cmluZyBocmVmKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGhyZWY7Ci0JCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZpbGVOYW1lKTsKLQotCQlTdHJpbmcgb3V0cHV0RGlyTmFtZSA9IG91dHB1dEZpbGUuZ2V0UGFyZW50KCk7Ci0JCUZpbGUgb3V0cHV0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyTmFtZSk7Ci0JCWlmICghb3V0cHV0RGlyLmV4aXN0cygpKQotCQkJb3V0cHV0RGlyLm1rZGlycygpOwotCi0JCU9ERlBhcnNlciBwYXJzZXIgPSBuZXcgT0RGUGFyc2VyKCk7Ci0JCURvY3VtZW50IGRvYyA9IGN1ckVsZW0uZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgT0RGRG9jdW1lbnQpIHsKLQkJCXBhcnNlci5leHRyYWN0RmlsZSgoKE9ERkRvY3VtZW50KSBkb2MpLmdldFVSTCgpLCBocmVmLAotCQkJCQlvdXRwdXRGaWxlTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleHRyYWN0Q29udGVudChXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwgT0RGRWxlbWVudCBlbGVtLAotCQkJYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQkvLyB3cml0ZSBvZGYgY29udGVudAotCQlib29sZWFuIGFkZGVkVGV4dENvbnRlbnQgPSBmYWxzZTsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJFbGVtZW50KSB7Ci0JCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlVGFiRWxlbWVudENvbnRlbnQod3JpdGVyLAotCQkJCQkoVGFiRWxlbWVudCkgZWxlbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFNFbGVtZW50KSB7Ci0JCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlU0VsZW1lbnRDb250ZW50KHdyaXRlciwgKFNFbGVtZW50KSBlbGVtKTsKLQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgVGFibGVDZWxsRWxlbWVudCkgewotCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZVRhYmxlQ2VsbEVsZW1lbnRDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkoVGFibGVDZWxsRWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQl9IGVsc2UgaWYgKChlbGVtIGluc3RhbmNlb2YgVHJhY2tlZENoYW5nZXNFbGVtZW50KQotCQkJCXx8IChlbGVtIGluc3RhbmNlb2YgUGFnZVRodW1ibmFpbEVsZW1lbnQpCi0JCQkJfHwgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZUVsZW1lbnQpCi0JCQkJfHwgKGVsZW0gaW5zdGFuY2VvZiBQYWdlTnVtYmVyRWxlbWVudCkpIHsKLQkJCS8vIG5vdGhpbmcgdG8gd3JpdGUKLQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSB7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIENvbnRyb2xFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZUNvbnRyb2xFbGVtZW50Q29udGVudCh3cml0ZXIsCi0JCQkJCQkoQ29udHJvbEVsZW1lbnQpIGVsZW0pOwotCQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZUZyYW1lRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoRnJhbWVFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZU1hcEVsZW1lbnQpIHsKLQkJCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlSW1hZ2VNYXBFbGVtZW50Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJCShJbWFnZU1hcEVsZW1lbnQpIGVsZW0sIGVuYWJsZVN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFRleHRCb3hFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZVRleHRCb3hFbGVtZW50Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJCShUZXh0Qm94RWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgQ3VzdG9tU2hhcGVFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZUN1c3RvbVNoYXBlRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoQ3VzdG9tU2hhcGVFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBHRWxlbWVudCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVPREZFbGVtZW50Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJCShPREZFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRDb250ZW50KAotCQkJCQkJd3JpdGVyLCBkaXIsIChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIGVsZW0sCi0JCQkJCQllbmFibGVTdHlsZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFBFbGVtZW50KSB7Ci0JCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlT0RGRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCShPREZFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCQlpZiAoYWRkZWRUZXh0Q29udGVudCkgewotCQkJCXRyeSB7Ci0JCQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlT0RGRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCShPREZFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3hsaW5rL1hMaW5rQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3hsaW5rL1hMaW5rQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTFhZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi94bGluay9YTGlua0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgWExpbmtDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFhMSU5LX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBMSU5LX1RZUEVfU0lNUExFID0gInNpbXBsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0hSRUYgPSAiaHJlZiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RZUEUgPSAidHlwZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NIT1cgPSAic2hvdyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0FDVFVBVEUgPSAiYWN0dWF0ZSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Ly5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlNDE5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LmRsbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LmRsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjZTMzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5kbGwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzQwNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIFByb3h5IFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMC4xCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LlByb3h5UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFjdGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNDY5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0JCQkgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuZGxsLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9pY29ucy9hY3Rpb24xNi9jbGVhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvaWNvbnMvYWN0aW9uMTYvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjMwYTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9pY29ucy9hY3Rpb24xNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvaWNvbnMvdmlldzE2L3Byb3h5bG9ndmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvaWNvbnMvdmlldzE2L3Byb3h5bG9ndmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmIzYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2ljb25zL3ZpZXcxNi9wcm94eWxvZ3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzZmZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotRGVidWcKLVJlbGVhc2UKLSoubmNiCi0qLnN1bwotKi51c2VyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NiOTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5jcHAgOiBEZWZpbmVzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIERMTCBhcHBsaWNhdGlvbi4KLS8vCi0KLSNpbmNsdWRlICJzdGRhZnguaCIKLQotCi0jaWZkZWYgX01BTkFHRUQKLSNwcmFnbWEgbWFuYWdlZChwdXNoLCBvZmYpCi0jZW5kaWYKLQotQk9PTCBBUElFTlRSWSBEbGxNYWluKCBITU9EVUxFIGhNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkCi0JCQkJCSApCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBfTUFOQUdFRAotI3ByYWdtYSBtYW5hZ2VkKHBvcCkKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LnNsbiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmRhN2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAot77u/DQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KLSMgVmlzdWFsIFN0dWRpbyAyMDA1DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJBY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5IiwgIkFjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkudmNwcm9qIiwgIns4MURCRDIzQi1EQkM5LTQ2QjgtQjgyMy1BRERCMDQ5NkFCQjV9Ig0KLUVuZFByb2plY3QNCi1HbG9iYWwNCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCi0JCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCi0JCXs4MURCRDIzQi1EQkM5LTQ2QjgtQjgyMy1BRERCMDQ5NkFCQjV9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQotCQl7ODFEQkQyM0ItREJDOS00NkI4LUI4MjMtQUREQjA0OTZBQkI1fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXs4MURCRDIzQi1EQkM5LTQ2QjgtQjgyMy1BRERCMDQ5NkFCQjV9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KLQkJezgxREJEMjNCLURCQzktNDZCOC1CODIzLUFEREIwNDk2QUJCNX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkudmNwcm9qIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjY2OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS52Y3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0ic2hpZnRfamlzIj8+DQotPFZpc3VhbFN0dWRpb1Byb2plY3QNCi0JUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQotCVZlcnNpb249IjguMDAiDQotCU5hbWU9IkFjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkiDQotCVByb2plY3RHVUlEPSJ7ODFEQkQyM0ItREJDOS00NkI4LUI4MjMtQUREQjA0OTZBQkI1fSINCi0JUm9vdE5hbWVzcGFjZT0iQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeSINCi0JS2V5d29yZD0iV2luMzJQcm9qIg0KLQk+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiINCi0JCS8+DQotCTwvUGxhdGZvcm1zPg0KLQk8VG9vbEZpbGVzPg0KLQk8L1Rvb2xGaWxlcz4NCi0JPENvbmZpZ3VyYXRpb25zPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCi0JCQlDaGFyYWN0ZXJTZXQ9IjEiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkKEpBVkFfSE9NRSlcaW5jbHVkZTskKEpBVkFfSE9NRSlcaW5jbHVkZVx3aW4zMiINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO0FDQ0VTU0lCSUxJVFlQUk9YWUxJQlJBUllfRVhQT1JUUyINCi0JCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id2luaW5ldC5saWIiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KLQkJCQlTdWJTeXN0ZW09IjIiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQotCQkJQ2hhcmFjdGVyU2V0PSIxIg0KLQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkKEpBVkFfSE9NRSlcaW5jbHVkZTskKEpBVkFfSE9NRSlcaW5jbHVkZVx3aW4zMiINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0FDQ0VTU0lCSUxJVFlQUk9YWUxJQlJBUllfRVhQT1JUUyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id2luaW5ldC5saWIiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KLQkJCQlTdWJTeXN0ZW09IjIiDQotCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCi0JCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCi0JCQkJVGFyZ2V0TWFjaGluZT0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCTwvUmVmZXJlbmNlcz4NCi0JPEZpbGVzPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCi0JCQlGaWx0ZXI9ImNwcDtjO2NjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ig0KLQkJCT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii5cQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5jcHAiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuXG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldC5jcHAiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuXHN0ZGFmeC5jcHAiDQotCQkJCT4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQkJCT4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KLQkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmM7eHNkIg0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins5Mzk5NTM4MC04OUJELTRiMDQtODhFQi02MjVGQkU1MkVCRkJ9Ig0KLQkJCT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3RkYWZ4LmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCi0JCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4O3RpZmY7dGlmO3BuZzt3YXYiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX0iDQotCQkJPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsZQ0KLQkJCVJlbGF0aXZlUGF0aD0iLlxSZWFkTWUudHh0Ig0KLQkJCT4NCi0JCTwvRmlsZT4NCi0JPC9GaWxlcz4NCi0JPEdsb2JhbHM+DQotCTwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0LmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODljZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJzdGRhZnguaCIKLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQuaCIKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JbnRlcm5ldE9wZW5XCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgbHBzekFnZW50LCBqaW50IGR3QWNjZXNzVHlwZSwgamludCBscHN6UHJveHksIGppbnQgbHBzelByb3h5QnlwYXNzLCBqaW50IGR3RmxhZ3MpIAotewotCXJldHVybiAoamludClJbnRlcm5ldE9wZW5XKChMUFdTVFIpbHBzekFnZW50LCBkd0FjY2Vzc1R5cGUsIChMUFdTVFIpbHBzelByb3h5LCAoTFBXU1RSKWxwc3pQcm94eUJ5cGFzcywgZHdGbGFncyk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0Q2xvc2VIYW5kbGUKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBoSW50ZXJuZXQpCi17Ci0JcmV0dXJuIEludGVybmV0Q2xvc2VIYW5kbGUoKEhJTlRFUk5FVCloSW50ZXJuZXQpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JbnRlcm5ldFNldE9wdGlvblcKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBoSW50ZXJuZXQsIGppbnQgZHdPcHRpb24sIGppbnQgbHBCdWZmZXIsIGppbnQgZHdCdWZmZXJMZW5ndGgpCi17Ci0JcmV0dXJuIEludGVybmV0U2V0T3B0aW9uVygoSElOVEVSTkVUKWhJbnRlcm5ldCwgZHdPcHRpb24sIChMUFZPSUQpbHBCdWZmZXIsIGR3QnVmZmVyTGVuZ3RoKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSW50ZXJuZXRRdWVyeU9wdGlvblcKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBoSW50ZXJuZXQsIGppbnQgZHdPcHRpb24sIGppbnQgbHBCdWZmZXIsIGppbnRBcnJheSBscGR3QnVmZmVyTGVuZ3RoKQotewotCWppbnQgKmxwTmF0aXZlTGVuZ3RoID0gTlVMTDsKLQlpZiggbHBkd0J1ZmZlckxlbmd0aCApIHsKLQkJbHBOYXRpdmVMZW5ndGggPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMobHBkd0J1ZmZlckxlbmd0aCxOVUxMKTsKLQl9Ci0JamJvb2xlYW4gcmMgPSBJbnRlcm5ldFF1ZXJ5T3B0aW9uVygoSElOVEVSTkVUKWhJbnRlcm5ldCwgZHdPcHRpb24sIChMUFZPSUQpbHBCdWZmZXIsIChMUERXT1JEKWxwTmF0aXZlTGVuZ3RoKTsKLQlpZiggbHBkd0J1ZmZlckxlbmd0aCAmJiBscE5hdGl2ZUxlbmd0aCApIHsKLQkJZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhscGR3QnVmZmVyTGVuZ3RoLGxwTmF0aXZlTGVuZ3RoLDApOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfRmluZEZpcnN0VXJsQ2FjaGVFbnRyeVcKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBscHN6VXJsU2VhcmNoUGF0dGVybiwgamludCBscEZpcnN0Q2FjaGVFbnRyeUluZm8sIGppbnRBcnJheSBscGNiQ2FjaGVFbnRyeUluZm8pCi17Ci0JamludCAqbHBOYXRpdmVMZW5ndGggPSBOVUxMOwotCWlmKCBscGNiQ2FjaGVFbnRyeUluZm8gKSB7Ci0JCWxwTmF0aXZlTGVuZ3RoID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGxwY2JDYWNoZUVudHJ5SW5mbyxOVUxMKTsKLQl9Ci0JSEFORExFIGhhbmRsZSA9IEZpbmRGaXJzdFVybENhY2hlRW50cnlXKChMUFdTVFIpbHBzelVybFNlYXJjaFBhdHRlcm4sIChMUElOVEVSTkVUX0NBQ0hFX0VOVFJZX0lORk9XKWxwRmlyc3RDYWNoZUVudHJ5SW5mbywgKExQRFdPUkQpbHBOYXRpdmVMZW5ndGgpOwotCWlmKCBscGNiQ2FjaGVFbnRyeUluZm8gJiYgbHBOYXRpdmVMZW5ndGggKSB7Ci0JCWVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMobHBjYkNhY2hlRW50cnlJbmZvLGxwTmF0aXZlTGVuZ3RoLDApOwotCX0KLQlyZXR1cm4gKGppbnQpaGFuZGxlOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9GaW5kTmV4dFVybENhY2hlRW50cnlXCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaEVudW1IYW5kbGUsIGppbnQgbHBOZXh0Q2FjaGVFbnRyeUluZm8sIGppbnRBcnJheSBscGNiQ2FjaGVFbnRyeUluZm8pCi17Ci0JamludCAqbHBOYXRpdmVMZW5ndGggPSBOVUxMOwotCWlmKCBscGNiQ2FjaGVFbnRyeUluZm8gKSB7Ci0JCWxwTmF0aXZlTGVuZ3RoID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGxwY2JDYWNoZUVudHJ5SW5mbyxOVUxMKTsKLQl9Ci0JQk9PTCByYyA9IEZpbmROZXh0VXJsQ2FjaGVFbnRyeVcoKEhBTkRMRSloRW51bUhhbmRsZSwgKExQSU5URVJORVRfQ0FDSEVfRU5UUllfSU5GT1cpbHBOZXh0Q2FjaGVFbnRyeUluZm8sIChMUERXT1JEKWxwTmF0aXZlTGVuZ3RoKTsKLQlpZiggbHBjYkNhY2hlRW50cnlJbmZvICYmIGxwTmF0aXZlTGVuZ3RoICkgewotCQllbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGxwY2JDYWNoZUVudHJ5SW5mbyxscE5hdGl2ZUxlbmd0aCwwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9GaW5kQ2xvc2VVcmxDYWNoZQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGhFbnVtSGFuZGxlKQotewotCXJldHVybiBGaW5kQ2xvc2VVcmxDYWNoZSgoSEFORExFKWhFbnVtSGFuZGxlKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfRGVsZXRlVXJsQ2FjaGVFbnRyeVcKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBscHN6VXJsTmFtZSkKLXsKLQlyZXR1cm4gRGVsZXRlVXJsQ2FjaGVFbnRyeVcoKExQV1NUUilscHN6VXJsTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQuaCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODdiZGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERPIE5PVCBFRElUIFRISVMgRklMRSAtIGl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkICovCi0jaW5jbHVkZSA8am5pLmg+Ci0vKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldCAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSNkZWZpbmUgX0luY2x1ZGVkX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUEVOX1RZUEVfUFJFQ09ORklHCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUEVOX1RZUEVfUFJFQ09ORklHIDBMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QRU5fVFlQRV9ESVJFQ1QKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QRU5fVFlQRV9ESVJFQ1QgMUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BFTl9UWVBFX1BST1hZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUEVOX1RZUEVfUFJPWFkgM0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BFTl9UWVBFX1BSRUNPTkZJR19XSVRIX05PX0FVVE9QUk9YWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BFTl9UWVBFX1BSRUNPTkZJR19XSVRIX05PX0FVVE9QUk9YWSA0TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0FMTEJBQ0sKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUxMQkFDSyAxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9USU1FT1VUIDJMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX1JFVFJJRVMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX1JFVFJJRVMgM0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfQkFDS09GRgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfQkFDS09GRiA0TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VORF9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VORF9USU1FT1VUIDVMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05UUk9MX1NFTkRfVElNRU9VVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTlRST0xfU0VORF9USU1FT1VUIDVMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RJTUVPVVQgNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTlRST0xfUkVDRUlWRV9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OVFJPTF9SRUNFSVZFX1RJTUVPVVQgNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RBVEFfU0VORF9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQV9TRU5EX1RJTUVPVVQgN0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RBVEFfUkVDRUlWRV9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQV9SRUNFSVZFX1RJTUVPVVQgOEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0hBTkRMRV9UWVBFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fSEFORExFX1RZUEUgOUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0xJU1RFTl9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fTElTVEVOX1RJTUVPVVQgMTFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUFEX0JVRkZFUl9TSVpFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVBRF9CVUZGRVJfU0laRSAxMkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1dSSVRFX0JVRkZFUl9TSVpFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fV1JJVEVfQlVGRkVSX1NJWkUgMTNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BU1lOQ19JRAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FTWU5DX0lEIDE1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVNZTkNfUFJJT1JJVFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BU1lOQ19QUklPUklUWSAxNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BBUkVOVF9IQU5ETEUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QQVJFTlRfSEFORExFIDIxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fS0VFUF9DT05ORUNUSU9OCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fS0VFUF9DT05ORUNUSU9OIDIyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVRVUVTVF9GTEFHUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFUVVFU1RfRkxBR1MgMjNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9FWFRFTkRFRF9FUlJPUgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VYVEVOREVEX0VSUk9SIDI0TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fT0ZGTElORV9NT0RFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fT0ZGTElORV9NT0RFIDI2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0FDSEVfU1RSRUFNX0hBTkRMRQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NBQ0hFX1NUUkVBTV9IQU5ETEUgMjdMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9VU0VSTkFNRQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1VTRVJOQU1FIDI4TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUEFTU1dPUkQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QQVNTV09SRCAyOUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FTWU5DCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVNZTkMgMzBMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9GTEFHUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0ZMQUdTIDMxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfQ0VSVElGSUNBVEVfU1RSVUNUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfQ0VSVElGSUNBVEVfU1RSVUNUIDMyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQUZJTEVfTkFNRQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RBVEFGSUxFX05BTUUgMzNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9VUkwKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9VUkwgMzRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9DRVJUSUZJQ0FURQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0NFUlRJRklDQVRFIDM1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfS0VZX0JJVE5FU1MKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9LRVlfQklUTkVTUyAzNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFRlJFU0gKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUZSRVNIIDM3TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUFJPWFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWSAzOEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFVFRJTkdTX0NIQU5HRUQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRVRUSU5HU19DSEFOR0VEIDM5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fVkVSU0lPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1ZFUlNJT04gNDBMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9VU0VSX0FHRU5UCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fVVNFUl9BR0VOVCA0MUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VORF9CUk9XU0VSX1NFU1NJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9FTkRfQlJPV1NFUl9TRVNTSU9OIDQyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUFJPWFlfVVNFUk5BTUUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWV9VU0VSTkFNRSA0M0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BST1hZX1BBU1NXT1JECi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUFJPWFlfUEFTU1dPUkQgNDRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05URVhUX1ZBTFVFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OVEVYVF9WQUxVRSA0NUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfTElNSVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX0xJTUlUIDQ2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfU0VMRUNUX0NMSUVOVF9DRVJUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfU0VMRUNUX0NMSUVOVF9DRVJUIDQ3TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUE9MSUNZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUE9MSUNZIDQ4TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRElTQ09OTkVDVEVEX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESVNDT05ORUNURURfVElNRU9VVCA0OUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RFRF9TVEFURQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RFRF9TVEFURSA1MEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0lETEVfU1RBVEUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9JRExFX1NUQVRFIDUxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fT0ZGTElORV9TRU1BTlRJQ1MKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9PRkZMSU5FX1NFTUFOVElDUyA1MkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ09OREFSWV9DQUNIRV9LRVkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNPTkRBUllfQ0FDSEVfS0VZIDUzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0FMTEJBQ0tfRklMVEVSCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0FMTEJBQ0tfRklMVEVSIDU0TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9USU1FCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9USU1FIDU1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VORF9USFJPVUdIUFVUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VORF9USFJPVUdIUFVUIDU2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVDRUlWRV9USFJPVUdIUFVUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVDRUlWRV9USFJPVUdIUFVUIDU3TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVRVUVTVF9QUklPUklUWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFUVVFU1RfUFJJT1JJVFkgNThMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9IVFRQX1ZFUlNJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9IVFRQX1ZFUlNJT04gNTlMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRVNFVF9VUkxDQUNIRV9TRVNTSU9OCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVTRVRfVVJMQ0FDSEVfU0VTU0lPTiA2MEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VSUk9SX01BU0sKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9FUlJPUl9NQVNLIDYyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRlJPTV9DQUNIRV9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRlJPTV9DQUNIRV9USU1FT1VUIDYzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQllQQVNTX0VESVRFRF9FTlRSWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0JZUEFTU19FRElURURfRU5UUlkgNjRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESUFHTk9TVElDX1NPQ0tFVF9JTkZPCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRElBR05PU1RJQ19TT0NLRVRfSU5GTyA2N0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPREVQQUdFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09ERVBBR0UgNjhMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUNIRV9USU1FU1RBTVBTCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0FDSEVfVElNRVNUQU1QUyA2OUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJU0FCTEVfQVVUT0RJQUwKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESVNBQkxFX0FVVE9ESUFMIDcwTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fTUFYX0NPTk5TX1BFUl9TRVJWRVIKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9NQVhfQ09OTlNfUEVSX1NFUlZFUiA3M0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX01BWF9DT05OU19QRVJfMV8wX1NFUlZFUgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX01BWF9DT05OU19QRVJfMV8wX1NFUlZFUiA3NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BFUl9DT05ORUNUSU9OX09QVElPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BFUl9DT05ORUNUSU9OX09QVElPTiA3NUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJR0VTVF9BVVRIX1VOTE9BRAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJR0VTVF9BVVRIX1VOTE9BRCA3NkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0lHTk9SRV9PRkZMSU5FCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fSUdOT1JFX09GRkxJTkUgNzdMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9JREVOVElUWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0lERU5USVRZIDc4TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVNT1ZFX0lERU5USVRZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVNT1ZFX0lERU5USVRZIDc5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQUxURVJfSURFTlRJVFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BTFRFUl9JREVOVElUWSA4MEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NVUFBSRVNTX0JFSEFWSU9SCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU1VQUFJFU1NfQkVIQVZJT1IgODFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BVVRPRElBTF9NT0RFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVVUT0RJQUxfTU9ERSA4MkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FVVE9ESUFMX0NPTk5FQ1RJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BVVRPRElBTF9DT05ORUNUSU9OIDgzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0xJRU5UX0NFUlRfQ09OVEVYVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NMSUVOVF9DRVJUX0NPTlRFWFQgODRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BVVRIX0ZMQUdTCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVVUSF9GTEFHUyA4NUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPT0tJRVNfM1JEX1BBUlRZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09PS0lFU18zUkRfUEFSVFkgODZMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESVNBQkxFX1BBU1NQT1JUX0FVVEgKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESVNBQkxFX1BBU1NQT1JUX0FVVEggODdMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRU5EX1VURjhfU0VSVkVSTkFNRV9UT19QUk9YWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFTkRfVVRGOF9TRVJWRVJOQU1FX1RPX1BST1hZIDg4TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRVhFTVBUX0NPTk5FQ1RJT05fTElNSVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9FWEVNUFRfQ09OTkVDVElPTl9MSU1JVCA4OUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VOQUJMRV9QQVNTUE9SVF9BVVRICi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRU5BQkxFX1BBU1NQT1JUX0FVVEggOTBMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ISUJFUk5BVEVfSU5BQ1RJVkVfV09SS0VSX1RIUkVBRFMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ISUJFUk5BVEVfSU5BQ1RJVkVfV09SS0VSX1RIUkVBRFMgOTFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BQ1RJVkFURV9XT1JLRVJfVEhSRUFEUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FDVElWQVRFX1dPUktFUl9USFJFQURTIDkyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVTVE9SRV9XT1JLRVJfVEhSRUFEX0RFRkFVTFRTCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVTVE9SRV9XT1JLRVJfVEhSRUFEX0RFRkFVTFRTIDkzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU09DS0VUX1NFTkRfQlVGRkVSX0xFTkdUSAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NPQ0tFVF9TRU5EX0JVRkZFUl9MRU5HVEggOTRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWV9TRVRUSU5HU19DSEFOR0VECi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUFJPWFlfU0VUVElOR1NfQ0hBTkdFRCA5NUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RBVEFGSUxFX0VYVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RBVEFGSUxFX0VYVCA5NkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfRklSU1RfT1BUSU9OCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9GSVJTVF9PUFRJT04gMUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfTEFTVF9PUFRJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX0xBU1RfT1BUSU9OIDk2TAotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIEludGVybmV0T3BlblcKLSAqIFNpZ25hdHVyZTogKElJSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JbnRlcm5ldE9wZW5XCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIEludGVybmV0Q2xvc2VIYW5kbGUKLSAqIFNpZ25hdHVyZTogKEkpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JbnRlcm5ldENsb3NlSGFuZGxlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIEludGVybmV0U2V0T3B0aW9uVwotICogU2lnbmF0dXJlOiAoSUlJSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0U2V0T3B0aW9uVwotICAoSk5JRW52ICosIGpjbGFzcywgamludCwgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldAotICogTWV0aG9kOiAgICBJbnRlcm5ldFF1ZXJ5T3B0aW9uVwotICogU2lnbmF0dXJlOiAoSUlJW0kpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JbnRlcm5ldFF1ZXJ5T3B0aW9uVwotICAoSk5JRW52ICosIGpjbGFzcywgamludCwgamludCwgamludCwgamludEFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIEZpbmRGaXJzdFVybENhY2hlRW50cnlXCi0gKiBTaWduYXR1cmU6IChJSVtJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9GaW5kRmlyc3RVcmxDYWNoZUVudHJ5VwotICAoSk5JRW52ICosIGpjbGFzcywgamludCwgamludCwgamludEFycmF5KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIEZpbmROZXh0VXJsQ2FjaGVFbnRyeVcKLSAqIFNpZ25hdHVyZTogKElJW0kpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9GaW5kTmV4dFVybENhY2hlRW50cnlXCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50QXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSAqIE1ldGhvZDogICAgRmluZENsb3NlVXJsQ2FjaGUKLSAqIFNpZ25hdHVyZTogKEkpWgotICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9GaW5kQ2xvc2VVcmxDYWNoZQotICAoSk5JRW52ICosIGpjbGFzcywgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldAotICogTWV0aG9kOiAgICBEZWxldGVVcmxDYWNoZUVudHJ5VwotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0RlbGV0ZVVybENhY2hlRW50cnlXCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvc3RkYWZ4LmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L3N0ZGFmeC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTc1MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvc3RkYWZ4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIHN0ZGFmeC5jcHAgOiBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIGp1c3QgdGhlIHN0YW5kYXJkIGluY2x1ZGVzCi0vLyBBY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LnBjaCB3aWxsIGJlIHRoZSBwcmUtY29tcGlsZWQgaGVhZGVyCi0vLyBzdGRhZngub2JqIHdpbGwgY29udGFpbiB0aGUgcHJlLWNvbXBpbGVkIHR5cGUgaW5mb3JtYXRpb24KLQotI2luY2x1ZGUgInN0ZGFmeC5oIgotCi0vLyBUT0RPOiByZWZlcmVuY2UgYW55IGFkZGl0aW9uYWwgaGVhZGVycyB5b3UgbmVlZCBpbiBTVERBRlguSAotLy8gYW5kIG5vdCBpbiB0aGlzIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L3N0ZGFmeC5oIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvc3RkYWZ4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjQ0NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvc3RkYWZ4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBzdGRhZnguaCA6IGluY2x1ZGUgZmlsZSBmb3Igc3RhbmRhcmQgc3lzdGVtIGluY2x1ZGUgZmlsZXMsCi0vLyBvciBwcm9qZWN0IHNwZWNpZmljIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBmcmVxdWVudGx5LCBidXQKLS8vIGFyZSBjaGFuZ2VkIGluZnJlcXVlbnRseQotLy8KLQotI3ByYWdtYSBvbmNlCi0KLS8vIE1vZGlmeSB0aGUgZm9sbG93aW5nIGRlZmluZXMgaWYgeW91IGhhdmUgdG8gdGFyZ2V0IGEgcGxhdGZvcm0gcHJpb3IgdG8gdGhlIG9uZXMgc3BlY2lmaWVkIGJlbG93LgotLy8gUmVmZXIgdG8gTVNETiBmb3IgdGhlIGxhdGVzdCBpbmZvIG9uIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zLgotI2lmbmRlZiBXSU5WRVIJCQkJLy8gQWxsb3cgdXNlIG9mIGZlYXR1cmVzIHNwZWNpZmljIHRvIFdpbmRvd3MgWFAgb3IgbGF0ZXIuCi0jZGVmaW5lIFdJTlZFUiAweDA1MDEJCS8vIENoYW5nZSB0aGlzIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byB0YXJnZXQgb3RoZXIgdmVyc2lvbnMgb2YgV2luZG93cy4KLSNlbmRpZgotCi0jaWZuZGVmIF9XSU4zMl9XSU5OVAkJLy8gQWxsb3cgdXNlIG9mIGZlYXR1cmVzIHNwZWNpZmljIHRvIFdpbmRvd3MgWFAgb3IgbGF0ZXIuICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCS8vIENoYW5nZSB0aGlzIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byB0YXJnZXQgb3RoZXIgdmVyc2lvbnMgb2YgV2luZG93cy4KLSNlbmRpZgkJCQkJCQotCi0jaWZuZGVmIF9XSU4zMl9XSU5ET1dTCQkvLyBBbGxvdyB1c2Ugb2YgZmVhdHVyZXMgc3BlY2lmaWMgdG8gV2luZG93cyA5OCBvciBsYXRlci4KLSNkZWZpbmUgX1dJTjMyX1dJTkRPV1MgMHgwNDEwIC8vIENoYW5nZSB0aGlzIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byB0YXJnZXQgV2luZG93cyBNZSBvciBsYXRlci4KLSNlbmRpZgotCi0jaWZuZGVmIF9XSU4zMl9JRQkJCS8vIEFsbG93IHVzZSBvZiBmZWF0dXJlcyBzcGVjaWZpYyB0byBJRSA2LjAgb3IgbGF0ZXIuCi0jZGVmaW5lIF9XSU4zMl9JRSAweDA2MDAJLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBvdGhlciB2ZXJzaW9ucyBvZiBJRS4KLSNlbmRpZgotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4JCS8vIEV4Y2x1ZGUgcmFyZWx5LXVzZWQgc3R1ZmYgZnJvbSBXaW5kb3dzIGhlYWRlcnMKLS8vIFdpbmRvd3MgSGVhZGVyIEZpbGVzOgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotCi0vLyBUT0RPOiByZWZlcmVuY2UgYWRkaXRpb25hbCBoZWFkZXJzIHlvdXIgcHJvZ3JhbSByZXF1aXJlcyBoZXJlCi0jaW5jbHVkZSA8V2luSW5ldC5oPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGMzZTU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVByb3h5UHJlZmVyZW5jZVBhZ2UubmFtZT1GbGFzaCBQcm94eQotUHJveHlMb2dWaWV3Lm5hbWU9Rmxhc2ggUHJveHkgTG9ncwotUHJveHlNZW51Lm5hbWU9JkNhY2hlCi1EZWxldGVBY3Rpb24ubmFtZT1DbGVhciBpbnRlcm5ldCBjYWNoZQotRGVsZXRlQWN0aW9uLnRpcD1DbGVhciBpbnRlcm5ldCBjYWNoZQotUHJveHlQcmVmZXJlbmNlcz1GbGFzaCBQcm94eSBQcmVmZXJlbmNlcy4uLgotUHJlZmVyZW5jZXM9UHJlZmVyZW5jZXMuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNThjNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+Ci0gICAgICA8c3RhcnR1cCBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5Qcm94eVN0YXJ0dXAiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkucHJlZmVyZW5jZXMuUHJveHlQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVQcm94eVByZWZlcmVuY2VQYWdlLm5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LnZpZXdzLlByb3h5TG9nVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL3ZpZXcxNi9wcm94eWxvZ3ZpZXcuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkudmlld3MuUHJveHlMb2dWaWV3IgotICAgICAgICAgICAgbmFtZT0iJVByb3h5TG9nVmlldy5uYW1lIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuYWN0aW9uU2V0IgotICAgICAgICAgICAgbGFiZWw9IlByb3h5IEFjdGlvbiBTZXRzIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmFjdGlvbnMuRGVsZXRlQ2FjaGVBY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb25zLkRlbGV0ZUNhY2hlQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVBY3Rpb24ubmFtZSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJmaWxlL2NhY2hlR3JvdXAiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlQWN0aW9uLnRpcCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIAotIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zIj4KLSAgICA8dmlld0NvbnRyaWJ1dGlvbgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnZpZXdlckNvbnRyaWJ1dGlvbjEiCi0gICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmFjdGYudmlzdWFsaXphdGlvbi5mbGFzaC51aS52aWV3cy5GbGFzaERPTVZpZXciPgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb25zLk9wZW5QcmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb24xIgotICAgICAgICAgICAgIGxhYmVsPSIlUHJveHlQcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIi8+Ci0gICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudmlld2VyQ29udHJpYnV0aW9uMiIKLSAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS52aWV3cy5Qcm94eUxvZ1ZpZXciPgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb25zLk9wZW5QcmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb24yIgotICAgICAgICAgICAgIGxhYmVsPSIlUHJlZmVyZW5jZXMiCi0gICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIvPgotICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSA8L2V4dGVuc2lvbj4KLSAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9wbHVnaW5famEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5ZWIwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Qcm94eVByZWZlcmVuY2VQYWdlLm5hbWU9Rmxhc2ggXHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3Ci1Qcm94eUxvZ1ZpZXcubmFtZT1GbGFzaCBcdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjcgXHUzMGVkXHUzMGIwCi1Qcm94eU1lbnUubmFtZT1cdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTUoJkMpCi1EZWxldGVBY3Rpb24ubmFtZT1cdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwY2RcdTMwYzNcdTMwYzhcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwOTJcdTUyNGFcdTk2NjQKLURlbGV0ZUFjdGlvbi50aXA9XHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGNkXHUzMGMzXHUzMGM4XHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5Ci1Qcm94eVByZWZlcmVuY2VzPUZsYXNoIFx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1OGEyZFx1NWI5YS4uLgotUHJlZmVyZW5jZXM9XHU4YTJkXHU1YjlhLi4uCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNTNiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNkbyBub3QgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMKLU5PX0RFTEVURT18Z2lmfGpwZ3xqcGVnfHBuZ3xibXB8aWNvfHBkZnx0eHR8dGV4dHxkb2N8eGxzfHBwdHxodG18aHRtbHxzaHRtbHxqc3B8YXNwfHBocHxodGF8aHRjfGFzaHh8eG1sfGNzc3xqc3x2Ynx2YnN8dmJ4fGF1fGF2aXxtcDN8YWlmfGFpZmZ8YXNmfGFzeHx3bXx3bXZ8d21hfG1pZHxleGV8Y2FifHppcHxmbHZ8Ci0jU3BlY2lmeSB1cmwgZXh0ZW5zaW9ucyB0byBiZSBieXBhc3NlZC4gVGhpcyBpcyBmb3IgZGVidWcgcHVycG9zZSBvbmx5LgotTk9fUFJPWFk9Ci0KLSN0cmFuc2xhdGUgdGhlIGZvbGxvd2luZyBtZXNzYWdlcwotcHJveHkuY2xlYXJfdGlwPUNsZWFyIExvZ3MKLXByb3h5LmNsZWFyPUNsZWFyCi1wcm94eS5zb3VyY2U9U291cmNlCi1wcm94eS5nbG9iYWw9U3lzdGVtIGdsb2JhbAotcHJveHkudGltZT1UaW1lCi1wcm94eS50eXBlPVVzZSBIVFRQIFByb3h5IEZvcjoKLXByb3h5Lm5vbmU9Tm9uZQotcHJveHkuc2hvd19maW5lPVNob3cgdHJhY2UgbG9ncwotcHJveHkubWVzc2FnZT1NZXNzYWdlCi1wcm94eS5jb3B5PSZDb3B5Ci0KLXByb3h5LnN3Zm1ldGhvZD1TV0YgYnJpZGdlIG1ldGhvZDoKLXByb3h5LnN3Zm1ldGhvZC5ub25lPURvIG5vdGhpbmcuCi1wcm94eS5zd2ZtZXRob2QuYm9vdGxvYWRlcj1Vc2UgYW4gU1dGIGJvb3Rsb2FkZXIuCi1wcm94eS5zd2ZtZXRob2QudHJhbnNjb2Rlcj1UcmFuc2NvZGUgaW5jb21pbmcgU1dGcy4KLQotcHJveHkucHJlZl9kZXNjcmlwdGlvbj1IVFRQIFByb3h5IHNldHRpbmdzCi1wcm94eS5kZWxldGluZ19jYWNoZT1EZWxldGluZyBpbnRlcm5ldCBjYWNoZSAuLi4KLXByb3h5LnNlc3Npb249VGhpcyBzZXNzaW9uIG9ubHkKLXByb3h5LnN3Zl92ZXJzaW9uPU1pbmltdW0gU1dGIHZlcnNpb24gdG8gYmUgaGFuZGxlZDoKLXByb3h5LnRpbWVvdXQ9VGltZW91dCAoc2Vjb25kcyk6Ci0KLXByb3h5LmRpYWxvZy50ZXh0PUNsZWFyIEludGVybmV0IENhY2hlIERpYWxvZwotcHJveHkuZGlhbG9nLm9rPU9LCi1wcm94eS5jYWNoZV9jbGVhcj1JbnRlcm5ldCBDYWNoZSBDbGVhcgotCi1wcm94eS5jYWNoZV9jb25maXJtYXRpb24xPXdpbGwgZGVsZXRlIHlvdXIgSW50ZXJuZXQgY2FjaGUgb2YgRmxhc2ggY29udGVudFxudG8gYWNjZXNzIHRoZSBGbGFzaCBjb250ZW50LgotcHJveHkuY2FjaGVfY2xlYXJfd2hlbl9zdGFydHVwX2FuZF9jYWNoZV9jbGVhcj1DbGVhciBJbnRlcm5ldCBjYWNoZSB3aXRob3V0IGNvbWZpcm1pbmcgKHJlY29tbWVuZGVkKQotcHJveHkuY29uZmlybV9hbmRfY2FjaGVfY2xlYXI9Q2xlYXIgSW50ZXJuZXQgY2FjaGUgZm9yIHRoaXMgdGltZQotcHJveHkuY29uZmlybV9hbmRfbm9fb3BlcmF0aW9uPURvIG5vdCBjbGVhciB0aGUgY2FjaGUgKEZsYXNoIGZ1bmN0aW9uYWxpdHkgd291bGQgbm90IHdvcmshKQotCi1wcm94eS5jYWNoZV9jbGVhcl93aGVuX3N0YXJ0dXA9Q2xlYXIgd2l0aG91dCBjb25maXJtaW5nCi1wcm94eS5jb25maXJtX2NhY2hlX2NsZWFyPUNvbmZpcm0gYmVmb3JlIGNsZWFyCi1wcm94eS5ub19jYWNoZV9jbGVhcj1OZXZlciBjbGVhciB0aGUgY2FjaGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjYjk1NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL21lc3NhZ2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm94eS5jbGVhcl90aXA9XHUzMGVkXHUzMGIwXHUzMDkyXHU2ZDg4XHU1M2JiXHUzMDU3XHUzMDdlXHUzMDU5Ci1wcm94eS5jbGVhcj1cdTMwYWZcdTMwZWFcdTMwYTIKLXByb3h5LnNob3dfZmluZT1cdTMwYzhcdTMwZWNcdTMwZmNcdTMwYjlcdTMwZWRcdTMwYjBcdTMwOTJcdTg4NjhcdTc5M2FcdTMwNTlcdTMwOGIKLXByb3h5LnNvdXJjZT1cdTMwYmRcdTMwZmNcdTMwYjkKLXByb3h5Lmdsb2JhbD1cdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTUxNjhcdTRmNTMKLXByb3h5LnRpbWU9XHU2NjQyXHU1MjNiCi1wcm94eS50eXBlPUhUVFBcdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjdcdTkwNjlcdTc1Mjg6Ci1wcm94eS5ub25lPVx1NzEyMVx1MzA1NwotcHJveHkubWVzc2FnZT1cdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjgKLXByb3h5LnByZWZfZGVzY3JpcHRpb249SFRUUFx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzA2ZVx1OGEyZFx1NWI5YQotcHJveHkuZGVsZXRpbmdfY2FjaGU9XHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGNkXHUzMGMzXHUzMGM4XHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDkyXHU1MjRhXHU5NjY0XHU0ZTJkXHUzMDY3XHUzMDU5IC4uLgotcHJveHkuc2Vzc2lvbj1cdTMwNTNcdTMwNmVcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTMwN2YKLXByb3h5LnN3Zl92ZXJzaW9uPVx1NWJmZVx1OGM2MVx1MzA2OFx1MzA2YVx1MzA4YlNXRlx1MzA2ZVx1NjcwMFx1NGY0ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzoKLXByb3h5LnRpbWVvdXQ9XHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4IChcdTc5ZDIpOgotcHJveHkuY29weT1cdTMwYjNcdTMwZDRcdTMwZmMoJkMpCi0KLXByb3h5LmRpYWxvZy50ZXh0PVx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBjZFx1MzBjM1x1MzBjOFx1MzBhZFx1MzBlM1x1MzBjM1x1MzBiN1x1MzBlNVx1MzA2ZVx1NTI0YVx1OTY2NAotcHJveHkuZGlhbG9nLm9rPU9LCi1wcm94eS5jYWNoZV9jbGVhcj1cdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwY2RcdTMwYzNcdTMwYzhcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwNmVcdTUyNGFcdTk2NjQKLQotcHJveHkuY2FjaGVfY29uZmlybWF0aW9uMT1cdTMwNmZGbGFzaFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2Ylx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzAwMUZsYXNoXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0XHUzMDZlXG5cdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwY2RcdTMwYzNcdTMwYzhcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwODhcdTMwNDZcdTMwNjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIKLXByb3h5LmNhY2hlX2NsZWFyX3doZW5fc3RhcnR1cF9hbmRfY2FjaGVfY2xlYXI9XHU3OGJhXHU4YThkXHUzMDViXHUzMDVhXHUzMDZiXHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHUzMDAwXHVmZjA4XHU2M2E4XHU1OTY4XHVmZjA5Ci1wcm94eS5jb25maXJtX2FuZF9jYWNoZV9jbGVhcj1cdTRlY2FcdTU2ZGVcdTMwNjBcdTMwNTFcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGIKLXByb3h5LmNvbmZpcm1fYW5kX25vX29wZXJhdGlvbj1cdTRlY2FcdTU2ZGVcdTMwNmZcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwNmFcdTMwNDRcdTMwMDBcdWZmMDhGbGFzaFx1MzA2ZVx1NmE1Zlx1ODBmZFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1NTJkNVx1NGY1Y1x1MzA1N1x1MzA2YVx1MzA0NFx1NTNlZlx1ODBmZFx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMlx1ZmYwOQotCi1wcm94eS5jYWNoZV9jbGVhcl93aGVuX3N0YXJ0dXA9XHU3OGJhXHU4YThkXHUzMDViXHUzMDVhXHUzMDZiXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiCi1wcm94eS5jb25maXJtX2NhY2hlX2NsZWFyPVx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1NTI0ZFx1MzA2Ylx1NzhiYVx1OGE4ZFx1MzA1OVx1MzA4YgotcHJveHkubm9fY2FjaGVfY2xlYXI9XHU1ZTM4XHUzMDZiXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDZhXHUzMDQ0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0NThlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAibWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvUHJveHlNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvUHJveHlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzBkZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L1Byb3h5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guRmxhc2hNb2RlbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5JV2FYY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5pbnRlcm5hbC5XU1RSOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuV2luSW5ldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmxvZ3MuUHJveHlMb2dIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotCi0KLQotcHVibGljIGNsYXNzIFByb3h5TWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5pdExvZ2dlciA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmb3JjZVByb3h5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vUHJveHkgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIk5PX1BST1hZIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlzdGF0aWMgewotCQlTdHJpbmdbXSB0ZW1wID0gUGxhdGZvcm0uZ2V0QXBwbGljYXRpb25BcmdzKCk7Ci0JCWZvciggaW50IGk9MDsgaTx0ZW1wLmxlbmd0aDsgaSsrICkgewotCQkJaWYoICItaW5pdExvZ2dlciIuZXF1YWxzKHRlbXBbaV0pICkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW5pdExvZ2dlciA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKCAiLWZvcmNlUHJveHkiLmVxdWFscyh0ZW1wW2ldKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvcmNlUHJveHkgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiggIi1ub1Byb3h5Ii5lcXVhbHModGVtcFtpXSkgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiggaSA8IHRlbXAubGVuZ3RoLTEgKSB7Ci0JCQkJCVN0cmluZyBuZXh0QXJnID0gdGVtcFtpKzFdOwotCQkJCQlpZiggbmV4dEFyZy5zdGFydHNXaXRoKCJ8IikgJiYgbmV4dEFyZy5lbmRzV2l0aCgifCIpICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW5vUHJveHkgPSBuZXh0QXJnOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbml0TG9nZ2VyID0gIitpbml0TG9nZ2VyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb3JjZVByb3h5ID0gIitmb3JjZVByb3h5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJub1Byb3h5ID0gIitub1Byb3h5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0JfQotCi0gICAgcHJpdmF0ZSBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCBzYXZlZExpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgc2F2ZWRBZGRyZXNzOwotICAgIHByaXZhdGUgaW50IGhTZXNzaW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkUmVzdG9yZSA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRQb3J0ID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVENPTF9IVFRQID0gICAiaHR0cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVENPTF9IVFRQUyA9ICAiaHR0cHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST1RDT0xfRlRQID0gICAgImZ0cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVENPTF9HT1BIRVIgPSAiZ29waGVyIjsgLy8kTk9OLU5MUy0xJAotLy8gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gUFJPVENPTF9FWFRSQSA9IG5ldyBTdHJpbmdbXXsiaHR0cHMiLCJmdHAiLCJnb3BoZXIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAKLSAgICBwdWJsaWMgUHJveHlNYW5hZ2VyKCkgewotICAgICAgICAvLyBTYXZlIGRlZmF1bHQgc2V0dGluZ3MKLSAgICAgICAgc2F2ZWRMaXN0ID0gbmV3IElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNUKDQpOwotICAgICAgICBzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwotICAgICAgICBzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMV0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX1BST1hZX1NFUlZFUjsKLSAgICAgICAgc2F2ZWRMaXN0LnBlckNvbm5PcHRpb25zWzJdLmR3T3B0aW9uPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5JTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1M7Ci0gICAgICAgIHNhdmVkTGlzdC5wZXJDb25uT3B0aW9uc1szXS5kd09wdGlvbj1JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19VUkw7Ci0gICAgICAgIHNhdmVkQWRkcmVzcyA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVC5zaXplb2YpOwotICAgICAgICBzYXZlZExpc3QuZ2V0RGF0YShzYXZlZEFkZHJlc3MpOwotICAgICAgICBpbnRbXSBwSW50ID0gbmV3IGludFtde0lOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNULnNpemVvZn07Ci0gICAgICAgIFdpbkluZXQuSW50ZXJuZXRRdWVyeU9wdGlvblcoMCxXaW5JbmV0LklOVEVSTkVUX09QVElPTl9QRVJfQ09OTkVDVElPTl9PUFRJT04sc2F2ZWRBZGRyZXNzLHBJbnQpOwotICAgICAgICBzYXZlZExpc3Quc2V0RGF0YShzYXZlZEFkZHJlc3MpOwotICAgICAgICBXU1RSIHdzQWdlbnQgPSBuZXcgV1NUUigiQWdlbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBoU2Vzc2lvbiA9IFdpbkluZXQuSW50ZXJuZXRPcGVuVyh3c0FnZW50LmdldEFkZHJlc3MoKSxXaW5JbmV0LklOVEVSTkVUX09QRU5fVFlQRV9ESVJFQ1QsMCwwLDApOwotICAgICAgICB3c0FnZW50LmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm94eShpbnQgcG9ydCwgaW50IHN3ZlZlcnNpb24sIGludCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzd2ZCb290bG9hZGVyLCBib29sZWFuIHN3ZlRyYW5zY29kZXIpIHsKLSAgICAgICAgSVdhWGNvZGluZyB3YVhjb2RpbmcgPSBnZXRJV2FYY29kaW5nKCk7Ci0gICAgICAgIHdhWGNvZGluZy5zZXRQb3J0KHBvcnQpOwotICAgICAgICB3YVhjb2Rpbmcuc2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbihzd2ZWZXJzaW9uKTsKLSAgICAgICAgd2FYY29kaW5nLnNldFRpbWVvdXQodGltZW91dCk7Ci0gICAgICAgIHdhWGNvZGluZy5zZXRFeHRlcm5hbFByb3h5RmxhZyhmYWxzZSk7Ci0gICAgICAgIHdhWGNvZGluZy5zZXRTV0ZCb290bG9hZGVyRmxhZyhzd2ZCb290bG9hZGVyKTsKLSAgICAgICAgd2FYY29kaW5nLnNldFNXRlRyYW5zY29kaW5nRmxhZyhzd2ZUcmFuc2NvZGVyKTsKLSAgICAgICAgU3RyaW5nIGV4dFByb3h5ID0gZ2V0RGVmYXVsdFByb3h5KFBST1RDT0xfSFRUUCk7Ci0gICAgICAgIGlmKCBudWxsICE9IGV4dFByb3h5ICkgewotICAgICAgICAgICAgaW50IHBvcyA9IGV4dFByb3h5LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmKCAtMSAhPSBwb3MgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4dEhvc3QgPSBleHRQcm94eS5zdWJzdHJpbmcoMCxwb3MpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFN0ciA9IGV4dFByb3h5LnN1YnN0cmluZyhwb3MrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHRQb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0U3RyKTsKLSAgICAgICAgICAgICAgICAgICAgd2FYY29kaW5nLnNldEV4dGVybmFsUHJveHlGbGFnKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB3YVhjb2Rpbmcuc2V0RXh0ZXJuYWxQcm94eShleHRIb3N0LGV4dFBvcnQpOwotICAgICAgICAgICAgICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgZXh0ZXJuYWwgcHJveHkgIitleHRIb3N0KyI6IitleHRQb3J0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHJveHlMb2dIYW5kbGVyLmNvbmZpZ3VyZSgpOyAgICAgIC8vIENvbmZpZ3VyZSBvdXIgbG9nIGhhbmRsZXIKLSAgICAgICAgd2FYY29kaW5nLnN0YXJ0KGluaXRMb2dnZXIpOyAgICAgICAgICAgLy8gU3RhcnQgV2FYY29kaW5nIHdpdGhvdXQgbG9nIGhhbmRsZXIKLSAgICAgICAgaWYoICFpbml0TG9nZ2VyICkgewotICAgICAgICAJUHJveHlMb2dIYW5kbGVyLnJlc2V0TG9nTGV2ZWwoKTsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50UG9ydCA9IHdhWGNvZGluZy5nZXRQb3J0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3BQcm94eSgpIHsKLSAgICAgICAgaWYoIDAgIT0gY3VycmVudFBvcnQgKSB7Ci0gICAgICAgICAgICBnZXRJV2FYY29kaW5nKCkuc3RvcCgpOwotICAgICAgICAgICAgY3VycmVudFBvcnQgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEludGVybmV0T3B0aW9ucyhib29sZWFuIGlzR2xvYmFsKSB7Ci0gICAgICAgIGlmKCAwICE9IHNhdmVkQWRkcmVzcyApIHsKLSAgICAgICAgICAgIGlmKCAwID09IGN1cnJlbnRQb3J0ICkgewotICAgICAgICAgICAgICAgIGludm9rZVNldE9wdGlvbihoU2Vzc2lvbixzYXZlZEFkZHJlc3MpOwotICAgICAgICAgICAgICAgIGludm9rZVNldE9wdGlvbigwLHNhdmVkQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgbmVlZFJlc3RvcmUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotLy8gICAgICAgICAgICAgICAgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1QgbGlzdCA9IG5ldyBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCgzKTsKLS8vICAgICAgICAgICAgICAgIGxpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwotLy8gICAgICAgICAgICAgICAgbGlzdC5wZXJDb25uT3B0aW9uc1swXS5kd1ZhbHVlPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5QUk9YWV9UWVBFX1BST1hZIHwgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLlBST1hZX1RZUEVfRElSRUNUOwotLy8gICAgICAgICAgICAgICAgbGlzdC5wZXJDb25uT3B0aW9uc1sxXS5kd09wdGlvbj1JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfU0VSVkVSOwotLy8gICAgICAgICAgICAgICAgbGlzdC5wZXJDb25uT3B0aW9uc1sxXS5zdHJWYWx1ZS5zZXRTdHJpbmcoZ2V0UHJveHlTdHJpbmcoKSk7Ci0vLyAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzJdLmR3T3B0aW9uPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5JTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1M7Ci0vLyAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzJdLnN0clZhbHVlLnNldFN0cmluZyhudWxsKTsKLSAgICAgICAgICAgICAgICBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCBsaXN0ID0gbmV3IElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNUKDIpOwotICAgICAgICAgICAgICAgIGxpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwotICAgICAgICAgICAgICAgIGxpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdWYWx1ZT1JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uUFJPWFlfVFlQRV9BVVRPX1BST1hZX1VSTCB8IElOVEVSTkVUX1BFUl9DT05OX09QVElPTi5QUk9YWV9UWVBFX0RJUkVDVDsKLSAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzFdLmR3T3B0aW9uPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5JTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1VSTDsKLSAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzFdLnN0clZhbHVlLnNldFN0cmluZyhnZXRBdXRvQ29uZmlnVVJMKGlzR2xvYmFsfHxmb3JjZVByb3h5KSk7Ci0gICAgICAgICAgICAgICAgaW50IGFkZHJlc3MgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1Quc2l6ZW9mKTsKLSAgICAgICAgICAgICAgICBsaXN0LmdldERhdGEoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgaW52b2tlU2V0T3B0aW9uKGhTZXNzaW9uLCBhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBpbnZva2VTZXRPcHRpb24oMCwgaXNHbG9iYWwgPyBhZGRyZXNzIDogc2F2ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBuZWVkUmVzdG9yZSA9IGlzR2xvYmFsOwotICAgICAgICAgICAgICAgIE9TLkdsb2JhbEZyZWUoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgbGlzdC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgUHJveHlMb2dIYW5kbGVyLnJlbW92ZUhhbmRsZXIoKTsKLSAgICAgICAgc3RvcFByb3h5KCk7Ci0gICAgICAgIGlmKCAwICE9IGhTZXNzaW9uICkgewotICAgICAgICAgICAgV2luSW5ldC5JbnRlcm5ldENsb3NlSGFuZGxlKGhTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiggMCAhPSBzYXZlZEFkZHJlc3MgKSB7Ci0gICAgICAgICAgICBpZiggbmVlZFJlc3RvcmUgKSB7Ci0gICAgICAgICAgICAgICAgV2luSW5ldC5JbnRlcm5ldFNldE9wdGlvblcoMCxXaW5JbmV0LklOVEVSTkVUX09QVElPTl9QRVJfQ09OTkVDVElPTl9PUFRJT04sc2F2ZWRBZGRyZXNzLElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNULnNpemVvZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPUy5HbG9iYWxGcmVlKHNhdmVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBzYXZlZExpc3QuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZVNldE9wdGlvbihpbnQgaGFuZGxlLCBpbnQgYWRkcmVzcykgewotICAgICAgICBXaW5JbmV0LkludGVybmV0U2V0T3B0aW9uVyhoYW5kbGUsV2luSW5ldC5JTlRFUk5FVF9PUFRJT05fUEVSX0NPTk5FQ1RJT05fT1BUSU9OLGFkZHJlc3MsSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1Quc2l6ZW9mKTsKLSAgICAgICAgV2luSW5ldC5JbnRlcm5ldFNldE9wdGlvblcoaGFuZGxlLFdpbkluZXQuSU5URVJORVRfT1BUSU9OX1NFVFRJTkdTX0NIQU5HRUQsMCwwKTsKLSAgICAgICAgV2luSW5ldC5JbnRlcm5ldFNldE9wdGlvblcoaGFuZGxlLFdpbkluZXQuSU5URVJORVRfT1BUSU9OX1JFRlJFU0gsMCwwKTsKLSAgICB9Ci0gICAgCi0vLyAgICBwcml2YXRlIFN0cmluZyBnZXRQcm94eVN0cmluZygpIHsKLS8vICAgICAgICBTdHJpbmcgcmVzdWx0ID0gUFJPVENPTF9IVFRQKyI9bG9jYWxob3N0OiIrY3VycmVudFBvcnQ7IC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICBmb3IoIGludCBpPTA7IGk8UFJPVENPTF9FWFRSQS5sZW5ndGg7IGkrKyApIHsKLS8vICAgICAgICAgICAgU3RyaW5nIHMgPSBnZXREZWZhdWx0UHJveHkoUFJPVENPTF9FWFRSQVtpXSk7Ci0vLyAgICAgICAgICAgIGlmKCBudWxsIT1zICYmIHMubGVuZ3RoKCk+MCApIHsKLS8vICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiOyIrUFJPVENPTF9FWFRSQVtpXSsiPSIrczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIHJlc3VsdDsKLS8vICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJveHkoU3RyaW5nIHByb3RvY29sKSB7Ci0gICAgICAgIGlmKCAwICE9IChzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdWYWx1ZSAmIElOVEVSTkVUX1BFUl9DT05OX09QVElPTi5QUk9YWV9UWVBFX1BST1hZKSApIHsKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UHJveHkgPSBzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMV0uc3RyVmFsdWUuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiggbnVsbCAhPSBkZWZhdWx0UHJveHkgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIC0xID09IGRlZmF1bHRQcm94eS5pbmRleE9mKCc9JykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJveHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBhdHRlcm4uY29tcGlsZShwcm90b2NvbCsiPSguKykiKS5tYXRjaGVyKGRlZmF1bHRQcm94eSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiggbS5maW5kKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG51bGwgIT0gcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXAgPSBzLmluZGV4T2YoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMT09c2VwID8gcyA6IHMuc3Vic3RyaW5nKDAsc2VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJV2FYY29kaW5nIGdldElXYVhjb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBGbGFzaE1vZGVsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJV2FYY29kaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEF1dG9Db25maWdVUkwoYm9vbGVhbiBkaXNhYmxlQXV0b1Byb3h5KSB7Ci0JCVN0cmluZyBwYWMgPSByZWFkUGx1Z2luRmlsZSgidGVtcGxhdGVzL3Byb3h5LnBhYyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmKCBudWxsICE9IHBhYyApIHsKLSAgICAgICAgCVN0cmluZyBodHRwUHJveHkgPSBnZXRQcm94eVN0cmluZygibG9jYWxob3N0OiIrY3VycmVudFBvcnQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAlwYWMgPSBwYWMucmVwbGFjZUFsbCgiXFwkTk9QUk9YWV9FWFRTXFwkIiwgIGRpc2FibGVBdXRvUHJveHkgPyAiIiA6IG5vUHJveHkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICAgICAgIAkgLnJlcGxhY2VBbGwoIlxcJEhUVFBfUFJPWFlcXCQiLCAgICBodHRwUHJveHkpIC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAJIC5yZXBsYWNlQWxsKCJcXCRIVFRQX0RJUkVDVFxcJCIsICAgZ2V0UHJveHlTdHJpbmcoZ2V0RGVmYXVsdFByb3h5KFBST1RDT0xfSFRUUCkpKSAvLyROT04tTkxTLTEkCi0JCSAgICAgICAgCSAucmVwbGFjZUFsbCgiXFwkSFRUUFNfRElSRUNUXFwkIiwgIGdldFByb3h5U3RyaW5nKGdldERlZmF1bHRQcm94eShQUk9UQ09MX0hUVFBTKSkpIC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAJIC5yZXBsYWNlQWxsKCJcXCRGVFBfRElSRUNUXFwkIiwgICAgZ2V0UHJveHlTdHJpbmcoZ2V0RGVmYXVsdFByb3h5KFBST1RDT0xfRlRQKSkpIC8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAJIC5yZXBsYWNlQWxsKCJcXCRHT1BIRVJfRElSRUNUXFwkIiwgZ2V0UHJveHlTdHJpbmcoZ2V0RGVmYXVsdFByb3h5KFBST1RDT0xfR09QSEVSKSkpOyAvLyROT04tTkxTLTEkCi0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYWMpOwotICAgICAgICAJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLSAgICAgICAgCXRyeSB7Ci0gICAgICAgICAgICAgICAgSVBhdGggcGFjUGF0aCA9IFByb3h5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKCJwcm94eS5wYWMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFjUGF0aC50b0ZpbGUoKSk7Ci0gICAgCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJd3JpdGVyLndyaXRlKHBhYyk7Ci0gICAgCQkJd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmaWxlOi8vIitwYWNQYXRoLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAJfQotICAgICAgICAJZmluYWxseSB7Ci0gICAgICAgIAkJaWYoIG51bGwgIT0gb3MgKSB7Ci0gICAgCQkJCXRyeSB7Ci0gICAgCQkJCQlvcy5jbG9zZSgpOwotICAgIAkJCQl9IAotICAgIAkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgIAkJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJveHlTdHJpbmcoU3RyaW5nIGRlZmF1bHRQcm94eSkgewotICAgIAlyZXR1cm4gbnVsbCAhPSBkZWZhdWx0UHJveHkgPyBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiUFJPWFkgezB9OyBESVJFQ1QiLCBuZXcgT2JqZWN0W117ZGVmYXVsdFByb3h5fSkgOiAiRElSRUNUIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkUGx1Z2luRmlsZShTdHJpbmcgcGF0aCkgewotICAgIAlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgCXRyeSB7Ci0gICAgICAgIAlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShQcm94eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aCkpOwotCQkJaXMgPSB1cmwub3BlblN0cmVhbSgpOwotCQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQljaGFyW10gYnVmZiA9IG5ldyBjaGFyWzQwOTZdOwotCQkJaW50IHJlc3VsdDsKLQkJCXdoaWxlKCAtMSAhPSAocmVzdWx0PXJlYWRlci5yZWFkKGJ1ZmYpKSApIHsKLQkJCQlzYi5hcHBlbmQoYnVmZiwgMCwgcmVzdWx0KTsKLQkJCX0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotICAgIAl9Ci0gICAgCWNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCX0KLSAgICAJZmluYWxseSB7Ci0gICAgCQlpZiggbnVsbCAhPSBpcyApIHsKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0gCi0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L1Byb3h5UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvUHJveHlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3YmIzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvUHJveHlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb25zLkRlbGV0ZUNhY2hlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkucHJlZmVyZW5jZXMuUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkudWkuQ2FjaGVDbGVhckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICBwcml2YXRlIHN0YXRpYyBQcm94eVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvLyBQcm94eSBtYW5hZ2VyCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlNYW5hZ2VyIHByb3h5TWFuYWdlciA9IG5ldyBQcm94eU1hbmFnZXIoKTsKLQotICAgIC8vIFByZWZlcmVuY2VzIGNoYW5nZSBsaXN0ZW5lcnMKLSAgICBwcml2YXRlIExpc3QgbGlzdGVuZXJzOwotCi0gICAgLy8gSW1hZ2VzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1BR0VfQ0xFQVIgPSBnZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2FjdGlvbjE2L2NsZWFyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFByb3h5UGx1Z2luKCkgewotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfUFJPWFlfVFlQRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1NXRl9NRVRIT0QuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9TV0ZfTUlOSU1VTV9WRVJTSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfVElNRU9VVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJveHlTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNldFByb3h5U2V0dGluZ3MoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0UHJveHlTZXR0aW5ncygpIHsKLSAgICAgICAgcHJveHlNYW5hZ2VyLnN0b3BQcm94eSgpOwotICAgICAgICBTdHJpbmcgcHJveHlUeXBlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1RZUEUpOwotICAgICAgICBpbnQgc3dmVmVyc2lvbiA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9TV0ZfTUlOSU1VTV9WRVJTSU9OKTsKLSAgICAgICAgaW50IHRpbWVvdXQgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfVElNRU9VVCk7Ci0gICAgICAgIGlmICghUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX05PTkUuZXF1YWxzKHByb3h5VHlwZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm94eVN3Zk1ldGhvZCA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9QUk9YWV9TV0ZfTUVUSE9EKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3dmQm9vdExvYWRlciA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBzd2ZUcmFuc2NvZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1NXRl9NRVRIT0RfQk9PVExPQURFUi5lcXVhbHMocHJveHlTd2ZNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgc3dmQm9vdExvYWRlciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9TV0ZfTUVUSE9EX1RSQU5TQ09ERVIuZXF1YWxzKHByb3h5U3dmTWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHN3ZlRyYW5zY29kZXIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJveHlNYW5hZ2VyLnN0YXJ0UHJveHkoMCwgc3dmVmVyc2lvbiwgdGltZW91dCAqIDEwMDAsIHN3ZkJvb3RMb2FkZXIsIHN3ZlRyYW5zY29kZXIpOwotCi0gICAgICAgIH0KLSAgICAgICAgcHJveHlNYW5hZ2VyLnNldEludGVybmV0T3B0aW9ucyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfR0xPQkFMLmVxdWFscyhwcm94eVR5cGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgICAgICBwcm94eU1hbmFnZXIuZGlzcG9zZSgpOwotICAgICAgICBsaXN0ZW5lcnMgPSBudWxsOwotICAgICAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb3h5UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogICAgICAgICAgICB0aGUgcGF0aAotICAgICAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eSIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgKChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKSkucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBpZiAobnVsbCA9PSBsaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNhY2hlQ2hlY2tlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIHZvaWQgY2hlY2tDYWNoZSgpIHsKLQotICAgICAgICBTdHJpbmcgc2V0dGluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUik7Ci0KLSAgICAgICAgYm9vbGVhbiBjbGVhckNhY2hlRmxhZyA9IHRydWUgJiYgIWNhY2hlQ2hlY2tlZDsKLQotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0gICAgICAgIGlmIChzZXR0aW5nLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9XSEVOX1NUQVJUVVApICYmICFjYWNoZUNoZWNrZWQpIHsKLQotICAgICAgICAgICAgQ2FjaGVDbGVhckRpYWxvZyBkaWFsb2cgPSBudWxsOwotCi0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgQ2FjaGVDbGVhckRpYWxvZyhzaGVsbCwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0ID0gZGlhbG9nLmdldFNlbGVjdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoc2VsZWN0LmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfQ0xFQVJfV0hFTl9TVEFSVFVQX0FORF9DQUNIRV9DTEVBUikpIHsKLSAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVApOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3QuZXF1YWxzKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DT05GSVJNX0FORF9DQUNIRV9DTEVBUikpIHsKLSAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DT05GSVJNX1dIRU5fU1RBUlRVUCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdC5lcXVhbHMoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTkZJUk1fQU5EX05PX09QRVJBVElPTikpIHsKLSAgICAgICAgICAgICAgICBnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DT05GSVJNX1dIRU5fU1RBUlRVUCk7Ci0gICAgICAgICAgICAgICAgY2xlYXJDYWNoZUZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5nLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfQ0xFQVJfV0hFTl9TVEFSVFVQKSAmJiBjYWNoZUNoZWNrZWQpIHsKLSAgICAgICAgICAgIGNsZWFyQ2FjaGVGbGFnID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZy5lcXVhbHMoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLk5PX0NBQ0hFX0NMRUFSKSkgewotICAgICAgICAgICAgY2xlYXJDYWNoZUZsYWcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGVhckNhY2hlRmxhZykgewotICAgICAgICAJY2xlYXJDYWNoZShmYWxzZSx3aW5kb3cpOwotLy8gICAgICAgICAgICBEZWxldGVDYWNoZUFjdGlvbiBkY2EgPSBuZXcgRGVsZXRlQ2FjaGVBY3Rpb24oKTsKLS8vICAgICAgICAgICAgZGNhLmluaXQod2luZG93KTsKLS8vICAgICAgICAgICAgZGNhLnJ1bihudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2FjaGVXaXRoQ2hlY2soKSB7Ci0KLSAgICAgICAgU3RyaW5nIHNldHRpbmcgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfQ0FDSEVfQ0xFQVIpOwotCi0gICAgICAgIGlmIChzZXR0aW5nLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfQ0xFQVJfV0hFTl9TVEFSVFVQKSkgewotICAgICAgICAJY2xlYXJDYWNoZShmYWxzZSxudWxsKTsKLS8vICAgICAgICAgICAgRGVsZXRlQ2FjaGVBY3Rpb24gZGNhID0gbmV3IERlbGV0ZUNhY2hlQWN0aW9uKCk7Ci0vLyAgICAgICAgICAgIGRjYS5ydW4obnVsbCk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHRlcm5hbCBpbnRlcmZhY2UgdG8gY2xlYXIgU1dGIGNhY2hlCi0gICAgICogQHBhcmFtIGJhY2tncm91bmQKLSAgICAgKiAgICAgYmFja2dyb3VuZCBwcm9jZXNzaW5nIGZsYWcKLSAgICAgKiBAcGFyYW0gd2luZG93IAotICAgICAqICAgICBhY3RpdmUgV29ya2JlbmNoV2luZG93IGZvciBwcm9ncmVzcyBkaWFsb2cuIAotICAgICAqICAgICB1c2UgbnVsbCBmb3Igc2lsZW50IG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDYWNoZShib29sZWFuIGJhY2tncm91bmQsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0gICAgICAgIERlbGV0ZUNhY2hlQWN0aW9uIGRjYSA9IG5ldyBEZWxldGVDYWNoZUFjdGlvbihiYWNrZ3JvdW5kKTsKLSAgICAgICAgZGNhLmluaXQod2luZG93KTsKLSAgICAgICAgZGNhLnJ1bihudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvUHJveHlTdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvUHJveHlTdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDZjNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L1Byb3h5U3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCi0gICAgcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgewotICAgICAgICBQcm94eVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvYWN0aW9ucy9EZWxldGVDYWNoZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2FjdGlvbnMvRGVsZXRlQ2FjaGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1OTJhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvYWN0aW9ucy9EZWxldGVDYWNoZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LlByb3h5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuV1NUUjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmludGVybmFsLldpbkluZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnVpLlByb2dyZXNzQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVDYWNoZUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAzMiAqIDEwMjQ7Ly8gNDA5NjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVWRVJfREVMRVRFID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJOT19ERUxFVEUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBib29sZWFuIGJhY2tncm91bmQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBEZWxldGVDYWNoZUFjdGlvbigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERlbGV0ZUNhY2hlQWN0aW9uKGJvb2xlYW4gYmFja2dyb3VuZCkgewotICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9ncmVzc0NvbnRyaWJ1dGlvbiBwYzsKLQotICAgIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb3h5UGx1Z2luLmNhY2hlQ2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nOwotCi0gICAgICAgICAgICBpZiAoYmFja2dyb3VuZCkgewotICAgICAgICAgICAgICAgIGluaXRQcm9ncmVzcygpOwotICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVDYWNoZUVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZFByb2dyZXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KS5zdGFydCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAod2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5ydW4odHJ1ZSwgdHJ1ZSwgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG90YWwgPSBjb3VudENhY2hlRW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuZGVsZXRpbmdfY2FjaGUiKSwgdG90YWwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2FjaGVFbnRyaWVzKG1vbml0b3IsIHRvdGFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2FjaGVFbnRyaWVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmVzcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFByb2dyZXNzQ29udHJpYnV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYyAhPSBudWxsICYmIG1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBjLnNldFRleHQoIkRlbGV0aW5nIEludGVybmV0IENhY2hlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRQcm9ncmVzc0NvbnRyaWJ1dGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gUHJvZ3Jlc3NDb250cmlidXRpb24uUFJPR1JFU1NfQ09OVFJJQlVUSU9OX0lEOwotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIElWaWV3UGFydCBwYXJ0ID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRWaWV3UmVmZXJlbmNlcygpWzBdLmdldFZpZXcoZmFsc2UpOwotICAgICAgICBJVmlld1NpdGUgdmlld1NpdGUgPSBwYXJ0LmdldFZpZXdTaXRlKCk7Ci0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSB2aWV3U2l0ZS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIG1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIHBjID0gKFByb2dyZXNzQ29udHJpYnV0aW9uKSBtYW5hZ2VyLmZpbmQoaWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmRQcm9ncmVzcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGMgIT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBjLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY291bnRDYWNoZUVudHJpZXMoKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDE7Ci0gICAgICAgIGludCBwQ2FjaGVFbnRyeSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBCVUZGRVJfU0laRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnRbXSBwU2l6ZSA9IG5ldyBpbnRbXSB7IEJVRkZFUl9TSVpFIH07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBDYWNoZUVudHJ5LCBwU2l6ZSwgNCk7Ci0gICAgICAgICAgICBpbnQgaEVudW0gPSBXaW5JbmV0LkZpbmRGaXJzdFVybENhY2hlRW50cnlXKDAsIHBDYWNoZUVudHJ5LCBwU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoMCAhPSBoRW51bSkgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludFtdIHBFbnRyaWVzID0gbmV3IGludFsyMF07Ci0gICAgICAgICAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocEVudHJpZXMsIHBDYWNoZUVudHJ5LCA0ICogcEVudHJpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gKHBFbnRyaWVzWzNdICYgMHgwMDMwMDAwMCkpIHsgLy8gU2tpcCBDb29raWUgJiBIaXN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxGaWxlTmFtZSA9IG5ldyBXU1RSKHBFbnRyaWVzWzJdKS5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2tpcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRmlsZU5hbWUuaW5kZXhPZignPycpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBsb2NhbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9IHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ID0gbG9jYWxGaWxlTmFtZS5zdWJzdHJpbmcocG9zICsgMSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IC0xICE9IE5FVkVSX0RFTEVURS5pbmRleE9mKCJ8IiArIGV4dCArICJ8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFNpemVbMF0gPSBCVUZGRVJfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFXaW5JbmV0LkZpbmROZXh0VXJsQ2FjaGVFbnRyeVcoaEVudW0sIHBDYWNoZUVudHJ5LCBwU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFdpbkluZXQuRmluZENsb3NlVXJsQ2FjaGUoaEVudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgT1MuR2xvYmFsRnJlZShwQ2FjaGVFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVDYWNoZUVudHJpZXMoKSB7Ci0gICAgICAgIGRlbGV0ZUNhY2hlRW50cmllcyhudWxsLCAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlQ2FjaGVFbnRyaWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRvdGFsKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgaW50IHBDYWNoZUVudHJ5ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludFtdIHBTaXplID0gbmV3IGludFtdIHsgQlVGRkVSX1NJWkUgfTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocENhY2hlRW50cnksIHBTaXplLCA0KTsKLSAgICAgICAgICAgIGludCBoRW51bSA9IFdpbkluZXQuRmluZEZpcnN0VXJsQ2FjaGVFbnRyeVcoMCwgcENhY2hlRW50cnksIHBTaXplKTsKLSAgICAgICAgICAgIGlmICgwICE9IGhFbnVtKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50W10gcEVudHJpZXMgPSBuZXcgaW50WzIwXTsKLSAgICAgICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwRW50cmllcywgcENhY2hlRW50cnksIDQgKiBwRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSAocEVudHJpZXNbM10gJiAweDAwMzAwMDAwKSkgeyAvLyBTa2lwIENvb2tpZSAmIEhpc3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbEZpbGVOYW1lID0gbmV3IFdTVFIocEVudHJpZXNbMl0pLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBza2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxGaWxlTmFtZS5pbmRleE9mKCc/JykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGxvY2FsRmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT0gcG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSBsb2NhbEZpbGVOYW1lLnN1YnN0cmluZyhwb3MgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gLTEgIT0gTkVWRVJfREVMRVRFLmluZGV4T2YoInwiICsgZXh0ICsgInwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKCBza2lwICkgU3lzdGVtLm91dC5wcmludChleHQrInwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU1RSIHdzU291cmNlVXJsTmFtZSA9IG5ldyBXU1RSKHBFbnRyaWVzWzFdKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zdWJUYXNrKHdzU291cmNlVXJsTmFtZS5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRGVsZXRlOiAiICsgbG9jYWxGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5JbmV0LkRlbGV0ZVVybENhY2hlRW50cnlXKHdzU291cmNlVXJsTmFtZS5nZXRBZGRyZXNzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmQgJiYgdG90YWw+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQcm9ncmVzcyhjb3VudCAqIDEwMCAvIHRvdGFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFNpemVbMF0gPSBCVUZGRVJfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFXaW5JbmV0LkZpbmROZXh0VXJsQ2FjaGVFbnRyeVcoaEVudW0sIHBDYWNoZUVudHJ5LCBwU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFdpbkluZXQuRmluZENsb3NlVXJsQ2FjaGUoaEVudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgT1MuR2xvYmFsRnJlZShwQ2FjaGVFbnRyeSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VQcm9ncmVzcyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAocGMgIT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGMuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2FjdGlvbnMvT3BlblByZWZlcmVuY2VzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvYWN0aW9ucy9PcGVuUHJlZmVyZW5jZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5MDNhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvYWN0aW9ucy9PcGVuUHJlZmVyZW5jZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotCi0KLQotcHVibGljIGNsYXNzIE9wZW5QcmVmZXJlbmNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLSAgICBJVmlld1BhcnQgdmlldzsKLQotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBQcmVmZXJlbmNlc1V0aWwKLSAgICAgICAgLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbih2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpLCAib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VQYWdlIiwgbnVsbCwgbnVsbCkKLSAgICAgICAgLm9wZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0gICAgICAgIHRoaXMudmlldyA9IHZpZXc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTA0MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2ludGVybmFsL0lOVEVSTkVUX1BFUl9DT05OX09QVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi0KLQotcHVibGljIGNsYXNzIElOVEVSTkVUX1BFUl9DT05OX09QVElPTiB7Ci0gICAgcHVibGljIGludCBkd09wdGlvbjsgICAgIAotICAgIHB1YmxpYyBpbnQgZHdWYWx1ZTsKLSAgICBwdWJsaWMgV1NUUiBzdHJWYWx1ZSA9IG5ldyBXU1RSKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2l6ZW9mID0gMTI7IC8vICs0IGZvciBGSUxFVElNRQotICAgIAotICAgIC8vCi0gICAgLy8gIE9wdGlvbnMgdXNlZCBpbiBJTlRFUk5FVF9QRVJfQ09OTl9PUFRPTiBzdHJ1Y3QKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX1BST1hZX1NFUlZFUiAgICAgICAgICAgICAgICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX1BST1hZX0JZUEFTUyAgICAgICAgICAgICAgICAgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfVVJMICAgICAgICAgICAgICAgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0FVVE9ESVNDT1ZFUllfRkxBR1MgICAgICAgICAgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfU0VDT05EQVJZX1VSTCAgICAgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfUkVMT0FEX0RFTEFZX01JTlMgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVElNRSAgPSA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVVJMICAgPSA5OwotCi0gICAgLy8KLSAgICAvLyAgICAgUEVSX0NPTk5fRkxBR1MKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1hZX1RZUEVfRElSRUNUICAgICAgICAgPSAweDAwMDAwMDAxOyAgIC8vIGRpcmVjdCB0byBuZXQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9YWV9UWVBFX1BST1hZICAgICAgICAgID0gMHgwMDAwMDAwMjsgICAvLyB2aWEgbmFtZWQgcHJveHkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9YWV9UWVBFX0FVVE9fUFJPWFlfVVJMID0gMHgwMDAwMDAwNDsgICAvLyBhdXRvcHJveHkgVVJMCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPWFlfVFlQRV9BVVRPX0RFVEVDVCAgICA9IDB4MDAwMDAwMDg7ICAgLy8gdXNlIGF1dG9wcm94eSBkZXRlY3Rpb24KLQotICAgIC8vCi0gICAgLy8gVHlwZSBvZiB2YWx1ZQotICAgIC8vCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0lOVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1NUUklORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0ZJTEVUSU1FID0gMjsKLQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldERhdGEoaW50IHBEYXRhKSB7Ci0gICAgICAgIGlmKCAwICE9IHBEYXRhICkgewotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwRGF0YSxuZXcgaW50W117ZHdPcHRpb24sMCwwfSw0KjMpOwotICAgICAgICAgICAgc3dpdGNoKCBnZXRWYWx1ZVR5cGUoKSApIHsKLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwRGF0YSs0LG5ldyBpbnRbXXtkd1ZhbHVlfSw0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBWQUxVRV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocERhdGErNCwgbmV3IGludFtdIHtzdHJWYWx1ZS5nZXRBZGRyZXNzKCl9LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgcERhdGEpIHsKLSAgICAgICAgaWYoIDAgIT0gcERhdGEgKSB7Ci0gICAgICAgICAgICBpbnRbXSBwT3B0aW9uID0gbmV3IGludFszXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocE9wdGlvbixwRGF0YSw0KnBPcHRpb24ubGVuZ3RoKTsKLSAgICAgICAgICAgIGR3T3B0aW9uID0gcE9wdGlvblswXTsKLSAgICAgICAgICAgIHN3aXRjaCggZ2V0VmFsdWVUeXBlKCkgKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBWQUxVRV9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGR3VmFsdWUgPSBwT3B0aW9uWzFdOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFX1NUUklORzoKLSAgICAgICAgICAgICAgICAgICAgc3RyVmFsdWUuc2V0RGF0YShwT3B0aW9uWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3RyVmFsdWUuZGlzcG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRWYWx1ZVR5cGUoKSB7Ci0gICAgICAgIHN3aXRjaCggZHdPcHRpb24gKSB7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOgotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPRElTQ09WRVJZX0ZMQUdTOgotICAgICAgICAgICAgICAgIHJldHVybiBWQUxVRV9JTlQ7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX1BST1hZX1NFUlZFUjoKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfQllQQVNTOgotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1VSTDoKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19TRUNPTkRBUllfVVJMOgotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1JFTE9BRF9ERUxBWV9NSU5TOgotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX0xBU1RfREVURUNUX1VSTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVkFMVUVfU1RSSU5HOwotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX0xBU1RfREVURUNUX1RJTUU6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkd09wdGlvbiAiK2R3T3B0aW9uKyIgaXMgbm90IHN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICByZXR1cm4gVkFMVUVfRklMRVRJTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgczsKLSAgICAgICAgc3dpdGNoKCBkd09wdGlvbiApIHsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fRkxBR1M6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9GTEFHUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfU0VSVkVSOgotICAgICAgICAgICAgICAgIHMgPSAiSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfU0VSVkVSIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1M6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1MiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfVVJMOgotICAgICAgICAgICAgICAgIHMgPSAiSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19VUkwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9ESVNDT1ZFUllfRkxBR1M6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9BVVRPRElTQ09WRVJZX0ZMQUdTIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1NFQ09OREFSWV9VUkw6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1NFQ09OREFSWV9VUkwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfUkVMT0FEX0RFTEFZX01JTlM6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1JFTE9BRF9ERUxBWV9NSU5TIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX0xBU1RfREVURUNUX1RJTUU6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX0xBU1RfREVURUNUX1RJTUUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVVJMOgotICAgICAgICAgICAgICAgIHMgPSAiSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19MQVNUX0RFVEVDVF9VUkwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHMgPSAiSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OOiBkd09wdGlvbj0iK2R3T3B0aW9uOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoKCBnZXRWYWx1ZVR5cGUoKSApIHsKLSAgICAgICAgICAgIGNhc2UgVkFMVUVfSU5UOgotICAgICAgICAgICAgICAgIHMgKz0gIiBkd1ZhbHVlPSIrZHdWYWx1ZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBWQUxVRV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcyArPSAiIHN0clZhbHVlPSIrc3RyVmFsdWUuZ2V0U3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMzNGFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1QgewotICAgIHB1YmxpYyBXU1RSICAgd3NDb25uZWN0aW9uID0gbmV3IFdTVFIoKTsgIC8vIGNvbm5lY3Rpb24gbmFtZSB0byBzZXQvcXVlcnkgcGVyQ29ubk9wdGlvbnMKLSAgICBwdWJsaWMgaW50ICAgIGR3T3B0aW9uQ291bnQgPSAwOyAvLyBudW1iZXIgb2YgcGVyQ29ubk9wdGlvbnMgdG8gc2V0L3F1ZXJ5Ci0gICAgcHVibGljIGludCAgICBkd09wdGlvbkVycm9yID0gMDsgLy8gb24gZXJyb3IsIHdoaWNoIG9wdGlvbiBmYWlsZWQKLSAgICBwdWJsaWMgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OW10gcGVyQ29ubk9wdGlvbnMgPSBudWxsOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDIwOwotICAgIAotICAgIHByaXZhdGUgaW50IG9wdGlvbnNBZGRyZXNzOwotICAgIAotICAgIHB1YmxpYyBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVChpbnQgb3B0aW9uQ291bnQpIHsKLSAgICAgICAgZHdPcHRpb25Db3VudCA9IG9wdGlvbkNvdW50OwotICAgICAgICBwZXJDb25uT3B0aW9ucyA9IG5ldyBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05bZHdPcHRpb25Db3VudF07Ci0gICAgICAgIGZvciggaW50IGk9MDsgaTxwZXJDb25uT3B0aW9ucy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgIHBlckNvbm5PcHRpb25zW2ldID0gbmV3IElOVEVSTkVUX1BFUl9DT05OX09QVElPTigpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGdldERhdGEoaW50IHBEYXRhKSB7Ci0gICAgICAgIGlmKCAwICE9IHBEYXRhICkgewotICAgICAgICAgICAgaWYoIDAgPT0gb3B0aW9uc0FkZHJlc3MgKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uc0FkZHJlc3MgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLnNpemVvZipkd09wdGlvbkNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCBudWxsICE9IHBlckNvbm5PcHRpb25zICkgewotICAgICAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxwZXJDb25uT3B0aW9ucy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyQ29ubk9wdGlvbnNbaV0uZ2V0RGF0YShvcHRpb25zQWRkcmVzcytJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uc2l6ZW9mKmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocERhdGEsbmV3IGludFtde3NpemVvZix3c0Nvbm5lY3Rpb24uZ2V0QWRkcmVzcygpLGR3T3B0aW9uQ291bnQsZHdPcHRpb25FcnJvcixvcHRpb25zQWRkcmVzc30sNCo1KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGludCBwRGF0YSkgewotICAgICAgICBpZiggMCAhPSBwRGF0YSApIHsKLSAgICAgICAgICAgIGludFtdIHBMaXN0ID0gbmV3IGludFs1XTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocExpc3QscERhdGEsNCpwTGlzdC5sZW5ndGgpOwotICAgICAgICAgICAgaWYoIHNpemVvZiA9PSBwTGlzdFswXSApIHsKLSAgICAgICAgICAgICAgICB3c0Nvbm5lY3Rpb24uc2V0RGF0YShwTGlzdFsxXSk7Ci0gICAgICAgICAgICAgICAgZHdPcHRpb25Db3VudCA9IHBMaXN0WzJdOwotICAgICAgICAgICAgICAgIGR3T3B0aW9uRXJyb3IgPSBwTGlzdFszXTsKLSAgICAgICAgICAgICAgICBvcHRpb25zQWRkcmVzcyA9IHBMaXN0WzRdOwotICAgICAgICAgICAgICAgIGlmKCBudWxsICE9IHBlckNvbm5PcHRpb25zICkgewotICAgICAgICAgICAgICAgICAgICBpZiggcGVyQ29ubk9wdGlvbnMubGVuZ3RoID09ZHdPcHRpb25Db3VudCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxwZXJDb25uT3B0aW9ucy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJDb25uT3B0aW9uc1tpXS5zZXREYXRhKG9wdGlvbnNBZGRyZXNzK0lOVEVSTkVUX1BFUl9DT05OX09QVElPTi5zaXplb2YqaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgd3NDb25uZWN0aW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgaWYoIG51bGwgIT0gcGVyQ29ubk9wdGlvbnMgKSB7Ci0gICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8cGVyQ29ubk9wdGlvbnMubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgcGVyQ29ubk9wdGlvbnNbaV0uZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGVyQ29ubk9wdGlvbnMgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmKCAwICE9IG9wdGlvbnNBZGRyZXNzICkgewotICAgICAgICAgICAgT1MuR2xvYmFsRnJlZShvcHRpb25zQWRkcmVzcyk7Ci0gICAgICAgICAgICBvcHRpb25zQWRkcmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvV1NUUi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2ludGVybmFsL1dTVFIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkYmQ3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvV1NUUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLQotCi1wdWJsaWMgY2xhc3MgV1NUUiB7Ci0KLSAgICBwcml2YXRlIGludCBhZGRyZXNzID0gMDsKLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmcgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBXU1RSKCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgV1NUUihTdHJpbmcgbmV3U3RyaW5nKSB7Ci0gICAgICAgIHNldFN0cmluZyhuZXdTdHJpbmcpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgV1NUUihpbnQgbmV3QWRkcmVzcykgewotICAgICAgICBzZXREYXRhKG5ld0FkZHJlc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld1N0cmluZykgewotICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgIHN0cmluZyA9IG5ld1N0cmluZzsKLSAgICAgICAgaWYoIG51bGwgIT0gc3RyaW5nICkgewotICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IChzdHJpbmcgKyAiXDAiKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBhZGRyZXNzID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsYnVmZmVyLmxlbmd0aCoyKTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkoYWRkcmVzcyxidWZmZXIsYnVmZmVyLmxlbmd0aCoyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgbmV3QWRkcmVzcykgewotICAgICAgICBpZiggYWRkcmVzcyAhPSBuZXdBZGRyZXNzICkgewotICAgICAgICAgICAgZGlzcG9zZSgpOwotICAgICAgICAgICAgYWRkcmVzcyA9IG5ld0FkZHJlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nID0gbnVsbDsKLSAgICAgICAgaWYoIDAgIT0gYWRkcmVzcyApIHsKLSAgICAgICAgICAgIGludCBzaXplID0gT1Mud2NzbGVuKGFkZHJlc3MpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW3NpemVdOwotICAgICAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkoYnVmZmVyLCBhZGRyZXNzLCBzaXplKjIpOwotICAgICAgICAgICAgICAgIHN0cmluZyA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYoIDAgIT0gYWRkcmVzcyApIHsKLSAgICAgICAgICAgIE9TLkdsb2JhbEZyZWUoYWRkcmVzcyk7Ci0gICAgICAgICAgICBhZGRyZXNzID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9XaW5JbmV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvV2luSW5ldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNkYWYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9XaW5JbmV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWw7Ci0KLQotcHVibGljIGNsYXNzIFdpbkluZXQgewotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vCi0gICAgLy8gIGFjY2VzcyB0eXBlcyBmb3IgSW50ZXJuZXRPcGVuKCkKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QRU5fVFlQRV9QUkVDT05GSUcgICAgICAgICAgICAgICAgICAgPSAwOyAgIC8vIHVzZSByZWdpc3RyeSBjb25maWd1cmF0aW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BFTl9UWVBFX0RJUkVDVCAgICAgICAgICAgICAgICAgICAgICA9IDE7ICAgLy8gZGlyZWN0IHRvIG5ldAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QRU5fVFlQRV9QUk9YWSAgICAgICAgICAgICAgICAgICAgICAgPSAzOyAgIC8vIHZpYSBuYW1lZCBwcm94eQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QRU5fVFlQRV9QUkVDT05GSUdfV0lUSF9OT19BVVRPUFJPWFkgPSA0OyAgIC8vIHByZXZlbnQgdXNpbmcgamF2YS9zY3JpcHQvSU5TCi0KLSAgICAvLwotICAgIC8vICBwZXJDb25uT3B0aW9ucyBtYW5pZmVzdHMgZm9yIEludGVybmV0e1F1ZXJ5fFNldH1PcHRpb24KLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DQUxMQkFDSyAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfVElNRU9VVCAgICAgICAgID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9SRVRSSUVTICAgICAgICAgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT05ORUNUX0JBQ0tPRkYgICAgICAgICA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFTkRfVElNRU9VVCAgICAgICAgICAgID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09OVFJPTF9TRU5EX1RJTUVPVVQgICAgPSBJTlRFUk5FVF9PUFRJT05fU0VORF9USU1FT1VUOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RJTUVPVVQgICAgICAgICA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTlRST0xfUkVDRUlWRV9USU1FT1VUID0gSU5URVJORVRfT1BUSU9OX1JFQ0VJVkVfVElNRU9VVDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fREFUQV9TRU5EX1RJTUVPVVQgICAgICAgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9EQVRBX1JFQ0VJVkVfVElNRU9VVCAgICA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0hBTkRMRV9UWVBFICAgICAgICAgICAgID0gOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fTElTVEVOX1RJTUVPVVQgICAgICAgICAgPSAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUkVBRF9CVUZGRVJfU0laRSAgICAgICAgPSAxMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fV1JJVEVfQlVGRkVSX1NJWkUgICAgICAgPSAxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQVNZTkNfSUQgICAgICAgICAgICAgICAgPSAxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQVNZTkNfUFJJT1JJVFkgICAgICAgICAgPSAxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUEFSRU5UX0hBTkRMRSAgICAgICAgICAgPSAyMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fS0VFUF9DT05ORUNUSU9OICAgICAgICAgPSAyMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUkVRVUVTVF9GTEFHUyAgICAgICAgICAgPSAyMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fRVhURU5ERURfRVJST1IgICAgICAgICAgPSAyNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fT0ZGTElORV9NT0RFICAgICAgICAgICAgPSAyNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ0FDSEVfU1RSRUFNX0hBTkRMRSAgICAgPSAyNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fVVNFUk5BTUUgICAgICAgICAgICAgICAgPSAyODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUEFTU1dPUkQgICAgICAgICAgICAgICAgPSAyOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQVNZTkMgICAgICAgICAgICAgICAgICAgPSAzMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfRkxBR1MgICAgICAgICAgPSAzMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfQ0VSVElGSUNBVEVfU1RSVUNUID0gMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0RBVEFGSUxFX05BTUUgICAgICAgICAgID0gMzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1VSTCAgICAgICAgICAgICAgICAgICAgID0gMzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0NFUlRJRklDQVRFICAgID0gMzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0tFWV9CSVRORVNTICAgID0gMzY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1JFRlJFU0ggICAgICAgICAgICAgICAgID0gMzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1BST1hZICAgICAgICAgICAgICAgICAgID0gMzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFVFRJTkdTX0NIQU5HRUQgICAgICAgID0gMzk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1ZFUlNJT04gICAgICAgICAgICAgICAgID0gNDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1VTRVJfQUdFTlQgICAgICAgICAgICAgID0gNDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0VORF9CUk9XU0VSX1NFU1NJT04gICAgID0gNDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1BST1hZX1VTRVJOQU1FICAgICAgICAgID0gNDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1BST1hZX1BBU1NXT1JEICAgICAgICAgID0gNDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTlRFWFRfVkFMVUUgICAgICAgICAgID0gNDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfTElNSVQgICAgICAgICAgID0gNDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX1NFTEVDVF9DTElFTlRfQ0VSVCA9IDQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9QT0xJQ1kgICAgICAgICAgICAgICAgICA9IDQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9ESVNDT05ORUNURURfVElNRU9VVCAgICA9IDQ5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT05ORUNURURfU1RBVEUgICAgICAgICA9IDUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9JRExFX1NUQVRFICAgICAgICAgICAgICA9IDUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9PRkZMSU5FX1NFTUFOVElDUyAgICAgICA9IDUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TRUNPTkRBUllfQ0FDSEVfS0VZICAgICA9IDUzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DQUxMQkFDS19GSUxURVIgICAgICAgICA9IDU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT05ORUNUX1RJTUUgICAgICAgICAgICA9IDU1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TRU5EX1RIUk9VR0hQVVQgICAgICAgICA9IDU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RIUk9VR0hQVVQgICAgICA9IDU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRVFVRVNUX1BSSU9SSVRZICAgICAgICA9IDU4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9IVFRQX1ZFUlNJT04gICAgICAgICAgICA9IDU5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRVNFVF9VUkxDQUNIRV9TRVNTSU9OICA9IDYwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9FUlJPUl9NQVNLICAgICAgICAgICAgICA9IDYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9GUk9NX0NBQ0hFX1RJTUVPVVQgICAgICA9IDYzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9CWVBBU1NfRURJVEVEX0VOVFJZICAgICA9IDY0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9ESUFHTk9TVElDX1NPQ0tFVF9JTkZPICA9IDY3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT0RFUEFHRSAgICAgICAgICAgICAgICA9IDY4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DQUNIRV9USU1FU1RBTVBTICAgICAgICA9IDY5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9ESVNBQkxFX0FVVE9ESUFMICAgICAgICA9IDcwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9NQVhfQ09OTlNfUEVSX1NFUlZFUiAgICA9IDczOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9NQVhfQ09OTlNfUEVSXzFfMF9TRVJWRVIgPSA3NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUEVSX0NPTk5FQ1RJT05fT1BUSU9OICAgPSA3NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fRElHRVNUX0FVVEhfVU5MT0FEICAgICAgPSA3NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fSUdOT1JFX09GRkxJTkUgICAgICAgICAgPSA3NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fSURFTlRJVFkgICAgICAgICAgICAgICAgPSA3ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUkVNT1ZFX0lERU5USVRZICAgICAgICAgPSA3OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQUxURVJfSURFTlRJVFkgICAgICAgICAgPSA4MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU1VQUFJFU1NfQkVIQVZJT1IgICAgICAgPSA4MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQVVUT0RJQUxfTU9ERSAgICAgICAgICAgPSA4MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQVVUT0RJQUxfQ09OTkVDVElPTiAgICAgPSA4MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ0xJRU5UX0NFUlRfQ09OVEVYVCAgICAgPSA4NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQVVUSF9GTEFHUyAgICAgICAgICAgICAgPSA4NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09PS0lFU18zUkRfUEFSVFkgICAgICAgPSA4NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fRElTQUJMRV9QQVNTUE9SVF9BVVRIICAgPSA4NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VORF9VVEY4X1NFUlZFUk5BTUVfVE9fUFJPWFkgPSA4ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fRVhFTVBUX0NPTk5FQ1RJT05fTElNSVQgPSA4OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fRU5BQkxFX1BBU1NQT1JUX0FVVEggICAgPSA5MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fSElCRVJOQVRFX0lOQUNUSVZFX1dPUktFUl9USFJFQURTID0gOTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0FDVElWQVRFX1dPUktFUl9USFJFQURTID0gOTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1JFU1RPUkVfV09SS0VSX1RIUkVBRF9ERUZBVUxUUyA9IDkzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TT0NLRVRfU0VORF9CVUZGRVJfTEVOR1RIID0gOTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1BST1hZX1NFVFRJTkdTX0NIQU5HRUQgID0gOTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0RBVEFGSUxFX0VYVCAgICAgICAgICAgID0gOTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfRklSU1RfT1BUSU9OICAgICAgICAgICAgICAgICAgID0gSU5URVJORVRfT1BUSU9OX0NBTExCQUNLOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX0xBU1RfT1BUSU9OICAgICAgICAgICAgICAgICAgICA9IElOVEVSTkVUX09QVElPTl9EQVRBRklMRV9FWFQ7Ci0KLSAgICAvKiogTmF0aXZlcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBJbnRlcm5ldE9wZW5XKGludCBscHN6QWdlbnQsIGludCBkd0FjY2Vzc1R5cGUsIGludCBscHN6UHJveHksIGludCBscHN6UHJveHlCeXBhc3MsIGludCBkd0ZsYWdzKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIEludGVybmV0Q2xvc2VIYW5kbGUoaW50IGhJbnRlcm5ldCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBJbnRlcm5ldFNldE9wdGlvblcoaW50IGhJbnRlcm5ldCwgaW50IGR3T3B0aW9uLCBpbnQgbHBCdWZmZXIsIGludCBkd0J1ZmZlckxlbmd0aCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBJbnRlcm5ldFF1ZXJ5T3B0aW9uVyhpbnQgaEludGVybmV0LCBpbnQgZHdPcHRpb24sIGludCBscEJ1ZmZlciwgaW50W10gbHBkd0J1ZmZlckxlbmd0aCk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEZpbmRGaXJzdFVybENhY2hlRW50cnlXKGludCBscHN6VXJsU2VhcmNoUGF0dGVybixpbnQgbHBGaXJzdENhY2hlRW50cnlJbmZvLCBpbnRbXSBscGNiQ2FjaGVFbnRyeUluZm8pOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gRmluZE5leHRVcmxDYWNoZUVudHJ5VyhpbnQgaEVudW1IYW5kbGUsaW50IGxwTmV4dENhY2hlRW50cnlJbmZvLGludFtdIGxwY2JDYWNoZUVudHJ5SW5mbyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBGaW5kQ2xvc2VVcmxDYWNoZShpbnQgaEVudW1IYW5kbGUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gRGVsZXRlVXJsQ2FjaGVFbnRyeVcoaW50IGxwc3pVcmxOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2xvZ3MvUHJveHlMb2dIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzY2U3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5sb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS52aWV3cy5Qcm94eUxvZ1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLQotcHVibGljIGNsYXNzIFByb3h5TG9nSGFuZGxlciBleHRlbmRzIENvbnNvbGVIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgbG9nUmVjb3JkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4UmVjb3JkQ291bnQgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcigiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIERpc3BsYXkgZGlzcGxheSA9IFByb3h5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGV2ZWwgbG9nTGV2ZWwgPSBMZXZlbC5JTkZPOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGNvbnNvbGUgaGFuZGxlciAKLSAgICAgICAgSGFuZGxlcltdIGhhbmRsZXJzID0gbG9nZ2VyLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgIGZvciggaW50IGk9MDsgaTxoYW5kbGVycy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgIGlmKCBoYW5kbGVyc1tpXSBpbnN0YW5jZW9mIENvbnNvbGVIYW5kbGVyICkgewotICAgICAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXJzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoaXMgY2xhc3MKLSAgICAgICAgaWYoIG51bGwgPT0gaGFuZGxlciApIHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgUHJveHlMb2dIYW5kbGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGp1c3QgbG9nZ2luZyBsZXZlbAotICAgICAgICBzZXRMb2dMZXZlbChsb2dMZXZlbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVIYW5kbGVyKCkgewotICAgICAgICBpZiggbnVsbCAhPSBoYW5kbGVyICkgewotICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHVibGlzaChMb2dSZWNvcmQgcmVjb3JkKSB7Ci0vLyAgICAgICAgc3VwZXIucHVibGlzaChyZWNvcmQpOwotICAgICAgICBpZiAoIWlzTG9nZ2FibGUocmVjb3JkKSB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBMb2dSZWNvcmQgdG8gdGhlIGxpc3QKLSAgICAgICAgd2hpbGUoIGxvZ1JlY29yZExpc3Quc2l6ZSgpID49IG1heFJlY29yZENvdW50ICkgewotICAgICAgICAgICAgbG9nUmVjb3JkTGlzdC5yZW1vdmUoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVjb3JkTGlzdC5hZGQobmV3IFByb3h5TG9nUmVjb3JkKHJlY29yZCkpOwotICAgICAgICAKLSAgICAgICAgLy8gUmVmcmVzaCBsb2cgdmlldwotICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYoIG51bGwgPT0gd2luZG93ICkgcmV0dXJuOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgIGlmKCBudWxsICE9IHBhZ2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhQcm94eUxvZ1ZpZXcuSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiggcGFydCBpbnN0YW5jZW9mIFByb3h5TG9nVmlldyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJveHlMb2dWaWV3KXBhcnQpLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMb2dzKCkgewotICAgICAgICByZXR1cm4gbG9nUmVjb3JkTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBsb2dSZWNvcmRMaXN0LmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2dMZXZlbChMZXZlbCBuZXdMZXZlbCkgewotICAgICAgICBsb2dMZXZlbCA9IG5ld0xldmVsOwotICAgICAgICBpZiggbnVsbCAhPSBoYW5kbGVyICkgewotICAgICAgICAgICAgaGFuZGxlci5zZXRMZXZlbChsb2dMZXZlbCk7Ci0gICAgICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobG9nTGV2ZWwpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldExvZ0xldmVsKCkgewotICAgIAlzZXRMb2dMZXZlbChsb2dMZXZlbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXhMb2dDb3VudChpbnQgbWF4Q291bnQpIHsKLSAgICAgICAgbWF4UmVjb3JkQ291bnQgPSBtYXhDb3VudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4TG9nQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtYXhSZWNvcmRDb3VudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ1JlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2xvZ3MvUHJveHlMb2dSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiZWIyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ1JlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkubG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQcm94eUxvZ1JlY29yZCB7Ci0KLSAgICBwcml2YXRlIGxvbmcgbWlsbGlzOwotICAgIHByaXZhdGUgTGV2ZWwgbGV2ZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2dnZXJOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiLShcXGQrKToiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcW2lkOihcXGQrKVxcXSAoLiopIik7Ci0gICAgCi0gICAgcHVibGljIFByb3h5TG9nUmVjb3JkKExvZ1JlY29yZCByZWNvcmQpIHsKLSAgICAgICAgbWlsbGlzID0gcmVjb3JkLmdldE1pbGxpcygpOwotICAgICAgICBsZXZlbCA9IHJlY29yZC5nZXRMZXZlbCgpOwotICAgICAgICBsb2dnZXJOYW1lID0gcmVjb3JkLmdldExvZ2dlck5hbWUoKTsKLSAgICAgICAgbWVzc2FnZSA9IHJlY29yZC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlkID0gIiI7Ci0gICAgICAgIGlmKCBudWxsICE9IG1lc3NhZ2UgKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobWVzc2FnZSk7Ci0gICAgICAgICAgICBpZiggbWF0Y2hlci5maW5kKCkgKSB7Ci0gICAgICAgICAgICAgICAgaWQ9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgLy8gbWVzc2FnZSA9IG1hdGNoZXIucmVwbGFjZUZpcnN0KCI6Iik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZT1tYXRjaGVyLmdyb3VwKDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIG1lc3NhZ2UubGVuZ3RoKCk+MjU2ICkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnN1YnN0cmluZygwLDI1NikrIi4uLiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXMoKSB7Ci0gICAgICAgIHJldHVybiBtaWxsaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMZXZlbCBnZXRMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIGxldmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nZ2VyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvZ2dlck5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE5ZGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9wcmVmZXJlbmNlcy9Qcm94eVByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LnByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfUFJPWFlfVFlQRSA9ICJQcm94eVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9OT05FID0gIlBST1hZX05PTkUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU0VTU0lPTiA9ICJQUk9YWV9TRVNTSU9OIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0dMT0JBTCA9ICJQUk9YWV9HTE9CQUwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BST1hZX1NXRl9NRVRIT0QgPSAiUHJveHlTV0ZNZXRob2QiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU1dGX01FVEhPRF9OT05FID0gIlBST1hZX1NXRl9NRVRIT0RfTk9ORSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9TV0ZfTUVUSE9EX0JPT1RMT0FERVIgPSAiUFJPWFlfU1dGX01FVEhPRF9CT09UTE9BREVSIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NXRl9NRVRIT0RfVFJBTlNDT0RFUiA9ICJQUk9YWV9TV0ZfTUVUSE9EX1RSQU5TQ09ERVIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TV0ZfTUlOSU1VTV9WRVJTSU9OID0gIlNXRk1pbmltdW1WZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVElNRU9VVCA9ICJUaW1lb3V0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DQUNIRV9DTEVBUiA9ICJDYWNoZUNsZWFyTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUCA9ICJDQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSVJNX1dIRU5fU1RBUlRVUCA9ICJDT05GSVJNX1dIRU5fU1RBUlRVUCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DQUNIRV9DTEVBUiA9ICJOT19DQUNIRV9DTEVBUiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSVJNX0FORF9DQUNIRV9DTEVBUiA9ICJDT05GSVJNX0FORF9DQUNIRV9DTEVBUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJUk1fQU5EX05PX09QRVJBVElPTiA9ICJDT05GSVJNX0FORF9OT19PUEVSQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVBfQU5EX0NBQ0hFX0NMRUFSID0gIkNBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUF9BTkRfQ0FDSEVfQ0xFQVIiOwotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvcHJlZmVyZW5jZXMvUHJveHlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MmM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvcHJlZmVyZW5jZXMvUHJveHlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcm94eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfUFJPWFlfVFlQRSxQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU0VTU0lPTik7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfUFJPWFlfU1dGX01FVEhPRCxQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU1dGX01FVEhPRF9CT09UTE9BREVSKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9TV0ZfTUlOSU1VTV9WRVJTSU9OLDUpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1RJTUVPVVQsMzApOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX0NBQ0hFX0NMRUFSLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9XSEVOX1NUQVJUVVApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9wcmVmZXJlbmNlcy9Qcm94eVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlY2NkYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkludGVnZXJGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlJhZGlvR3JvdXBGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgICBwcml2YXRlIExpc3QgZ3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHByb3RlY3RlZCBHcm91cCBjcmVhdGVGaWVsZEdyb3VwKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGdldEZpZWxkRWRpdG9yUGFyZW50KCksU1dULk5PTkUpOwotICAgICAgICBpZiggbnVsbCAhPSBuYW1lICkgewotICAgICAgICAgICAgZ3JvdXAuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOwotICAgICAgICByZXR1cm4gZ3JvdXA7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkanVzdEdyaWRMYXlvdXQoKSB7Ci0gICAgICAgIHN1cGVyLmFkanVzdEdyaWRMYXlvdXQoKTsKLSAgICAgICAgaW50IG51bUNvbHVtbnMgPSAoKEdyaWRMYXlvdXQpZ2V0RmllbGRFZGl0b3JQYXJlbnQoKS5nZXRMYXlvdXQoKSkubnVtQ29sdW1uczsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPCBncm91cHMuc2l6ZSgpOyBpKysgKSB7Ci0gICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cClncm91cHMuZ2V0KGkpOwotICAgICAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dClncm91cC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIEdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpZ3JvdXAuZ2V0TGF5b3V0RGF0YSgpOyAKLSAgICAgICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICAgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0gICAgICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKLSAgICAgICAgICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2x1bW5zOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm94eVByZWZlcmVuY2VQYWdlKCkgewotICAgICAgICBzdXBlcihHUklEKTsKLS8vICAgICAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnByZWZfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKFByb3h5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLSAgICAgICAgR3JvdXAgaHR0cFByb3h5R3JvdXAgPSBjcmVhdGVGaWVsZEdyb3VwKE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkucHJlZl9kZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRGaWVsZChuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1RZUEUsCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS50eXBlIiksMSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXVtdewotICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5ub25lIiksUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX05PTkV9LCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnNlc3Npb24iKSxQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU0VTU0lPTn0sIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLmdldFN0cmluZygicHJveHkuZ2xvYmFsIiksUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX0dMT0JBTH0gfSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGh0dHBQcm94eUdyb3VwKSk7Ci0KLSAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0gICAgICAgICAgICBhZGRGaWVsZChuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1NXRl9NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuc3dmbWV0aG9kIiksMSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnN3Zm1ldGhvZC5ub25lIiksIFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9TV0ZfTUVUSE9EX05PTkV9LCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zd2ZtZXRob2QuYm9vdGxvYWRlciIpLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU1dGX01FVEhPRF9CT09UTE9BREVSfS8qLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zd2ZtZXRob2QudHJhbnNjb2RlciIpLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU1dGX01FVEhPRF9UUkFOU0NPREVSfSovIH0sIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaHR0cFByb3h5R3JvdXApKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEludGVnZXJGaWVsZEVkaXRvciB0aW1lb3V0ID0gbmV3IEludGVnZXJGaWVsZEVkaXRvcihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS50aW1lb3V0IiksaHR0cFByb3h5R3JvdXApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRpbWVvdXQuc2V0VmFsaWRSYW5nZSgwLDk5KTsKLSAgICAgICAgYWRkRmllbGQodGltZW91dCk7Ci0KLSAgICAgICAgSW50ZWdlckZpZWxkRWRpdG9yIHZlcnNpb24gPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1NXRl9NSU5JTVVNX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zd2ZfdmVyc2lvbiIpLGh0dHBQcm94eUdyb3VwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB2ZXJzaW9uLnNldFZhbGlkUmFuZ2UoMyw5OSk7Ci0gICAgICAgIGFkZEZpZWxkKHZlcnNpb24pOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGFkZEZpZWxkKG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfQ0FDSEVfQ0xFQVIsCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jYWNoZV9jbGVhciIpLDEsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXXsKLSAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLmdldFN0cmluZygicHJveHkuY2FjaGVfY2xlYXJfd2hlbl9zdGFydHVwIiksIFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVB9LCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNvbmZpcm1fY2FjaGVfY2xlYXIiKSwgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTkZJUk1fV0hFTl9TVEFSVFVQfSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5ub19jYWNoZV9jbGVhciIpLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuTk9fQ0FDSEVfQ0xFQVJ9IH0sIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBnZXRGaWVsZEVkaXRvclBhcmVudCgpLHRydWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvdWkvQ2FjaGVDbGVhckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3VpL0NhY2hlQ2xlYXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzYjhjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvdWkvQ2FjaGVDbGVhckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LlByb3h5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkucHJlZmVyZW5jZXMuUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBDYWNoZUNsZWFyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBhcHBOYW1lOwotCi0gICAgcHVibGljIENhY2hlQ2xlYXJEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBhcHBOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHNoZWxsKTsKLSAgICAgICAgdGhpcy5hcHBOYW1lID0gYXBwTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgCi0gICAgICAgIHBhcmVudC5nZXRTaGVsbCgpLnNldFRleHQoTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5kaWFsb2cudGV4dCIpKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMjA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDIwOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzZXR0aW5ncyA9IFByb3h5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfQ0FDSEVfQ0xFQVIpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgbGFiZWwxLnNldFRleHQoIiAgICAiK2FwcE5hbWUrIiAiK01lc3NhZ2VzLmdldFN0cmluZygicHJveHkuY2FjaGVfY29uZmlybWF0aW9uMSIpKTsKLQotICAgICAgICBGb250IGYgPSBsYWJlbDEuZ2V0Rm9udCgpOwotICAgICAgICBGb250IGY5YiA9IG5ldyBGb250KGYuZ2V0RGV2aWNlKCksIGYuZ2V0Rm9udERhdGEoKVswXS5nZXROYW1lKCksIDksIFNXVC5CT0xEKTsKLSAgICAgICAgRm9udCBmOSA9IG5ldyBGb250KGYuZ2V0RGV2aWNlKCksIGYuZ2V0Rm9udERhdGEoKVswXS5nZXROYW1lKCksIDksIFNXVC5OT1JNQUwpOwotICAgICAgICBsYWJlbDEuc2V0Rm9udChmOWIpOwotICAgICAgICAKLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAKLSAgICAgICAgc3RhdHVzID0gUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUF9BTkRfQ0FDSEVfQ0xFQVI7Ci0KLSAgICAgICAgY3JlYXRlUmFkaW9CdXR0b24oUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUF9BTkRfQ0FDSEVfQ0xFQVIsIC8vCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jYWNoZV9jbGVhcl93aGVuX3N0YXJ0dXBfYW5kX2NhY2hlX2NsZWFyIiksIGNvbXBvc2l0ZSwgdHJ1ZSkuc2V0Rm9udChmOWIpOwotICAgICAgICBjcmVhdGVSYWRpb0J1dHRvbihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9BTkRfQ0FDSEVfQ0xFQVIsIC8vCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jb25maXJtX2FuZF9jYWNoZV9jbGVhciIpLCBjb21wb3NpdGUsIGZhbHNlKS5zZXRGb250KGY5KTsKLSAgICAgICAgY3JlYXRlUmFkaW9CdXR0b24oUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTkZJUk1fQU5EX05PX09QRVJBVElPTiwgLy8KLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNvbmZpcm1fYW5kX25vX29wZXJhdGlvbiIpLCBjb21wb3NpdGUsIGZhbHNlKS5zZXRGb250KGY5KTsKLQotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKGZpbmFsIFN0cmluZyBpZCwgU3RyaW5nIHRleHQsIENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gZmxhZykgewotICAgICAgICBCdXR0b24gcmFkaW8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICAgICAgcmFkaW8uc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgcmFkaW8uc2V0U2VsZWN0aW9uKGZsYWcpOwotCi0gICAgICAgIHJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gaWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiByYWRpbzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLSAgICAgICAgaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTaGVsbENsb3NlRXZlbnQoKSB7Ci0gICAgICAgIHRoaXMuc3RhdHVzID0gUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTkZJUk1fQU5EX05PX09QRVJBVElPTjsKLSAgICAgICAgc3VwZXIuaGFuZGxlU2hlbGxDbG9zZUV2ZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ZpZXdzL1Byb3h5TG9nVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L3ZpZXdzL1Byb3h5TG9nVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIwNWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS92aWV3cy9Qcm94eUxvZ1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkudmlld3M7Ci0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LlByb3h5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkubG9ncy5Qcm94eUxvZ0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5sb2dzLlByb3h5TG9nUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0KLQotcHVibGljIGNsYXNzIFByb3h5TG9nVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFByb3h5TG9nVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIRUFESU5HUyA9IHsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5tZXNzYWdlIiksICJJRCIsIE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuc291cmNlIiksIE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkudGltZSIpIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gV0VJR0hUUyA9ICAgICB7IDMwLCAzLCAxMCwgNSB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEFMSUdOTUVOVFMgPSAgeyBTV1QuTEVGVCwgU1dULkxFRlQsIFNXVC5MRUZULCBTV1QuTEVGVCAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XX01FU1NBR0UgPSAwOyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XX0lEID0gMTsgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPV19TT1VSQ0UgPSAyOyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XX1RJTUUgPSAzOyAKLSAgICAKLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLSAgICBwcml2YXRlIFByb3h5TG9nVmlld1NvcnRlciBzb3J0ZXIgPSBuZXcgUHJveHlMb2dWaWV3U29ydGVyKCk7IAotCi0gICAgcHJpdmF0ZSBBY3Rpb24gY2xlYXJBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gc2hvd0ZpbmVBY3Rpb247Ci0gICAgcHJpdmF0ZSBBY3Rpb24gY29weUFjdGlvbjsKLSAgICBwcml2YXRlIFZpZXdMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCi0JY2xhc3MgVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2LCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBQcm94eUxvZ0hhbmRsZXIuZ2V0TG9ncygpLnRvQXJyYXkoKTsKLQkJfQotCX0KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBpbmRleCkgewotICAgICAgICAgICAgaWYoIG9iaiBpbnN0YW5jZW9mIFByb3h5TG9nUmVjb3JkICkgewotICAgICAgICAgICAgICAgIHN3aXRjaCggaW5kZXggKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSAoKFByb3h5TG9nUmVjb3JkKW9iaikuZ2V0TWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoInswLHRpbWV9IixuZXcgT2JqZWN0W117bmV3IERhdGUodGltZSl9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBjYXNlIFJPV19NRVNTQUdFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoUHJveHlMb2dSZWNvcmQpb2JqKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX0lEOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoUHJveHlMb2dSZWNvcmQpb2JqKS5nZXRJRCgpOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFJPV19TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9nZ2VyID0gKChQcm94eUxvZ1JlY29yZClvYmopLmdldExvZ2dlck5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXAgPSBsb2dnZXIubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAtMSAhPSBzZXAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci5zdWJzdHJpbmcoc2VwKzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCQlyZXR1cm4gZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmKCBST1dfTUVTU0FHRT09aW5kZXggJiYgb2JqIGluc3RhbmNlb2YgUHJveHlMb2dSZWNvcmQgKSB7Ci0gICAgICAgICAgICAgICAgSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotICAgICAgICAgICAgICAgIGludCBsZXZlbCA9ICgoUHJveHlMb2dSZWNvcmQpb2JqKS5nZXRMZXZlbCgpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYoIGxldmVsID4gTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIGxldmVsID4gTGV2ZWwuSU5GTy5pbnRWYWx1ZSgpICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggbGV2ZWwgPiBMZXZlbC5GSU5FLmludFZhbHVlKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFByb3h5TG9nVmlldygpIHsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBUaGlzIGlzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGFsbG93IHVzCi0JICogdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUgaXQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPEhFQURJTkdTLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoV0VJR0hUU1tpXSkpOwotICAgICAgICAgICAgVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIHRjLnNldFRleHQoSEVBRElOR1NbaV0pOwotICAgICAgICAgICAgdGMuc2V0QWxpZ25tZW50KEFMSUdOTUVOVFNbaV0pOwotICAgICAgICAgICAgdGMuc2V0UmVzaXphYmxlKHRydWUpOwotICAgICAgICAgICAgZmluYWwgaW50IG5ld1NvcnRpbmdDb2x1bW4gPSBpKzE7Ci0gICAgICAgICAgICB0Yy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG5ld1NvcnRpbmdDb2x1bW49PSBzb3J0ZXIuc29ydGluZ0NvbHVtbiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlci5zb3J0aW5nQ29sdW1uID0gLW5ld1NvcnRpbmdDb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZXIuc29ydGluZ0NvbHVtbiA9IG5ld1NvcnRpbmdDb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotICAgICAgICAKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVmlld0NvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlciA9IG5ldyBWaWV3TGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgdmlld2VyLnNldFNvcnRlcihzb3J0ZXIpOwotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQoZ2V0Vmlld1NpdGUoKSk7Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JCWhvb2tDb250ZXh0TWVudSgpOwotCQljb250cmlidXRlVG9BY3Rpb25CYXJzKCk7Ci0JfQotICAgIAotICAgIHByaXZhdGUgY2xhc3MgUHJveHlMb2dWaWV3U29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLSAgICAgICAgcHVibGljIGludCBzb3J0aW5nQ29sdW1uID0gMDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotICAgICAgICAgICAgaWYgKDAgIT0gc29ydGluZ0NvbHVtbiAmJiB2aWV3ZXIgaW5zdGFuY2VvZiBUYWJsZVZpZXdlcikgewotICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKChUYWJsZVZpZXdlcil2aWV3ZXIpLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiggbGFiZWxQcm92aWRlciBpbnN0YW5jZW9mIElUYWJsZUxhYmVsUHJvdmlkZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5JbmRleCA9IE1hdGguYWJzKHNvcnRpbmdDb2x1bW4pLTE7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzMSA9ICgoSVRhYmxlTGFiZWxQcm92aWRlcilsYWJlbFByb3ZpZGVyKS5nZXRDb2x1bW5UZXh0KGUxLGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMyID0gKChJVGFibGVMYWJlbFByb3ZpZGVyKWxhYmVsUHJvdmlkZXIpLmdldENvbHVtblRleHQoZTIsY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBjb2x1bW5JbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX1RJTUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKGludCkoKChQcm94eUxvZ1JlY29yZCllMSkuZ2V0TWlsbGlzKCktKChQcm94eUxvZ1JlY29yZCllMikuZ2V0TWlsbGlzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBST1dfTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX0lEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUoczEsczIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0aW5nQ29sdW1uID4gMCA/IHJlc3VsdCA6IC1yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgaG9va0NvbnRleHRNZW51KCkgewotCQlNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJUHJveHlMb2dWaWV3LnRoaXMuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQkJfQotCQl9KTsKLQkJTWVudSBtZW51ID0gbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWdyLCB2aWV3ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb250cmlidXRlVG9BY3Rpb25CYXJzKCkgewotCQlJQWN0aW9uQmFycyBiYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWZpbGxMb2NhbFB1bGxEb3duKGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWZpbGxMb2NhbFRvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsUHVsbERvd24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoc2hvd0ZpbmVBY3Rpb24pOwotICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBtYW5hZ2VyLmFkZChjbGVhckFjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKGNvcHlBY3Rpb24pOwotCQkvLyBPdGhlciBwbHVnLWlucyBjYW4gY29udHJpYnV0ZSB0aGVyZSBhY3Rpb25zIGhlcmUKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsbExvY2FsVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChjbGVhckFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQljbGVhckFjdGlvbiA9IG5ldyBBY3Rpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jbGVhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBQcm94eUxvZ0hhbmRsZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotCQljbGVhckFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNsZWFyX3RpcCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjbGVhckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUHJveHlQbHVnaW4uSU1BR0VfQ0xFQVIpOwotCQkKLQkJc2hvd0ZpbmVBY3Rpb24gPSBuZXcgQWN0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuc2hvd19maW5lIiksQWN0aW9uLkFTX0NIRUNLX0JPWCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgUHJveHlMb2dIYW5kbGVyLnNldExvZ0xldmVsKHNob3dGaW5lQWN0aW9uLmlzQ2hlY2tlZCgpID8gTGV2ZWwuRklORSA6IExldmVsLklORk8pOwotCQkJfQotCQl9OwotICAgICAgICAKLSAgICAgICAgY29weUFjdGlvbiA9IG5ldyBBY3Rpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jb3B5IikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IoIGludCBpbmRleD0wOztpbmRleCsrICkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IHZpZXdlci5nZXRFbGVtZW50QXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiggbnVsbD09ZWxlbWVudCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGNvbD0wOyBjb2w8SEVBRElOR1MubGVuZ3RoOyBjb2wrKyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZWxlbWVudCwgY29sKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY29sPT1IRUFESU5HUy5sZW5ndGgtMSA/ICJcclxuIjoiXHQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggc2IubGVuZ3RoKCk+MCApIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSkuc2V0Q29udGVudHMobmV3IE9iamVjdFtdIHsgc2IudG9TdHJpbmcoKSB9LCBuZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NPUFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3RlbXBsYXRlcy9wcm94eS5wYWMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvdGVtcGxhdGVzL3Byb3h5LnBhYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3OTdjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvdGVtcGxhdGVzL3Byb3h5LnBhYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXZhciBOT19QUk9YWSA9ICIkTk9QUk9YWV9FWFRTJCI7DQotDQotZnVuY3Rpb24gRmluZFByb3h5Rm9yVVJMKHVybCwgaG9zdCkgew0KLSAgaWYoIHVybC5zdWJzdHJpbmcoMCw1KSA9PSAiaHR0cDoiICkgew0KLSAgICBpZiggTk9fUFJPWFkubGVuZ3RoID4gMCAmJiB1cmwuaW5kZXhPZigiPyIpID09IC0xICkgew0KLQkgIHZhciBleHRQb3MgPSB1cmwubGFzdEluZGV4T2YoIi4iKTsNCi0JICBpZiggZXh0UG9zICE9IC0xICkgew0KLQkgICAgaWYoIE5PX1BST1hZLmluZGV4T2YoInwiK3VybC5zdWJzdHJpbmcoZXh0UG9zKzEpLnRvTG93ZXJDYXNlKCkrInwiKSAhPSAtMSApIHsNCi0JICAgICAgcmV0dXJuICIkSFRUUF9ESVJFQ1QkIjsNCi0JICAgIH0NCi0JICB9DQotICAgIH0NCi0gICAgcmV0dXJuICIkSFRUUF9QUk9YWSQiOw0KLSAgfQ0KLSAgaWYoIHVybC5zdWJzdHJpbmcoMCw2KSA9PSAiaHR0cHM6IiApIHsNCi0gICAgcmV0dXJuICIkSFRUUFNfRElSRUNUJCI7DQotICB9DQotICBpZiggdXJsLnN1YnN0cmluZygwLDQpID09ICJmdHA6IiApIHsNCi0gICAgcmV0dXJuICIkRlRQX0RJUkVDVCQiOw0KLSAgfQ0KLSAgaWYoIHVybC5zdWJzdHJpbmcoMCw3KSA9PSAiZ29waGVyOiIgKSB7DQotICAgIHJldHVybiAiJEdPUEhFUl9ESVJFQ1QkIjsNCi0gIH0NCi0gIHJldHVybiAiRElSRUNUIjsNCi19DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3ODM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxNWM5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgRmxhc2ggTW9kZWwgUGx1Zy1pbiAoSW5jdWJhdGlvbikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gKLUJ1bmRsZS1WZXJzaW9uOiAwLjAuMQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5GbGFzaE1vZGVsUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5hY3RmLmFjY3NlcnZpY2Uuc3d0YnJpZGdlLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaCwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvRWNsaXBzZV9BQ1RGX2luaXRpYWxpemVyLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9FY2xpcHNlX0FDVEZfaW5pdGlhbGl6ZXIuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2ZlOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9FY2xpcHNlX0FDVEZfaW5pdGlhbGl6ZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8sIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgQ29tbW9uIEJyaWRnZSBJbml0aWFsaXphdGlvbiBNb2R1bGUKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLV9yb290LkVjbGlwc2VfQUNURl9pc19hdmFpbGFibGUgPSAidHJ1ZSI7Ci1fcm9vdC5FY2xpcHNlX0FDVEZfU1dGX0JyaWRnZV92ZXJzaW9uID0gIjAuMDEiOwotCi0vLyBVc2VkIGJ5IFJlcXVlc3RTZXJ2ZXIuCi1fcm9vdC5FY2xpcHNlX0FDVEZfcmVxdWVzdF9hcmdzID0gIiI7Ci1fcm9vdC5FY2xpcHNlX0FDVEZfcmVzcG9uc2VfdmFsdWUgPSAiIjsKLV9yb290LkVjbGlwc2VfQUNURl9TV0ZfQ09OVEVOVF9JRCA9IF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEOwotRWNsaXBzZV9BQ1RGX1JlcXVlc3RTZXJ2ZXIuc3RhcnQoX2dsb2JhbC5FY2xpcHNlX0FDVEZfU0VDUkVUKTsKLWRlbGV0ZSBfZ2xvYmFsLkVjbGlwc2VfQUNURl9TRUNSRVQ7Ci0KLUVjbGlwc2VfQUNURl9Jbml0LmluaXRpYWxpemUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQ1NTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuYXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8sIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgIEJyaWRnZSBJbml0aWFsaXphdGlvbiBtb2R1bGUgZm9yIFNXRiBib290bG9hZGVyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdmFyIEVjbGlwc2VfQUNURl9ERUJVRzpCb29sZWFuID0gZmFsc2U7Ci0KLWlmIChFY2xpcHNlX0FDVEZfREVCVUcpewotICAgIHZhciBFY2xpcHNlX0FDVEZfbGM6TG9jYWxDb25uZWN0aW9uID0gbmV3IExvY2FsQ29ubmVjdGlvbigpOwotICAgIHZhciBtZXNzOlN0cmluZyA9ICIiOwotICAgIG1lc3MgPSAiU1dGIGJyaWRnZSB2ZXIgMS4wMCIgKyBuZXdsaW5lICsgInRoaXMuX3VybCA9ICIgKyB0aGlzLl91cmwgKyBuZXdsaW5lOwotfQotCi1mb3IgKHByb3AgaW4gX2dsb2JhbC5FY2xpcHNlX0FDVEZfUFJPUEVSVElFUykgewotICAgIGlmIChFY2xpcHNlX0FDVEZfREVCVUcpewotCW1lc3MgKz0gIiA6IiArIHByb3AgKyAiPSIgKyBfZ2xvYmFsLkVjbGlwc2VfQUNURl9QUk9QRVJUSUVTW3Byb3BdICsgbmV3bGluZTsKLQltZXNzICs9ICIgOjA6IiArIHByb3AgKyAiPSIgKyBfbGV2ZWwwW3Byb3BdICsgbmV3bGluZTsKLSAgICB9Ci0KLSAgICBpZiAoT2JqZWN0LnByb3RvdHlwZVtwcm9wXSkgewotCWRlbGV0ZSBPYmplY3QucHJvdG90eXBlW3Byb3BdOwotICAgIH0KLSAgICBpZiAoX2xldmVsMFtwcm9wXSA9PSB1bmRlZmluZWQpIHsKLSAgICAgICAgX2xldmVsMFtwcm9wXSA9IF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1BST1BFUlRJRVNbcHJvcF07Ci0gICAgfQotCi0gICAgaWYgKEVjbGlwc2VfQUNURl9ERUJVRyl7Ci0JbWVzcyArPSAiIDpjOiIgKyBwcm9wICsgIj0iICsgX2xldmVsMFtwcm9wXSArIG5ld2xpbmU7Ci0gICAgfQotfQotCi1pZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKXsKLSAgICBFY2xpcHNlX0FDVEZfbGMuc2VuZCgiX3Rlc3RMQyIsICJkdW1wIiwgbWVzcyk7Ci19Ci0KLV9nbG9iYWwuZW5jb2RlU3RyaW5nRm9yQnJpZGdlID0gZnVuY3Rpb24oYXJnOlN0cmluZykgewotICAgIHJldHVybiBhcmc7Ci19Ci0KLSNpbmNsdWRlICJFY2xpcHNlX0FDVEZfaW5pdGlhbGl6ZXIuYXMiCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLmZsYSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuZmxhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVmYzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuZmxhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9ib290X2JyaWRnZS5zd2YgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLnN3ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4YjAzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLnN3ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTc1NWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPLCBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBib290X2xvYWRlci5hcwotdmFyIEVjbGlwc2VfQUNURl9ERUJVRzpCb29sZWFuID0gZmFsc2U7Ci12YXIgRWNsaXBzZV9BQ1RGX1JBTkRPTV9TVFJJTkdfMSA9ICIiOwotCi1pZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgdmFyIEVjbGlwc2VfQUNURl9sYzpMb2NhbENvbm5lY3Rpb24gPSBuZXcgTG9jYWxDb25uZWN0aW9uKCk7Ci0gICAgdmFyIG1lc3M6U3RyaW5nID0gIiI7Ci0gICAgbWVzcyA9ICJTV0YgYm9vdGxvYWRlciB2ZXIgMS4wMCIgKyBuZXdsaW5lICsgInRoaXMuX3VybCA9ICIgKyB0aGlzLl91cmwgKyBuZXdsaW5lOwotfQotCi1pZiAoX2xldmVsNTM1NTMuRWNsaXBzZV9BQ1RGX2lzX2F2YWlsYWJsZSkgewotICAgIGlmIChFY2xpcHNlX0FDVEZfREVCVUcpIHsKLSAgICAgICAgbWVzcyArPSAidGhpcyBpcyBjaGlsZCBTV0YuIiArIG5ld2xpbmU7Ci0gICAgfQotICAgIGZvciAocHJvcCBpbiB0aGlzKSB7Ci0gICAgICAgIGlmIChwcm9wICE9ICJnZXRTYW1lRG9tYWluVVJMIiAmJiBwcm9wICE9ICJtZXNzIiAmJiBwcm9wICE9ICJFY2xpcHNlX0FDVEZfbGMiICYmIHByb3AgIT0gIiR2ZXJzaW9uIiAmJgotICAgICAgICAgICAgcHJvcCAhPSAiRWNsaXBzZV9BQ1RGX0RFQlVHIikgewotICAgICAgICAgICAgaWYgKEVjbGlwc2VfQUNURl9ERUJVRykgewotICAgICAgICAgICAgICAgIG1lc3MgKz0gIiA6Iitwcm9wICsgIj0iICsgdGhpc1twcm9wXSArIG5ld2xpbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9QUk9QRVJUSUVTW3Byb3BdID0gdGhpc1twcm9wXTsKLSAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGVbcHJvcF0gPSB0aGlzW3Byb3BdOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChFY2xpcHNlX0FDVEZfREVCVUcpIHsKLSAgICAgICAgRWNsaXBzZV9BQ1RGX1V0aWwuc2VuZChtZXNzKTsKLSAgICB9Ci0gICAgdGhpcy5sb2FkTW92aWUodGhpcy5fdXJsLCAiUE9TVCIpOwotfSBlbHNlIHsKLSAgICBpZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgICAgIG1lc3MgKz0gInRoaXMgaXMgcm9vdCBTV0YuIiArIG5ld2xpbmU7Ci0gICAgfQotICAgIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1BST1BFUlRJRVMgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICB2YXIgZ2V0U2FtZURvbWFpblVSTCA9IGZ1bmN0aW9uKHVybDpTdHJpbmcsIGZpbGVuYW1lKSB7Ci0gICAgICAgIGlmICh1cmwuaW5kZXhPZigiaHR0cDoiKTwwICYmIHVybC5pbmRleE9mKCJodHRwczoiKTwwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0gICAgICAgIH0KLQl2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoIj8iKTsKLQlpZiAoaW5kZXggPj0gMCl7Ci0JICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JfQotCWluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgIGlmICh1cmwuY2hhckF0KGluZGV4LTEpID09ICIvIikgewotICAgICAgICAgICAgcmV0dXJuIHVybCArICIvIiArIGZpbGVuYW1lOyAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KzEpK2ZpbGVuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlbyA9IG5ldyBPYmplY3QoKTsKLSAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5zdHJlYW1zID0gbmV3IEFycmF5KCk7Ci0gICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8ucmVnaXN0ZXIgPSBmdW5jdGlvbih0YXJnZXQ6T2JqZWN0LCBzb3VyY2U6T2JqZWN0KSB7Ci0gICAgICAgIGlmICgoIXRhcmdldCkgfHwgKCFzb3VyY2UpKSByZXR1cm47Ci0gICAgICAgIHZhciBhcjpBcnJheSA9IF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnN0cmVhbXM7Ci0gICAgICAgIHZhciBzbG90OkVjbGlwc2VfQUNURl9TdHJlYW07Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyA7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPT0gYXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgc2xvdCA9IG5ldyBFY2xpcHNlX0FDVEZfU3RyZWFtKHRhcmdldCwgc291cmNlKTsKLSAgICAgICAgICAgICAgICBhci5wdXNoKHNsb3QpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xvdCA9IGFyW2ldOwotICAgICAgICAgICAgaWYgKHNsb3QuZXF1YWxzKHRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICBzbG90LnVwZGF0ZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8uYXR0YWNoVmlkZW8gPSBWaWRlby5wcm90b3R5cGUuYXR0YWNoVmlkZW87Ci0gICAgVmlkZW8ucHJvdG90eXBlLmF0dGFjaFZpZGVvID0gZnVuY3Rpb24oc291cmNlOk9iamVjdCkgewotICAgICAgICAvLyBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCJWaWRlby5hdHRhY2hWaWRlbyEhISIpOwotICAgICAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5yZWdpc3Rlcih0aGlzLCBzb3VyY2UpOwotICAgICAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5hdHRhY2hWaWRlby5jYWxsKHRoaXMsIHNvdXJjZSk7Ci0gICAgfTsKLQotICAgIC8vIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnNvdW5kcCA9IG5ldyBPYmplY3QoKTsKLSAgICAvLyBBU1NldFByb3BGbGFncyhfZ2xvYmFsLlNvdW5kLnByb3RvdHlwZSwgImF0dGFjaFNvdW5kIiwgMCwgdHJ1ZSk7Ci0gICAgLy8gX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8uc291bmRwLm9uTG9hZCA9IFNvdW5kLnByb3RvdHlwZS5vbkxvYWQ7Ci0gICAgLy9Tb3VuZC5wcm90b3R5cGUuYXR0YWNoU291bmQgPSBmdW5jdGlvbigpIHsKLSAgICAvLyAgICBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCJJbnZva2VkOiAiICsgImF0dGFjaFNvdW5kIik7Ci0gICAgLy8gICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8ucmVnaXN0ZXIodGhpcywgdGhpcyk7Ci0gICAgLy8gICAgcmV0dXJuIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnNvdW5kcC5hdHRhY2hTb3VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgIC8vfQotICAgIC8vIEVjbGlwc2VfQUNURl9VdGlsLnNlbmQoIkluaXQuLi4iKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBmb3IgKHByb3AgaW4gdGhpcykgewotICAgICAgICBpZiAocHJvcCAhPSAiZ2V0U2FtZURvbWFpblVSTCIKLSAgICAgICAgICAgICYmIHByb3AgIT0gIm1lc3MiCi0gICAgICAgICAgICAmJiBwcm9wICE9ICJFY2xpcHNlX0FDVEZfbGMiCi0gICAgICAgICAgICAmJiBwcm9wICE9ICIkdmVyc2lvbiIKLSAgICAgICAgICAgICYmIHByb3AgIT0gIkVjbGlwc2VfQUNURl9ERUJVRyIpIHsKLSAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfREVCVUcpIHsKLSAgICAgICAgICAgICAgICBtZXNzICs9ICIgOiIrcHJvcCArICI9IiArIHRoaXNbcHJvcF0gKyBuZXdsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfUFJPUEVSVElFU1twcm9wXSA9IHRoaXNbcHJvcF07Ci0gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlW3Byb3BdID0gdGhpc1twcm9wXTsKLSAgICAgICAgICAgIEFTU2V0UHJvcEZsYWdzKE9iamVjdC5wcm90b3R5cGUsIHByb3AsIDEpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5zZXRQcm9wZXJ0eUlzRW51bWVyYWJsZSkgewotICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnNldFByb3BlcnR5SXNFbnVtZXJhYmxlKHByb3AsIGZhbHNlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgICAgIEVjbGlwc2VfQUNURl9sYy5zZW5kKCJfdGVzdExDIiwgImR1bXAiLCBtZXNzKTsKLSAgICB9Ci0KLSAgICAvLyBsb2FkIHRoZSBzZWNyZXQuCi0KLSAgICB2YXIgbHY6TG9hZFZhcnMgPSBuZXcgTG9hZFZhcnMoKTsKLSAgICBsdi5vbkxvYWQgPSBmdW5jdGlvbihmbGFnOkJvb2xlYW4pIHsKLSAgICAgICAgaWYgKGZsYWcpIHsKLSAgICAgICAgICAgIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEID0gbHYuY29udGVudGlkOwotICAgICAgICAgICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfU0VDUkVUID0gbHYuc2VjcmV0OwotICAgICAgICAgICAgLy8gbG9hZCB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgIGxvYWRNb3ZpZU51bShfcm9vdC5fdXJsLCAwLCAiUE9TVCIpOwotICAgCi0gICAgICAgICAgICAvLyBsb2FkIGJvb3RfYnJpZGdlLnN3ZgotICAgICAgICAgICAgbG9hZE1vdmllTnVtKGdldFNhbWVEb21haW5VUkwoX3Jvb3QuX3VybCwgIkVjbGlwc2UtQUNURi1TV0YtSW5pdGlhbGl6ZS1CcmlkZ2UtUGFja2FnZS0xMDgyMDE3MzA5MTMwMTg3NDcyLnN3ZiIpLCA1MzU1Myk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGx2LmxvYWQoZ2V0U2FtZURvbWFpblVSTCh0aGlzLl91cmwsICJodHRwOi8vbG9jYWxob3N0L0VjbGlwc2UtQUNURi1TV0YtTG9hZFZhcnMtMTA4MjAxNzMwOTEzMDE4NzQ3Mi50eHQiKSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLmZsYSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuZmxhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI3NTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuZmxhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9ib290X2xvYWRlci5zd2YgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLnN3ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNzZmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLnN3ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BU1NlcmlhbGl6ZXIuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQVNTZXJpYWxpemVyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFmNjk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BU1NlcmlhbGl6ZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPLCBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBBUyBTZXJpYWxpemVyL0Rlc2VyaWFsaXphdGlvbiBsaWJyYXJ5Ci0KLWNsYXNzIEVjbGlwc2VfQUNURl9BU1NlcmlhbGl6ZXIgewotICAgIHByaXZhdGUgc3RhdGljIHZhciBpZ25vcmVQcm9wZXJ0aWVzV2l0aFVuZGVyU2NvcmVzOkJvb2xlYW4gPSB0cnVlOwotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemUobzpPYmplY3QpOlN0cmluZyB7Ci0gICAgICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZUFycmF5KG86IEFycmF5KSB7Ci0JICAgIHZhciByZXQ6U3RyaW5nID0gIlsiOwotCSAgICBmb3IodmFyIGkgPSAwOyBpIDwgby5sZW5ndGg7IGkrKyl7Ci0JCXJldCArPSBzZXJpYWxpemVJbnRlcm5hbChvW2ldKTsKLSAgICAgICAgICAgICAgICByZXQgKz0gIiwiOwotCSAgICB9Ci0gICAgICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICByZXQgPSByZXQuc3Vic3RyaW5nKDAsIHJldC5sZW5ndGggLSAxKTsKLSAgICAgICAgICAgIH0KLQkgICAgcmV0ICs9ICJdIjsKLQkgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZVN0cmluZyhvOiBTdHJpbmcpIHsKLQkgICAgdmFyIHJlc3Q6U3RyaW5nID0gX2dsb2JhbC5lbmNvZGVTdHJpbmdGb3JCcmlkZ2Uobyk7Ci0JICAgIHZhciByZXQ6U3RyaW5nID0gJyInOwotCSAgICB2YXIgaW5kZXg7Ci0JICAgIHdoaWxlICgoaW5kZXggPSByZXN0LmluZGV4T2YoJyInKSkgPj0gMCkgewotCQlyZXQgKz0gcmVzdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JCXJldCArPSAiXFxcIiI7Ci0JCXJlc3QgPSByZXN0LnN1YnN0cihpbmRleCArIDEpOwotCSAgICB9Ci0JICAgIHJldCs9cmVzdCArICciJzsKLQkgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdChvOiBPYmplY3QpIHsKLQkgICAgdmFyIHJldDpTdHJpbmcgPSAneyc7Ci0JICAgIGZvciAodmFyIHByb3AgaW4gbyl7Ci0gICAgICAgICAgICAgICAgaWYgKG9bcHJvcF0gIT0gbnVsbCAmJiBvW3Byb3BdICE9IHVuZGVmaW5lZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZVByb3BlcnRpZXNXaXRoVW5kZXJTY29yZXMgfHwgcHJvcC5zdWJzdHIoMCwyKSAhPSAnX18nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2VyaWFsaXplU3RyaW5nKHByb3ApICsgIjoiIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzZXJpYWxpemVJbnRlcm5hbChvW3Byb3BdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSAiLCI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgICAgIGlmIChyZXQubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgICAgIHJldCA9IHJldC5zdWJzdHJpbmcoMCwgcmV0Lmxlbmd0aCAtIDEpOwotICAgICAgICAgICAgfQotCSAgICByZXQgKz0gIn0iOwotCSAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gc2VyaWFsaXplSW50ZXJuYWwobzogT2JqZWN0KSB7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUFycmF5KG8pOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mKG8pKSB7Ci0JICAgIGNhc2UgInVuZGVmaW5lZCI6Ci0JCXJldHVybiAibnVsbCI7Ci0gICAgICAgICAgICBjYXNlICJzdHJpbmciOgotICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVTdHJpbmcobyk7Ci0gICAgICAgICAgICBjYXNlICJvYmplY3QiOgotICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVPYmplY3Qobyk7Ci0JICAgIGNhc2UgIm1vdmllY2xpcCI6Ci0JCXJldHVybiAibnVsbCI7Ci0JICAgIGNhc2UgImZ1bmN0aW9uIjoKLQkJcmV0dXJuICJudWxsIjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VyaWFsaXplSW50ZXJuYWwobyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZShzdHI6U3RyaW5nKTpPYmplY3QgewotICAgICAgICB2YXIgaWR4Ok51bWJlciA9IDA7Ci0gICAgICAgIHZhciBvYmo6T2JqZWN0ID0gdW5kZWZpbmVkOwotICAgICAgICB2YXIgYzpTdHJpbmcgPSBzdHIuY2hhckF0KGlkeCk7Ci0KLSAgICAgICAgZnVuY3Rpb24gc2tpcFNQKCk6Qm9vbGVhbiB7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgYyA9IHN0ci5jaGFyQXQoaWR4KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgICAgICAgaWR4Kys7Ci0JCSAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIHRva2VuRW5kKCk6Qm9vbGVhbiB7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgYyA9IHN0ci5jaGFyQXQoaWR4KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgICBjYXNlICcgJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBjYXNlICcsJzoKLSAgICAgICAgICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgICAgICBjYXNlICddJzoKLSAgICAgICAgICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gZGVzZXJpYWxpemVBcnJheSgpIHsKLQkgICAgLy8gdHJhY2UoImRBIik7Ci0JICAgIGlkeCsrOwotICAgICAgICAgICAgdmFyIHJldDpBcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIHNraXBTUCgpOwotICAgICAgICAgICAgICAgIGlmIChjID09ICddJykgewotICAgICAgICAgICAgICAgICAgICBvYmogPSByZXQ7Ci0JCSAgICBpZHgrKzsKLQkJICAgIC8vIHRyYWNlKCJkQS1leGl0OiAiICsgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZUludGVybmFsKCkpIHsKLQkJICAgIC8vIHRyYWNlKCJkQS1pbnRlcm5hbDogIitvYmopOwotICAgICAgICAgICAgICAgICAgICByZXQucHVzaChvYmopOwotCQl9Ci0gICAgICAgICAgICAgICAgc2tpcFNQKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ10nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iaiA9IHJldDsKLQkJICAgIGlkeCsrOwotCQkgICAgLy8gdHJhY2UoImRBLWV4aXQ6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGMgIT0gJywnKSByZXR1cm4gZmFsc2U7Ci0JCWlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gZGVzZXJpYWxpemVPYmplY3QoKSB7Ci0JICAgIGlkeCsrOwotICAgICAgICAgICAgdmFyIHJldDpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgc2tpcFNQKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ30nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iaiA9IHJldDsKLQkJICAgIGlkeCsrOwotCQkgICAgLy8gdHJhY2UoImRBLWV4aXQ6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2VyaWFsaXplU3RyaW5nKCkpIHsKLQkJICAgIHZhciBwcm9wTmFtZSA9IG9iajsKLQkJICAgIC8vIHRyYWNlKHByb3BOYW1lKTsKLQkJICAgIHNraXBTUCgpOwotCQkgICAgaWYgKGMgIT0gJzonKSByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZHgrKzsKLQkJICAgIHNraXBTUCgpOwotCQkgICAgaWYgKGRlc2VyaWFsaXplSW50ZXJuYWwoKSkgewotCQkJdmFyIHByb3BWYWw6T2JqZWN0ID0gb2JqOwotCQkJLy8gdHJhY2UocHJvcFZhbCk7Ci0JCQlyZXRbcHJvcE5hbWVdID0gcHJvcFZhbDsKLQkJICAgIH0KLQkJfQotICAgICAgICAgICAgICAgIHNraXBTUCgpOwotICAgICAgICAgICAgICAgIGlmIChjID09ICd9JykgewotICAgICAgICAgICAgICAgICAgICBvYmogPSByZXQ7Ci0JCSAgICBpZHgrKzsKLQkJICAgIC8vIHRyYWNlKCJkQS1leGl0OiAiICsgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjICE9ICcsJykgcmV0dXJuIGZhbHNlOwotCQlpZHgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXplU3RyaW5nKCkgewotICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICB2YXIgcmV0OlN0cmluZyA9ICIiOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgICAgICBvYmogPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYykgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCArPSBjOwotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3Rpb24gZGVzZXJpYWxpemVJbnRlcm5hbCgpOkJvb2xlYW4gewotICAgICAgICAgICAgaWYgKCFza2lwU1AoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUFycmF5KCk7Ci0gICAgICAgICAgICBjYXNlICd7JzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVPYmplY3QoKTsKLSAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZVN0cmluZygpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB2YXIgaWR4U3Q6TnVtYmVyID0gaWR4OwotICAgICAgICAgICAgICAgIGlmICh0b2tlbkVuZCgpKSB7Ci0JCSAgICB2YXIgc3Vic3RyID0gc3RyLnN1YnN0cmluZyhpZHhTdCwgaWR4KTsKLQkJICAgIGlmICgoJzAnPD1zdWJzdHIuY2hhckF0KDApICYmIHN1YnN0ci5jaGFyQXQoMCk8PSc5JykKLQkJCXx8IHN1YnN0ci5jaGFyQXQoMCk9PScrJyB8fCBzdWJzdHIuY2hhckF0KDApPT0nLScpCi0JCQlvYmogPSBOdW1iZXIoc3Vic3RyKTsKLQkJICAgIGVsc2UKLQkJCW9iaiA9IGV2YWwoc3Vic3RyKTsKLQkJICAgIC8vIHRyYWNlKG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlc2VyaWFsaXplSW50ZXJuYWwoKTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQWNjSW5mby5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BY2NJbmZvLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFmNjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BY2NJbmZvLmFzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jbGFzcyBFY2xpcHNlX0FDVEZfQWNjSW5mbyB7Ci0gICAgdmFyIHNpbGVudDpCb29sZWFuOwotICAgIHZhciBmb3JjZVNpbXBsZTpCb29sZWFuOwotICAgIHZhciBuYW1lOlN0cmluZzsKLSAgICB2YXIgZGVzY3JpcHRpb246U3RyaW5nOwotICAgIHZhciBzaG9ydGN1dDpTdHJpbmc7Ci0KLSAgICB2YXIgcm9sZTpOdW1iZXI7Ci0gICAgdmFyIHN0YXRlOk51bWJlcjsKLSAgICB2YXIgZGVmYXVsdEFjdGlvbjpTdHJpbmc7Ci0gICAgdmFyIGNoaWxkcmVuOkFycmF5OwotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBFY2xpcHNlX0FDVEZfQWNjSW5mbyhvOk9iamVjdCkgewotICAgICAgICBpZiAoby5fYWNjUHJvcHMpIHsKLSAgICAgICAgICAgIHRoaXMuc2lsZW50ID0gby5fYWNjUHJvcHMuc2lsZW50OwotICAgICAgICAgICAgdGhpcy5mb3JjZVNpbXBsZSA9IG8uX2FjY1Byb3BzLmZvcmNlU2ltcGxlOwotICAgICAgICAgICAgdGhpcy5uYW1lID0gby5fYWNjUHJvcHMubmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBvLl9hY2NQcm9wcy5kZXNjcmlwdGlvbjsKLSAgICAgICAgICAgIHRoaXMuc2hvcnRjdXQgPSBvLl9hY2NQcm9wcy5zaG9ydGN1dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvLl9hY2NJbXBsKSB7Ci0gICAgICAgICAgICB2YXIgYWk6T2JqZWN0ID0gby5fYWNjSW1wbDsKLSAgICAgICAgICAgIHZhciBuYW1lQWNjSW1wbDpTdHJpbmcgPSBhaS5nZXRfYWNjTmFtZSgwKTsKLSAgICAgICAgICAgIGlmIChuYW1lQWNjSW1wbCkgdGhpcy5uYW1lID0gbmFtZUFjY0ltcGw7Ci0gICAgICAgICAgICB0aGlzLnJvbGUgPSBhaS5nZXRfYWNjUm9sZSgwKTsKLSAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBhaS5nZXRfYWNjU3RhdGUoMCk7Ci0gICAgICAgICAgICB0aGlzLmRlZmF1bHRBY3Rpb24gPSBhaS5nZXRfYWNjRGVmYXVsdEFjdGlvbigwKTsKLSAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBhaS5nZXRDaGlsZElkQXJyYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbmV3QWNjSW5mbyhvOk9iamVjdCkgewotICAgICAgICBpZiAoby5fYWNjUHJvcHMgfHwgby5fYWNjSW1wbCkgcmV0dXJuIG5ldyBFY2xpcHNlX0FDVEZfQWNjSW5mbyhvKTsKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQWNjVGFyZ2V0LmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0FjY1RhcmdldC5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkNzFmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQWNjVGFyZ2V0LmFzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jbGFzcyBFY2xpcHNlX0FDVEZfQWNjVGFyZ2V0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlVGFyZ2V0KHRhcmdldDpTdHJpbmcsIGRlcHRoOk51bWJlcik6Qm9vbGVhbiB7Ci0gICAgICAgIHZhciBvYmo6T2JqZWN0ID0gZXZhbCh0YXJnZXQpOwotICAgICAgICB2YXIgbG9nOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgdXBkYXRlSW1wbChvYmosIHRhcmdldCwgZGVwdGgsIGxvZyk7Ci0gICAgICAgIEFjY2Vzc2liaWxpdHkudXBkYXRlUHJvcGVydGllcygpOwotICAgICAgICByZXR1cm4gbG9nLl9FY2xpcHNlX0FDVEZfdXBkYXRlZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlSW1wbChvYmo6T2JqZWN0LCB0YXJnZXQ6U3RyaW5nLCBkZXB0aDpOdW1iZXIsIGxvZzpPYmplY3QpIHsKLSAgICAgICAgaWYgKGRlcHRoIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0JCWlmIChsb2dbdGFyZ2V0XSkgewotCQkJcmV0dXJuOwotCQl9Ci0gICAgICAgIGxvZ1t0YXJnZXRdID0gdHJ1ZTsKLQotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBNb3ZpZUNsaXApICYmICEob2JqIGluc3RhbmNlb2YgQnV0dG9uKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIGlzQnV0dG9uOkJvb2xlYW4gPSBvYmoub25SZWxlYXNlIHx8IG9iai5vblByZXNzIHx8IG9iaiBpbnN0YW5jZW9mIEJ1dHRvbjsKLQotICAgICAgICBpZiAoaXNCdXR0b24pIHsKLSAgICAgICAgICAgIG9iai5fYWNjUHJvcHMgPSBvYmouX2FjY1Byb3BzIHx8IHt9OwotICAgICAgICAgICAgb2JqLl9hY2NQcm9wcy5zaG9ydGN1dCA9IHRhcmdldDsKLSAgICAgICAgICAgIGxvZy5fRWNsaXBzZV9BQ1RGX3VwZGF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1vdmllQ2xpcCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLQkJZm9yICh2YXIgYyBpbiBvYmopIHsKLQkJCXZhciBjVGFyZ2V0OlN0cmluZyA9IHRhcmdldCsiLiIrYzsKLQkJCXZhciBjbzpPYmplY3QgPSBldmFsKGNUYXJnZXQpOwotCQkJY1RhcmdldCA9IHRhcmdldFBhdGgoY28pOwotCQkJaWYgKCFjby5fdGFyZ2V0KSB7Ci0JCQkJY28uX3RhcmdldCA9IGNUYXJnZXQ7Ci0JCQl9Ci0JCQl1cGRhdGVJbXBsKGNvLCBjVGFyZ2V0LCBkZXB0aCAtIDEsIGxvZyk7Ci0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQXV0b1RyYW5zbGF0b3IuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQXV0b1RyYW5zbGF0b3IuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzFjNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0F1dG9UcmFuc2xhdG9yLmFzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jbGFzcyBFY2xpcHNlX0FDVEZfQXV0b1RyYW5zbGF0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzQnV0dG9uKG46RWNsaXBzZV9BQ1RGX05vZGUpOkJvb2xlYW4gewotICAgICAgICBpZiAobi50eXBlID09ICJvYmplY3QiICYmIG4uY2xhc3NOYW1lID09ICJCdXR0b24iKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChuLnR5cGUgPT0gIm1vdmllY2xpcCIgJiYgKGV2YWwobi50YXJnZXQpLm9uUmVsZWFzZSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0VtcHR5KG46RWNsaXBzZV9BQ1RGX05vZGUpOkJvb2xlYW4gewotICAgICAgICBpZiAobi50ZXh0ICYmIG4udGV4dC5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChuLmFjY0luZm8gJiYgbi5hY2NJbmZvLm5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGlzQnV0dG9uKG4pKSB7Ci0gICAgICAgICAgICBuLnRleHQgPSBuLnRhcmdldC5zdWJzdHIobi50YXJnZXQubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGJ1aWxkSXRlbShuOkVjbGlwc2VfQUNURl9Ob2RlLCBkZXB0aDpOdW1iZXIpOkFycmF5IHsKLSAgICAgICAgdmFyIHI6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgaWYgKG4uaXNPcGFxdWVPYmplY3QpIHJldHVybiByOwotICAgICAgICBpZiAobi5hY2NJbmZvICYmIG4uYWNjSW5mby5zaWxlbnQpIHJldHVybiByOwotICAgICAgICB2YXIgY3I6QXJyYXkgPSBuLmdldENoaWxkTm9kZXNBcnJheSgpOwotICAgICAgICBjci5yZXZlcnNlKCk7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3IubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBjOkVjbGlwc2VfQUNURl9Ob2RlID0gY3JbaV07Ci0KLSAgICAgICAgICAgIGlmICghKGMudHlwZSA9PSAibW92aWVjbGlwIiB8fAotICAgICAgICAgICAgICAgICAgKGMudHlwZSA9PSAib2JqZWN0IiAmJiAoYy5jbGFzc05hbWUgPT0gIlRleHRGaWVsZCIgfHwgYy5jbGFzc05hbWUgPT0gIkJ1dHRvbiIpKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0JCQkKLSAgICAgICAgICAgIGlmIChpc0VtcHR5KGMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChkZXB0aCA8PSAwKSAmJiAoci5sZW5ndGggPiAwKSkgewotICAgICAgICAgICAgICAgICAgICByLnB1c2goYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgciA9IHIuY29uY2F0KGJ1aWxkSXRlbShjLCBkZXB0aCAtIDEpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHIucHVzaChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyYW5zbGF0ZShwYXRoOlN0cmluZyk6QXJyYXkgewotICAgICAgICB2YXIgbjpFY2xpcHNlX0FDVEZfTm9kZSA9IEVjbGlwc2VfQUNURl9Ob2RlLmdldE5vZGVGcm9tUGF0aChwYXRoKTsKLSAgICAgICAgaWYgKCFuKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGJ1aWxkSXRlbShuLCAxKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9Db250cm9sbGVyLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDFiNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGZsYXNoLmZpbHRlcnMuKjsKLQotY2xhc3MgRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FsbE1ldGhvZChwYXRoOlN0cmluZywgbWV0aG9kTmFtZTpTdHJpbmcsIGFyZ3M6QXJyYXkpIHsKLSAgICAgICAgdmFyIG8gPSBldmFsKHBhdGgpOwotICAgICAgICB2YXIgZiA9IG9bbWV0aG9kTmFtZV07Ci0gICAgICAgIHJldHVybiBmLmFwcGx5KG8sIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FsbE1ldGhvZEEocGF0aDpTdHJpbmcsIG1ldGhvZE5hbWU6U3RyaW5nKSB7Ci0gICAgICAgIHZhciBvOk9iamVjdCA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHZhciBmOkZ1bmN0aW9uID0gb1ttZXRob2ROYW1lXTsKLSAgICAgICAgdmFyIGE6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGEucHVzaChhcmd1bWVudHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmLmFwcGx5KG8sIGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJvcGVydHkocGF0aDpTdHJpbmcsIHByb3A6U3RyaW5nKTpPYmplY3QgewotICAgICAgICB2YXIgbzpPYmplY3QgPSBldmFsKHBhdGgpOwotICAgICAgICByZXR1cm4gb1twcm9wXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFByb3BlcnR5KHBhdGg6U3RyaW5nLCBwcm9wOlN0cmluZywgdmFsdWU6T2JqZWN0KSB7Ci0gICAgICAgIHZhciBvOk9iamVjdCA9IGV2YWwocGF0aCk7Ci0gICAgICAgIG9bcHJvcF0gPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZEZpbHRlcihwYXRoOlN0cmluZykgewotICAgICAgICB2YXIgbyA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHZhciBiZmlsdGVyOkJsdXJGaWx0ZXIgPSBuZXcgQmx1ckZpbHRlcig0LCA0LCAyKTsKLSAgICAgICAgby5maWx0ZXJzID0gW2JmaWx0ZXJdOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3ZlRmlsdGVyKHBhdGg6U3RyaW5nKSB7Ci0gICAgICAgIHZhciBvID0gZXZhbChwYXRoKTsKLSAgICAgICAgby5maWx0ZXJzID0gW107Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0luaXQuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfSW5pdC5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkZmY4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfSW5pdC5hcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBmbGFzaC5leHRlcm5hbC5FeHRlcm5hbEludGVyZmFjZTsKLQotY2xhc3MgRWNsaXBzZV9BQ1RGX0luaXQgewotICAgIHB1YmxpYyBzdGF0aWMgdmFyIGRlYnVnOkJvb2xlYW4gPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyB2YXIgZGVidWdUZXh0RmllbGQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZhciBjYWxsYmFja3MgPSB7Ci0gICAgICAgIGdldFJvb3ROb2RlIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Um9vdE5vZGUsCi0gICAgICAgIGdldE5vZGVGcm9tUGF0aCA6IEVjbGlwc2VfQUNURl9Ob2RlLmdldE5vZGVGcm9tUGF0aCwKLQotICAgICAgICBnZXROdW1TdWNjZXNzb3JOb2RlcyA6IEVjbGlwc2VfQUNURl9Ob2RlLmdldE51bVN1Y2Nlc3Nvck5vZGVzLAotICAgICAgICBnZXRTdWNjZXNzb3JOb2RlcyA6IEVjbGlwc2VfQUNURl9Ob2RlLmdldFN1Y2Nlc3Nvck5vZGVzLAotCi0gICAgICAgIGdldE51bUNoaWxkTm9kZXMgOiBFY2xpcHNlX0FDVEZfTm9kZS5nZXROdW1DaGlsZE5vZGVzLAotICAgICAgICBnZXRDaGlsZE5vZGVzIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Q2hpbGROb2RlcywKLQotICAgICAgICBnZXROb2RlQXREZXB0aCA6IEVjbGlwc2VfQUNURl9Ob2RlLmdldE5vZGVBdERlcHRoLAotICAgICAgICBnZXRJbm5lck5vZGVzIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0SW5uZXJOb2RlcywKLQlzZXRGb2N1cyA6IEVjbGlwc2VfQUNURl9Ob2RlLnNldEZvY3VzLAotCi0gICAgICAgIGNhbGxNZXRob2QgOiBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5jYWxsTWV0aG9kLAotICAgICAgICBjYWxsTWV0aG9kQSA6IEVjbGlwc2VfQUNURl9Db250cm9sbGVyLmNhbGxNZXRob2RBLAotICAgICAgICBnZXRQcm9wZXJ0eSA6IEVjbGlwc2VfQUNURl9Db250cm9sbGVyLmdldFByb3BlcnR5LAotICAgICAgICBzZXRQcm9wZXJ0eSA6IEVjbGlwc2VfQUNURl9Db250cm9sbGVyLnNldFByb3BlcnR5LAotICAgICAgICBhZGRGaWx0ZXIgOiAgRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIuYWRkRmlsdGVyLAotICAgICAgICByZW1vdmVGaWx0ZXIgOiBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5yZW1vdmVGaWx0ZXIsCi0KLSAgICAgICAgc2VhcmNoVmlkZW8gOiBFY2xpcHNlX0FDVEZfTWVkaWEuc2VhcmNoVmlkZW8sCi0gICAgICAgIHNlYXJjaFNvdW5kIDogRWNsaXBzZV9BQ1RGX01lZGlhLnNlYXJjaFNvdW5kLAotCi0gICAgICAgIHdhdGNoSW5pdCA6ICBFY2xpcHNlX0FDVEZfV2F0Y2gud2F0Y2hJbml0LAotICAgICAgICB3YXRjaE9iamVjdCA6IEVjbGlwc2VfQUNURl9XYXRjaC53YXRjaE9iamVjdCwKLSAgICAgICAgcmVtb3ZlV2F0Y2hMaXN0IDogRWNsaXBzZV9BQ1RGX1dhdGNoLnJlbW92ZVdhdGNoTGlzdCwKLQotICAgICAgICBuZXdNYXJrZXIgOiBFY2xpcHNlX0FDVEZfTWFya2VyLm5ld01hcmtlciwKLSAgICAgICAgc2V0TWFya2VyIDogIEVjbGlwc2VfQUNURl9NYXJrZXIuc2V0TWFya2VyLAotICAgICAgICB1bnNldE1hcmtlciA6IEVjbGlwc2VfQUNURl9NYXJrZXIudW5zZXRNYXJrZXIsCi0gICAgICAgIHNob3dBbGxNYXJrZXJzIDogRWNsaXBzZV9BQ1RGX01hcmtlci5zaG93QWxsTWFya2VycywKLSAgICAgICAgY2xlYXJBbGxNYXJrZXJzIDogRWNsaXBzZV9BQ1RGX01hcmtlci5jbGVhckFsbE1hcmtlcnMsCi0KLQlnZXRTY2FsZU1vZGUgOiBFY2xpcHNlX0FDVEZfU3RhZ2VQcm94eS5nZXRTY2FsZU1vZGUsCi0Jc2V0U2NhbGVNb2RlIDogRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuc2V0U2NhbGVNb2RlLAotCWdldFN0YWdlV2lkdGggOiBFY2xpcHNlX0FDVEZfU3RhZ2VQcm94eS5nZXRTdGFnZVdpZHRoLAotCWdldFN0YWdlSGVpZ2h0IDogRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuZ2V0U3RhZ2VIZWlnaHQsCi0JZ2V0U3RhZ2VBbGlnbiA6IEVjbGlwc2VfQUNURl9TdGFnZVByb3h5LmdldFN0YWdlQWxpZ24sCi0KLSAgICAgICAgdHJhbnNsYXRlIDogRWNsaXBzZV9BQ1RGX0F1dG9UcmFuc2xhdG9yLnRyYW5zbGF0ZSwKLQkJCi0gICAgICAgIC8vcmVwYWlyRmxhc2ggOiBFY2xpcHNlX0FDVEZfQWNjUmVwYWlyLnJlcGFpckZsYXNoLAotCi0gICAgICAgIHVwZGF0ZVRhcmdldCA6IEVjbGlwc2VfQUNURl9BY2NUYXJnZXQudXBkYXRlVGFyZ2V0Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNlYXJjaEFjY0ludGVybmFsKG86T2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDpTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VkOk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByOkFycmF5KSB7Ci0gICAgICAgIGlmICh0cmF2ZXJzZWRbdGFyZ2V0XSkgcmV0dXJuOwotICAgICAgICB0cmF2ZXJzZWRbdGFyZ2V0XSA9IHRydWU7Ci0gICAgICAgIGZvciAodmFyIGMgaW4gbykgewotICAgICAgICAgICAgaWYgKGMgPT0gIl9hY2NQcm9wcyIpIHsKLSAgICAgICAgICAgICAgICBkZWJ1Z1RleHRGaWVsZC50ZXh0ICs9ICIgQUNDUFJPUFMhIjsKLSAgICAgICAgICAgICAgICAvLyBBbGVydC5zaG93KCJMYXVuY2ggU3RvY2sgQXBwbGljYXRpb24/IiwgIlN0b2NrIFByaWNlIEFsZXJ0IiwgQWxlcnQuT0sgfCBBbGVydC5DQU5DRUwsIHRoaXMsIG15Q2xpY2tIYW5kbGVyLCAic3RvY2tJY29uIiwgQWxlcnQuT0spCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYyA9PSAiX2FjY0ltcGwiKSB7Ci0gICAgICAgICAgICAgICAgZGVidWdUZXh0RmllbGQudGV4dCArPSAiIEFDQ0lNUEwhIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBjVGFyZ2V0OlN0cmluZyA9IHRhcmdldCArICIuIiArIGM7Ci0gICAgICAgICAgICB2YXIgY286T2JqZWN0ID0gZXZhbChjVGFyZ2V0KTsKLSAgICAgICAgICAgIGlmIChjby5fdGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgY1RhcmdldCA9IEVjbGlwc2VfQUNURl9Ob2RlLm5vcm1hbGl6ZVRhcmdldE5hbWUoY28uX3RhcmdldCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvLl90YXJnZXQgPSBjVGFyZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRXh0ZXJuYWxJbnRlcmZhY2UuY2FsbCgiYWxlcnQiLCBjVGFyZ2V0KTsKLSAgICAgICAgICAgIHNlYXJjaEFjY0ludGVybmFsKGNvLCBjVGFyZ2V0LCB0cmF2ZXJzZWQsIHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2hBY2MocGF0aDpTdHJpbmcpIHsKLSAgICAgICAgdmFyIG86T2JqZWN0ID0gZXZhbChwYXRoKTsKLSAgICAgICAgdmFyIHRyYXZlcnNlZDpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIHZhciByOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHNlYXJjaEFjY0ludGVybmFsKG8sIHBhdGgsIHRyYXZlcnNlZCwgcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFkZENhbGxiYWNrKG5hbWU6U3RyaW5nLCBmdW5jOkZ1bmN0aW9uKSB7Ci0JdmFyIHJlc3VsdDpCb29sZWFuID0gRXh0ZXJuYWxJbnRlcmZhY2UuYWRkQ2FsbGJhY2sobmFtZSwgbnVsbCwgZnVuYyk7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgLy8gZGVidWdUZXh0RmllbGQudGV4dCArPSAiICIgKyBuYW1lICsgIiAiICsgcmVzdWx0ICsgIjsgIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgLy8gdHJhY2UoIkVjbGlwc2VfQUNURl9Jbml0LmluaXRpYWxpemUoKSIpOwotCi0gICAgICAgIC8vIHZhciBFY2xpcHNlX0FDVEZfaXNfYXZhaWxhYmxlOkJvb2xlYW4gPSBFeHRlcm5hbEludGVyZmFjZS5hdmFpbGFibGU7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgIHZhciBsdjBPYmogPSBldmFsKCJfbGV2ZWwwIik7IAotICAgICAgICAgIGRlYnVnVGV4dEZpZWxkID0gbHYwT2JqLmNyZWF0ZVRleHRGaWVsZCgiZGVidWdUZXh0IiwgMSwgMCwgMCwgMTAsIDEwKTsKLSAgICAgICAgICBkZWJ1Z1RleHRGaWVsZC5fd2lkdGggPSBsdjBPYmouX3dpZHRoOwotICAgICAgICAgIGRlYnVnVGV4dEZpZWxkLl9oZWlnaHQgPSBsdjBPYmouX2hlaWdodDsKLSAgICAgICAgICBzZWFyY2hBY2MoIl9sZXZlbDAiKTsKLSAgICAgICAgICBzZWFyY2hBY2MoIl9sZXZlbDEiKTsKLSAgICAgICAgICBkZWJ1Z1RleHRGaWVsZC50ZXh0ICs9ICIgRE9ORSEhISEiOwotICAgICAgICAgIC8vRXh0ZXJuYWxJbnRlcmZhY2UuY2FsbCgiYWxlcnQiLCAic3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkIGluaXQuIEFTIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0uc2VjdXJpdHkuYWxsb3dEb21haW4oJyonKTsgICAvLyBzaGluCi0KLSAgICAgICAgLyoKLSAgICAgICAgZm9yICh2YXIgaCBpbiBjYWxsYmFja3MpIHsKLSAgICAgICAgICAgIHZhciByZXMgPSBhZGRDYWxsYmFjayhoLCBjYWxsYmFja3NbaF0pOwotICAgICAgICAgICAgX2xldmVsMC5FY2xpcHNlX0FDVEZfcmVnX3Jlc3VsdHMucHVzaChyZXMpOwotICAgICAgICAgICAgaWYgKCFyZXMpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIC8vIHRyYWNlKCJFY2xpcHNlX0FDVEZfSW5pdC5pbml0aWFsaXplKCkgZG9uZS4iKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9NYXJrZXIuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfTWFya2VyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTk0ZTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9NYXJrZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBmbGFzaC5leHRlcm5hbC5FeHRlcm5hbEludGVyZmFjZTsKLQotY2xhc3MgRWNsaXBzZV9BQ1RGX01hcmtlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdmFyIG1hcmtlcnMgPSBuZXcgQXJyYXkoKTsKLSAgICB2YXIgbW92aWVDbGlwOk1vdmllQ2xpcDsKLSAgICB2YXIgaWR4Ok51bWJlcjsKLSAgICB2YXIgeCwgeSwgdywgaDpOdW1iZXI7Ci0gICAgdmFyIHR4dDpUZXh0RmllbGQ7Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIG5leHRNYXJrZXJJZHgoKSB7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFtYXJrZXJzW2ldKSByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFya2Vycy5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBFY2xpcHNlX0FDVEZfTWFya2VyKGlkeDpOdW1iZXIpIHsKLSAgICAgICAgdmFyIGJhc2VNQzpNb3ZpZUNsaXAgPSBldmFsKCJfbGV2ZWwwIik7Ci0gICAgICAgIHRoaXMuaWR4ID0gdGhpcy5uZXh0TWFya2VySWR4KCk7Ci0gICAgICAgIHZhciBuZXh0RGVwdGg6TnVtYmVyID0gYmFzZU1DLmdldE5leHRIaWdoZXN0RGVwdGgoKTsKLSAgICAgICAgLy8gRm9yIEFTIHZlcnNpb24gMiBjb21wb25lbnQKLSAgICAgICAgaWYgKG5leHREZXB0aCA+PSAxMDQ4Njc2KSB7Ci0gICAgICAgICAgICBuZXh0RGVwdGggLT0gMTAwMCArIHRoaXMuaWR4OwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubW92aWVDbGlwID0gYmFzZU1DLmNyZWF0ZUVtcHR5TW92aWVDbGlwKCJfX0VjbGlwc2VfQUNURl9tYXJrZXItIiArIHRoaXMuaWR4LCBuZXh0RGVwdGgpOwotICAgICAgICBtYXJrZXJzW3RoaXMuaWR4XSA9IHRoaXM7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLl9hbHBoYSA9IDEwMDsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuX3Zpc2libGUgPSBmYWxzZTsKLQotICAgICAgICB0aGlzLnR4dCA9IHRoaXMubW92aWVDbGlwLmNyZWF0ZVRleHRGaWVsZCgidHh0IiwgMSwgMCwgMCwgMTAsIDEwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHNldFRleHQodGV4dDpTdHJpbmcpIHsKLSAgICAgICAgdmFyIGRwcCA9IDQuMCAqIDk2IC8gNzI7Ci0gICAgICAgIHZhciBoID0gdGhpcy5oIC8gMjsKLSAgICAgICAgdGhpcy50eHQuX3ggPSAwOwotICAgICAgICB0aGlzLnR4dC5feSA9IDA7Ci0gICAgICAgIHRoaXMudHh0Ll93aWR0aCA9IHRoaXMudzsKLSAgICAgICAgdGhpcy50eHQuX2hlaWdodCA9IGg7Ci0gICAgICAgIHRoaXMudHh0Lm11bHRpbGluZSA9IHRydWU7Ci0gICAgICAgIHRoaXMudHh0LmF1dG9TaXplID0gInJpZ2h0IjsKLSAgICAgICAgdmFyIGZtdDpUZXh0Rm9ybWF0ID0gbmV3IFRleHRGb3JtYXQoKTsKLSAgICAgICAgZm10LmZvbnQgPSAiVGltZXMgTmV3IFJvbWFuIjsKLSAgICAgICAgdmFyIHNpemUgPSBoIC8gZHBwICsgNzsKLSAgICAgICAgaWYgKHNpemUgPiAyMCkgc2l6ZSA9IDIwOwotICAgICAgICBmbXQuc2l6ZSA9IHNpemU7Ci0gICAgICAgIGZtdC5jb2xvciA9IDB4MDAxMEZGOwotICAgICAgICB0aGlzLnR4dC50ZXh0ID0gdGV4dDsKLSAgICAgICAgdGhpcy50eHQuc2V0VGV4dEZvcm1hdCgwLCB0ZXh0Lmxlbmd0aCwgZm10KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRNYXJrZXIoaWR4Ok51bWJlcikgewotICAgICAgICByZXR1cm4gbWFya2Vyc1tpZHhdOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gc2V0KHg6TnVtYmVyLCB5Ok51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3Ok51bWJlciwgaDpOdW1iZXIpIHsKLSAgICAgICAgdmFyIGx3ID0gNDsKLSAgICAgICAgdGhpcy54ID0geDsKLSAgICAgICAgdGhpcy55ID0geTsKLSAgICAgICAgdGhpcy53ID0gdzsKLSAgICAgICAgdGhpcy5oID0gaDsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuX3ggPSB4OwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5feSA9IHk7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLl93ID0gdzsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuX2ggPSBoOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5saW5lU3R5bGUobHcsIDB4MDBGRjAwLCAxMDApOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5tb3ZlVG8oMCwgMCk7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLmxpbmVUbyh3LCAwKTsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAubGluZVRvKHcsIGgpOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5saW5lVG8oMCwgaCk7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLmxpbmVUbygwLCAwKTsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuX3Zpc2libGUgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gdW5zZXQoeDpOdW1iZXIsIHk6TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHc6TnVtYmVyLCBoOk51bWJlcikgewotICAgICAgICB0aGlzLm1vdmllQ2xpcC5fdmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0TWFya2VyKGlkeDpOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDpOdW1iZXIsIHk6TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6TnVtYmVyLCBoOk51bWJlcikgewotICAgICAgICB2YXIgbWs6RWNsaXBzZV9BQ1RGX01hcmtlciA9IEVjbGlwc2VfQUNURl9NYXJrZXIuZ2V0TWFya2VyKGlkeCk7Ci0gICAgICAgIG1rLnNldCh4LCB5LCB3LCBoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuc2V0TWFya2VyKGlkeDpOdW1iZXIpIHsKLSAgICAgICAgdmFyIG1rOkVjbGlwc2VfQUNURl9NYXJrZXIgPSBFY2xpcHNlX0FDVEZfTWFya2VyLmdldE1hcmtlcihpZHgpOwotICAgICAgICBtay51bnNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbmV3TWFya2VyKCk6TnVtYmVyIHsKLSAgICAgICAgdmFyIG1rOkVjbGlwc2VfQUNURl9NYXJrZXIgPSBuZXcgRWNsaXBzZV9BQ1RGX01hcmtlcigpOwotICAgICAgICByZXR1cm4gbWsuaWR4OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZhciBidWlsdE1hcmtlcnM6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNob3dNYXJrZXJzKGE6QXJyYXkpIHsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgbWs6RWNsaXBzZV9BQ1RGX01hcmtlciA9IG5ldyBFY2xpcHNlX0FDVEZfTWFya2VyKCk7Ci0gICAgICAgICAgICBidWlsdE1hcmtlcnMucHVzaChtay5pZHgpOwotICAgICAgICAgICAgdmFyIGM6RWNsaXBzZV9BQ1RGX05vZGUgPSBhW2ldOwotICAgICAgICAgICAgbWsuc2V0KGMueCwgYy55LCBjLncsIGMuaCk7Ci0gICAgICAgICAgICBtay5zZXRUZXh0KGMudGFyZ2V0ICsgInwiICsgYy5jdXJyZW50RnJhbWUpOwotICAgICAgICAgICAgdmFyIGEyOkFycmF5ID0gRWNsaXBzZV9BQ1RGX05vZGUuZ2V0SW5uZXJOb2RlcyhjLnRhcmdldCk7Ci0gICAgICAgICAgICBFY2xpcHNlX0FDVEZfTWFya2VyLnNob3dNYXJrZXJzKGEyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2hvd0FsbE1hcmtlcnMocGF0aDpTdHJpbmcpIHsKLSAgICAgICAgdmFyIGE6QXJyYXkgPSBFY2xpcHNlX0FDVEZfTm9kZS5nZXRJbm5lck5vZGVzKHBhdGgpOwotICAgICAgICBFY2xpcHNlX0FDVEZfTWFya2VyLnNob3dNYXJrZXJzKGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVtb3ZlKCkgewotICAgICAgICB0aGlzLm1vdmllQ2xpcC5jbGVhcigpOwotICAgICAgICB0aGlzLnR4dC50ZXh0ID0gIiI7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLnJlbW92ZU1vdmllQ2xpcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXJBbGxNYXJrZXJzKCkgewotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1aWx0TWFya2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIGogPSBidWlsdE1hcmtlcnNbaV07Ci0gICAgICAgICAgICBtYXJrZXJzW2pdLnJlbW92ZSgpOwotICAgICAgICAgICAgbWFya2Vyc1tqXSA9IHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX01lZGlhLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX01lZGlhLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU2ZDk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9NZWRpYS5hcworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGZsYXNoLmV4dGVybmFsLkV4dGVybmFsSW50ZXJmYWNlOwotCi1jbGFzcyBFY2xpcHNlX0FDVEZfTWVkaWEgewotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFkZE9iamVjdChvOk9iamVjdCwgdGFyZ2V0OlN0cmluZywgYTpBcnJheSkgewotICAgICAgICB2YXIgbGVuOk51bWJlciA9IGEubGVuZ3RoOwotICAgICAgICBmb3IgKHZhciBpOk51bWJlciA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgdmFyIG8yOk9iamVjdCA9IGV2YWwoYVtpXS50YXJnZXQpOwotICAgICAgICAgICAgaWYgKG8gPT09IG8yKSByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYS5wdXNoKG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCB0YXJnZXQpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2hWaWRlb0ludGVybmFsKG86T2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlZDpPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByOkFycmF5KSB7Ci0gICAgICAgIGlmICh0cmF2ZXJzZWRbdGFyZ2V0XSkgcmV0dXJuOwotICAgICAgICB0cmF2ZXJzZWRbdGFyZ2V0XSA9IHRydWU7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgTmV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBhZGRPYmplY3QobywgdGFyZ2V0LCByKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuaXNJbkNsYXNzKG8sIG14LmNvcmUuVUlPYmplY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ki8KLSAgICAgICAgZm9yICh2YXIgYyBpbiBvKSB7Ci0gICAgICAgICAgICB2YXIgY286T2JqZWN0ID0gb1tjXTsKLSAgICAgICAgICAgIHZhciBjVGFyZ2V0OlN0cmluZyA9IHRhcmdldCArICIuIiArIGM7Ci0gICAgICAgICAgICBpZiAoY28uX3RhcmdldCkgewotICAgICAgICAgICAgICAgIGNUYXJnZXQgPSBFY2xpcHNlX0FDVEZfTm9kZS5ub3JtYWxpemVUYXJnZXROYW1lKGNvLl90YXJnZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjby5fdGFyZ2V0ID0gY1RhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlYXJjaFZpZGVvSW50ZXJuYWwoY28sIGNUYXJnZXQsIHRyYXZlcnNlZCwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlYXJjaFZpZGVvKCk6QXJyYXkgewotICAgICAgICAvKgotICAgICAgICB2YXIgdHJhdmVyc2VkOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgdmFyIHI6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHBhdGg6U3RyaW5nID0gYXJndW1lbnRzW2ldOwotICAgICAgICAgICAgdmFyIG86T2JqZWN0ID0gZXZhbChwYXRoKTsKLSAgICAgICAgICAgIHNlYXJjaFZpZGVvSW50ZXJuYWwobywgcGF0aCwgdHJhdmVyc2VkLCByKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgKi8KLSAgICAgICAgdmFyIHI6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgdmFyIHN0cmVhbXM6QXJyYXkgPSBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5zdHJlYW1zOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmVhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBzbG90Ok9iamVjdCA9IHN0cmVhbXNbaV07Ci0gICAgICAgICAgICBhZGRPYmplY3Qoc2xvdCwgIl9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnN0cmVhbXMuIiArIGksIHIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNlYXJjaFNvdW5kSW50ZXJuYWwobzpPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6U3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VkOk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6QXJyYXkpIHsKLSAgICAgICAgaWYgKHRyYXZlcnNlZFt0YXJnZXRdKSByZXR1cm47Ci0gICAgICAgIHRyYXZlcnNlZFt0YXJnZXRdID0gdHJ1ZTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTb3VuZCkgewotICAgICAgICAgICAgYWRkT2JqZWN0KG8sIHRhcmdldCwgcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh2YXIgYyBpbiBvKSB7Ci0gICAgICAgICAgICB2YXIgY1RhcmdldDpTdHJpbmcgPSB0YXJnZXQgKyAiLiIgKyBjOwotICAgICAgICAgICAgdmFyIGNvOk9iamVjdCA9IGV2YWwoY1RhcmdldCk7Ci0gICAgICAgICAgICBpZiAoY28uX3RhcmdldCkgewotICAgICAgICAgICAgICAgIGNUYXJnZXQgPSBFY2xpcHNlX0FDVEZfTm9kZS5ub3JtYWxpemVUYXJnZXROYW1lKGNvLl90YXJnZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjby5fdGFyZ2V0ID0gY1RhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEV4dGVybmFsSW50ZXJmYWNlLmNhbGwoImFsZXJ0IiwgY1RhcmdldCk7Ci0gICAgICAgICAgICBzZWFyY2hTb3VuZEludGVybmFsKGNvLCBjVGFyZ2V0LCB0cmF2ZXJzZWQsIHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2hTb3VuZChwYXRoOlN0cmluZyk6QXJyYXkgewotICAgICAgICAvKiB2YXIgbzpPYmplY3QgPSBldmFsKHBhdGgpOwotICAgICAgICB2YXIgdHJhdmVyc2VkOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgdmFyIHI6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgc2VhcmNoU291bmRJbnRlcm5hbChvLCBwYXRoLCB0cmF2ZXJzZWQsIHIpOwotICAgICAgICByZXR1cm4gcjsgKi8KLSAgICAgICAgaWYgKCFfZ2xvYmFsLkVjbGlwc2VfQUNURl9GTEFTSEJyaWRnZUdsb2JhbFNvdW5kKSB7Ci0gICAgICAgICAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9GTEFTSEJyaWRnZUdsb2JhbFNvdW5kID0gbmV3IFNvdW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIHI6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgci5wdXNoKG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCAiX2dsb2JhbC5FY2xpcHNlX0FDVEZfRkxBU0hCcmlkZ2VHbG9iYWxTb3VuZCIpKTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotICAgIC8qCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWb2x1bWUocGF0aDpTdHJpbmcpOk51bWJlciB7Ci0gICAgICAgIHZhciBzOlNvdW5kID0gZXZhbChwYXRoKTsKLSAgICAgICAgcmV0dXJuIHMuZ2V0Vm9sdW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRWb2x1bWUocGF0aDpTdHJpbmcsIHZhbDpOdW1iZXIpIHsKLSAgICAgICAgdmFyIHM6U291bmQgPSBldmFsKHBhdGgpOwotICAgICAgICBzLnNldFZvbHVtZSh2YWwpOwotICAgIH0KLSAgICAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX05vZGUuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfTm9kZS5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3YTUyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfTm9kZS5hcworKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWNsYXNzIEVjbGlwc2VfQUNURl9Ob2RlIHsKLSAgICBwcml2YXRlIHZhciBfX29iamVjdDsKLQotICAgIHZhciBvYmplY3ROYW1lOwotICAgIHZhciB0eXBlOwotICAgIHZhciBjbGFzc05hbWU7Ci0gICAgdmFyIHRleHQ7Ci0gICAgdmFyIHRpdGxlOwotICAgIHZhciB0YXJnZXQ6U3RyaW5nOwotICAgIHZhciB4Ok51bWJlciwgeTpOdW1iZXIsIHc6TnVtYmVyLCBoOk51bWJlcjsKLSAgICB2YXIgdmFsdWU7Ci0gICAgdmFyIGlzT3BhcXVlT2JqZWN0OkJvb2xlYW47Ci0gICAgdmFyIGlzVUlDb21wb25lbnQ6Qm9vbGVhbjsKLSAgICB2YXIgaXNJbnB1dGFibGU6Qm9vbGVhbjsKLSAgICB2YXIgZGVwdGg7Ci0gICAgdmFyIGN1cnJlbnRGcmFtZTpOdW1iZXI7Ci0gICAgdmFyIHRhYkluZGV4Ok51bWJlcjsKLQotICAgIHZhciBhY2NJbmZvOkVjbGlwc2VfQUNURl9BY2NJbmZvOwotCi0gICAgLyoKLSAgICAgIHB1YmxpYyBmdW5jdGlvbiBFY2xpcHNlX0FDVEZfTm9kZShpTmFtZSwgdG4sIGNuLCB0eHQsIGMpIHsKLSAgICAgIHRoaXMuaW5zdGFuY2VOYW1lID0gaU5hbWU7Ci0gICAgICB0aGlzLnR5cGUgPSB0bjsKLSAgICAgIHRoaXMuY2xhc3NOYW1lID0gY247Ci0gICAgICB0aGlzLnRleHQgPSB0eHQ7Ci0gICAgICB0aGlzLmNoaWxkcmVuID0gYzsKLSAgICAgIHRyYWNlKCJOb2RlIGNyZWF0ZWQuIik7Ci0gICAgICB9Ci0gICAgKi8KLQotICAgIC8vIAotICAgIHZhciBzd2ZWZXJzaW9uOlN0cmluZzsKLSAgICB2YXIgdXJsOlN0cmluZzsKLSAgICB2YXIgbU5hbWU6U3RyaW5nOwotICAgIHZhciBtVGFyZ2V0OlN0cmluZzsKLSAgICB2YXIgcGFyZW50VGFyZ2V0OlN0cmluZzsKLSAgICB2YXIgdGFyZ2V0TW9kaWZpZWQ6Qm9vbGVhbjsKLSAgICB2YXIgdGFyZ2V0SXNTdHJpbmc6Qm9vbGVhbjsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOlN0cmluZyB7Ci0gICAgICAgIHZhciByZXQ7Ci0gICAgICAgIHJldCA9IHRoaXMub2JqZWN0TmFtZSArICIgLSAodHlwZToiICsgdGhpcy50eXBlICsgIikgIiArICh0aGlzLnZhbHVlID8gIih2YWx1ZToiICsgdGhpcy52YWx1ZSArICIpIiA6ICIiKSArICIgIiArICh0YXJnZXQgPyAiKHRhcmdldDoiICsgdGhpcy50YXJnZXQgKyAiKSIgOiAiIikgKyAiICI7Ci0gICAgICAgIHJldCArPSAodGhpcy5jbGFzc05hbWUgPyAiKGNOYW1lOiIgKyB0aGlzLmNsYXNzTmFtZSArICIpIiA6ICIiKSArICIgIiArICh0aGlzLnRleHQgPyAiKHRleHQ6IiArIHRoaXMudGV4dCArICIpIiA6ICIiKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHVpT2JqZWN0Q2hlY2soKTpCb29sZWFuIHsKLSAgICAgICAgaWYgKCEoRWNsaXBzZV9BQ1RGX1V0aWwuaXNJbkNsYXNzKHRoaXMuX19vYmplY3QsIG14LmNvcmUuVUlPYmplY3QpKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuaXNJbkNsYXNzKHRoaXMuX19vYmplY3QsIG14LmNvcmUuVUlDb21wb25lbnQpKSB7Ci0gICAgICAgICAgICBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250YWluZXJzLkFjY29yZGlvbikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250YWluZXJzLkFjY29yZGlvbiI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuaXNJbkNsYXNzKHRoaXMuX19vYmplY3QsIG14LmNvbnRhaW5lcnMuV2luZG93KSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QudGl0bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5fX29iamVjdC50aXRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuQWxlcnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRhaW5lcnMuQWxhcnQiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRhaW5lcnMuV2luZG93IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmlzSW5DbGFzcyh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5MaXN0KSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuRGF0YUdyaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLkRhdGFHcmlkIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5MaXN0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuQnV0dG9uKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuQnV0dG9uIjsKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCwgdG9nZ2xlCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuQ2hlY2tCb3gpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5DaGVja0JveCI7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QubGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5fX29iamVjdC5sYWJlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5Db21ib0JveCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLkNvbWJvQm94IjsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC50ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QudGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUsIHNlbGVjdGVkSXRlbSwgc2VsZWN0ZWRJbmRleCwgLi4uCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuRGF0ZUZpZWxkKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuRGF0ZUZpZWxkIjsKLSAgICAgICAgICAgICAgICAvLyBUT0RPLi4uCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuRGF0ZUNob29zZXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5EYXRlQ2hvb3NlciI7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETy4uLgotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkxhYmVsKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLkxhYmVsIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5fX29iamVjdC50ZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5Mb2FkZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVmlldwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLkxvYWRlciI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuTWVudSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5NZW51IjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLk1lbnVCYXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuTWVudUJhciI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5OdW1lcmljU3RlcHBlcikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5OdW1lcmljU3RlcHBlciI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC52YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBTdHJpbmcodGhpcy5fX29iamVjdC52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLlJhZGlvQnV0dG9uKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLlJhZGlvQnV0dG9uIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNJbnB1dGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LmxhYmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QuZ3JvdXBOYW1lICsgIiAiICsgdGhpcy5fX29iamVjdC5sYWJlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udGFpbmVycy5TY3JvbGxQYW5lKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRhaW5lcnMuU2Nyb2xsUGFuZSI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5UZXh0QXJlYSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5UZXh0QXJlYSI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC50ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QudGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuVGV4dElucHV0KSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLlRleHRJbnB1dCI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC50ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QudGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuVHJlZSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5UcmVlIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLlVJU2Nyb2xsQmFyKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLlVJU2Nyb2xsQmFyIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LnNjcm9sbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3Quc2Nyb2xsUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14Lm1hbmFnZXJzLkZvY3VzTWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5tYW5hZ2Vycy5Gb2N1c01hbmFnZXIiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLk1lZGlhQ29udHJvbGxlcikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5NZWRpYUNvbnRyb2xsZXIiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuTWVkaWFEaXNwbGF5KSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLk1lZGlhRGlzcGxheSI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5NZWRpYVBsYXliYWNrKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLk1lZGlhUGxheWJhY2siOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvcmUuVUlDb21wb25lbnQiOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuUHJvZ3Jlc3NCYXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuUHJvZ3Jlc3NCYXIiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QubGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5fX29iamVjdC5sYWJlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvcmUuVUlPYmplY3QiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBFY2xpcHNlX0FDVEZfTm9kZShwYXJlbnQsIG9iamVjdFN0cikgewotICAgICAgICAvLyBkdHJhY2UoIiAgY3RvcjoiKTsKLSAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0U3RyOwotICAgICAgICAvLyBkdHJhY2UoIiAgIHBhdGggPSAiICsgKChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gdW5kZWZpbmVkKSA/IHBhcmVudCA6ICIqKiIpICsgIjoiICsgb2JqZWN0U3RyKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSB1bmRlZmluZWQpIHsKLSAgICAgICAgICAgIC8vIHRyYWNlKHBhcmVudCArICI6IiArIG9iamVjdFN0cik7Ci0gICAgICAgICAgICB2YXIgcGFyZW50TyA9IGV2YWwocGFyZW50KTsKLSAgICAgICAgICAgIHRoaXMuX19vYmplY3QgPSBwYXJlbnRPW29iamVjdFN0cl07Ci0gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHBhcmVudCArICIuIiArIG9iamVjdFN0cjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRyYWNlKHRoaXMuX19vYmplY3QpOwotICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBvYmplY3RTdHI7Ci0gICAgICAgICAgICB0aGlzLl9fb2JqZWN0ID0gZXZhbChvYmplY3RTdHIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGVvZiAodGhpcy5fX29iamVjdCk7Ci0gICAgICAgIC8vIGR0cmFjZSgiICAgdHlwZTogIiArIHRoaXMudHlwZSk7Ci0KLSAgICAgICAgdGhpcy5hY2NJbmZvID0gRWNsaXBzZV9BQ1RGX0FjY0luZm8ubmV3QWNjSW5mbyh0aGlzLl9fb2JqZWN0KTsKLSAgICAgICAgaWYgKHRoaXMuX19vYmplY3QuZ2V0U1dGVmVyc2lvbikgewotICAgICAgICAgICAgdGhpcy5zd2ZWZXJzaW9uID0gdGhpcy5fX29iamVjdC5nZXRTV0ZWZXJzaW9uKCk7IC8vIHNoaW4gZm9yIGRlYnVnCi0gICAgICAgIH0KLSAgICAgICAgdGhpcy51cmwgPSB0aGlzLl9fb2JqZWN0Ll91cmw7IC8vIHNoaW4gZm9yIGRlYnVnCi0gICAgICAgIHRoaXMudyA9IHRoaXMuX19vYmplY3QuX3dpZHRoOwotICAgICAgICB0aGlzLmggPSB0aGlzLl9fb2JqZWN0Ll9oZWlnaHQ7Ci0gICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LmdldFJlY3QpIHsKLSAgICAgICAgICAgIHZhciBib2JqOk9iamVjdCA9IHRoaXMuX19vYmplY3QuZ2V0UmVjdCgpOwotICAgICAgICAgICAgdGhpcy54ID0gYm9iai54TWluOwotICAgICAgICAgICAgdGhpcy55ID0gYm9iai55TWluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIG9iamVjdCBpcyBwdXQgaW4gaXRzIHBhcmVudCBNQy4KLSAgICAgICAgICAgIC8vIFRoZSBvcmlnaW4gaXMgbG9jYXRlZCBhdCB0aGUgY2VudGVyIG9mIHRoZSBvYmplY3QuCi0gICAgICAgICAgICB0aGlzLnggPSBvYmplY3QuX3ggLSB0aGlzLncgLyAyOwotICAgICAgICAgICAgdGhpcy55ID0gb2JqZWN0Ll95IC0gdGhpcy5oIC8gMjsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aGlzLnggPSB0aGlzLl9fb2JqZWN0Ll94OwotICAgICAgICAgICAgdGhpcy55ID0gdGhpcy5fX29iamVjdC5feTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5fX29iamVjdC5sb2NhbFRvR2xvYmFsKSB7Ci0gICAgICAgICAgICB0aGlzLl9fb2JqZWN0LmxvY2FsVG9HbG9iYWwodGhpcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX29iamVjdC5fcGFyZW50LmxvY2FsVG9HbG9iYWwpIHsKLSAgICAgICAgICAgIHRoaXMuX19vYmplY3QuX3BhcmVudC5sb2NhbFRvR2xvYmFsKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLnR5cGUgPT0gIm1vdmllY2xpcCIpIHsKLSAgICAgICAgICAgIHZhciB0YXJnZXRQYXRoOlN0cmluZyA9IHRhcmdldFBhdGgodGhpcy5fX29iamVjdCk7Ci0gICAgICAgICAgICB2YXIgck9iajpPYmplY3QgPSBldmFsKHRhcmdldFBhdGgpOwotICAgICAgICAgICAgaWYgKHR5cGVvZihyT2JqKSA9PSAic3RyaW5nIikgewotICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0SXNTdHJpbmcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGV2YWwock9iaikgPT09IHRoaXMuX19vYmplY3QpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldE1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldFBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkdHJhY2UoIiAgIHRhcmdldDogIiArIHRoaXMudGFyZ2V0KTsKLSAgICAgICAgICAgIHRoaXMubU5hbWUgPSB0aGlzLl9fb2JqZWN0Ll9uYW1lOwotICAgICAgICAgICAgdGhpcy5tVGFyZ2V0ID0gdGhpcy5fX29iamVjdC5fdGFyZ2V0OwotICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QuX3BhcmVudCkgewotICAgICAgICAgICAgICAgIHRoaXMucGFyZW50VGFyZ2V0ID0gdGhpcy5fX29iamVjdC5fcGFyZW50Ll90YXJnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IHRoaXMuX19vYmplY3QuX2N1cnJlbnRmcmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVwdGggPSB0aGlzLl9fb2JqZWN0LmdldERlcHRoKCk7Ci0gICAgICAgICAgICBpZiAoIXVpT2JqZWN0Q2hlY2soKSkgewotICAgICAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LnZpZGVvLkZMVlBsYXliYWNrKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC52aWRlby5GTFZQbGF5YmFjayI7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC52aWRlby5WaWRlb1BsYXllcikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXgudmlkZW8uVmlkZW9QbGF5ZXIiOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLnRleHQgPT0gbnVsbCB8fCB0aGlzLnRleHQgPT0gdW5kZWZpbmVkIHx8IHRoaXMudGV4dCA9PSAiIikgewotICAgICAgICAgICAgICAgIC8vIGR0cmFjZSgiICAgb2J0YWluaW5nIHRleHQgZnJvbSBzbmFwc2hvdC4uLiIpOwotICAgICAgICAgICAgICAgIHZhciB0czpUZXh0U25hcHNob3QgPSB0aGlzLl9fb2JqZWN0LmdldFRleHRTbmFwc2hvdCgpOwotICAgICAgICAgICAgICAgIGlmICh0cykgewotICAgICAgICAgICAgICAgICAgICB2YXIgbGVuOk51bWJlciA9IHRzLmdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gdHMuZ2V0VGV4dCgwLCBsZW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZHRyYWNlKCIgICBvYnRhaW5lZCB0ZXh0IGlzIFtbIiArIHRleHQgKyAiXV0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0ICE9IHVuZGVmaW5lZCAmJiB0ZXh0ICE9ICIiKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSAib2JqZWN0IikgewotICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QgaW5zdGFuY2VvZiBUZXh0RmllbGQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJUZXh0RmllbGQiOwotICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0UGF0aCh0aGlzLl9fb2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC50eXBlID09ICJpbnB1dCIpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgodGhpcy5fX29iamVjdC5fX3Nob3dDb250ZW50cyAhPSBmYWxzZSkgJiYgdGhpcy5fX29iamVjdC50ZXh0ICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuX19vYmplY3QudGV4dCAhPSB1bmRlZmluZWQgJiYgdGhpcy5fX29iamVjdC50ZXh0ICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QudGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gdHJhY2UoIiBUZXh0OiIgKyB0aGlzLnRleHQpOwotICAgICAgICAgICAgICAgIC8vIGlmICh0aGlzLl9fb2JqZWN0W29dLl9fc2hvd0NvbnRlbnRzICE9IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gX2xldmVsMC5hcmVhX3R4dC50ZXh0ICs9ICIgWyIgKyB0aGlzLl9fb2JqZWN0W29dLnRleHQgKyAiXSI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYmplY3QgaW5zdGFuY2VvZiBCdXR0b24pIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJCdXR0b24iOwotICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0UGF0aCh0aGlzLl9fb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5fX29iamVjdFtvXS5fX3Nob3dDb250ZW50cyAhPSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIF9sZXZlbDAuYXJlYV90eHQudGV4dCArPSAiIFsiICsgdGhpcy5fX29iamVjdFtvXS50ZXh0ICsgIl0iOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fb2JqZWN0IGluc3RhbmNlb2YgWE1MKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAiWE1MIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX29iamVjdCBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJYTUxOb2RlIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX29iamVjdCBpbnN0YW5jZW9mIEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAiQXJyYXkiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fb2JqZWN0IGluc3RhbmNlb2YgU291bmQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJTb3VuZCI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYmplY3QgaW5zdGFuY2VvZiBWaWRlbykgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIlZpZGVvIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldFBhdGgodGhpcy5fX29iamVjdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXgubWFuYWdlcnMuRGVwdGhNYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14Lm1hbmFnZXJzLkRlcHRoTWFuYWdlciI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIj8/PyBVbmtub3duIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGR0cmFjZSgiICBjbGFzcyBuYW1lOiAiICsgdGhpcy5jbGFzc05hbWUpOwotICAgICAgICAgICAgdGhpcy5kZXB0aCA9IHRoaXMuX19vYmplY3QuZ2V0RGVwdGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSBTdHJpbmcoZXZhbCh0aGlzLnRhcmdldCkpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudGFiSW5kZXggPSB0aGlzLl9fb2JqZWN0LnRhYkluZGV4OwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gU3VjY2Vzc29yTm9kZXMuIChJbiBncmFwaCB0aGVvcnksIHdlIGNhbiBkaXJlY3RseSByZWFjaCBzdWNjZXJvcyBub2RlcyBmcm9tICJ0aGlzIiBub2RlKQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TnVtYmVyT2ZTdWNjZXNzb3JOb2RlcygpOk51bWJlciB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldFN1Y2Nlc3Nvck5vZGVzQXJyYXkoKS5sZW5ndGg7Ci0gICAgfQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdWNjZXNzb3JOb2Rlc0FycmF5KCk6QXJyYXkgewotICAgICAgICAvLyBkdHJhY2UoIk5vZGU6OmdldFN1Y2Nlc3Nvck5vZGVzQXJyYXkoKSIpOwotICAgICAgICB2YXIgc3VjY2Vzc29yczpBcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBpZiAodGhpcy50eXBlICE9ICJtb3ZpZWNsaXAiICYmIHRoaXMudHlwZSAhPSAib2JqZWN0IikgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvcnM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHZhciBjaGlsZCBpbiBldmFsKHRoaXMudGFyZ2V0KSkgewotICAgICAgICAgICAgICAgIHZhciBjTm9kZTpFY2xpcHNlX0FDVEZfTm9kZSA9IG5ldyBFY2xpcHNlX0FDVEZfTm9kZSh0aGlzLnRhcmdldCwgY2hpbGQpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NvcnMucHVzaChjTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2Vzc29yczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TnVtU3VjY2Vzc29yTm9kZXMocGF0aDpTdHJpbmcpOk51bWJlciB7Ci0gICAgICAgIC8vIGR0cmFjZSgic3RhdGljIE5vZGU6OmdldE51bVN1Y2Nlc3Nvck5vZGVzKCkiKTsKLSAgICAgICAgdmFyIG5vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBFY2xpcHNlX0FDVEZfTm9kZS5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0gICAgICAgIGlmICghbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXROdW1iZXJPZlN1Y2Nlc3Nvck5vZGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdWNjZXNzb3JOb2RlcyhwYXRoOlN0cmluZyk6QXJyYXkgewotICAgICAgICB2YXIgbm9kZTpFY2xpcHNlX0FDVEZfTm9kZSA9IEVjbGlwc2VfQUNURl9Ob2RlLmdldE5vZGVGcm9tUGF0aChwYXRoKTsKLSAgICAgICAgaWYgKCFub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlLmdldFN1Y2Nlc3Nvck5vZGVzQXJyYXkoKTsKLSAgICB9Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBDaGlsZE5vZGVzLiAoSW4gdHJlZSB0aGVvcnksIHRoZSBjaGlsZCBub2RlcyBoYXMgInRoaXMiIHBhcmVudCBub2RlKQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIGZ1bmN0aW9uIGdldE51bWJlck9mQ2hpbGROb2RlcygpOk51bWJlciB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkTm9kZXNBcnJheSgpLmxlbmd0aDsKLSAgICB9Ci0gICAgcHVibGljIGZ1bmN0aW9uIGdldENoaWxkTm9kZXNBcnJheSgpOkFycmF5IHsKLSAgICAgICAgLy8gZHRyYWNlKCJOb2RlOjpnZXRDaGlsZE5vZGVzQXJyYXkoKSIpOwotICAgICAgICB2YXIgY2hpbGRyZW46QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgdmFyIG9iak5hbWVzOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICB2YXIgdHA6U3RyaW5nID0gdGFyZ2V0UGF0aCh0aGlzLl9fb2JqZWN0KTsKLSAgICAgICAgLy8gZHRyYWNlKCIgdHAgPSAiICsgdHApOwotICAgICAgICBpZiAodHAgPT0gbnVsbCB8fCB0cCA9PSB1bmRlZmluZWQpIHsKLSAgICAgICAgICAgIC8vIGR0cmFjZSgiICoqIHRwIGlzIG51bGwuIGFib3J0LiIpOwotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29waWVkIGZyb20gZ2V0U3VjY2Vzc29yTm9kZXNBcnJheSgpLiBuZWVkbGVzcz8KLSAgICAgICAgaWYgKHRoaXMudHlwZSAhPSAibW92aWVjbGlwIiAmJiB0aGlzLnR5cGUgIT0gIm9iamVjdCIpIHsKLSAgICAgICAgICAgIC8vIGR0cmFjZSgiICoqIHRoZSBlbnRpdHkgaXMgbm90IG1vdmllY2xpcCBub3Igb2JqZWN0LiBhYm9ydC4iKTsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFE6IHdoeSBkbyB3ZSB1c2UgYm90aCB0YXJnZXRQYXRoIGFuZCB0aGlzLnRhcmdldD8KLSAgICAgICAgdmFyIGk6TnVtYmVyID0gMDsKLSAgICAgICAgZm9yICh2YXIgY2hpbGQgaW4gZXZhbCh0aGlzLnRhcmdldCkpIHsKLSAgICAgICAgICAgIC8vIGR0cmFjZSgiIGluZGV4ICIgKyAoaSsrKSArICI6ICIgKyBjaGlsZCk7Ci0gICAgICAgICAgICB2YXIgY05vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBuZXcgRWNsaXBzZV9BQ1RGX05vZGUodGhpcy50YXJnZXQsIGNoaWxkKTsKLSAgICAgICAgICAgIHZhciBjTm9kZVRhcmdldDpTdHJpbmcgPSBjTm9kZS50YXJnZXQ7Ci0gICAgICAgICAgICAvLyBkdHJhY2UoIiAgY2hpbGQncyB0YXJnZXQ6ICIgKyBjTm9kZVRhcmdldCk7Ci0gICAgICAgICAgICB2YXIgaWR4Ok51bWJlciA9IGNOb2RlVGFyZ2V0Lmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgICAgICAgIC8vIGR0cmFjZSgiICAqKiB0aGlzIGNoaWxkIGRvZXMgbm90IGhhdmUgJy4nLiBjb250aW51ZS4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRwICE9IGNOb2RlVGFyZ2V0LnN1YnN0cmluZygwLCBpZHgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZHRyYWNlKCIgICoqIHRoaXMgY2hpbGQgaXMgbm90IHJlYWwgY2hpbGQuIGNvbnRpbnVlLiIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgYnJpZGdlLWludGVybmFsIG9iamVjdHMuCi0gICAgICAgICAgICBpZiAoY05vZGVUYXJnZXQuaW5kZXhPZigiX19FY2xpcHNlX0FDVEZfIikgPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIGR0cmFjZSgiICAqKiB0aGlzIGNoaWxkIGlzIGJyaWRnZS1pbnRlcm5hbCBlbnRpdHkuIGNvbnRpbnVlLiIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0JICAgIHZhciBvYmpOYW1lOlN0cmluZyA9IGNOb2RlVGFyZ2V0LnN1YnN0cmluZyhpZHgrMSk7Ci0JICAgIC8vIEVjbGlwc2VfQUNURl9VdGlsLnNlbmQob2JqTmFtZSk7Ci0JICAgIGlmIChvYmpOYW1lc1tvYmpOYW1lXSA9PSAxKXsKLQkJLy8gRWNsaXBzZV9BQ1RGX1V0aWwuc2VuZCgiIC0tIGR1cGxpY2F0ZWQhIik7Ci0gICAgICAgICAgICAgICAgLy8gZHRyYWNlKCIgICoqIGR1cGxpY2F0ZWQgY2hpbGQgbmFtZS4gY29udGludWUuIik7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIG9iak5hbWVzW29iak5hbWVdID0gMTsKLSAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY05vZGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGR0cmFjZSgicHJvY2Vzc2VkIGNoaWxkcmVuLiIpOwotICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXROdW1DaGlsZE5vZGVzKHBhdGg6U3RyaW5nKTpOdW1iZXIgewotICAgICAgICAvLyBkdHJhY2UoInN0YXRpYyBOb2RlOjpnZXROdW1DaGlsZE5vZGVzKCkiKTsKLSAgICAgICAgdmFyIG5vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBFY2xpcHNlX0FDVEZfTm9kZS5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0gICAgICAgIGlmICghbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXROdW1iZXJPZkNoaWxkTm9kZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENoaWxkTm9kZXMocGF0aDpTdHJpbmcpOkFycmF5IHsKLSAgICAgICAgdmFyIG5vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBFY2xpcHNlX0FDVEZfTm9kZS5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0gICAgICAgIGlmICghbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXRDaGlsZE5vZGVzQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEVuZHMgaGVyZS4KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Tm9kZUZyb21QYXRoKHBhdGg6U3RyaW5nKTpFY2xpcHNlX0FDVEZfTm9kZSB7Ci0gICAgICAgIGlmICghZXZhbChwYXRoKSkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICB2YXIgbm9kZTpFY2xpcHNlX0FDVEZfTm9kZSA9IG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCBwYXRoKTsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoKTpFY2xpcHNlX0FDVEZfTm9kZSB7Ci0gICAgICAgIHZhciBub2RlOkVjbGlwc2VfQUNURl9Ob2RlID0gbmV3IEVjbGlwc2VfQUNURl9Ob2RlKG51bGwsICJfbGV2ZWwwIik7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUHJvcGVybHlOZXN0ZWQoeDE6TnVtYmVyLCB5MTpOdW1iZXIsIHcxOk51bWJlciwgaDE6TnVtYmVyLCB4MjpOdW1iZXIsIHkyOk51bWJlciwgdzI6TnVtYmVyLCBoMjpOdW1iZXIpOkJvb2xlYW4gewotICAgICAgICB2YXIgbCA9IE1hdGgubWF4KHgxLCB4Mik7Ci0gICAgICAgIHZhciByID0gTWF0aC5taW4oeDEgKyB3MSwgeDIgKyB3Mik7Ci0gICAgICAgIHZhciB0ID0gTWF0aC5tYXgoeTEsIHkyKTsKLSAgICAgICAgdmFyIGIgPSBNYXRoLm1pbih5MSArIGgxLCB5MiArIGgyKTsKLSAgICAgICAgcmV0dXJuICgoKHIgLSBsKSA+IDApICYmICgoYiAtIHQpID4gMCkpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vZGVBdERlcHRoKHBhdGg6U3RyaW5nLCBkZXB0aDpOdW1iZXIpOkVjbGlwc2VfQUNURl9Ob2RlIHsKLSAgICAgICAgdmFyIGIgPSBldmFsKHBhdGgpOwotICAgICAgICB2YXIgbyA9IGIuZ2V0SW5zdGFuY2VBdERlcHRoKGRlcHRoKTsKLSAgICAgICAgaWYgKCFvKSByZXR1cm4gdW5kZWZpbmVkOwotICAgICAgICB2YXIgdGFyZ2V0ID0gRWNsaXBzZV9BQ1RGX05vZGUubm9ybWFsaXplVGFyZ2V0TmFtZShvLl90YXJnZXQpOwotICAgICAgICByZXR1cm4gbmV3IEVjbGlwc2VfQUNURl9Ob2RlKG51bGwsIHRhcmdldCk7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNtcHh5KGE6RWNsaXBzZV9BQ1RGX05vZGUsIGI6RWNsaXBzZV9BQ1RGX05vZGUpOk51bWJlciB7Ci0gICAgICAgIGlmIChhLnkgPiBiLnkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhLnkgPCBiLnkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYS54ID4gYi54KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYS54IDwgYi54KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplVGFyZ2V0TmFtZSh0YXJnZXQ6U3RyaW5nKTpTdHJpbmcgewotICAgICAgICBpZiAodGFyZ2V0LmNoYXJBdCgwKSAhPSAnLycpIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIHJhOkFycmF5ID0gdGFyZ2V0LnNwbGl0KCIvIik7Ci0gICAgICAgIHZhciBudDpTdHJpbmcgPSAiX2xldmVsMCI7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyYVtpXS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgbnQgPSBudCArICIuIiArIHJhW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbm5lck5vZGVzKHBhdGg6U3RyaW5nLCBmbGFnOkJvb2xlYW4sIHN0YXJ0QmFzZURlcHRoOkJvb2xlYW4pOkFycmF5IHsKLSAgICAgICAgdmFyIGFycmF5OkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIC8vIHRyYWNlKCJQQVRIOiIrcGF0aCk7Ci0gICAgICAgIHZhciBiID0gZXZhbChwYXRoKTsKLSAgICAgICAgdmFyIG87Ci0gICAgICAgIC8vIHRyYWNlKCJUWToiICsgdHlwZW9mKGIpKTsKLSAgICAgICAgaWYgKGIgJiYgYi5nZXROZXh0SGlnaGVzdERlcHRoKSB7Ci0gICAgICAgICAgICB2YXIgZHM6TnVtYmVyLCBkZTpOdW1iZXIsIGRjOk51bWJlcjsKLSAgICAgICAgICAgIGRlID0gYi5nZXROZXh0SGlnaGVzdERlcHRoKCk7Ci0gICAgICAgICAgICBpZiAoZGUgPiAxMDAwKSB7Ci0gICAgICAgICAgICAgICAgZGUgPSAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gdHJhY2UoIklEUzoiICsgYi5nZXREZXB0aCgpICsiOiIrYi5feCsiOiIrYi5feSsiOiIrYi5fd2lkdGgrIjoiICtiLl9oZWlnaHQpOyAKLSAgICAgICAgICAgIC8vIHRyYWNlKCJJREU6IiArIGRlKTsKLSAgICAgICAgICAgIGRjID0gYi5nZXREZXB0aCgpOwotICAgICAgICAgICAgaWYgKHN0YXJ0QmFzZURlcHRoKSB7Ci0gICAgICAgICAgICAgICAgZHMgPSBkYyArIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRzID0gLTE2MzgzOwotICAgICAgICAgICAgICAgIC8vIC0xNjM4NChfbGV2ZWwwLmdldERlcHRoKCkgKyAxKQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICg7IGRzIDwgZGU7IGRzKyspIHsKLSAgICAgICAgICAgICAgICAvLyBpZiAoZHMgPT0gZGMpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIG8gPSBiLmdldEluc3RhbmNlQXREZXB0aChkcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG8uX3RhcmdldCA9PSBiLl90YXJnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvICYmIG8uX3Zpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIuX3gKLSAgICAgICAgICAgICAgICAgICAgICB8fCAhby5feAotICAgICAgICAgICAgICAgICAgICAgIHx8IEVjbGlwc2VfQUNURl9Ob2RlLmlzUHJvcGVybHlOZXN0ZWQoYi5feCwgYi5feSwgYi5fd2lkdGgsIGIuX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBvLl94LCBvLl95LCBvLl93aWR0aCwgby5faGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKCJJRDoiICsgZHMgKyAiOiIgKyBvLl90YXJnZXQpOwotICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2gobmV3IEVjbGlwc2VfQUNURl9Ob2RlKG51bGwsIG8uX3RhcmdldCkpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IEVjbGlwc2VfQUNURl9Ob2RlLm5vcm1hbGl6ZVRhcmdldE5hbWUoby5fdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG8yID0gZXZhbCh0YXJnZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZyB8fCAoZHMgPT0gMCkgfHwgKG8yLmdldERlcHRoKCkgPT0gZHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCB0YXJnZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyB0cmFjZSgiTEVOOiIrYXJyYXkubGVuZ3RoKTsgCi0gICAgICAgIGFycmF5LnNvcnQoRWNsaXBzZV9BQ1RGX05vZGUuY21weHkpOwotICAgICAgICByZXR1cm4gYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRGb2N1cyhwYXRoOlN0cmluZyk6Qm9vbGVhbiB7Ci0gICAgICAgIHZhciBvID0gZXZhbChwYXRoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5zZXRGb2N1cyhvKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkdHJhY2UobWVzOlN0cmluZykgewotICAgICAgICAvLyBpZiAoZGVidWcpIHsKLSAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICAgIHRyYWNlKG1lcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfUmVxdWVzdFNlcnZlci5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9SZXF1ZXN0U2VydmVyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODExOThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9SZXF1ZXN0U2VydmVyLmFzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jbGFzcyBFY2xpcHNlX0FDVEZfUmVxdWVzdFNlcnZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHNlY3JldDpTdHJpbmc7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzKHByb3BOYW1lLCBvbGRWYWwsIG5ld1ZhbCwgdXNlckRhdGEpIHsKLSAgICAgICAgLy8gZHRyYWNlKCJwcm9jZXNzaW5nOiAiICsgcHJvcE5hbWUgKyAiICIgKyBvbGRWYWwgKyAiICIgKyBuZXdWYWwgKyAiICIgKyB1c2VyRGF0YSk7Ci0gICAgICAgIGlmIChuZXdWYWwuc3Vic3RyaW5nKDAsIHNlY3JldC5sZW5ndGgpID09IHNlY3JldCkgewotICAgICAgICAgICAgdmFyIGFyZ3MgPSBFY2xpcHNlX0FDVEZfQVNTZXJpYWxpemVyLmRlc2VyaWFsaXplKG5ld1ZhbC5zdWJzdHJpbmcoc2VjcmV0Lmxlbmd0aCkpOwotICAgICAgICAgICAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7Ci0JICAgIC8vIGR0cmFjZSgiICBjYWxsaW5nIGZ1bmN0aW9uICIgKyBuYW1lICsgIjogIiArIGFyZ3NbMF0gKyAiICIgKyBhcmdzWzFdKTsKLSAgICAgICAgICAgIHZhciBtZXRob2Q6RnVuY3Rpb24gPSBFY2xpcHNlX0FDVEZfSW5pdC5jYWxsYmFja3NbbmFtZV07Ci0gICAgICAgICAgICB2YXIgcmV0T2JqID0gbWV0aG9kLmFwcGx5KG51bGwsIGFyZ3MpOwotCSAgICAvLyBkdHJhY2UoIiAgcmV0dXJuIHZhbHVlIFsiICsgcmV0T2JqICsgIl0iKTsKLSAgICAgICAgICAgIF9yb290LkVjbGlwc2VfQUNURl9yZXNwb25zZV92YWx1ZSA9IEVjbGlwc2VfQUNURl9BU1NlcmlhbGl6ZXIuc2VyaWFsaXplKHJldE9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9sZFZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXJ0KHNlYzpTdHJpbmcpIHsKLSAgICAgICAgc2VjcmV0ID0gc2VjOwotICAgICAgICBfcm9vdC53YXRjaCgiRWNsaXBzZV9BQ1RGX3JlcXVlc3RfYXJncyIsIEVjbGlwc2VfQUNURl9SZXF1ZXN0U2VydmVyLnByb2Nlc3MpOwotICAgICAgICAvLyBkdHJhY2UoInJlcXVlc3Qgc2VydmVyIHN0YXJ0ZWQuIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkdHJhY2UobWVzOlN0cmluZykgewotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIHRyYWNlKG1lcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfU3RhZ2VQcm94eS5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiOWQ5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfU3RhZ2VQcm94eS5hcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWNsYXNzIEVjbGlwc2VfQUNURl9TdGFnZVByb3h5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFNjYWxlTW9kZShtb2RlOlN0cmluZyk6Qm9vbGVhbiB7Ci0gICAgICAgIFN0YWdlLnNjYWxlTW9kZSA9IG1vZGU7Ci0gICAgICAgIHJldHVybiAoU3RhZ2Uuc2NhbGVNb2RlID09IG1vZGUpCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTY2FsZU1vZGUoKTpTdHJpbmcgewotICAgICAgICByZXR1cm4gU3RhZ2Uuc2NhbGVNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3RhZ2VXaWR0aCgpOk51bWJlciB7Ci0gICAgICAgIHJldHVybiBTdGFnZS53aWR0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN0YWdlSGVpZ2h0KCk6TnVtYmVyIHsKLSAgICAgICAgcmV0dXJuIFN0YWdlLmhlaWdodDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN0YWdlQWxpZ24oKTpTdHJpbmcgewotICAgICAgICByZXR1cm4gU3RhZ2UuYWxpZ247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1N0cmVhbS5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9TdHJlYW0uYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZGM4ZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1N0cmVhbS5hcworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1jbGFzcyBFY2xpcHNlX0FDVEZfU3RyZWFtIHsKLSAgICBwcml2YXRlIHZhciBuZXRTdHJlYW06TmV0U3RyZWFtOwotICAgIHByaXZhdGUgdmFyIHNvdW5kOlNvdW5kOwotICAgIHByaXZhdGUgdmFyIHBvczpOdW1iZXI7Ci0gICAgcHJpdmF0ZSB2YXIgdGFyZ2V0Ok9iamVjdDsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqOk9iamVjdCk6Qm9vbGVhbiB7Ci0gICAgICAgIHJldHVybiAob2JqID09PSB0aGlzLnRhcmdldCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5ldFN0cmVhbSkgewotICAgICAgICAgICAgdGhpcy5uZXRTdHJlYW0ucGF1c2UodHJ1ZSk7Ci0gICAgICAgICAgICB0aGlzLm5ldFN0cmVhbS5zZWVrKDApOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc291bmQpIHsKLSAgICAgICAgICAgIHRoaXMuc291bmQuc3RvcCgpOwotICAgICAgICAgICAgdGhpcy5wb3MgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VhcmNoUGxheUJ1dHRvbkludGVybmFsKG86T2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6U3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZWQ6T2JqZWN0KTpCb29sZWFuIHsKLSAgICAgICAgaWYgKHRyYXZlcnNlZFt0YXJnZXRdKSByZXR1cm47Ci0gICAgICAgIHRyYXZlcnNlZFt0YXJnZXRdID0gdHJ1ZTsKLQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhNTE5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAodmFyIGMgaW4gbykgewotICAgICAgICAgICAgdmFyIGNvOk9iamVjdCA9IG9bY107Ci0gICAgICAgICAgICAvLyBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCIuLi4iICsgYyArICIgIiArIGMudG9VcHBlckNhc2UoKS5pbmRleE9mKCJQTEFZIikpOwotICAgICAgICAgICAgaWYgKGMudG9VcHBlckNhc2UoKS5pbmRleE9mKCJQTEFZIikgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjbyAmJiBjby5vblJlbGVhc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRWNsaXBzZV9BQ1RGX1V0aWwuc2VuZCgiVHJ5IHRvIFB1c2g6IiArIGNvKTsKLSAgICAgICAgICAgICAgICAgICAgY28ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBjVGFyZ2V0OlN0cmluZyA9IHRhcmdldCArICIuIiArIGM7Ci0gICAgICAgICAgICBpZiAoY28uX3RhcmdldCkgewotICAgICAgICAgICAgICAgIGNUYXJnZXQgPSBFY2xpcHNlX0FDVEZfTm9kZS5ub3JtYWxpemVUYXJnZXROYW1lKGNvLl90YXJnZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjby5fdGFyZ2V0ID0gY1RhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWFyY2hQbGF5QnV0dG9uSW50ZXJuYWwoY28sIGNUYXJnZXQsIHRyYXZlcnNlZCkpIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlYXJjaFBsYXlCdXR0b24oKSB7Ci0gICAgICAgIHZhciB0cmF2ZXJzZWQ6T2JqZWN0ID0gbmV3IE9iamVjdCgpOwotCi0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcGF0aDpTdHJpbmcgPSBhcmd1bWVudHNbaV07Ci0gICAgICAgICAgICB2YXIgbzpPYmplY3QgPSBldmFsKHBhdGgpOwotICAgICAgICAgICAgc2VhcmNoUGxheUJ1dHRvbkludGVybmFsKG8sIHBhdGgsIHRyYXZlcnNlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcGxheSgpIHsKLSAgICAgICAgaWYgKHRoaXMubmV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAvLyBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCJieXRlc0xvYWRlZDoiICsgdGhpcy5uZXRTdHJlYW0uYnl0ZXNMb2FkZWQpOwotICAgICAgICAgICAgaWYgKHRoaXMubmV0U3RyZWFtLmJ5dGVzTG9hZGVkIDw9IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCJTZWFyY2ggYnV0dG9uLi4uIik7Ci0gICAgICAgICAgICAgICAgc2VhcmNoUGxheUJ1dHRvbigiX2xldmVsMCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5uZXRTdHJlYW0ucGF1c2UoZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc291bmQpIHsKLSAgICAgICAgICAgIHRoaXMuc291bmQuc3RhcnQodGhpcy5wb3MgLyAxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBwYXVzZSgpIHsKLSAgICAgICAgaWYgKHRoaXMubmV0U3RyZWFtKSB7Ci0gICAgICAgICAgICB0aGlzLm5ldFN0cmVhbS5wYXVzZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucG9zID0gdGhpcy5zb3VuZC5kdXJhdGlvbjsKLSAgICAgICAgICAgIHRoaXMuc291bmQuc3RvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIGdldEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgLy8gVE9ETwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50UG9zaXRpb24oKTpOdW1iZXIgewotICAgICAgICBpZiAodGhpcy5uZXRTdHJlYW0pIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLm5ldFN0cmVhbS50aW1lOwotICAgICAgICB9IGVsc2UgaWYgKHNvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VuZC5kdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShzcmMpIHsKLSAgICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIE5ldFN0cmVhbSkgewotICAgICAgICAgICAgdGhpcy5uZXRTdHJlYW0gPSBzcmM7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgU291bmQpIHsKLSAgICAgICAgICAgIHRoaXMuc291bmQgPSBzcmM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gRWNsaXBzZV9BQ1RGX1N0cmVhbSh0Z3QsIHNyYykgewotICAgICAgICB0aGlzLnRhcmdldCA9IHRndDsKLSAgICAgICAgdGhpcy51cGRhdGUoc3JjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfVXRpbC5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9VdGlsLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Y3NjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9VdGlsLmFzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1jbGFzcyBFY2xpcHNlX0FDVEZfVXRpbCB7Ci0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGFzc0p1ZGdlKG86T2JqZWN0LCBjbHM6RnVuY3Rpb24pOkJvb2xlYW4gewotICAgICAgICByZXR1cm4gKG8uX19wcm90b19fID09IGNscy5wcm90b3R5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbkNsYXNzKG86T2JqZWN0LCBjbHM6RnVuY3Rpb24pOkJvb2xlYW4gewotICAgICAgICBvID0gby5fX3Byb3RvX187Ci0gICAgICAgIHZhciBjbHNQcm90byA9IGNscy5wcm90b3R5cGU7Ci0gICAgICAgIHdoaWxlIChvKSB7Ci0gICAgICAgICAgICBpZiAobyA9PSBjbHNQcm90bykgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBvID0gby5fX3Byb3RvX187Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VuZChtZXM6U3RyaW5nKSB7Ci0gICAgICAgIC8vIG5ldyBMb2NhbENvbm5lY3Rpb24oKS5zZW5kKCJfdGVzdExDIiwgImR1bXAiLCBtZXMpOwotICAgICAgICB2YXIgbGM6TG9jYWxDb25uZWN0aW9uID0gbmV3IExvY2FsQ29ubmVjdGlvbigpOwotCWxjLnNlbmQoIl90ZXN0TEMiLCAiZHVtcCIsIG1lcyk7Ci0JLy8gbGMuY2xvc2UoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfV2F0Y2guYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfV2F0Y2guYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDUwYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1dhdGNoLmFzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBmbGFzaC5leHRlcm5hbC5FeHRlcm5hbEludGVyZmFjZTsKLQotY2xhc3MgRWNsaXBzZV9BQ1RGX1dhdGNoIHsKLSAgICBwcml2YXRlIHN0YXRpYyB2YXIgYmFzZU9iamVjdDpPYmplY3Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdmFyIG9yaWdPbkVudGVyRnJhbWU6RnVuY3Rpb247Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHdhdGNoTGlzdHM6T2JqZWN0ID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgc3RhdGljIHZhciBjYWxsYmFjazpTdHJpbmc7Ci0gICAgcHJpdmF0ZSB2YXIgcGF0aDpTdHJpbmc7Ci0gICAgcHJpdmF0ZSB2YXIgcmFuZ2VzOkFycmF5OwotICAgIHByaXZhdGUgdmFyIGV4aXN0czpCb29sZWFuOwotICAgIHByaXZhdGUgdmFyIGN1cnJlbnRGcmFtZTpOdW1iZXI7Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIEVjbGlwc2VfQUNURl9XYXRjaChwYXRoOlN0cmluZykgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICB0aGlzLnJhbmdlcyA9IG5ldyBBcnJheSgpOwotICAgICAgICB2YXIgb2JqID0gZXZhbCAocGF0aCk7Ci0gICAgICAgIGlmIChvYmopIHsKLSAgICAgICAgICAgIHRoaXMuZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gb2JqLl9jdXJyZW50RnJhbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzSW5GcmFtZShmbjpOdW1iZXIsIHI6T2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiAoZm4gPj0gci5taW4pICYmIChmbiA8IHIubWF4KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB3YXRjaEVudHJ5KCkgewotICAgICAgICAvLyBvcmlnT25FbnRlckZyYW1lLmNhbGwoYmFzZU9iamVjdCk7Ci0gICAgICAgIGZvciAodmFyIHBhdGggaW4gd2F0Y2hMaXN0cykgewotICAgICAgICAgICAgdmFyIHc6RWNsaXBzZV9BQ1RGX1dhdGNoID0gd2F0Y2hMaXN0c1twYXRoXTsKLSAgICAgICAgICAgIHZhciBjYWxsID0gZmFsc2U7Ci0gICAgICAgICAgICB2YXIgb2JqID0gZXZhbCAody5wYXRoKTsKLSAgICAgICAgICAgIGlmICghb2JqID09IHcuZXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgdy5leGlzdHMgPSAhdy5leGlzdHM7Ci0gICAgICAgICAgICAgICAgY2FsbCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9iaikgewotICAgICAgICAgICAgICAgIHZhciBmbiA9IG9iai5fY3VycmVudEZyYW1lOwotICAgICAgICAgICAgICAgIHZhciBwZm4gPSB3LmN1cnJlbnRGcmFtZTsKLSAgICAgICAgICAgICAgICB3LmN1cnJlbnRGcmFtZSA9IGZuOwotICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdy5yYW5nZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHI6T2JqZWN0ID0gdy5yYW5nZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmID0gRWNsaXBzZV9BQ1RGX1dhdGNoLmlzSW5GcmFtZShmbiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBwZiA9IEVjbGlwc2VfQUNURl9XYXRjaC5pc0luRnJhbWUocGZuLCByKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGYgIT0gcGYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbCkgewotICAgICAgICAgICAgICAgIEV4dGVybmFsSW50ZXJmYWNlLmNhbGwoY2FsbGJhY2ssIHcucGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcuZXhpc3RzLCB3LmN1cnJlbnRGcmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdhdGNoSW5pdChjYjpTdHJpbmcpIHsKLSAgICAgICAgY2FsbGJhY2sgPSBjYjsKLSAgICAgICAgYmFzZU9iamVjdCA9IGV2YWwgKCJfbGV2ZWwwIik7Ci0gICAgICAgIG9yaWdPbkVudGVyRnJhbWUgPSBiYXNlT2JqZWN0Lm9uRW50ZXJGcmFtZTsKLSAgICAgICAgYmFzZU9iamVjdC5vbkVudGVyRnJhbWUgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIEVjbGlwc2VfQUNURl9XYXRjaC53YXRjaEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdhdGNoT2JqZWN0KHBhdGg6U3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRnJhbWU6TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RnJhbWU6TnVtYmVyKSB7Ci0gICAgICAgIHZhciB3OkVjbGlwc2VfQUNURl9XYXRjaCA9IHdhdGNoTGlzdHNbcGF0aF07Ci0gICAgICAgIGlmICghdykgewotICAgICAgICAgICAgdyA9IG5ldyBFY2xpcHNlX0FDVEZfV2F0Y2gocGF0aCk7Ci0gICAgICAgICAgICB3YXRjaExpc3RzW3BhdGhdID0gdzsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1pbkZyYW1lID49IDApICYmIChtYXhGcmFtZSA+PSAwKSkgewotICAgICAgICAgICAgdmFyIHI6T2JqZWN0ID0gbmV3IE9iamVjdCgpOwotICAgICAgICAgICAgci5taW4gPSBtaW5GcmFtZTsKLSAgICAgICAgICAgIHIubWF4ID0gbWF4RnJhbWU7Ci0gICAgICAgICAgICB3LnJhbmdlc1t3LnJhbmdlcy5sZW5ndGhdID0gcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3ZlV2F0Y2hMaXN0KHBhdGg6U3RyaW5nKSB7Ci0gICAgICAgIHdhdGNoTGlzdHNbcGF0aF0gPSB1bmRlZmluZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2MzAwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGxvZ2dpbmcuY29uZixcCi0gICAgICAgICAgICAgICBicmlkZ2VTV0YvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvbG9nZ2luZy5jb25mIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2xvZ2dpbmcuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNGM3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvbG9nZ2luZy5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1oYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyDQotLmxldmVsPUZJTkUNCi1qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbD1TRVZFUkUNCi1qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5mb3JtYXR0ZXI9amF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyDQotamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWw9RklORVNUDQotamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIuZm9ybWF0dGVyPWphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwZWQ2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jZmxhc2gKLWZsYXNoLnBsYXllcl9sb2FkaW5nPUxvYWRpbmcuLi4gKFBsZWFzZSByZXRyeSBsYXRlcikKLWZsYXNoLnBsYXllcl9ub19kb209Rmxhc2ggRE9NIGlzIG5vdCBhdmFpbGFibGUKLWZsYXNoLnBsYXllcl9ub194Y29kZT1GbGFzaCBET00gaXMgbm90IHRyYW5zY29kZWQKLWZsYXNoLnBsYXllcl91bmtub3duPVVuZXhwZWN0ZWQgRmxhc2ggaXRlbQotZmxhc2guYmFkX2ZsYXNoX3ZlcnNpb249Rmxhc2ggUGxheWVyIHZlcnNpb24gezB9IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuXG5cblBsZWFzZSBpbnN0YWxsIEZsYXNoIFBsYXllciB2ZXJzaW9uIDggb3IgbGF0ZXIuCi0jZGVidWcgbWVzc2FnZSA6IG5vIG5lZWQgdG8gdHJhbnNsYXRlCi1mbGFzaC5lcnJvcl90YXJnZXRfbGVuZ3RoPUVycm9yOiB0YXJnZXQgbGV2ZWwgezB9Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmZWQ3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL21lc3NhZ2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jZmxhc2gKLWZsYXNoLnBsYXllcl9sb2FkaW5nPVx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZC4uLiAoXHUzMDQyXHUzMDY4XHUzMDY3XHU1MThkXHU4YTY2XHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0KQotZmxhc2gucGxheWVyX25vX2RvbT1GbGFzaCBET01cdTMwOTJcdTUyMjlcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKLWZsYXNoLnBsYXllcl9ub194Y29kZT1GbGFzaCBET01cdTMwNGNcdTU5MDlcdTYzZGJcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKLWZsYXNoLnBsYXllcl91bmtub3duPVx1NGU4OFx1NjcxZlx1MzA1Ylx1MzA2Y0ZsYXNoXHU5ODA1XHU3NmVlXHUzMDY3XHUzMDU5Ci1mbGFzaC5iYWRfZmxhc2hfdmVyc2lvbj1GbGFzaCBQbGF5ZXIgXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzIHswfSBcdTMwNGNcdTczZmVcdTU3MjhcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYzhcdTMwZmNcdTMwZWJcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDJcblxuRmxhc2ggUGxheWVyIFx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMyA4IFx1NGVlNVx1NGUwYVx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoQWNjSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoQWNjSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDVhNDI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaEFjY0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudDsKLQotCi1wdWJsaWMgY2xhc3MgRmxhc2hBY2NJbmZvIHsKLQotICAgIHByaXZhdGUgRmxhc2hOb2RlIHBhcmVudDsKLSAgICBwcml2YXRlIEJvb2xlYW4gaGFzT25SZWxlYXNlOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc1NpbGVudDsKLSAgICBwcml2YXRlIEludGVnZXIgYWNjUm9sZTsKLSAgICAKLSAgICBwdWJsaWMgRmxhc2hBY2NJbmZvKEZsYXNoTm9kZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNPblJlbGVhc2UoKSB7Ci0gICAgICAgIGlmKCBudWxsID09IGhhc09uUmVsZWFzZSApIHsKLSAgICAgICAgICAgIEZsYXNoTm9kZSBvblJlbGVhc2VOb2RlID0gcGFyZW50LmdldE5vZGUoIm9uUmVsZWFzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiggbnVsbCAhPSBvblJlbGVhc2VOb2RlICkgewotICAgICAgICAgICAgICAgIGhhc09uUmVsZWFzZSA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgICAgICBvblJlbGVhc2VOb2RlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGhhc09uUmVsZWFzZSA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc09uUmVsZWFzZS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRBY2NSb2xlKCkgewotICAgICAgICBpZiggbnVsbCA9PSBhY2NSb2xlICkgewotICAgICAgICAgICAgVmFyaWFudCB2YXJSb2xlID0gcGFyZW50LmdldFBsYXllcigpLmNhbGxNZXRob2QocGFyZW50LmdldFRhcmdldCgpKyIuX2FjY0ltcGwiLCJnZXRfYWNjUm9sZSIsbmV3IFZhcmlhbnQoMCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIGlmKCBudWxsICE9IHZhclJvbGUgJiYgT0xFLlZUX0k0PT12YXJSb2xlLmdldFR5cGUoKSApIHsKLSAgICAgICAgICAgICAgICBhY2NSb2xlID0gbmV3IEludGVnZXIodmFyUm9sZS5nZXRJbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhY2NSb2xlID0gbmV3IEludGVnZXIoLTEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY2NSb2xlLmludFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2lsZW50KCkgewotICAgICAgICBpZiggbnVsbCA9PSBpc1NpbGVudCApIHsKLSAgICAgICAgICAgIEZsYXNoTm9kZSBhY2NTaWxlbnROb2RlID0gcGFyZW50LmdldE5vZGUoIl9hY2NQcm9wcy5zaWxlbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYoIG51bGwgIT0gYWNjU2lsZW50Tm9kZSApIHsKLSAgICAgICAgICAgICAgICBpc1NpbGVudCA9IG5ldyBCb29sZWFuKCJ0cnVlIi5lcXVhbHMoYWNjU2lsZW50Tm9kZS5nZXRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBhY2NTaWxlbnROb2RlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlzU2lsZW50ID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNTaWxlbnQuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjTmFtZSgpIHsKLSAgICAgICAgVmFyaWFudCB2YXJOYW1lID0gcGFyZW50LmdldFBsYXllcigpLmNhbGxNZXRob2QocGFyZW50LmdldFRhcmdldCgpKyIuX2FjY0ltcGwiLCJnZXRfYWNjTmFtZSIsIG5ldyBWYXJpYW50KDApKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmKCBudWxsICE9IHZhck5hbWUgJiYgT0xFLlZUX0JTVFI9PXZhck5hbWUuZ2V0VHlwZSgpICkgewotICAgICAgICAgICAgcmV0dXJuIHZhck5hbWUuZ2V0U3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRmxhc2hOb2RlIGFjY05hbWVOb2RlID0gcGFyZW50LmdldE5vZGUoIl9hY2NQcm9wcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYoIG51bGwgIT0gYWNjTmFtZU5vZGUgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBhY2NOYW1lTm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgYWNjTmFtZU5vZGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjY0Rlc2NyaXB0aW9uKCkgewotICAgICAgICBGbGFzaE5vZGUgYWNjRGVzY3JpcHRpb25Ob2RlID0gcGFyZW50LmdldE5vZGUoIl9hY2NQcm9wcy5kZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmKCBudWxsICE9IGFjY0Rlc2NyaXB0aW9uTm9kZSApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjY0Rlc2NyaXB0aW9uTm9kZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgYWNjRGVzY3JpcHRpb25Ob2RlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaEFkanVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoQWRqdXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjk0NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoQWRqdXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuYWNjc2VydmljZS5zd3RicmlkZ2UudXRpbC5IVE1MRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5pbnRlcm5hbC5BU0JyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50OwotCi0KLQotcHVibGljIGNsYXNzIEZsYXNoQWRqdXN0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX09LID0gICAiT0s6ICI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9ORyA9ICAgIk5HOiAiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTkEgPSAgICJOQTogIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dBSVQgPSAiV0FJVDogIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHByaXZhdGUgVmFyaWFudCB2YXJGbGFzaCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPbGVBdXRvbWF0aW9uIGZsYXNoQXV0b21hdGlvbiA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIEZsYXNoQWRqdXN0KE9iamVjdCBmbGFzaE9iamVjdC8qLCBpbnQgdmFsaWRhdGUqLykgewotICAgICAgICB2YXJGbGFzaCA9IEhUTUxFbGVtZW50VXRpbC5nZXRIdG1sRWxlbWVudEZyb21PYmplY3QoZmxhc2hPYmplY3QpOwotICAgICAgICBpZiggbnVsbCAhPSB2YXJGbGFzaCAmJiBPTEUuVlRfRElTUEFUQ0g9PXZhckZsYXNoLmdldFR5cGUoKSApIHsKLSAgICAgICAgICAgIGZsYXNoQXV0b21hdGlvbiA9IHZhckZsYXNoLmdldEF1dG9tYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiggbnVsbCE9dmFyRmxhc2ggKSB2YXJGbGFzaC5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkanVzdChTdHJpbmcgbmV3SWQpIHsKLSAgICAgICAgaWYoIG51bGw9PWZsYXNoQXV0b21hdGlvbiApIHJldHVybjsKLQotICAgICAgICBpbnRbXSBpZEdldFZhcmlhYmxlID0gZmxhc2hBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHZXRWYXJpYWJsZSJ9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiggbnVsbCAhPSBmbGFzaEF1dG9tYXRpb24uaW52b2tlKGlkR2V0VmFyaWFibGVbMF0sbmV3IFZhcmlhbnRbXXtuZXcgVmFyaWFudChBU0JyaWRnZS5ST09UTEVWRUxfUEFUSCsiLkVjbGlwc2VfQUNURl9pc19hdmFpbGFibGUiKX0pIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG51bGwgIT0gZmxhc2hBdXRvbWF0aW9uLmludm9rZShpZEdldFZhcmlhYmxlWzBdLG5ldyBWYXJpYW50W117bmV3IFZhcmlhbnQoQVNCcmlkZ2UuQlJJREdFTEVWRUxfUEFUSCsiLkVjbGlwc2VfQUNURl9pc19hdmFpbGFibGUiKX0pKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNldEVycm9yQXR0cmlidXRlKEVSUk9SX09LKyJGbGFzaCBET00gZGV0ZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludFtdIGlkVGFnTmFtZSA9IGZsYXNoQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsidGFnTmFtZSJ9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiggbnVsbCAhPSBpZFRhZ05hbWUgKSB7Ci0gICAgICAgICAgICBWYXJpYW50IHZhclRhZ05hbWUgPSBmbGFzaEF1dG9tYXRpb24uZ2V0UHJvcGVydHkoaWRUYWdOYW1lWzBdKTsKLSAgICAgICAgICAgIGlmKCBudWxsIT12YXJUYWdOYW1lICYmIE9MRS5WVF9CU1RSPT12YXJUYWdOYW1lLmdldFR5cGUoKSApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyVGFnTmFtZSA9IHZhclRhZ05hbWUuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYoICEiT0JKRUNUIi5lcXVhbHNJZ25vcmVDYXNlKHN0clRhZ05hbWUpICkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHNldEVycm9yQXR0cmlidXRlKEVSUk9SX05HK3N0clRhZ05hbWUrIiB0YWcgaXMgbm90IHN1cG9wb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50W10gaWRSZWFkeVN0YXRlID0gZmxhc2hBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJSZWFkeVN0YXRlIn0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmKCBudWxsIT1pZFJlYWR5U3RhdGUgKSB7Ci0gICAgICAgICAgICBWYXJpYW50IHZhclJlYWR5U3RhdGUgPSBmbGFzaEF1dG9tYXRpb24uZ2V0UHJvcGVydHkoaWRSZWFkeVN0YXRlWzBdKTsKLSAgICAgICAgICAgIGlmKCBudWxsIT12YXJSZWFkeVN0YXRlICYmIE9MRS5WVF9JND09dmFyUmVhZHlTdGF0ZS5nZXRUeXBlKCkgKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlYWR5U3RhdGUgPSB2YXJSZWFkeVN0YXRlLmdldEludCgpOyAKLSAgICAgICAgICAgICAgICBpZiggcmVhZHlTdGF0ZSA8IDQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVycm9yQXR0cmlidXRlKEVSUk9SX1dBSVQrIkZsYXNoIG1vdmllIGlzIG5vdCByZWFkeSAoUmVhZHlTdGF0ZT0iK3JlYWR5U3RhdGUrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RXJyb3JBdHRyaWJ1dGUoRVJST1JfTkErIkZsYXNoIERPTSBpcyBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RXJyb3JBdHRyaWJ1dGUoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaW50W10gaWRTZXRBdHRyaWJ1dGUgPSBmbGFzaEF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117InNldEF0dHJpYnV0ZSJ9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiggbnVsbCAhPSBpZFNldEF0dHJpYnV0ZSApIHsKLSAgICAgICAgICAgIGZsYXNoQXV0b21hdGlvbi5pbnZva2UoaWRTZXRBdHRyaWJ1dGVbMF0sbmV3IFZhcmlhbnRbXXtuZXcgVmFyaWFudCgiYURlc2lnbmVyRXJyb3IiKSxuZXcgVmFyaWFudChtZXNzYWdlKX0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvRmxhc2hEZXRlY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaERldGVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI0YTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaERldGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5DT01VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkdVSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVBdXRvbWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLXB1YmxpYyBjbGFzcyBGbGFzaERldGVjdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHVUlEIENMU0lEX0ZMQVNIID0gQ09NVXRpbC5JSURGcm9tU3RyaW5nKCJ7RDI3Q0RCNkUtQUU2RC0xMUNGLTk2QjgtNDQ0NTUzNTQwMDAwfSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyVmVyc2lvbiA9IG51bGw7Ci0KLSAgICBzdGF0aWMgewotICAgIAl0cnkgewotICAgICAgICAgICAgaW50IHB2ID0gQ09NVXRpbC5jcmVhdGVEaXNwYXRjaChDTFNJRF9GTEFTSCk7Ci0gICAgICAgICAgICBpZiggMCAhPSBwdiApIHsKLSAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggZGlzcEZsYXNoID0gbmV3IElEaXNwYXRjaChwdik7Ci0gICAgICAgICAgICAgICAgVmFyaWFudCB2YXJGbGFzaCA9IG5ldyBWYXJpYW50KGRpc3BGbGFzaCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAJT2xlQXV0b21hdGlvbiBhdXRvID0gdmFyRmxhc2guZ2V0QXV0b21hdGlvbigpOwotICAgICAgICAgICAgICAgIAlpbnRbXSBpZEdldFZlcnNpb24gPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJHZXRWYXJpYWJsZSJ9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIAlpZiggbnVsbCAhPSBpZEdldFZlcnNpb24gKSB7Ci0gICAgICAgICAgICAgICAgCQlWYXJpYW50IHZhclZlcnNpb24gPSBhdXRvLmludm9rZShpZEdldFZlcnNpb25bMF0sbmV3IFZhcmlhbnRbXXtuZXcgVmFyaWFudCgiJHZlcnNpb24iKX0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgCQlpZiggbnVsbCAhPSB2YXJWZXJzaW9uICYmIE9MRS5WVF9CU1RSID09IHZhclZlcnNpb24uZ2V0VHlwZSgpICkgewotICAgICAgICAgICAgICAgIAkJCVN0cmluZyByYXdWZXJzaW9uID0gdmFyVmVyc2lvbi5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAJCQlpbnQgc2VwID0gcmF3VmVyc2lvbi5pbmRleE9mKCcgJyk7Ci0gICAgICAgICAgICAgICAgCQkJaWYoIHNlcCA+IDAgKSB7Ci0gICAgICAgICAgICAgICAgCQkJCXN0clZlcnNpb24gPSByYXdWZXJzaW9uLnN1YnN0cmluZyhzZXArMSk7Ci0gICAgICAgICAgICAgICAgCQkJfQotICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIAl2YXJGbGFzaC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIAl9Ci0gICAgCWNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGlmKCBudWxsID09IHN0clZlcnNpb24gKSByZXR1cm47Ci0gICAgICAgIGludCBzZXAgPSBzdHJWZXJzaW9uLmluZGV4T2YoJywnKTsKLSAgICAgICAgaWYoIHNlcCA+IDAgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmKCBJbnRlZ2VyLnBhcnNlSW50KHN0clZlcnNpb24uc3Vic3RyaW5nKDAsc2VwKSkgPCA4ICkgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0U3RyaW5nKCJmbGFzaC53YXJuaW5nIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0LmZvcm1hdChNZXNzYWdlcy5nZXRTdHJpbmcoImZsYXNoLmJhZF9mbGFzaF92ZXJzaW9uIiksbmV3IE9iamVjdFtde3N0clZlcnNpb259KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyVmVyc2lvbiA9IG51bGw7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoTW9kZWxQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaE1vZGVsUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YmUzMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoTW9kZWxQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLklXYVhjb2Rpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UuaW1wbC5XYVhjb2RpbmdJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRmxhc2hNb2RlbFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBGbGFzaE1vZGVsUGx1Z2luIHBsdWdpbjsKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXRoIGltcG9zZWRTV0ZQYXRoID0gbmV3IFBhdGgoImJyaWRnZVNXRi9pbXBvc2VkLnN3ZiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdGggYm9vdGxvYWRlclNXRlBhdGggPSBuZXcgUGF0aCgiYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLnN3ZiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdGggYnJpZGdlSW5pdFNXRlBhdGggPSBuZXcgUGF0aCgiYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLnN3ZiIpOwkKLQkJCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEZsYXNoTW9kZWxQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJSW5wdXRTdHJlYW0gaXM7Ci0gICAgICAgIGlzID0gdHJ5T3BlblN0cmVhbShpbXBvc2VkU1dGUGF0aCk7Ci0gICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRJV2FYY29kaW5nKCkuc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaXMgPSB0cnlPcGVuU3RyZWFtKGJvb3Rsb2FkZXJTV0ZQYXRoKTsKLSAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldElXYVhjb2RpbmcoKS5zZXRTV0ZCb290bG9hZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICBpcyA9IHRyeU9wZW5TdHJlYW0oYnJpZGdlSW5pdFNXRlBhdGgpOwotICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0SVdhWGNvZGluZygpLnNldFNXRkJyaWRnZUluaXQoaXMpOwotICAgICAgICB9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmxhc2hNb2RlbFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotICAgIHB1YmxpYyBJV2FYY29kaW5nIGdldElXYVhjb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBXYVhjb2RpbmdJbXBsLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSB0cnlPcGVuU3RyZWFtKFBhdGggcGF0aCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oZ2V0QnVuZGxlKCksIHBhdGgsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4M2UwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvRmxhc2hOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC51dGlsLkFTT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgRmxhc2hOb2RlIHsKLQotCXByaXZhdGUgRmxhc2hQbGF5ZXIgcGxheWVyOwotCXByaXZhdGUgQVNPYmplY3QgYXNPYmplY3Q7Ci0JcHJpdmF0ZSBGbGFzaE5vZGUgcGFyZW50OwotCXByaXZhdGUgaW50IGxldmVsOwotCXByaXZhdGUgRmxhc2hBY2NJbmZvIGFjY0luZm87Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNraXBDaGlsZHJlbiA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpc0FjY1Byb3BlcnRpZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHN0clR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RyQ2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIHN0ck9iamVjdE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RyVGFyZ2V0OwotCXByaXZhdGUgYm9vbGVhbiBpc1VJQ29tcG9uZW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNpZFR5cGUgPSAidHlwZSIsIC8vJE5PTi1OTFMtMSQKLQkJCXNpZENsYXNzTmFtZSA9ICJjbGFzc05hbWUiLCAvLyROT04tTkxTLTEkCi0JCQlzaWRPYmplY3ROYW1lID0gIm9iamVjdE5hbWUiLCAvLyROT04tTkxTLTEkCi0JCQlzaWRUYXJnZXQgPSAidGFyZ2V0IiwgLy8kTk9OLU5MUy0xJAotCQkJc2lkVmFsdWUgPSAidmFsdWUiLCAvLyROT04tTkxTLTEkCi0JCQlzaWRUZXh0ID0gInRleHQiLCAvLyROT04tTkxTLTEkCi0JCQlzaWRUaXRsZSA9ICJ0aXRsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCXNpZElzVUlDb21wb25lbnQgPSAiaXNVSUNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBGbGFzaE5vZGUoRmxhc2hOb2RlIHBhcmVudCwgRmxhc2hQbGF5ZXIgcGxheWVyLCBBU09iamVjdCBub2RlKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmxldmVsID0gbnVsbCAhPSBwYXJlbnQgPyBwYXJlbnQuZ2V0TGV2ZWwoKSArIDEgOiAwOwotCQl0aGlzLnBsYXllciA9IHBsYXllcjsKLQotCQlhc09iamVjdCA9IG5vZGU7Ci0JCXN0clR5cGUgPSBnZXRTdHJpbmcoc2lkVHlwZSk7Ci0JCXN0ckNsYXNzTmFtZSA9IGdldFN0cmluZyhzaWRDbGFzc05hbWUpOwotCQlzdHJPYmplY3ROYW1lID0gZ2V0U3RyaW5nKHNpZE9iamVjdE5hbWUpOwotCQlzdHJUYXJnZXQgPSBnZXRTdHJpbmcoc2lkVGFyZ2V0KTsKLQkJaXNVSUNvbXBvbmVudCA9ICJ0cnVlIi5lcXVhbHMoZ2V0U3RyaW5nKHNpZElzVUlDb21wb25lbnQpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChudWxsICE9IHBhcmVudCkgewotCQkJU3RyaW5nIHRhcmdldFBhcmVudCA9IHBhcmVudC5nZXRUYXJnZXQoKTsKLQkJCWlmIChudWxsICE9IHRhcmdldFBhcmVudCkgewotCQkJCWlmICghc3RyVGFyZ2V0LmVxdWFscyh0YXJnZXRQYXJlbnQgKyAiLiIgKyBzdHJPYmplY3ROYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlzUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgcGFyZW50T2JqZWN0TmFtZSA9IHBhcmVudC5nZXRPYmplY3ROYW1lKCk7Ci0JCQlpZiAoIl9hY2NQcm9wcyIuZXF1YWxzKHBhcmVudE9iamVjdE5hbWUpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJIl9hY2NJbXBsIi5lcXVhbHMocGFyZW50T2JqZWN0TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlzQWNjUHJvcGVydGllcyA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCJudW1iZXIiLmVxdWFscyhzdHJUeXBlKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJIm51bGwiLmVxdWFscyhzdHJUeXBlKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJImJvb2xlYW4iLmVxdWFscyhzdHJUeXBlKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJInN0cmluZyIuZXF1YWxzKHN0clR5cGUpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkidW5kZWZpbmVkIi5lcXVhbHMoc3RyVHlwZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc2tpcENoaWxkcmVuID0gdHJ1ZTsKLQkJfSBlbHNlIGlmICgib2JqZWN0Ii5lcXVhbHMoc3RyVHlwZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG51bGwgPT0gc3RyQ2xhc3NOYW1lIHx8ICJBcnJheSIuZXF1YWxzKHN0ckNsYXNzTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXNraXBDaGlsZHJlbiA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIm1vdmllY2xpcCIuZXF1YWxzKHN0clR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICgiX2xldmVsMC5yZXNlcnZlZCIuZXF1YWxzKHN0clRhcmdldCkgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQkiX2xldmVsMC5mb2N1c01hbmFnZXIiLmVxdWFscyhzdHJUYXJnZXQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlza2lwQ2hpbGRyZW4gPSB0cnVlOwotCQkJfQotCQl9Ci0JCXRoaXMuYWNjSW5mbyA9IG5ldyBGbGFzaEFjY0luZm8odGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gc3RyVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHN0ckNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7Ci0JCXJldHVybiBzdHJPYmplY3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gc3RyVGFyZ2V0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVUlDb21wb25lbnQoKSB7Ci0JCXJldHVybiBpc1VJQ29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCWlmIChudWxsICE9IGFzT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZGVjb2RlU3RyaW5nKGdldFN0cmluZyhzaWRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KGJvb2xlYW4gdXNlQWNjTmFtZSkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICh1c2VBY2NOYW1lKSB7Ci0JCQl0ZXh0ID0gYWNjSW5mby5nZXRBY2NOYW1lKCk7Ci0JCX0KLQkJaWYgKG51bGwgPT0gdGV4dCkgewotCQkJaWYgKG51bGwgIT0gYXNPYmplY3QpIHsKLQkJCQl0ZXh0ID0gZ2V0U3RyaW5nKHNpZFRleHQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGV4dCA9ICJbIiArIHRleHQgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBkZWNvZGVTdHJpbmcodGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKG51bGwgIT0gYXNPYmplY3QpIHsKLQkJCXJldHVybiBkZWNvZGVTdHJpbmcoZ2V0U3RyaW5nKHNpZFRpdGxlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG51bGwgIT0gYXNPYmplY3QpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBhc09iamVjdC5nZXQobmFtZSk7Ci0JCQlyZXR1cm4gbnVsbCA9PSByZXN1bHQgPyBudWxsIDogcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG51bGwgIT0gYXNPYmplY3QpIHsKLQkJCXJldHVybiBhc09iamVjdC5nZXQobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVN0cmluZyhTdHJpbmcgaW5wdXQpIHsKLQkJaWYgKG51bGwgIT0gaW5wdXQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKGlucHV0LCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgRmxhc2hOb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExldmVsKCkgewotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2tpcCgpIHsKLQkJcmV0dXJuIChza2lwQ2hpbGRyZW4gJiYgIWlzQWNjUHJvcGVydGllcykgfHwgaXNSZWZlcmVuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBY2NQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gaXNBY2NQcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkKGJvb2xlYW4gdmlzdWFsKSB7Ci0JCXJldHVybiBoYXNDaGlsZCh2aXN1YWwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChib29sZWFuIHZpc3VhbCwgYm9vbGVhbiBkZWJ1Z01vZGUpIHsKLQkJaWYgKGxldmVsID49IDUwKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoCi0JCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJTWVzc2FnZXMKLQkJCQkJCQkJCQkJLmdldFN0cmluZygiZmxhc2guZXJyb3JfdGFyZ2V0X2xlbmd0aCIpLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihsZXZlbCkgfSkgKyAiXG4iICsgc3RyVGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHBsYXllci5oYXNDaGlsZCh0aGlzLCB2aXN1YWwsIGRlYnVnTW9kZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKGJvb2xlYW4gdmlzdWFsLCBib29sZWFuIGluZm9ybWF0aXZlKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbih2aXN1YWwsIGluZm9ybWF0aXZlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKGJvb2xlYW4gdmlzdWFsLCBib29sZWFuIGluZm9ybWF0aXZlLAotCQkJYm9vbGVhbiBkZWJ1Z01vZGUpIHsKLQkJRmxhc2hOb2RlW10gY2hpbGRyZW4gPSBwbGF5ZXIuZ2V0Q2hpbGRyZW4odGhpcywgdmlzdWFsLCBkZWJ1Z01vZGUpOwotCQlMaXN0PEZsYXNoTm9kZT4gY2hpbGRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbGFzaE5vZGU+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUZsYXNoTm9kZSBub2RlID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoIWRlYnVnTW9kZSkgewotCQkJCWlmICghdmlzdWFsICYmIG5vZGUuc2hvdWxkU2tpcCgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoaW5mb3JtYXRpdmUgJiYgIW5vZGUuaXNBY2NQcm9wZXJ0aWVzKCkpIHsKLQkJCQkJaWYgKG51bGwgPT0gbm9kZS5nZXRUZXh0KCkKLQkJCQkJCQkmJiAhIm1vdmllY2xpcCIuZXF1YWxzKG5vZGUuZ2V0VHlwZSgpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkJISJCdXR0b24iLmVxdWFscyhub2RlLmdldENsYXNzTmFtZSgpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkJISJfYWNjUHJvcHMiLmVxdWFscyhub2RlLmdldE9iamVjdE5hbWUoKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSEiX2FjY0ltcGwiLmVxdWFscyhub2RlLmdldE9iamVjdE5hbWUoKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSEib25SZWxlYXNlIi5lcXVhbHMobm9kZS5nZXRPYmplY3ROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2hpbGRMaXN0LmFkZChub2RlKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyBGbGFzaE5vZGUgZ2V0Tm9kZShTdHJpbmcgbm9kZU5hbWUpIHsKLQkJcmV0dXJuIHBsYXllci5nZXROb2RlRnJvbVBhdGgoZ2V0VGFyZ2V0KCkgKyAiLiIgKyBub2RlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXIoKSB7Ci0JCWlmIChudWxsICE9IGFzT2JqZWN0KSB7Ci0JCQlwbGF5ZXIKLQkJCQkJLnNldE1hcmtlcigKLQkJCQkJCQlhc09iamVjdC5nZXQoIngiKSwgYXNPYmplY3QuZ2V0KCJ5IiksIGFzT2JqZWN0LmdldCgidyIpLCBhc09iamVjdC5nZXQoImgiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCX0KLQotCXB1YmxpYyBGbGFzaFBsYXllciBnZXRQbGF5ZXIoKSB7Ci0JCXJldHVybiBwbGF5ZXI7Ci0JfQotCi0JcHVibGljIEZsYXNoQWNjSW5mbyBnZXRBY2NJbmZvKCkgewotCQlyZXR1cm4gYWNjSW5mbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlkaXNwb3NlKCk7Ci0JCXN1cGVyLmZpbmFsaXplKCk7Ci0JfQotCi0JcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoKSB7Ci0JCWlmIChudWxsICE9IGFzT2JqZWN0KSB7Ci0JCQlyZXR1cm4gYXNPYmplY3QuZ2V0S2V5cygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaFBsYXllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmY4NTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoUGxheWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5hY2NzZXJ2aWNlLnN3dGJyaWRnZS5BY2Nlc3NpYmxlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuYWNjc2VydmljZS5zd3RicmlkZ2UudXRpbC5IVE1MRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5pbnRlcm5hbC5BU0JyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudXRpbC5BU09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50OwotCi1wdWJsaWMgY2xhc3MgRmxhc2hQbGF5ZXIgewotCi0JcHJpdmF0ZSBPbGVBdXRvbWF0aW9uIGF1dG9tYXRpb247Ci0JcHJpdmF0ZSBWYXJpYW50IHZhck1hcmtlcjsKLQlwcml2YXRlIGludCBpZEdldEF0dHJpYnV0ZTsKLQlwcml2YXRlIGludCBpZFNldEF0dHJpYnV0ZTsKLQlwcml2YXRlIGludCBpZFdNb2RlOwotCXByaXZhdGUgaW50IGlkR2V0VmFyaWFibGU7Ci0JcHJpdmF0ZSBpbnQgaWRTZXRWYXJpYWJsZTsKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzaWRHZXRSb290Tm9kZSA9ICJnZXRSb290Tm9kZSIsIC8vJE5PTi1OTFMtMSQKLQkJCXNpZEdldE51bURlYnVnQ2hpbGRyZW4gPSAiZ2V0TnVtU3VjY2Vzc29yTm9kZXMiLCAvLyROT04tTkxTLTEkCi0JCQlzaWRHZXREZWJ1Z0NoaWxkcmVuID0gImdldFN1Y2Nlc3Nvck5vZGVzIiwgLy8kTk9OLU5MUy0xJAotCQkJc2lkR2V0TnVtQ2hpbGRyZW4gPSAiZ2V0TnVtQ2hpbGROb2RlcyIsIC8vJE5PTi1OTFMtMSQKLQkJCXNpZEdldENoaWxkcmVuID0gImdldENoaWxkTm9kZXMiLCAvLyROT04tTkxTLTEkCi0JCQlzaWRHZXRJbm5lck5vZGVzID0gImdldElubmVyTm9kZXMiLCAvLyROT04tTkxTLTEkCi0JCQlzaWROZXdNYXJrZXIgPSAibmV3TWFya2VyIiwgLy8kTk9OLU5MUy0xJAotCQkJc2lkU2V0TWFya2VyID0gInNldE1hcmtlciIsIC8vJE5PTi1OTFMtMSQKLQkJCXNpZEdldE5vZGVGcm9tUGF0aCA9ICJnZXROb2RlRnJvbVBhdGgiLC8vJE5PTi1OTFMtMSQKLQkJCXNpZENhbGxNZXRob2QgPSAiY2FsbE1ldGhvZEEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFTQnJpZGdlIGJyaWRnZTsKLQotCXB1YmxpYyBGbGFzaFBsYXllcihWYXJpYW50IGZsYXNoKSB7Ci0JCWF1dG9tYXRpb24gPSBmbGFzaC5nZXRBdXRvbWF0aW9uKCk7Ci0JCWlkV01vZGUgPSBnZXRJRHNPZk5hbWVzKCJ3bW9kZSIpOyAvLyROT04tTkxTLTEkCi0JCWlkR2V0VmFyaWFibGUgPSBnZXRJRHNPZk5hbWVzKCJHZXRWYXJpYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlkU2V0VmFyaWFibGUgPSBnZXRJRHNPZk5hbWVzKCJTZXRWYXJpYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlkR2V0QXR0cmlidXRlID0gZ2V0SURzT2ZOYW1lcygiZ2V0QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWRTZXRBdHRyaWJ1dGUgPSBnZXRJRHNPZk5hbWVzKCJzZXRBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCQlicmlkZ2UgPSBBU0JyaWRnZS5nZXRJbnN0YW5jZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZsYXNoUGxheWVyIGdldFBsYXllckZyb21PYmplY3QoQWNjZXNzaWJsZU9iamVjdCBhY2NPYmplY3QpIHsKLQkJVmFyaWFudCB2YXJGbGFzaCA9IEhUTUxFbGVtZW50VXRpbC5nZXRIdG1sRWxlbWVudEZyb21PYmplY3QoYWNjT2JqZWN0KTsKLQkJaWYgKG51bGwgIT0gdmFyRmxhc2gpIHsKLQkJCXJldHVybiBuZXcgRmxhc2hQbGF5ZXIodmFyRmxhc2gpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGbGFzaE5vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCWlmIChudWxsICE9IGJyaWRnZSkgewotCQkJT2JqZWN0IHJlc3VsdCA9IGludm9rZShzaWRHZXRSb290Tm9kZSk7Ci0JCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgQVNPYmplY3QpIHsKLQkJCQlyZXR1cm4gbmV3IEZsYXNoTm9kZShudWxsLCB0aGlzLCAoQVNPYmplY3QpIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZsYXNoTm9kZSBnZXROb2RlRnJvbVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKG51bGwgIT0gYnJpZGdlKSB7Ci0JCQlPYmplY3QgcmVzdWx0ID0gaW52b2tlKHNpZEdldE5vZGVGcm9tUGF0aCwgcGF0aCk7Ci0JCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgQVNPYmplY3QpIHsKLQkJCQlyZXR1cm4gbmV3IEZsYXNoTm9kZShudWxsLCB0aGlzLCAoQVNPYmplY3QpIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGQoRmxhc2hOb2RlIHBhcmVudE5vZGUsIGJvb2xlYW4gdmlzdWFsKSB7Ci0JCXJldHVybiBoYXNDaGlsZChwYXJlbnROb2RlLCB2aXN1YWwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChGbGFzaE5vZGUgcGFyZW50Tm9kZSwgYm9vbGVhbiB2aXN1YWwsCi0JCQlib29sZWFuIGRlYnVnTW9kZSkgewotCQlpZiAodmlzdWFsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAobnVsbCAhPSBicmlkZ2UpIHsKLQkJCVN0cmluZyBzaWRNZXRob2Q7Ci0JCQlpZiAodmlzdWFsKSB7Ci0JCQkJc2lkTWV0aG9kID0gc2lkR2V0TnVtRGVidWdDaGlsZHJlbjsKLQkJCX0gZWxzZSB7Ci0JCQkJc2lkTWV0aG9kID0gZGVidWdNb2RlID8gc2lkR2V0TnVtRGVidWdDaGlsZHJlbgotCQkJCQkJOiBzaWRHZXROdW1DaGlsZHJlbjsKLQkJCX0KLQkJCU9iamVjdCByZXN1bHQgPSBpbnZva2Uoc2lkTWV0aG9kLCBwYXJlbnROb2RlLmdldFRhcmdldCgpKTsKLQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJcmV0dXJuICgoSW50ZWdlcikgcmVzdWx0KS5pbnRWYWx1ZSgpID4gMDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEZsYXNoTm9kZVtdIGdldENoaWxkcmVuKEZsYXNoTm9kZSBwYXJlbnROb2RlLCBib29sZWFuIHZpc3VhbCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4ocGFyZW50Tm9kZSwgdmlzdWFsLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIEZsYXNoTm9kZVtdIGdldENoaWxkcmVuKEZsYXNoTm9kZSBwYXJlbnROb2RlLCBib29sZWFuIHZpc3VhbCwKLQkJCWJvb2xlYW4gZGVidWdNb2RlKSB7Ci0JCUxpc3Q8Rmxhc2hOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Rmxhc2hOb2RlPigpOwotCQlpZiAobnVsbCAhPSBicmlkZ2UpIHsKLQkJCVN0cmluZyBzaWRNZXRob2Q7Ci0JCQlpZiAodmlzdWFsKSB7Ci0JCQkJc2lkTWV0aG9kID0gc2lkR2V0SW5uZXJOb2RlczsKLQkJCX0gZWxzZSB7Ci0JCQkJc2lkTWV0aG9kID0gZGVidWdNb2RlID8gc2lkR2V0RGVidWdDaGlsZHJlbiA6IHNpZEdldENoaWxkcmVuOwotCQkJfQotCQkJT2JqZWN0IHJlc3VsdCA9IGludm9rZShzaWRNZXRob2QsIHBhcmVudE5vZGUuZ2V0VGFyZ2V0KCkpOwotCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQkJT2JqZWN0W10gb2JqQ2hpbGRyZW4gPSAoT2JqZWN0W10pIHJlc3VsdDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9iakNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChvYmpDaGlsZHJlbltpXSBpbnN0YW5jZW9mIEFTT2JqZWN0KSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQobmV3IEZsYXNoTm9kZShwYXJlbnROb2RlLCB0aGlzLAotCQkJCQkJCQkoQVNPYmplY3QpIG9iakNoaWxkcmVuW2ldKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkobmV3IEZsYXNoTm9kZVtjaGlsZHJlbi5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXIoT2JqZWN0IG9ialgsIE9iamVjdCBvYmpZLCBPYmplY3Qgb2JqVywgT2JqZWN0IG9iakgpIHsKLQkJaWYgKG51bGwgIT0gb2JqWCAmJiBudWxsICE9IG9ialkgJiYgbnVsbCAhPSBvYmpXICYmIG51bGwgIT0gb2JqSCkgewotCQkJaWYgKG51bGwgPT0gdmFyTWFya2VyKSB7Ci0JCQkJdmFyTWFya2VyID0gYXV0b21hdGlvbi5pbnZva2UoaWRHZXRBdHRyaWJ1dGUsCi0JCQkJCQluZXcgVmFyaWFudFtdIHsgbmV3IFZhcmlhbnQoIm1hcmtlciIpIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG51bGwgPT0gdmFyTWFya2VyIHx8IE9MRS5WVF9JNCAhPSB2YXJNYXJrZXIuZ2V0VHlwZSgpKSB7Ci0JCQkJCU9iamVjdCBvYmpNYXJrZXIgPSBpbnZva2Uoc2lkTmV3TWFya2VyKTsKLQkJCQkJaWYgKCEob2JqTWFya2VyIGluc3RhbmNlb2YgSW50ZWdlcikpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQl2YXJNYXJrZXIgPSBuZXcgVmFyaWFudCgoKEludGVnZXIpIG9iak1hcmtlcikuaW50VmFsdWUoKSk7Ci0JCQkJCWF1dG9tYXRpb24uaW52b2tlKGlkU2V0QXR0cmlidXRlLCBuZXcgVmFyaWFudFtdIHsKLQkJCQkJCQluZXcgVmFyaWFudCgibWFya2VyIiksIHZhck1hcmtlciB9KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWlmIChudWxsICE9IGJyaWRnZSAmJiBudWxsICE9IHZhck1hcmtlcikgewotCQkJCWJyaWRnZQotCQkJCQkJLmludm9rZShuZXcgT2JqZWN0W10geyBzaWRTZXRNYXJrZXIsCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKHZhck1hcmtlci5nZXRJbnQoKSksIG9ialgsIG9ialksCi0JCQkJCQkJCW9ialcsIG9iakggfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFyaWFudCBjYWxsTWV0aG9kKFN0cmluZyB0YXJnZXQsIFN0cmluZyBtZXRob2QsIFZhcmlhbnQgYXJnMSkgewotCQlpZiAobnVsbCAhPSBicmlkZ2UpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJc3dpdGNoIChhcmcxLmdldFR5cGUoKSkgewotCQkJY2FzZSBPTEUuVlRfSTQ6Ci0JCQkJcmVzdWx0ID0gY2FsbE1ldGhvZCh0YXJnZXQsIG1ldGhvZCwgbmV3IEludGVnZXIoYXJnMS5nZXRJbnQoKSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPTEUuVlRfQlNUUjoKLQkJCQlyZXN1bHQgPSBjYWxsTWV0aG9kKHRhcmdldCwgbWV0aG9kLCBhcmcxLmdldFN0cmluZygpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJcmV0dXJuIG5ldyBWYXJpYW50KCgoSW50ZWdlcikgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSBpZiAocmVzdWx0IGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQkJcmV0dXJuIG5ldyBWYXJpYW50KCgoRG91YmxlKSByZXN1bHQpLmRvdWJsZVZhbHVlKCkpOwotCQkJfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlyZXR1cm4gbmV3IFZhcmlhbnQocmVzdWx0LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNhbGxNZXRob2QoU3RyaW5nIHRhcmdldCwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IGFyZzEpIHsKLQkJcmV0dXJuIGJyaWRnZQotCQkJCS5pbnZva2UobmV3IE9iamVjdFtdIHsgc2lkQ2FsbE1ldGhvZCwgdGFyZ2V0LCBtZXRob2QsIGFyZzEgfSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgaW52b2tlKFN0cmluZyBtZXRob2QpIHsKLQkJcmV0dXJuIGJyaWRnZS5pbnZva2UobmV3IE9iamVjdFtdIHsgbWV0aG9kIH0pOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGludm9rZShTdHJpbmcgbWV0aG9kLCBPYmplY3QgYXJnMSkgewotCQlyZXR1cm4gYnJpZGdlLmludm9rZShuZXcgT2JqZWN0W10geyBtZXRob2QsIGFyZzEgfSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SURzT2ZOYW1lcyhTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJaW50IGRpc3BpZFtdID0gYXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7IG5hbWUgfSk7Ci0JCQlpZiAobnVsbCAhPSBkaXNwaWQpIHsKLQkJCQlyZXR1cm4gZGlzcGlkWzBdOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yVGV4dCgpIHsKLQkJVmFyaWFudCB2YXJFcnJvciA9IGF1dG9tYXRpb24uaW52b2tlKGlkR2V0QXR0cmlidXRlLAotCQkJCW5ldyBWYXJpYW50W10geyBuZXcgVmFyaWFudCgiYURlc2lnbmVyRXJyb3IiKSB9KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobnVsbCAhPSB2YXJFcnJvciAmJiBPTEUuVlRfQlNUUiA9PSB2YXJFcnJvci5nZXRUeXBlKCkpIHsKLQkJCVN0cmluZyBzdHJFcnJvciA9IHZhckVycm9yLmdldFN0cmluZygpOwotCQkJaWYgKHN0ckVycm9yLnN0YXJ0c1dpdGgoRmxhc2hBZGp1c3QuRVJST1JfV0FJVCkpIHsKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJmbGFzaC5wbGF5ZXJfbG9hZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoc3RyRXJyb3Iuc3RhcnRzV2l0aChGbGFzaEFkanVzdC5FUlJPUl9ORykpIHsKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJmbGFzaC5wbGF5ZXJfbm9fZG9tIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdHJFcnJvci5zdGFydHNXaXRoKEZsYXNoQWRqdXN0LkVSUk9SX05BKSkgewotCQkJCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoImZsYXNoLnBsYXllcl9ub194Y29kZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJLy8gcmV0dXJuIE1lc3NhZ2VzLmdldFN0cmluZygiZmxhc2gucGxheWVyX3Vua25vd24iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJmbGFzaC5wbGF5ZXJfbm9feGNvZGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPbGVBdXRvbWF0aW9uIGdldEF1dG9tYXRpb24oKSB7Ci0JCXJldHVybiBhdXRvbWF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChudWxsICE9IHZhck1hcmtlcikgewotCQkJdmFyTWFya2VyLmRpc3Bvc2UoKTsKLQkJCXZhck1hcmtlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG51bGwgIT0gYXV0b21hdGlvbikgewotCQkJYXV0b21hdGlvbi5kaXNwb3NlKCk7Ci0JCQlhdXRvbWF0aW9uID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWRpc3Bvc2UoKTsKLQkJc3VwZXIuZmluYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdNb2RlKCkgewotCQlpZiAoMCAhPSBpZFdNb2RlKSB7Ci0JCQlWYXJpYW50IHZhcldNb2RlID0gYXV0b21hdGlvbi5nZXRQcm9wZXJ0eShpZFdNb2RlKTsKLQkJCWlmIChudWxsICE9IHZhcldNb2RlICYmIE9MRS5WVF9CU1RSID09IHZhcldNb2RlLmdldFR5cGUoKSkgewotCQkJCXJldHVybiB2YXJXTW9kZS5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICgwICE9IGlkU2V0VmFyaWFibGUpIHsKLQkJCWF1dG9tYXRpb24uaW52b2tlKGlkU2V0VmFyaWFibGUsIG5ldyBWYXJpYW50W10geyBuZXcgVmFyaWFudChuYW1lKSwKLQkJCQkJbmV3IFZhcmlhbnQodmFsdWUpIH0pOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZShTdHJpbmcgbmFtZSkgewotCQlpZiAoMCAhPSBpZEdldFZhcmlhYmxlKSB7Ci0JCQlWYXJpYW50IHZhclZhbHVlID0gYXV0b21hdGlvbi5pbnZva2UoaWRHZXRWYXJpYWJsZSwKLQkJCQkJbmV3IFZhcmlhbnRbXSB7IG5ldyBWYXJpYW50KG5hbWUpIH0pOwotCQkJaWYgKG51bGwgIT0gdmFyVmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFyVmFsdWUuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9JV2FYY29kaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL0lXYVhjb2RpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhM2VjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL0lXYVhjb2RpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGludGVyZmFjZSBJV2FYY29kaW5nIHsKLSAgICBib29sZWFuIHN0YXJ0KGJvb2xlYW4gaW5pdExvZ2dlcik7Ci0gICAgYm9vbGVhbiBzdG9wKCk7Ci0gICAgCi0gICAgU3RyaW5nIGdldFNlY3JldChTdHJpbmcgaWQsIGJvb2xlYW4gcmVtb3ZlKTsKLQotICAgIHZvaWQgc2V0UG9ydChpbnQgcG9ydCk7Ci0gICAgaW50IGdldFBvcnQoKTsKLSAgICB2b2lkIHNldEV4dGVybmFsUHJveHlGbGFnKGJvb2xlYW4gZmxhZyk7Ci0gICAgdm9pZCBzZXRFeHRlcm5hbFByb3h5KFN0cmluZyBob3N0LCBpbnQgcG9ydCk7Ci0gICAgdm9pZCBzZXRNYXhDb25uZWN0aW9uKGludCBjb25uZWN0aW9ucyk7Ci0gICAgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KTsKLSAgICB2b2lkIHNldFNXRkJvb3Rsb2FkZXJGbGFnKGJvb2xlYW4gZmxhZyk7Ci0gICAgdm9pZCBzZXRTV0ZCb290bG9hZGVyKElucHV0U3RyZWFtIGlzKTsKLSAgICB2b2lkIHNldFNXRkJyaWRnZUluaXQoSW5wdXRTdHJlYW0gaXMpOwotICAgIHZvaWQgc2V0U1dGVHJhbnNjb2RpbmdGbGFnKGJvb2xlYW4gZmxhZyk7Ci0gICAgdm9pZCBzZXRTV0ZUcmFuc2NvZGluZ01pbmltdW1WZXJzaW9uKGludCB2ZXJzaW9uKTsKLSAgICB2b2lkIHNldFNXRlRyYW5zY29kaW5nSW1wb3NlZEZpbGUoSW5wdXRTdHJlYW0gaXMpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9pbXBsL1dhWGNvZGluZ0NvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9pbXBsL1dhWGNvZGluZ0NvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmMxOWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvaW1wbC9XYVhjb2RpbmdDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UucHJveHkuSFRUUExvY2FsU2VydmVyU1dGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5wcm94eS5Qcm94eVRyYW5zY29kZXJTV0Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UucHJveHkuU1dGQm9vdGxvYWRlcjsKLQotcHVibGljIGNsYXNzIFdhWGNvZGluZ0NvbmZpZyB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3dmVHJhbnNjb2RpbmdGbGFnID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgc3dmVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbiA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIHN3ZkJvb3Rsb2FkZXJGbGFnID0gdHJ1ZTsKLQotCXB1YmxpYyBib29sZWFuIGdldFNXRlRyYW5zY29kaW5nRmxhZygpIHsKLQkJcmV0dXJuIHN3ZlRyYW5zY29kaW5nRmxhZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTV0ZUcmFuc2NvZGluZ0ZsYWcoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMuc3dmVHJhbnNjb2RpbmdGbGFnID0gZmxhZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTV0ZCb290bG9hZGVyRmxhZyhib29sZWFuIHN3ZkJvb3Rsb2FkZXJGbGFnKSB7Ci0JCXRoaXMuc3dmQm9vdGxvYWRlckZsYWcgPSBzd2ZCb290bG9hZGVyRmxhZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTV0ZCb290bG9hZGVyRmxhZygpIHsKLQkJcmV0dXJuIHN3ZkJvb3Rsb2FkZXJGbGFnOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbigpIHsKLQkJcmV0dXJuIHN3ZlRyYW5zY29kaW5nTWluaW11bVZlcnNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbihpbnQgdmVyc2lvbikgewotCQl0aGlzLnN3ZlRyYW5zY29kaW5nTWluaW11bVZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNXRlRyYW5zY29kaW5nSW1wb3NlZEZpbGUoSW5wdXRTdHJlYW0gaXMpIHsKLQkJUHJveHlUcmFuc2NvZGVyU1dGLnNldFNXRlRyYW5zY29kaW5nSW1wb3NlZEZpbGUoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNXRkJvb3RMb2FkZXIoSW5wdXRTdHJlYW0gaXMpIHsKLQkJU1dGQm9vdGxvYWRlci5zZXRTV0ZCb290TG9hZGVyRmlsZShpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGQnJpZGdlSW5pdChJbnB1dFN0cmVhbSBpcykgewotCQlIVFRQTG9jYWxTZXJ2ZXJTV0ZGYWN0b3J5LnNldEJyaWRnZUluaXRTd2YoaXMpOwotCX0KLQotCQotCXByaXZhdGUgc3RhdGljIFdhWGNvZGluZ0NvbmZpZyBpbnN0YW5jZSA9IG5ldyBXYVhjb2RpbmdDb25maWcoKTsKLQotCXB1YmxpYyBzdGF0aWMgV2FYY29kaW5nQ29uZmlnIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9pbXBsL1dhWGNvZGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvaW1wbC9XYVhjb2RpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNmUxMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9pbXBsL1dhWGNvZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLWluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLklXYVhjb2Rpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UucHJveHkuSFRUUExvY2FsU2VydmVyU1dGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5wcm94eS5Qcm94eVRyYW5zY29kZXJTV0ZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLnByb3h5LlNXRkJvb3Rsb2FkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLnByb3h5LlNXRlNlY3JldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5FeHRlcm5hbFByb3h5Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuSFRUUFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuUHJveHlDb25maWc7Ci0KLQotcHVibGljIGNsYXNzIFdhWGNvZGluZ0ltcGwgaW1wbGVtZW50cyBJV2FYY29kaW5nIHsKLSAgICBwcml2YXRlIEhUVFBQcm94eSBwcm94eTsKLSAgICBwcml2YXRlIFByb3h5Q29uZmlnIHByb3h5Q29uZmlnOwotICAgIHByaXZhdGUgRXh0ZXJuYWxQcm94eUNvbmZpZyBleFByb3h5Q29uZmlnOwotICAgIHByaXZhdGUgV2FYY29kaW5nQ29uZmlnIHdheENvbmZpZzsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9nQ29uZmlnID0gCi0gICAgICAgICJoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlclxuIgotICAgICAgICArICJqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbD1JTkZPXG4iCi0gICAgICAgICsgImphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLmZvcm1hdHRlcj1qYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXJcbiIKLSAgICAgICAgKyAiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWw9RklORVNUXG4iCi0gICAgICAgICsgImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLnBhdHRlcm49Yzovd2F4Y29kaW5nLmxvZ1xuIgotICAgICAgICArICJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXI9amF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyXG4iOwotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnQoYm9vbGVhbiBpbml0TG9nZ2VyKSB7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgaWYgKGluaXRMb2dnZXIpIHsKLSAgICAgICAgICAgIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGxvZ0NvbmZpZy5nZXRCeXRlcygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJveHkgPSBIVFRQUHJveHkubmV3UHJveHkocHJveHlDb25maWcsIGV4UHJveHlDb25maWcsICJXYVhjb2RpbmciLCBpcyk7Ci0gICAgICAgIGlmIChwcm94eSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHByb3h5LnN0YXJ0VGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0b3AoKSB7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zdG9wVGhyZWFkKCk7Ci0gICAgICAgICAgICBwcm94eSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWNyZXQoU3RyaW5nIGlkLCBib29sZWFuIHJlbW92ZSkgewotICAgICAgICByZXR1cm4gcHJveHkuZ2V0U2VjcmV0KGlkLCByZW1vdmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKLSAgICAgICAgcHJveHlDb25maWcuc2V0UG9ydChwb3J0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0TGlzdGVuUG9ydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5Q29uZmlnLmdldFBvcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsUHJveHlGbGFnKGJvb2xlYW4gZmxhZykgewotICAgIAlleFByb3h5Q29uZmlnLnNldEV4dGVybmFsUHJveHlGbGFnKGZsYWcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsUHJveHkoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0gICAgCWV4UHJveHlDb25maWcuc2V0RXh0ZXJuYWxQcm94eShob3N0LCBwb3J0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTV0ZUcmFuc2NvZGluZ0ZsYWcoYm9vbGVhbiBmbGFnKSB7Ci0gICAgCXdheENvbmZpZy5zZXRTV0ZUcmFuc2NvZGluZ0ZsYWcoZmxhZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbihpbnQgdmVyc2lvbikgewotICAgIAl3YXhDb25maWcuc2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbih2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTV0ZUcmFuc2NvZGluZ0ltcG9zZWRGaWxlKElucHV0U3RyZWFtIGlzKSB7Ci0gICAgCXdheENvbmZpZy5zZXRTV0ZUcmFuc2NvZGluZ0ltcG9zZWRGaWxlKGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhDb25uZWN0aW9uKGludCBjb25uZWN0aW9ucykgewotICAgIAlwcm94eUNvbmZpZy5zZXRNYXhDb25uZWN0aW9uKGNvbm5lY3Rpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0gICAgCXByb3h5Q29uZmlnLnNldFRpbWVvdXQodGltZW91dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBXYVhjb2RpbmdJbXBsKCkgewotICAgIAlwcm94eUNvbmZpZyA9IG5ldyBQcm94eUNvbmZpZygpOwotICAgIAlleFByb3h5Q29uZmlnID0gbmV3IEV4dGVybmFsUHJveHlDb25maWcoKTsKLSAgICAJd2F4Q29uZmlnID0gV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCk7Ci0KLSAgICAJcHJveHlDb25maWcuc2V0UHJveHlUcmFuc2NvZGVyRmFjdG9yeShuZXcgUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeSgpKTsKLSAgICAJcHJveHlDb25maWcuc2V0U2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkobmV3IFNXRkJvb3Rsb2FkZXJGYWN0b3J5KCkpOwotICAgIAlwcm94eUNvbmZpZy5zZXRMb2NhbFNlcnZlckZhY3RvcnkobmV3IEhUVFBMb2NhbFNlcnZlclNXRkZhY3RvcnkoKSk7Ci0gICAgCXByb3h5Q29uZmlnLnNldFNlY3JldE1hbmFnZXIobmV3IFNXRlNlY3JldE1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVdhWGNvZGluZyBpbnN0YW5jZSA9IG5ldyBXYVhjb2RpbmdJbXBsKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIElXYVhjb2RpbmcgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTV0ZCb290bG9hZGVyRmxhZyhib29sZWFuIGZsYWcpIHsKLSAgICAJd2F4Q29uZmlnLnNldFNXRkJvb3Rsb2FkZXJGbGFnKGZsYWcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNXRkJvb3Rsb2FkZXIoSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAJd2F4Q29uZmlnLnNldFNXRkJvb3RMb2FkZXIoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNXRkJyaWRnZUluaXQoSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAJd2F4Q29uZmlnLnNldFNXRkJyaWRnZUluaXQoaXMpOwotCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9wcm94eS9IVFRQTG9jYWxTZXJ2ZXJTV0YuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvSFRUUExvY2FsU2VydmVyU1dGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDNjZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9wcm94eS9IVFRQTG9jYWxTZXJ2ZXJTV0YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5IVFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5QYXJzZVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuVGltZW91dEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEhUVFBMb2NhbFNlcnZlclNXRiBpbXBsZW1lbnRzIElIVFRQTG9jYWxTZXJ2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfRklMRV9BQ0NFU1MgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVFRQX1dFTExfS05PV05fUE9SVCA9IDgwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBNSU1FX1RZUEVfQVBQTElDQVRJT05fWE1MX0EgPSAiYXBwbGljYXRpb24veG1sIi5nZXRCeXRlcygpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSFRUUExvY2FsU2VydmVyU1dGLmNsYXNzKTsKLQotCXN0YXRpYyBwdWJsaWMgY2xhc3MgTUlNRVR5cGUgewotCQlwdWJsaWMgZmluYWwgU3RyaW5nIHN1ZmZpeDsKLQkJcHVibGljIGZpbmFsIFN0cmluZyB0eXBlOwotCQlwdWJsaWMgZmluYWwgU3RyaW5nIHN1YnR5cGU7Ci0KLQkJTUlNRVR5cGUoU3RyaW5nIHN1ZmZpeCwgU3RyaW5nIHR5cGUsIFN0cmluZyBzdWJ0eXBlKSB7Ci0JCQl0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnN1YnR5cGUgPSBzdWJ0eXBlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBtaW1lVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTUlNRVR5cGUoU3RyaW5nIHN1ZmZpeCwgU3RyaW5nIHR5cGUsIFN0cmluZyBzdWJ0eXBlKSB7Ci0JCW1pbWVUeXBlTWFwLnB1dChzdWZmaXgsIG5ldyBNSU1FVHlwZShzdWZmaXgsIHR5cGUsIHN1YnR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1JTUVUeXBlIGdldE1JTUVUeXBlKFN0cmluZyBzdWZmaXgpIHsKLQkJcmV0dXJuIChNSU1FVHlwZSkgbWltZVR5cGVNYXAuZ2V0KHN1ZmZpeCk7Ci0JfSAgICAKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gYnJpZGdlSW5pdFN3ZjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCcmlkZ2VJbml0U3dmKElucHV0U3RyZWFtIGlzKSB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgaW50IGI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGIgPSBpcy5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGIgPCAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyaWRnZUluaXRTd2YgPSBvcy50b0J5dGVBcnJheSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcHJvY2Vzc0JyaWRnZUluaXRTd2YoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KSB7Ci0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcXVlc3QuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMCIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9LIi5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlkZ2VJbml0U3dmKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTlRFTlRfVFlQRV9BLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dGVXRpbC5NSU1FX1RZUEVfQVBQTElDQVRJT05fWF9TSE9DS1dBVkVfRkxBU0hfQSk7Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcHJvY2Vzc0xvYWRWYXJzRm9yU3dmKElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwgSVNlY3JldE1hbmFnZXIgc2VjcmV0TWFuYWdlcikgewotICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSA9IEhUVFBVdGlsLmNyZWF0ZUhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0LmdldFNlcmlhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAiLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPSyIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjcmV0TWFuYWdlci5yZXF1ZXN0U2VjcmV0KCkpOwotICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoSUhUVFBIZWFkZXIuQ09OVEVOVF9UWVBFX0EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTV0ZVdGlsLk1JTUVfVFlQRV9BUFBMSUNBVElPTl9YX1dXV19GT1JNX1VSTEVOQ09ERURfQSk7Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElIVFRQUmVzcG9uc2VNZXNzYWdlIHByb2Nlc3NTd2ZDcm9zc0RvbWFpblBvbGljeUZpbGUoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KSB7Ci0gICAgICAgIC8vaW50IHBvcnQgPSBTd2ZPUkJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TGlzdGVuUG9ydCgpOwotICAgICAgICBMT0dHRVIuaW5mbygiUmVxdWVzdCBjcm9zc2RvbWFpbi54bWwgcG9saWN5IGZpbGUuIik7Ci0gICAgICAgIGludCBwb3J0ID0gZ2V0U3dmT1JCUG9ydCgpOwotICAgICAgICAvKgotICAgICAgICBTdHJpbmcgY29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+XG48Y3Jvc3MtZG9tYWluLXBvbGljeT48YWxsb3ctYWNjZXNzLWZyb20gZG9tYWluPVwiKlwiIHRvLXBvcnRzPVwiIgotICAgICAgICAgICAgKyBwb3J0ICsgIlwiLz48L2Nyb3NzLWRvbWFpbi1wb2xpY3k+XG4iOwotICAgICAgICAqLwotICAgICAgICBTdHJpbmcgY29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+XG48Y3Jvc3MtZG9tYWluLXBvbGljeT48YWxsb3ctYWNjZXNzLWZyb20gZG9tYWluPVwiKlwiLz48L2Nyb3NzLWRvbWFpbi1wb2xpY3k+XG4iOwotICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSA9IEhUVFBVdGlsLmNyZWF0ZUhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0LmdldFNlcmlhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAiLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPSyIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihJSFRUUEhlYWRlci5DT05URU5UX1RZUEVfQSwgTUlNRV9UWVBFX0FQUExJQ0FUSU9OX1hNTF9BKTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIHByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcHJvY2Vzc0xvY2FsRmlsZShpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhYnNQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQUHJveHlUcmFuc2NvZGVyIHRyYW5zY29kZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFic1BhdGggPSBVUkxEZWNvZGVyLmRlY29kZShhYnNQYXRoLCAiVVRGLTgiKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0dHRVIuaW5mbygiTG9jYWwgU2VydmVyIE1vZGUuIFNlbmQ6IiArIGFic1BhdGgpOwotCi0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGFic1BhdGgpOwotICAgICAgICBpZiAoIWYuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW4gPSAoaW50KSBmLmxlbmd0aCgpOwotICAgICAgICBieXRlW10gY29udGVudHMgPSBuZXcgYnl0ZVtsZW5dOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgaXMucmVhZChjb250ZW50cywgMCwgbGVuKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcXVlc3QuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMCIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9LIi5nZXRCeXRlcygpLCBjb250ZW50cyk7Ci0gICAgICAgIGludCBkb3RQb3MgPSBhYnNQYXRoLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgIGlmIChkb3RQb3MgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgc1BvcyA9IGFic1BhdGgubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgIGlmIChkb3RQb3MgPiBzUG9zKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeCA9IGFic1BhdGguc3Vic3RyaW5nKGRvdFBvcyArIDEpOwotICAgICAgICAgICAgICAgIE1JTUVUeXBlIG10ID0gZ2V0TUlNRVR5cGUoc3VmZml4KTsKLSAgICAgICAgICAgICAgICBpZiAobXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtdC50eXBlKS5hcHBlbmQoJy8nKS5hcHBlbmQobXQuc3VidHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihJSFRUUEhlYWRlci5DT05URU5UX1RZUEVfQSwgc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHJhbnNjb2RlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHRyYW5zY29kZXIudHJhbnNjb2RlKGlkLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBMb2NhbFNlcnZlciNwcm9jZXNzUmVxdWVzdChpbnQsIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSFRUUFByb3h5Q29ubmVjdGlvbiwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXF1ZXN0TWVzc2FnZSwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlcikKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUmVxdWVzdChpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBQcm94eUNvbm5lY3Rpb24gZkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBQcm94eVRyYW5zY29kZXIgdHJhbnNjb2RlcikKLSAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghSUhUVFBIZWFkZXIuTUVUSE9EX0dFVC5lcXVhbHMocmVxdWVzdC5nZXRNZXRob2RBc1N0cmluZygpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHVyaVN0ciA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSVN0cmluZygpOwotICAgICAgICBTdHJpbmcgYXV0aG9yaXR5ID0gUGFyc2VVUkkuZ2V0QXV0aG9yaXR5KHVyaVN0cik7Ci0gICAgICAgIFN0cmluZyBhYnNQYXRoID0gUGFyc2VVUkkuZ2V0QWJzb2x1dGVQYXRoKHVyaVN0cik7Ci0KLSAgICAgICAgU3RyaW5nIGhvc3RTdHI7Ci0gICAgICAgIFN0cmluZyBob3N0OwotICAgICAgICBpbnQgcG9ydDsKLSAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBob3N0U3RyID0gYXV0aG9yaXR5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUhUVFBIZWFkZXIgaG9zdEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKElIVFRQSGVhZGVyLkhPU1RfQSk7Ci0gICAgICAgICAgICBpZiAoaG9zdEhlYWRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGhvc3RTdHIgPSBuZXcgU3RyaW5nKGhvc3RIZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaG9zdCA9IFBhcnNlVVJJLnBhcnNlSG9zdChob3N0U3RyKTsKLSAgICAgICAgcG9ydCA9IFBhcnNlVVJJLnBhcnNlUG9ydChob3N0U3RyLCBIVFRQX1dFTExfS05PV05fUE9SVCk7Ci0KLSAgICAgICAgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBpZiAoYWJzUGF0aC5lbmRzV2l0aChTV0ZVdGlsLkJSSURHRV9JTklUX1NXRl9GSUxFTkFNRSkpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlID0gcHJvY2Vzc0JyaWRnZUluaXRTd2YocmVxdWVzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWJzUGF0aC5lbmRzV2l0aChTV0ZVdGlsLkxPQURWQVJTX1BST1BFUlRZX0ZJTEVOQU1FKSkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm9jZXNzTG9hZFZhcnNGb3JTd2YocmVxdWVzdCwgZkNsaWVudC5nZXRTZWNyZXRNYW5hZ2VyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCEoImxvY2FsaG9zdCIuZXF1YWxzKGhvc3QpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoKHBvcnQgPT0gSFRUUF9XRUxMX0tOT1dOX1BPUlQpICYmICgiL2Nyb3NzZG9tYWluLnhtbCIuZXF1YWxzKGFic1BhdGgpKSkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJvY2Vzc1N3ZkNyb3NzRG9tYWluUG9saWN5RmlsZShyZXF1ZXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTE9DQUxfRklMRV9BQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCAhPSBmQ2xpZW50LmdldExpc3RlblBvcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJvY2Vzc0xvY2FsRmlsZShpZCwgcmVxdWVzdCwgYWJzUGF0aCwgdHJhbnNjb2Rlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIEhUVFBVdGlsLnNlbmRGYWlsZWRUb0NsaWVudChmQ2xpZW50LCByZXF1ZXN0KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZDbGllbnQuc2VuZFJlc3BvbnNlKDAsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZmF0YWwoIlRpbWVvdXQgaW4gbG9jYWwgc2VydmVyIG1vZGUiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQkvLyBUT0RPISEhIQotCXByaXZhdGUgaW50IHN3Zk9SQlBvcnQgPSAtMTsKLQotCXB1YmxpYyBpbnQgZ2V0U3dmT1JCUG9ydCgpIHsKLQkJaWYgKHN3Zk9SQlBvcnQgPCAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3dmT1JCUG9ydCBpcyBub3Qgc2V0Iik7Ci0JCXJldHVybiBzd2ZPUkJQb3J0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN3Zk9SQlBvcnQoaW50IHN3Zk9SQlBvcnQpIHsKLQkJdGhpcy5zd2ZPUkJQb3J0ID0gc3dmT1JCUG9ydDsKLQl9Ci0KLSAgICAKLSAgICBwdWJsaWMgSFRUUExvY2FsU2VydmVyU1dGKCkgeyAgICAgICAgCi0JCWFkZE1JTUVUeXBlKCJodG1sIiwgInRleHQiLCAiaHRtbCIpOwotCQlhZGRNSU1FVHlwZSgiaHRtIiwgInRleHQiLCAiaHRtbCIpOwotCQlhZGRNSU1FVHlwZSgianMiLCAiYXBwbGljYXRpb24iLCAieC1qYXZhc2NyaXB0Iik7Ci0JCWFkZE1JTUVUeXBlKCJzd2YiLCAiYXBwbGljYXRpb24iLCAieC1zaG9ja3dhdmUtZmxhc2giKTsKLQkJYWRkTUlNRVR5cGUoImdpZiIsICJpbWFnZSIsICJnaWYiKTsKLQkJYWRkTUlNRVR5cGUoImpwZWciLCAiaW1hZ2UiLCAianBlZyIpOwotCQlhZGRNSU1FVHlwZSgianBnIiwgImltYWdlIiwgImpwZWciKTsKLQkJYWRkTUlNRVR5cGUoInBuZyIsICJpbWFnZSIsICJwbmciKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvSFRUUExvY2FsU2VydmVyU1dGRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9wcm94eS9IVFRQTG9jYWxTZXJ2ZXJTV0ZGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTk0ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9wcm94eS9IVFRQTG9jYWxTZXJ2ZXJTV0ZGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBMb2NhbFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSFRUUExvY2FsU2VydmVyU1dGRmFjdG9yeSBpbXBsZW1lbnRzIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCcmlkZ2VJbml0U3dmKElucHV0U3RyZWFtIGlzKXsKLQkJSFRUUExvY2FsU2VydmVyU1dGLnNldEJyaWRnZUluaXRTd2YoaXMpOwotCX0KLQkKLQlwdWJsaWMgSFRUUExvY2FsU2VydmVyU1dGRmFjdG9yeSgpIHsKLQl9Ci0JCi0JcHVibGljIElIVFRQTG9jYWxTZXJ2ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSFRUUExvY2FsU2VydmVyU1dGKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1Byb3h5VHJhbnNjb2RlclNXRi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9wcm94eS9Qcm94eVRyYW5zY29kZXJTV0YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkwMDY5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1Byb3h5VHJhbnNjb2RlclNXRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLmltcGwuV2FYY29kaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudHJhbnNjb2Rlci5JU3dmVHJhbnNjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnRyYW5zY29kZXIuSVN3ZlRyYW5zY29kZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklQdXNoYmFja01lc3NhZ2VCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eVRyYW5zY29kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkhUVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRocm93YWJsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVRyYW5zY29kZXJTV0YgaW1wbGVtZW50cyBJSFRUUFByb3h5VHJhbnNjb2RlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUHJveHlUcmFuc2NvZGVyU1dGLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIElTd2ZUcmFuc2NvZGVyRmFjdG9yeSBnZXRTd2ZUcmFuc2NvZGVyRmFjdG9yeSgpIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IG1heWJlIHdlIHNob3VsZCByZW5hbWUgdGhlIGZhY3RvcnkgcGFja2FnZS4KLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MKLQkJCQkJLmZvck5hbWUoIm9yZy5lY2xpcHNlLmFjdGYudXRpbC5zd2Z0cmFuc2NvZGVyLlN3ZlRyYW5zY29kZXJGYWN0b3J5Iik7Ci0JCQlyZXR1cm4gKElTd2ZUcmFuc2NvZGVyRmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3dmVHJhbnNjb2RlckZhY3Rvcnkgc3dmVHJhbnNjb2RlckZhY3RvcnkgPSBnZXRTd2ZUcmFuc2NvZGVyRmFjdG9yeSgpOwotCi0JcHJpdmF0ZSBmaW5hbCBJU3dmVHJhbnNjb2RlciBzd2ZUcmFuc2NvZGVyOwotCi0JcHJpdmF0ZSBQcm94eVRyYW5zY29kZXJTV0YoaW50IGlkKSB7Ci0JCXRoaXMuc3dmVHJhbnNjb2RlciA9IHN3ZlRyYW5zY29kZXJGYWN0b3J5Lm5ld0luc3RhbmNlKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFByb3h5VHJhbnNjb2RlclNXRiBuZXdJbnN0YW5jZShpbnQgaWQpIHsKLQkJaWYgKHN3ZlRyYW5zY29kZXJGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBQcm94eVRyYW5zY29kZXJTV0YoaWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBpbXBvc2VkU1dGOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNXRlRyYW5zY29kaW5nSW1wb3NlZEZpbGUoSW5wdXRTdHJlYW0gaXMpIHsKLQkJaWYgKHN3ZlRyYW5zY29kZXJGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTd2ZUcmFuc2NvZGVyIHN0ID0gc3dmVHJhbnNjb2RlckZhY3RvcnkubmV3SW5zdGFuY2UoMCk7Ci0JCXRyeSB7Ci0JCQlpbXBvc2VkU1dGID0gc3QucGFyc2UoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRUZW1wb3JhcnlEZXN0U1dGKEZpbGUgc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGUoc3JjLmdldEFic29sdXRlUGF0aCgpICsgIi5vdXQiKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0VGVtcG9yYXJ5U3JjU1dGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGUuY3JlYXRlVGVtcEZpbGUoIlNXRlRDLSIsICIuc3dmIik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVHJhbnNjb2RlVGFyZ2V0KGludCBpZCwgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotCQkJSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZSByZXNwb25zZSkgewotCQlpZiAocmVxdWVzdC5nZXRIZWFkZXIoU1dGVXRpbC5YX0ZMQVNIX1ZFUlNJT05fQSkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFTV0ZVdGlsLmlzUG9zc2libHlTV0ZDb250ZW50VHlwZShyZXNwb25zZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVB1c2hiYWNrTWVzc2FnZUJvZHkgYm9keSA9IHJlc3BvbnNlLmdldFB1c2hiYWNrTWVzc2FnZUJvZHkoKTsKLQkJaWYgKGJvZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJUHVzaGJhY2tJbnB1dFN0cmVhbSBib2R5SW5wdXRTdHJlYW0gPSBib2R5Ci0JCQkJLmdldE1lc3NhZ2VCb2R5UHVzaEJhY2tJbnB1dFN0cmVhbSgpOwotCQlpbnQgdmVyc2lvbiA9IFNXRlV0aWwuaXNTV0YoYm9keUlucHV0U3RyZWFtKTsKLQkJLy8KLQkJaWYgKHZlcnNpb24gPj0gV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbigpKSB7Ci0JCQlMT0dHRVIuaW5mbygiW2lkOiIgKyBpZCArICJdIFNXVFRyYW5zY29kZXI6IFNXRiB0byBiZSB0cmFuc2NvZGVkICgiCi0JCQkJCSsgcmVxdWVzdC5nZXRPcmlnaW5hbFJlcXVlc3RVUklTdHJpbmcoKSArICIpLSBWZXJzaW9uOiIKLQkJCQkJKyB2ZXJzaW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCUxPR0dFUi5pbmZvKCJbaWQ6IiArIGlkCi0JCQkJCQkrICJdIFNXVFRyYW5zY29kZXI6IFNXRiBub3QgdG8gYmUgdHJhbnNjb2RlZCAoIgotCQkJCQkJKyByZXF1ZXN0LmdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpICsgIiktIFZlcnNpb246IgotCQkJCQkJKyB2ZXJzaW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRGYWlsdXJlTG9nKFN0cmluZ0J1ZmZlciBidWYsIElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwKLQkJCUZpbGUgb3V0RmlsZSwgVGhyb3dhYmxlIGUpIHsKLQkJYnVmLmFwcGVuZCgiKCIpOwotCQlidWYuYXBwZW5kKHJlcXVlc3QuZ2V0T3JpZ2luYWxSZXF1ZXN0VVJJU3RyaW5nKCkpOwotCQlidWYuYXBwZW5kKCIpXG4iKTsKLQkJYnVmLmFwcGVuZChUaHJvd2FibGVVdGlsLnN0YWNrVHJhY2VUb1N0cmluZyhlKSk7Ci0JCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSAmJiAob3V0RmlsZSAhPSBudWxsKSkgewotCQkJYnVmLmFwcGVuZCgiVGhlIFNXRiBmaWxlIGlzIHNlY3VyZWQgaW4gIik7Ci0JCQlidWYuYXBwZW5kKG91dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJfQotCQlMT0dHRVIuZmF0YWwoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgRmlsZSBzYXZlU1dGRmlsZShGaWxlIGYsIGJ5dGVbXSB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCQl0cnkgewotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCW9zLndyaXRlKHRhcmdldCk7Ci0JCQlyZXR1cm4gZjsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvcyAhPSBudWxsKSB7Ci0JCQkJb3MuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSB0cmFuc2NvZGUoaW50IGlkLCBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QsCi0JCQlJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgewotCQlpZiAoIVdhWGNvZGluZ0NvbmZpZy5nZXRJbnN0YW5jZSgpLmdldFNXRlRyYW5zY29kaW5nRmxhZygpKQotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQlpZiAoaW1wb3NlZFNXRiA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQlJSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIG5ld1Jlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlKAotCQkJCXJlc3BvbnNlLCBTV0ZVdGlsLkZMQVNIX01BR0lDX05VTUJFUl9TSVpFKTsKLQotCQlpZiAoIWlzVHJhbnNjb2RlVGFyZ2V0KGlkLCByZXF1ZXN0LCBuZXdSZXNwb25zZSkpCi0JCQlyZXR1cm4gbmV3UmVzcG9uc2U7Ci0KLQkJYnl0ZVtdIHRyYW5zY29kZWQ7Ci0JCUZpbGUgc3JjU1dGRmlsZSA9IG51bGw7Ci0JCUZpbGUgZGVzdFNXRkZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJc3JjU1dGRmlsZSA9IGdldFRlbXBvcmFyeVNyY1NXRigpOwotCQkJYnl0ZVtdIHRhcmdldEJ5dGVzOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXRCeXRlcyA9IG5ld1Jlc3BvbnNlLnJlYWRCb2R5KDAsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCUxPR0dFUi5mYXRhbCgiW2lkOiIgKyBpZAotCQkJCQkJKyAiXSBNZXNzYWdlIGJvZHkgY2Fubm90IGJlIHJlYWQgYnkgdGltZW91dC4iKTsKLQkJCQkvLyBUaGlzIHNob3VsZCBiZSBpbnRlZ3JhdGVkIHdpdGggc2VuZEdhdGV3YXlUaW1lb3V0Li4uCi0JCQkJcmV0dXJuIEhUVFBVdGlsLmNyZWF0ZUhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0LmdldFNlcmlhbCgpLAotCQkJCQkJSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLCAiNTA0Ii5nZXRCeXRlcygpLAotCQkJCQkJIkdhdGV3YXkgVGltZW91dCIuZ2V0Qnl0ZXMoKSwKLQkJCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlLkVNUFRZX0JPRFkpOwotCQkJfQotCQkJaWYgKHRhcmdldEJ5dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIHJlc3BvbnNlOwotCi0JCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlzYXZlU1dGRmlsZShzcmNTV0ZGaWxlLCB0YXJnZXRCeXRlcyk7Ci0JCQl9Ci0JCQlPYmplY3Qgc3JjU3dmID0gc3dmVHJhbnNjb2Rlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJCXRhcmdldEJ5dGVzKSk7Ci0JCQlPYmplY3QgZGVzdFN3ZiA9IHN3ZlRyYW5zY29kZXIuaW1wb3NlKGltcG9zZWRTV0YsIHNyY1N3Zik7Ci0JCQl0cmFuc2NvZGVkID0gc3dmVHJhbnNjb2Rlci5nZW5lcmF0ZShkZXN0U3dmLCBmYWxzZSwgOCk7Ci0KLQkJCWRlc3RTV0ZGaWxlID0gZ2V0VGVtcG9yYXJ5RGVzdFNXRihzcmNTV0ZGaWxlKTsKLQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCXNhdmVTV0ZGaWxlKGRlc3RTV0ZGaWxlLCB0cmFuc2NvZGVkKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiByZXNwb25zZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJTV0YgdHJhbnNjb2RpbmcgZmFpbGVkICIpOwotCQkJb3V0cHV0RmFpbHVyZUxvZyhidWYsIHJlcXVlc3QsIHNyY1NXRkZpbGUsIGUpOwotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQl9Ci0KLQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgbXNnID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJCXJlc3BvbnNlLCB0cmFuc2NvZGVkKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1Byb3h5VHJhbnNjb2RlclNXRkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg3YmE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5wcm94eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eVRyYW5zY29kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5VHJhbnNjb2RlclNXRkZhY3RvcnkgaW1wbGVtZW50cyBJSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkgewotCi0JcHVibGljIFByb3h5VHJhbnNjb2RlclNXRkZhY3RvcnkoKSB7Ci0JfQotCQotCXB1YmxpYyBJSFRUUFByb3h5VHJhbnNjb2RlciBuZXdJbnN0YW5jZShpbnQgaWQpIHsKLQkJcmV0dXJuIFByb3h5VHJhbnNjb2RlclNXRi5uZXdJbnN0YW5jZShpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1NXRkJvb3Rsb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvU1dGQm9vdGxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjdmMjdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvU1dGQm9vdGxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UuaW1wbC5XYVhjb2RpbmdDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSVB1c2hiYWNrTWVzc2FnZUJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JQ2xpZW50U3RhdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5DYWNoZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuSFRUUFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuUGFyc2VVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTV0ZCb290bG9hZGVyIGltcGxlbWVudHMgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTV0ZCb290bG9hZGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBib290TG9hZGVyU1dGOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VkRmxhZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gYm9vdGxvYWRlclJlcXVlc3RpbmdGbGFnOwotCi0gICAgcHJpdmF0ZSBJSFRUUFJlcXVlc3RNZXNzYWdlIHNlc3Npb25SZXF1ZXN0OwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFNlc3Npb25PdmVycmlkZXIjZ2V0U2Vzc2lvblJlcXVlc3QoKQotCSAqLwotICAgIHB1YmxpYyBJSFRUUFJlcXVlc3RNZXNzYWdlIGdldFNlc3Npb25SZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvblJlcXVlc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSBzZXNzaW9uUmVzcG9uc2U7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlciNnZXRTZXNzaW9uUmVzcG9uc2UoKQotCSAqLwotICAgIHB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSBnZXRTZXNzaW9uUmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uUmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7Ci0KLSAgICBwdWJsaWMgU1dGQm9vdGxvYWRlcihpbnQgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTV0ZCb290TG9hZGVyRmlsZShJbnB1dFN0cmVhbSBpcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaW50IGI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGIgPSBpcy5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib290TG9hZGVyU1dGID0gb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWNoZWRTbG90IHsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyB1cmk7Ci0gICAgICAgIHB1YmxpYyBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3Q7Ci0gICAgICAgIHB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZTsKLSAgICAgICAgQ2FjaGVkU2xvdChTdHJpbmcgdXJpKSB7Ci0gICAgICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ2FjaGVkU2xvdCBzZXNzaW9uQ2FjaGVkU2xvdDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVGRVJFUl9MRU5HVEggPSAxMjg7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRDYWNoZWRPYmplY3QoSUNsaWVudFN0YXRlTWFuYWdlciBjc20sIFN0cmluZyB1cmkpIHsKLSAgICAgICAgQ2FjaGVNYXAgbWFwID0gKENhY2hlTWFwKSBjc20uZ2V0KFNXRkJvb3Rsb2FkZXIuY2xhc3MpOwotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBDYWNoZU1hcCgxMjgsIDIwKTsKLSAgICAgICAgICAgIGNzbS5wdXQoU1dGQm9vdGxvYWRlci5jbGFzcywgbWFwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXJpLmxlbmd0aCgpID4gTUFYX1JFRkVSRVJfTEVOR1RIKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtYXAubWF0Y2hTdGFydHNXaXRoKHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtYXAuZ2V0KHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FjaGVPYmplY3QoSUNsaWVudFN0YXRlTWFuYWdlciBjc20sIFN0cmluZyB1cmksIE9iamVjdCBjb2JqKSB7Ci0gICAgICAgIE1hcCBtYXAgPSAoTWFwKSBjc20uZ2V0KFNXRkJvb3Rsb2FkZXIuY2xhc3MpOwotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBjc20ucHV0KFNXRkJvb3Rsb2FkZXIuY2xhc3MsIG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtYXApIHsKLSAgICAgICAgICAgIG1hcC5wdXQodXJpLCBjb2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElIVFRQUmVzcG9uc2VNZXNzYWdlIGJvb3Rsb2FkZXJSZXNwb25zZU1lc3NhZ2UoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KSB7Ci0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIG1zZyA9IEhUVFBVdGlsLmNyZWF0ZUhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0LmdldFNlcmlhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMCIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPSyIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RMb2FkZXJTV0YpOwotICAgICAgICBtc2cuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNBQ0hFX0NPTlRST0xfQSwgIm11c3QtcmV2YWxpZGF0ZSIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG1zZy5zZXRIZWFkZXIoSUhUVFBIZWFkZXIuQ09OVEVOVF9UWVBFX0EsIFNXRlV0aWwuTUlNRV9UWVBFX0FQUExJQ0FUSU9OX1hfU0hPQ0tXQVZFX0ZMQVNIX0EpOwotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyI3JlcGxhY2VSZXF1ZXN0KG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuQ2xpZW50U3RhdGVNYW5hZ2VyLCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSFRUUFJlcXVlc3RNZXNzYWdlKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2VSZXF1ZXN0KElDbGllbnRTdGF0ZU1hbmFnZXIgY3NtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkKLSAgICAJdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmVwbGFjZWRGbGFnID0gZmFsc2U7Ci0gICAgICAgIGlmICghV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCkuZ2V0U1dGQm9vdGxvYWRlckZsYWcoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAocmVxdWVzdC5nZXRIZWFkZXIoU1dGVXRpbC5YX0ZMQVNIX1ZFUlNJT05fQSkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFN0cmluZyB1cmlTdHIgPSByZXF1ZXN0LmdldFJlcXVlc3RVUklTdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0TWV0aG9kQXNTdHJpbmcoKTsKLSAgICAgICAgT2JqZWN0IGNvYmogPSBnZXRDYWNoZWRPYmplY3QoY3NtLCB1cmlTdHIpOwotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJtZXRob2Q6Iik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG1ldGhvZCk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHVyaVN0cik7Ci0gICAgICAgICAgICBMaXN0IGwgPSByZXF1ZXN0LmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyIGggPSAoSUhUVFBIZWFkZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWguaXNSZW1vdmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChoLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFQlVHKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChJSFRUUEhlYWRlci5NRVRIT0RfUE9TVC5lcXVhbHMobWV0aG9kKSkgewotICAgICAgICAgICAgaWYgKGNvYmogaW5zdGFuY2VvZiBDYWNoZWRTbG90KSB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9iID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qud3JpdGUoMCwgb2IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoIkJvb3Rsb2FkZXIncyBQT1NUIGNvbW1hbmQ6IiArIG5ldyBTdHJpbmcob2IudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJTkZPKCJib290bG9hZGVyIHJlcXVlc3RzIHRoZSBvcmlnaW5hbCBTV0Y6IiArIHVyaVN0cik7Ci0gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlZEZsYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuYm9vdGxvYWRlclJlcXVlc3RpbmdGbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25DYWNoZWRTbG90ID0gKENhY2hlZFNsb3QpIGNvYmo7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uUmVxdWVzdCA9IHNlc3Npb25DYWNoZWRTbG90LnJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uUmVxdWVzdC5yZW1vdmVIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25SZXNwb25zZSA9IHNlc3Npb25DYWNoZWRTbG90LnJlc3BvbnNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSUhUVFBIZWFkZXIgcmVmZXJlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKElIVFRQSGVhZGVyLlJFRkVSRVJfQSk7Ci0gICAgICAgIGlmIChyZWZlcmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByZWZTdHJCYXNlOwotICAgICAgICAgICAgU3RyaW5nIHVyaVN0ckJhc2U7Ci0KLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIHJlZlN0ckJhc2UgPSBQYXJzZVVSSS5lbGltaW5hdGVRdWVyeShuZXcgU3RyaW5nKHJlZmVyZXIuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICB1cmlTdHJCYXNlID0gUGFyc2VVUkkuZWxpbWluYXRlUXVlcnkodXJpU3RyKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlI6ICIgKyByZWZTdHJCYXNlKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlU6ICIgKyB1cmlTdHJCYXNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVmU3RyQmFzZSA9IG5ldyBTdHJpbmcocmVmZXJlci5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgdXJpU3RyQmFzZSA9IHVyaVN0cjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXRDYWNoZWRPYmplY3QoY3NtLCByZWZTdHJCYXNlKTsKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJTkZPKHVyaVN0ckJhc2UgKyAiIHNlZW1zIHRvIGJlIHJlZmVycmVkIGJ5ICIgKyByZWZTdHJCYXNlKTsKLSAgICAgICAgICAgICAgICBpZiAoY29iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlT2JqZWN0KGNzbSwgdXJpU3RyQmFzZSwgQm9vbGVhbi52YWx1ZU9mKHRydWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VuZCBib290bG9hZGVyIHN3ZgotCi0gICAgICAgIENhY2hlZFNsb3QgY3M7Ci0gICAgICAgIGlmIChjb2JqIGluc3RhbmNlb2YgQ2FjaGVkU2xvdCl7Ci0gICAgICAgICAgICBjcyA9IChDYWNoZWRTbG90KSBjb2JqOyAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNzID0gbmV3IENhY2hlZFNsb3QodXJpU3RyKTsKLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIGNhY2hlT2JqZWN0KGNzbSwgUGFyc2VVUkkuZWxpbWluYXRlUXVlcnkodXJpU3RyKSwgY3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYWNoZU9iamVjdChjc20sIHVyaVN0ciwgY3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICAvKgotICAgICAgICBJTkZPKCJib290bG9hZGVyIGlzIHVzZWQgZm9yICIgKyB1cmlTdHIpOwotICAgICAgICBIVFRQUmVzcG9uc2VNZXNzYWdlIG1zZyA9IGJvb3Rsb2FkZXJSZXNwb25zZU1lc3NhZ2UocmVxdWVzdCk7Ci0gICAgICAgIHRoaXMuc2Vzc2lvblJlc3BvbnNlID0gbXNnOwotICAgICAgICAqLwotICAgICAgICB0aGlzLnJlcGxhY2VkRmxhZyA9IHRydWU7Ci0gICAgICAgIHRoaXMuYm9vdGxvYWRlclJlcXVlc3RpbmdGbGFnID0gZmFsc2U7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbkNhY2hlZFNsb3QgPSBjczsKLSAgICAgICAgdGhpcy5zZXNzaW9uUmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIHRoaXMuc2Vzc2lvblJlcXVlc3QucmVtb3ZlSGVhZGVyKElIVFRQSGVhZGVyLklGX01PRElGSUVEX1NJTkNFX0EpOwotICAgICAgICB0aGlzLnNlc3Npb25SZXF1ZXN0LnJlbW92ZUhlYWRlcihJSFRUUEhlYWRlci5BQ0NFUFRfRU5DT0RJTkdfQSk7Ci0gICAgICAgIHRoaXMuc2Vzc2lvblJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFNlc3Npb25PdmVycmlkZXIjcmVwbGFjZVJlc3BvbnNlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuQ2xpZW50U3RhdGVNYW5hZ2VyLCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSFRUUFJlcXVlc3RNZXNzYWdlLCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSFRUUFJlc3BvbnNlTWVzc2FnZSwgaW50KQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2VSZXNwb25zZShJQ2xpZW50U3RhdGVNYW5hZ2VyIGNzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcmVwbGFjZWRGbGFnKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGJvb3Rsb2FkZXJSZXF1ZXN0aW5nRmxhZykgewotICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IHNlc3Npb25DYWNoZWRTbG90LnJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNBQ0hFX0NPTlRST0xfQSwgIm5vLWNhY2hlIi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuc2Vzc2lvblJlc3BvbnNlID0gcmVzcG9uc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghU1dGVXRpbC5pc1Bvc3NpYmx5U1dGQ29udGVudFR5cGUocmVzcG9uc2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBJSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIG5ld1Jlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlKHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0ZVdGlsLkZMQVNIX01BR0lDX05VTUJFUl9TSVpFKTsKLQotICAgICAgICAgICAgSVB1c2hiYWNrTWVzc2FnZUJvZHkgYm9keSA9IG5ld1Jlc3BvbnNlLmdldFB1c2hiYWNrTWVzc2FnZUJvZHkoKTsKLSAgICAgICAgICAgIGlmIChib2R5ID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIFB1c2hiYWNrSW5wdXRTdHJlYW0gYm9keUlucHV0U3RyZWFtID0gYm9keS5nZXRNZXNzYWdlQm9keVB1c2hCYWNrSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGludCB2ZXJzaW9uID0gU1dGVXRpbC5pc1NXRihib2R5SW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgSU5GTygiVGhlIGluY29taW5nIFNXRiBpcyB2ZXJzaW9uICIgKyB2ZXJzaW9uKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmlTdHIgPSByZXF1ZXN0LmdldFJlcXVlc3RVUklTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmICgodmVyc2lvbiA+PSBXYVhjb2RpbmdDb25maWcuZ2V0SW5zdGFuY2UoKS5nZXRTV0ZUcmFuc2NvZGluZ01pbmltdW1WZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgLy8gRmxhc2ggVmVyc2lvbiA5IG9yIGxhdGVyIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotICAgICAgICAgICAgICAgICYmICh2ZXJzaW9uIDwgOSkpIHsKLSAgICAgICAgICAgICAgICBJTkZPKCJib290bG9hZGVyIGlzIHVzZWQgZm9yICIgKyB1cmlTdHIpOwotICAgICAgICAgICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIG1zZyA9IGJvb3Rsb2FkZXJSZXNwb25zZU1lc3NhZ2UocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uUmVzcG9uc2UgPSBtc2c7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIG5ld1Jlc3BvbnNlLndyaXRlQm9keSh0aW1lb3V0LCBib2R5LCBvcyk7Ci0gICAgICAgICAgICAgICAgSUhUVFBSZXNwb25zZU1lc3NhZ2UgY2FjaGVkUmVzcG9uc2UgPSBIVFRQVXRpbC5jcmVhdGVIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgY2FjaGVkUmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNBQ0hFX0NPTlRST0xfQSwgIm5vLWNhY2hlLG11c3QtcmV2YWxpZGF0ZSIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgY2FjaGVkUmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLlBSQUdNQV9BLCAibm8tY2FjaGUiLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIGNhY2hlZFJlc3BvbnNlLnNldEhlYWRlcihJSFRUUEhlYWRlci5FWFBJUkVTX0EsICItMSIuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgICAgICAgICBJTkZPKCJUaGUgb3JpZ2luYWwgcmVzcG9uc2UgaXMgY2FjaGVkIGZvciBsYXRlciB1c2UuIik7Ci0gICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJDYWNoZWRNZXNzYWdlOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBsID0gY2FjaGVkUmVzcG9uc2UuZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGwuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBIZWFkZXIgaCA9IChJSFRUUEhlYWRlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoLmlzUmVtb3ZlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChoLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgREVCVUcoYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uQ2FjaGVkU2xvdC5yZXNwb25zZSA9IGNhY2hlZFJlc3BvbnNlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJTkZPKCJEdWUgdG8gdGhlIHVuc3VwcG9ydGVkIHZlcnNpb24sIHRoZSBib290bG9hZGVyIGlzIG5vdCBhcHBsaWVkIHRvICIgKyB1cmlTdHIpOwotICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvblJlc3BvbnNlID0gbmV3UmVzcG9uc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiW2lkOiIpLmFwcGVuZChpZCkuYXBwZW5kKCJdIFNXRkJvb3Rsb2FkZXIiKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIElORk8oU3RyaW5nIG1zZykgewotLy8gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vICAgICAgICBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0vLyAgICAgICAgTE9HR0VSLmluZm8oc2IudG9TdHJpbmcoKSk7Ci0gICAgCUxPR0dFUi5pbmZvKG1zZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIERFQlVHKFN0cmluZyBtc2cpIHsKLS8vICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLyAgICAgICAgc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotLy8gICAgICAgIExPR0dFUi5kZWJ1ZyhzYi50b1N0cmluZygpKTsKLSAgICAJTE9HR0VSLmRlYnVnKG1zZyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1NXRkJvb3Rsb2FkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1NXRkJvb3Rsb2FkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2M2NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9wcm94eS9TV0ZCb290bG9hZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5wcm94eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNXRkJvb3Rsb2FkZXJGYWN0b3J5IGltcGxlbWVudHMgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgU1dGQm9vdGxvYWRlckZhY3RvcnkoKSB7Ci0JfQotCQotCXB1YmxpYyBJSFRUUFNlc3Npb25PdmVycmlkZXIgbmV3SW5zdGFuY2UoaW50IGlkKSB7Ci0JCXJldHVybiBuZXcgU1dGQm9vdGxvYWRlcihpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1NXRlNlY3JldE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvU1dGU2VjcmV0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE4MWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvU1dGU2VjcmV0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5wcm94eTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5DYWNoZU1hcDsKLQotCi1wdWJsaWMgY2xhc3MgU1dGU2VjcmV0TWFuYWdlciBpbXBsZW1lbnRzIElTZWNyZXRNYW5hZ2VyIHsKLSAgICBwcml2YXRlIE1hcCBzZWNyZXRzID0gbmV3IENhY2hlTWFwKDI1NiwgMjApOwotICAgIHByaXZhdGUgU2VjdXJlUmFuZG9tIHJhbmRvbTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VDUkVUX0xFTkdUSCA9IDIwOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JU2VjcmV0TWFuYWdlciNnZXRTZWNyZXQoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRTZWNyZXQoU3RyaW5nIGlkLCBib29sZWFuIHJlbW92ZSkgewotICAgICAgICBTdHJpbmcgc2VjcmV0ID0gKFN0cmluZykgc2VjcmV0cy5nZXQoaWQpOwotICAgICAgICBpZiAocmVtb3ZlICYmIChzZWNyZXQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHNlY3JldHMucmVtb3ZlKGlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VjcmV0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSVNlY3JldE1hbmFnZXIjcmVxdWVzdFNlY3JldCgpCi0JICovCi0gICAgcHVibGljIGJ5dGVbXSByZXF1ZXN0U2VjcmV0KCkgewotICAgICAgICBieXRlW10gc2VjcmV0Qnl0ZXMgPSBuZXcgYnl0ZVtTRUNSRVRfTEVOR1RIICogMl07Ci0gICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoc2VjcmV0Qnl0ZXMpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiY29udGVudGlkPSIpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmMiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTRUNSRVRfTEVOR1RIOyBpKyspIHsKLSAgICAgICAgICAgIGJ5dGUgYiA9IHNlY3JldEJ5dGVzW2ldOwotICAgICAgICAgICAgYnVmMi5hcHBlbmQoYiAlIDEwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGlkID0gYnVmMi50b1N0cmluZygpOwotICAgICAgICBidWYuYXBwZW5kKGJ1ZjIpOwotICAgICAgICBidWYyLnNldExlbmd0aCgwKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiJnNlY3JldD0iKTsKLSAgICAgICAgZm9yICg7IGkgPCBTRUNSRVRfTEVOR1RIICogMjsgaSsrKSB7Ci0gICAgICAgICAgICBieXRlIGIgPSBzZWNyZXRCeXRlc1tpXTsKLSAgICAgICAgICAgIGJ1ZjIuYXBwZW5kKGIgJSAxMDApOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQoYnVmMik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiZlbmQ9dGVybSIpOwotICAgICAgICBidWYuYXBwZW5kKCdccicpOwotICAgICAgICBidWYuYXBwZW5kKCdcbicpOwotICAgICAgICBTdHJpbmcgc2VjcmV0ID0gYnVmMi50b1N0cmluZygpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHNlY3JldHMucHV0KGlkLCBzZWNyZXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKS5nZXRCeXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTV0ZTZWNyZXRNYW5hZ2VyKCkgewotICAgICAgICB0aGlzLnJhbmRvbSA9IG5ldyBTZWN1cmVSYW5kb20oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYnJpZGdlL3Byb3h5L1NXRlV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvU1dGVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzY3YjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvcHJveHkvU1dGVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLQotCi0KLQotcHVibGljIGNsYXNzIFNXRlV0aWwgewotICAgIC8vIHByaXZhdGUgZmluYWwgYnl0ZVtdIENUX1NIT0NLV0FWRV9GTEFTSCA9Ci0gICAgLy8gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIi5nZXRCeXRlcygpOwotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGVbXSBDVF9JTUFHRSA9ICJpbWFnZSIuZ2V0Qnl0ZXMoKTsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlW10gQ1RfVklERU8gPSAidmlkZW8iLmdldEJ5dGVzKCk7Ci0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIGJ5dGVbXSBYX0ZMQVNIX1ZFUlNJT05fQSA9ICJ4LWZsYXNoLXZlcnNpb24iLmdldEJ5dGVzKCk7Ci0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBieXRlW10gTUlNRV9UWVBFX0FQUExJQ0FUSU9OX1hfU0hPQ0tXQVZFX0ZMQVNIX0EgPSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giLmdldEJ5dGVzKCk7Ci0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBieXRlW10gTUlNRV9UWVBFX0FQUExJQ0FUSU9OX1hfV1dXX0ZPUk1fVVJMRU5DT0RFRF9BID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIuZ2V0Qnl0ZXMoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSURHRV9JTklUX1NXRl9GSUxFTkFNRSA9ICJFY2xpcHNlLUFDVEYtU1dGLUluaXRpYWxpemUtQnJpZGdlLVBhY2thZ2UtMTA4MjAxNzMwOTEzMDE4NzQ3Mi5zd2YiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURWQVJTX1BST1BFUlRZX0ZJTEVOQU1FID0gIkVjbGlwc2UtQUNURi1TV0YtTG9hZFZhcnMtMTA4MjAxNzMwOTEzMDE4NzQ3Mi50eHQiOwotCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRkxBU0hfTUFHSUNfTlVNQkVSX1NJWkUgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGVudFR5cGVFcXVhbChieXRlW10gY3QsIGJ5dGVbXSB0eXBlKSB7Ci0gICAgICAgIGlmIChjdC5sZW5ndGggPCB0eXBlLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0eXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY3RbaV0gIT0gdHlwZVtpXSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChjdFtpXSA9PSAnLycpIHx8IChjdC5sZW5ndGggPT0gdHlwZS5sZW5ndGgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3NzaWJseVNXRkNvbnRlbnRUeXBlKElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlKSB7Ci0gICAgICAgIElIVFRQSGVhZGVyIGNvbnRlbnRUeXBlSCA9IHJlc3BvbnNlLmdldEhlYWRlcihJSFRUUEhlYWRlci5DT05URU5UX1RZUEVfQSk7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZUggIT0gbnVsbCkgewotICAgICAgICAgICAgYnl0ZVtdIGN0ID0gY29udGVudFR5cGVILmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoaXNDb250ZW50VHlwZUVxdWFsKGN0LCBDVF9JTUFHRSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChpc0NvbnRlbnRUeXBlRXF1YWwoY3QsIENUX1ZJREVPKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgaW50IGlzU1dGKFB1c2hiYWNrSW5wdXRTdHJlYW0gcGJpcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIG1hZ2ljTnVtYmVyID0gbmV3IGJ5dGVbRkxBU0hfTUFHSUNfTlVNQkVSX1NJWkVdOwotICAgICAgICAgICAgaW50IHJldHVyblZhbHVlID0gLTE7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHBiaXMucmVhZChtYWdpY051bWJlcik7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8IEZMQVNIX01BR0lDX05VTUJFUl9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgcGJpcy51bnJlYWQobWFnaWNOdW1iZXIsIDAsIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKG1hZ2ljTnVtYmVyWzBdID09ICdDJykgfHwgKG1hZ2ljTnVtYmVyWzBdID09ICdGJykpCi0gICAgICAgICAgICAgICAgJiYgKG1hZ2ljTnVtYmVyWzFdID09ICdXJykKLSAgICAgICAgICAgICAgICAmJiAobWFnaWNOdW1iZXJbMl0gPT0gJ1MnKSkgewotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWFnaWNOdW1iZXJbM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYmlzLnVucmVhZChtYWdpY051bWJlcik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9pbnRlcm5hbC9BU0JyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2ludGVybmFsL0FTQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDAwNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2ludGVybmFsL0FTQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guRmxhc2hNb2RlbFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLkZsYXNoUGxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLklXYVhjb2Rpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC51dGlsLkFTRGVzZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudXRpbC5BU1NlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0KLXB1YmxpYyBjbGFzcyBBU0JyaWRnZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVExFVkVMX1BBVEggPSAiX2xldmVsMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklER0VMRVZFTF9QQVRIID0gIl9sZXZlbDUzNTUzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBGbGFzaFBsYXllciBwbGF5ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdEFyZ3NQYXRoOwotICAgIHByaXZhdGUgU3RyaW5nIHJlc3BvbnNlVmFsdWVQYXRoOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudElkOwotICAgIHByaXZhdGUgU3RyaW5nIHNlY3JldDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFTQnJpZGdlIGdldEluc3RhbmNlKEZsYXNoUGxheWVyIHBsYXllcikgewotICAgIAlpZiggInRydWUiLmVxdWFscyhwbGF5ZXIuZ2V0VmFyaWFibGUoUk9PVExFVkVMX1BBVEgrIi5FY2xpcHNlX0FDVEZfaXNfYXZhaWxhYmxlIikpICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAJCXJldHVybiBuZXcgQVNCcmlkZ2UocGxheWVyLFJPT1RMRVZFTF9QQVRIKTsKLSAgICAJfQotICAgIAllbHNlIGlmKCAidHJ1ZSIuZXF1YWxzKHBsYXllci5nZXRWYXJpYWJsZShCUklER0VMRVZFTF9QQVRIKyIuRWNsaXBzZV9BQ1RGX2lzX2F2YWlsYWJsZSIpKSApIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCQlyZXR1cm4gbmV3IEFTQnJpZGdlKHBsYXllcixCUklER0VMRVZFTF9QQVRIKTsKLQkJfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFTQnJpZGdlKEZsYXNoUGxheWVyIHBsYXllciwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0gICAgCXRoaXMucGxheWVyID0gcGxheWVyOwotICAgICAgICB0aGlzLnJlcXVlc3RBcmdzUGF0aCA9IHJvb3RQYXRoICsgIi5FY2xpcHNlX0FDVEZfcmVxdWVzdF9hcmdzIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0aGlzLnJlc3BvbnNlVmFsdWVQYXRoID0gcm9vdFBhdGggKyAiLkVjbGlwc2VfQUNURl9yZXNwb25zZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5jb250ZW50SWQgPSByb290UGF0aCArICIuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIGludCBjb3VudGVyID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZWNyZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluaXRTZWNyZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VjcmV0ID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGxheWVyLnNldFZhcmlhYmxlKHJlc3BvbnNlVmFsdWVQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN0cmluZyBhcmdzU3RyID0gQVNTZXJpYWxpemVyLnNlcmlhbGl6ZShzZWNyZXQsYXJncyk7Ci0gICAgICAgICAgICBwbGF5ZXIuc2V0VmFyaWFibGUocmVxdWVzdEFyZ3NQYXRoLCBhcmdzU3RyKTsKLSAgICAgICAgICAgIHdoaWxlICgrK2NvdW50ZXIgPCAxMDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwbGF5ZXIuZ2V0VmFyaWFibGUocmVzcG9uc2VWYWx1ZVBhdGgpOwotICAgICAgICAgICAgICAgIGlmKCBudWxsPT12YWx1ZSApIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQVNEZXNlcmlhbGl6ZXIgYXNkID0gbmV3IEFTRGVzZXJpYWxpemVyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzZC5kZXNlcmlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5yZWFkQW5kRGlzcGF0Y2goKTsvL1lpZWxkLm9uY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAJaWYoIDEgIT0gY291bnRlciApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IGNvdW50ZXI9Iitjb3VudGVyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFyZ3NbIitpKyJdPSIrYXJnc1tpXSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRTZWNyZXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBwbGF5ZXIuZ2V0VmFyaWFibGUoY29udGVudElkKTsKLSAgICAgICAgICAgIGlmIChpZC5sZW5ndGgoKSA9PSAwKSByZXR1cm47Ci0gICAgICAgICAgICBJV2FYY29kaW5nIHdheGNvZGluZyA9IEZsYXNoTW9kZWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElXYVhjb2RpbmcoKTsKLSAgICAgICAgICAgIHRoaXMuc2VjcmV0ID0gd2F4Y29kaW5nLmdldFNlY3JldChpZCxmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzNjQ4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAibWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdHJhbnNjb2Rlci9JU3dmVHJhbnNjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3RyYW5zY29kZXIvSVN3ZlRyYW5zY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5NGIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdHJhbnNjb2Rlci9JU3dmVHJhbnNjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC50cmFuc2NvZGVyOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN3ZlRyYW5zY29kZXIgewotICAgIE9iamVjdCBwYXJzZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICBPYmplY3QgaW1wb3NlKE9iamVjdCBpbXBvc2VkLCBPYmplY3Qgc3JjKTsKLSAgICBieXRlW10gZ2VuZXJhdGUoT2JqZWN0IHN3ZiwgYm9vbGVhbiBjb21wcmVzcywgaW50IHZlcnNpb24pIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdHJhbnNjb2Rlci9JU3dmVHJhbnNjb2RlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC90cmFuc2NvZGVyL0lTd2ZUcmFuc2NvZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRjYTIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC90cmFuc2NvZGVyL0lTd2ZUcmFuc2NvZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC50cmFuc2NvZGVyOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJU3dmVHJhbnNjb2RlckZhY3RvcnkgewotICAgIElTd2ZUcmFuc2NvZGVyIG5ld0luc3RhbmNlKGludCBpZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdXRpbC9BU0Rlc2VyaWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3V0aWwvQVNEZXNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwM2E5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdXRpbC9BU0Rlc2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLXB1YmxpYyBjbGFzcyBBU0Rlc2VyaWFsaXplciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB0b2tlbkRpYyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBVTkRFRklORUQgPSAidW5kZWZpbmVkIi5pbnRlcm4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTCA9ICJudWxsIi5pbnRlcm4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRva2VuRGljLnB1dCgidHJ1ZSIsIEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0gICAgICAgIHRva2VuRGljLnB1dCgiZmFsc2UiLCBCb29sZWFuLnZhbHVlT2YoZmFsc2UpKTsKLSAgICAgICAgdG9rZW5EaWMucHV0KCJ1bmRlZmluZWQiLCBVTkRFRklORUQpOwotICAgICAgICB0b2tlbkRpYy5wdXQoIm51bGwiLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBpZHg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyOwotCi0gICAgcHJpdmF0ZSBpbnQgc2tpcFNQKCkgewotICAgICAgICB3aGlsZSAoaWR4IDwgc3RyLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpZHgpOwotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBpZHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRUb2tlbkVuZElkeCgpIHsKLSAgICAgICAgaW50IGlkeDIgPSBpZHg7Ci0gICAgICAgIHdoaWxlIChpZHgyIDwgc3RyLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpZHgyKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgIGNhc2UgJ30nOgotICAgICAgICAgICAgY2FzZSAnXSc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkeDI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlkeDIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWR4MjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZXNlcmlhbGl6ZVN0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWR4Kys7Ci0gICAgICAgIHdoaWxlIChpZHggPCBzdHIubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGlkeCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBzdHIubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWJub3JtYWwgZW5kIG9mIHRoZSBzdHJpbmc6IiArIHN0cik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyLmNoYXJBdChpZHgpKTsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0LmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBTdHJpbmc6IiArIHN0cik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBkZXNlcmlhbGl6ZUFycmF5KCkgewotICAgICAgICBpZHgrKzsKLSAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gcmV0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIHdoaWxlIChpZHggPCBzdHIubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIHNraXBTUCgpOwotICAgICAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0LnRvQXJyYXkobmV3IE9iamVjdFtyZXQuc2l6ZSgpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldC5hZGQoZGVzZXJpYWxpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBza2lwU1AoKTsKLSAgICAgICAgICAgIGNoID0gc3RyLmNoYXJBdChpZHgpOwotICAgICAgICAgICAgaWYgKGNoID09ICddJykgewotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQudG9BcnJheShuZXcgT2JqZWN0W3JldC5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCAhPSAnLCcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nICcsJzoiICsgc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlkeCsrOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFibm9ybWFsIGVuZCBvZiB0aGUgYXJyYXk6IiArIHN0cik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBU09iamVjdCBkZXNlcmlhbGl6ZUFTT2JqZWN0KCkgewotICAgICAgICBpZHgrKzsKLSAgICAgICAgQVNPYmplY3QgcmV0ID0gbmV3IEFTT2JqZWN0KCk7Ci0gICAgICAgIHdoaWxlIChpZHggPCBzdHIubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIHNraXBTUCgpOwotICAgICAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnfScpIHsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcCA9IGRlc2VyaWFsaXplU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgc2tpcFNQKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaWR4KSAhPSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyAnOic6IiArIHN0cik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZGVzZXJpYWxpemUoKTsKLSAgICAgICAgICAgICAgICByZXQucHV0KHByb3AsIG8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2tpcFNQKCk7Ci0gICAgICAgICAgICBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnfScpIHsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQoaWR4KSAhPSAnLCcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nICcsJzoiICsgc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlkeCsrOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFibm9ybWFsIGVuZCBvZiB0aGUgYXJyYXk6IiArIHN0cik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBkZXNlcmlhbGl6ZSgpIHsKLSAgICAgICAgaW50IHIgPSBza2lwU1AoKTsKLSAgICAgICAgaWYgKHIgPCAwKSByZXR1cm4gbnVsbDsKLSAgICAgICAgY2hhciBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICBjYXNlICdbJzoKLSAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUFycmF5KCk7Ci0gICAgICAgIGNhc2UgJ3snOgotICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplQVNPYmplY3QoKTsKLSAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVTdHJpbmcoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGludCBpZHgyID0gZ2V0VG9rZW5FbmRJZHgoKTsKLSAgICAgICAgICAgIFN0cmluZyB0b2sgPSBzdHIuc3Vic3RyaW5nKGlkeCwgaWR4Mik7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IHRva2VuRGljLmdldCh0b2spOwotICAgICAgICAgICAgdGhpcy5pZHggPSBpZHgyOwotICAgICAgICAgICAgaWYgKG8gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IEludGVnZXIucGFyc2VJbnQodG9rKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGQgPSBEb3VibGUucGFyc2VEb3VibGUodG9rKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZShkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHRvayArICIgaXMgbm90IGEgdmFsaWQgdG9rZW4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIEFTRGVzZXJpYWxpemVyKFN0cmluZyBzdHIpIHsKLSAgICAgICAgdGhpcy5pZHggPSAwOwotICAgICAgICB0aGlzLnN0ciA9IHN0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdXRpbC9BU09iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3V0aWwvQVNPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1ODlkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdXRpbC9BU09iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQVNPYmplY3QgewotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXA7Ci0KLQlBU09iamVjdCgpIHsKLQkJdGhpcy5tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQl9Ci0KLQlPYmplY3QgcHV0KFN0cmluZyBwcm9wLCBPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBtYXAucHV0KHByb3AsIG9iaik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIHByb3ApIHsKLQkJcmV0dXJuIG1hcC5nZXQocHJvcCk7Ci0JfQotCi0JcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoKSB7Ci0JCXJldHVybiBtYXAua2V5U2V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcHJvcCA9IGl0Lm5leHQoKTsKLQkJCXJldC5hcHBlbmQocHJvcCk7Ci0JCQlyZXQuYXBwZW5kKCI6Iik7Ci0JCQlyZXQuYXBwZW5kKCIiICsgbWFwLmdldChwcm9wKSk7Ci0JCQlyZXQuYXBwZW5kKCIsIik7Ci0JCX0KLQkJcmV0dXJuIHJldC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC91dGlsL0FTU2VyaWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3V0aWwvQVNTZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjQ0MDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3V0aWwvQVNTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWw7Ci0KLQotcHVibGljIGNsYXNzIEFTU2VyaWFsaXplciB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKChzdHIuaW5kZXhPZignIicpID49IDApIHx8IChzdHIuaW5kZXhPZignXFwnKSA+PSAwKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoJyInKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldC5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiXCIiICsgc3RyICsgIlwiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoT2JqZWN0IGEpIHsKLSAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemUoKFN0cmluZykgYSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgcmV0dXJuIGEudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgcmV0dXJuIGEudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemUoKE9iamVjdFtdKSBhKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGEgKyAiIGNhbm5vdCBiZSBzZXJpYWxpemVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShTdHJpbmcgc2VjcmV0LCBPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKHNlY3JldCk7Ci0gICAgICAgIHJldC5hcHBlbmQoJ1snKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcmV0LmFwcGVuZChzZXJpYWxpemUoYXJnc1swXSkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgIE9iamVjdCBhID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICByZXQuYXBwZW5kKHNlcmlhbGl6ZShhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0LmFwcGVuZCgiXSIpOwotICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhNDE3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjc5NzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIFdlYiBCcm93c2VyIElFIFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC4wLjEKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5Ccm93c2VySUVfUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFjdGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZWRpdG9yLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDgwMDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLQkJCSAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvaWNvbnMvYmxfMjRfMDIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvaWNvbnMvYmxfMjRfMDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk5MmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2ljb25zL2JsXzI0XzAyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzJiOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1icm93c2VyLmllLnRpdGxlPVdlYiBCcm93c2VyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwYjA0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJXZWJCcm93c2VyRXZlbnRMaXN0ZW5lciIgbmFtZT0iV2ViQnJvd3NlckV2ZW50TGlzdGVuZXIiIHNjaGVtYT0ic2NoZW1hL1dlYkJyb3dzZXJFdmVudExpc3RlbmVyLmV4c2QiLz4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZWRpdG9yLldlYkJyb3dzZXJFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZWRpdG9yLldlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJodG1sLCBodG0sIHhodG1sLCBtaHQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ibF8yNF8wMi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmVkaXRvci5XZWJCcm93c2VyRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJWJyb3dzZXIuaWUudGl0bGUiLz4KLSAgICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9wbHVnaW5famEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTMyYjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYnJvd3Nlci5pZS50aXRsZT1XZWIgQnJvd3NlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc2NoZW1hL1dlYkJyb3dzZXJFdmVudExpc3RlbmVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zY2hlbWEvV2ViQnJvd3NlckV2ZW50TGlzdGVuZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzOGU5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zY2hlbWEvV2ViQnJvd3NlckV2ZW50TGlzdGVuZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZSIgaWQ9IldlYkJyb3dzZXJFdmVudExpc3RlbmVyIiBuYW1lPSJXZWJCcm93c2VyRXZlbnRMaXN0ZW5lciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaXN0ZW5lciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvQnJvd3NlcklFX1BsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9Ccm93c2VySUVfUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NWVlZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9Ccm93c2VySUVfUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlcklFX1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllIjsKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBCcm93c2VySUVfUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQnJvd3NlcklFX1BsdWdpbigpIHsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCcm93c2VySUVfUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2VkaXRvci9XZWJCcm93c2VyRWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2VkaXRvci9XZWJCcm93c2VyRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGQ4NzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9lZGl0b3IvV2ViQnJvd3NlckVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLk1vZGVsU2VydmljZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuRHVtbXlFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5JTW9kZWxTZXJ2aWNlSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuSVdlYkJyb3dzZXJBQ1RGOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuSU5ld1dpb25kb3cyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLklXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbXBsLklXZWJCcm93c2VyUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW1wbC5XZWJCcm93c2VyRXZlbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmltcGwuV2ViQnJvd3NlcklFSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLk5ld1dpbmRvdzJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC51aS5QbGF0Zm9ybVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgaW1wbGVtZW50cyBJTW9kZWxTZXJ2aWNlSG9sZGVyLCBJV2ViQnJvd3NlclBhcnQgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBXZWJCcm93c2VyRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIFdlYkJyb3dzZXJJRUltcGwgd2ViQnJvd3NlcjsKLQotICAgIElFZGl0b3JJbnB1dCBpbnB1dDsKLQotICAgIHB1YmxpYyBXZWJCcm93c2VyRWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldFVybCA9ICJhYm91dDpibGFuayI7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIER1bW15RWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIHRhcmdldFVybCA9ICgoRHVtbXlFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVybCgpOwotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh0YXJnZXRVcmwpKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0VXJsID0gImFib3V0OmJsYW5rIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdlYkJyb3dzZXIgPSBuZXcgV2ViQnJvd3NlcklFSW1wbCh0aGlzLCBwYXJlbnQsIHRhcmdldFVybCk7Ci0gICAgICAgIHdlYkJyb3dzZXIuc2V0TmV3V2luZG93MkV2ZW50TGlzdGVuZXIobmV3IElOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG5ld1dpbmRvdzIoTmV3V2luZG93MlBhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBuZXdFZGl0b3IgPSBNb2RlbFNlcnZpY2VVdGlscy5sYXVuY2goImFib3V0OmJsYW5rIiwgSUQpOwotICAgICAgICAgICAgICAgIGlmIChuZXdFZGl0b3IgaW5zdGFuY2VvZiBXZWJCcm93c2VyRWRpdG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIElXZWJCcm93c2VyQUNURiBicm93c2VyID0gKElXZWJCcm93c2VyQUNURikgKChXZWJCcm93c2VyRWRpdG9yKSBuZXdFZGl0b3IpLmdldE1vZGVsU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRCcm93c2VyQWRkcmVzcyhicm93c2VyLmdldElXZWJCcm93c2VyMigpKTsKLSAgICAgICAgICAgICAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLm5ld1dpbmRvdyhicm93c2VyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3ZWJCcm93c2VyLnNldFdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIobmV3IElXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKCkgewotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJVXRpbC5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKElFZGl0b3JSZWZlcmVuY2UgaSA6IGVkaXRvclJlZnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXZWJCcm93c2VyRWRpdG9yLnRoaXMgPT0gaS5nZXRFZGl0b3IoZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm1VSVV0aWwuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlRWRpdG9yKFdlYkJyb3dzZXJFZGl0b3IudGhpcywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi5icm93c2VyRGlzcG9zZWQod2ViQnJvd3NlciwgZ2V0UGFydE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi5mb2N1c0NoYW5nZSh3ZWJCcm93c2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLSAgICAgICAgLy8gVE9ETwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotICAgICAgICBzZXRTaXRlKHNpdGUpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIElNb2RlbFNlcnZpY2UgZ2V0TW9kZWxTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gKHRoaXMud2ViQnJvd3Nlcik7Ci0gICAgfQotCi0gICAgcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYW5nZVRpdGxlKElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyLCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgaWYgKHRoaXMud2ViQnJvd3NlciA9PSB3ZWJCcm93c2VyKSB7Ci0gICAgICAgICAgICBzZXRQYXJ0TmFtZSh0aXRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvZWRpdG9yL1dlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9lZGl0b3IvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2I4OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9lZGl0b3IvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zLkRpc2FibGVEZWJ1Z01lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9ucy5Hb0JhY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9ucy5Hb0ZvcndhcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9ucy5SZWZyZXNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmFjdGlvbnMuU3RvcEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zLlRleHRTaXplTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0gICAgcHJpdmF0ZSBEaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uIHNpbGVudEFjdGlvbjsKLQotICAgIHByaXZhdGUgRGlzYWJsZURlYnVnTWVzc2FnZUFjdGlvbiBzaWxlbnRBY3Rpb24yOwotCi0gICAgcHVibGljIFdlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvcigpIHsKLSAgICAgICAgc2lsZW50QWN0aW9uID0gbmV3IERpc2FibGVEZWJ1Z01lc3NhZ2VBY3Rpb24oKTsKLSAgICAgICAgc2lsZW50QWN0aW9uMiA9IG5ldyBEaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uKGZhbHNlKTsKLSAgICAgICAgc2lsZW50QWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoc2lsZW50QWN0aW9uMik7Ci0gICAgICAgIHNpbGVudEFjdGlvbjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzaWxlbnRBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICBzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocGFnZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db29sQmFyKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWFuYWdlcikgewotICAgICAgICAvLyBub3Qgc3luYyB3aXRoIEVkaXRvciBzaG93L2hpZGUuLi4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0gICAgICAgIC8vIFRPRE8gdXNlIHRoaXMgdG8gZ2V0IElXZWJCcm93c2VyIGZvciBBY3Rpb25zLiBkb24ndCBkZXBlbmQgb24gTWVkaWF0b3IKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0gICAgICAgIC8vIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIk5hdmlnYXRlIikpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobmV3IEdvQmFja0FjdGlvbigpKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBHb0ZvcndhcmRBY3Rpb24oKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgUmVmcmVzaEFjdGlvbigpKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTdG9wQWN0aW9uKCkpOwotICAgICAgICBpZiAoUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSkgewotICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKHNpbGVudEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGFpQnJvd3NlcgotICAgICAgICAvLyBtZW51TWFuYWdlci5hZGQobmV3Ci0gICAgICAgIC8vIEZhdm9yaXRlc01lbnUoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSkpOwotICAgICAgICAvLyBEaXNwbGF5IFRPRE8gb25seSBmb3IgQnJvd3NlcgotICAgICAgICAvLyBUT0RPCi0gICAgICAgIE1lbnVNYW5hZ2VyIGRpc3BsYXlNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0LiZEaXNwbGF5XzEiKSwKLSAgICAgICAgICAgICAgICAiZGlzcGxheU1lbnUiKTsKLSAgICAgICAgZGlzcGxheU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoIm5hdmlnYXRlIikpOwotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IEdvQmFja0FjdGlvbihmYWxzZSkpOwotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IEdvRm9yd2FyZEFjdGlvbihmYWxzZSkpOwotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IFJlZnJlc2hBY3Rpb24oZmFsc2UpKTsKLSAgICAgICAgZGlzcGxheU1lbnUuYWRkKG5ldyBTdG9wQWN0aW9uKGZhbHNlKSk7Ci0gICAgICAgIGlmIChQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpKSB7Ci0gICAgICAgICAgICBkaXNwbGF5TWVudS5hZGQoc2lsZW50QWN0aW9uMik7Ci0gICAgICAgIH0KLQotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgZGlzcGxheU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInZpZXciKSk7Ci0gICAgICAgIGRpc3BsYXlNZW51LmFkZChuZXcgVGV4dFNpemVNZW51KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0ZJTEUsIGRpc3BsYXlNZW51KTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9lZGl0b3IvV2ViQnJvd3NlckVkaXRvcklucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2VkaXRvci9XZWJCcm93c2VyRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMjNjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2VkaXRvci9XZWJCcm93c2VyRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0KLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gIldlYiBCcm93c2VyIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHVybCA9ICJhYm91dDpibGFuayI7Ci0KLSAgICBwdWJsaWMgV2ViQnJvd3NlckVkaXRvcklucHV0KCl7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBXZWJCcm93c2VyRWRpdG9ySW5wdXQoU3RyaW5nIHVybCkgewotICAgICAgICBzZXRVcmwodXJsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViQnJvd3NlckVkaXRvcklucHV0KFN0cmluZyB1cmwsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHNldFVybCh1cmwpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhpc3RzIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0lOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0lOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5M2I0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2V2ZW50cy9JTmV3V2lvbmRvdzJFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVyczsKLQotCi0KLQotcHVibGljIGludGVyZmFjZSBJTmV3V2lvbmRvdzJFdmVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLSAgICAvL1RPRE8gcGFyYW0KLSAgICBwdWJsaWMgdm9pZCBuZXdXaW5kb3cyKE5ld1dpbmRvdzJQYXJhbWV0ZXJzIHBhcmFtKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvSVdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0lXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzY1ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvSVdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbXBsL0lXZWJCcm93c2VyUGFydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbXBsL0lXZWJCcm93c2VyUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjhiMmY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9JV2ViQnJvd3NlclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuSVdlYkJyb3dzZXJBQ1RGOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJV2ViQnJvd3NlclBhcnQgewotICAgIHZvaWQgY2hhbmdlVGl0bGUoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIsIFN0cmluZyB0aXRsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjY4MmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbXBsL1dlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuSVdlYkJyb3dzZXJBQ1RGOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZXZlbnRzLklXZWJCcm93c2VyQUNURkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLkJyb3dzZXJJRV9QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLQotCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0xJU1RFTkVSID0gImxpc3RlbmVyIjsKLSAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gY2FjaGVkRXh0ZW5zaW9uczsKLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gZ2V0RXh0ZW5zaW9ucygpIHsKLSAgICAgICAgaWYgKGNhY2hlZEV4dGVuc2lvbnMgIT0gbnVsbCkgcmV0dXJuIGNhY2hlZEV4dGVuc2lvbnM7Ci0KLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gICAgICAgICAgICAuZ2V0RXh0ZW5zaW9uUG9pbnQoQnJvd3NlcklFX1BsdWdpbi5QTFVHSU5fSUQsICJXZWJCcm93c2VyRXZlbnRMaXN0ZW5lciIpCi0gICAgICAgICAgICAuZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uIGV4ID0gcGFyc2VFeHRlbnNpb24oY29uZmlnRWxlbWVudHNbal0sIGwuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkgbC5hZGQoZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhY2hlZEV4dGVuc2lvbnMgPSAoV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10pIGwudG9BcnJheShuZXcgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW2wuc2l6ZSgpXSk7Ci0gICAgICAgIHJldHVybiBjYWNoZWRFeHRlbnNpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbiBwYXJzZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgaW50IGlkeCkgewotICAgICAgICBpZiAoIWNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTElTVEVORVIpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbihjb25maWdFbGVtZW50LCBpZHgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlRXh0ZW5zaW9ucygpIHsKLSAgICAgICAgaWYgKGNhY2hlZEV4dGVuc2lvbnMgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNhY2hlZEV4dGVuc2lvbnNbaV0uZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhY2hlZEV4dGVuc2lvbnMgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBuYXZpZ2F0ZUNvbXBsZXRlKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3NlciwgU3RyaW5nIHVybCkgewotICAgICAgICBXZWJCcm93c2VyRXZlbnRFeHRlbnNpb25bXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIGlmIChleHMgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZXhzW2ldLmdldExpc3RlbmVyKCkubmF2aWdhdGVDb21wbGV0ZShpV2ViQnJvd3NlciwgdXJsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0aXRsZUNoYW5nZShJV2ViQnJvd3NlckFDVEYgaVdlYkJyb3dzZXIsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBXZWJCcm93c2VyRXZlbnRFeHRlbnNpb25bXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIGlmIChleHMgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZXhzW2ldLmdldExpc3RlbmVyKCkudGl0bGVDaGFuZ2UoaVdlYkJyb3dzZXIsIHRpdGxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvZ3Jlc3NDaGFuZ2UoSVdlYkJyb3dzZXJBQ1RGIGlXZWJCcm93c2VyLCBpbnQgcHJvZ3Jlc3MsIGludCBwcm9ncmVzc01heCl7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbltdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgaWYoZXhzID09IG51bGwpIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZXhzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIGV4c1tpXS5nZXRMaXN0ZW5lcigpLnByb2dyZXNzQ2hhbmdlKGlXZWJCcm93c2VyLCBwcm9ncmVzcywgcHJvZ3Jlc3NNYXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBteURvY3VtZW50Q29tcGxldGUoSVdlYkJyb3dzZXJBQ1RGIGlXZWJCcm93c2VyKXsKLSAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICAKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm15RG9jdW1lbnRDb21wbGV0ZSIpOwotICAgICAgICAKLSAgICAgICAgaWYgKGV4cyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHNbaV0uZ2V0TGlzdGVuZXIoKS5teURvY3VtZW50Q29tcGxldGUoaVdlYkJyb3dzZXIpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZvY3VzQ2hhbmdlKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3Nlcil7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbltdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgaWYgKGV4cyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHNbaV0uZ2V0TGlzdGVuZXIoKS5mb2N1c0NoYW5nZShpV2ViQnJvd3Nlcik7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYnJvd3NlckRpc3Bvc2VkKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3NlciwgU3RyaW5nIHRpdGxlKXsKLSAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICBpZihleHMgPT1udWxsKSByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHNbaV0uZ2V0TGlzdGVuZXIoKS5icm93c2VyRGlzcG9zZWQoaVdlYkJyb3dzZXIsIHRpdGxlKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjbG9zZToiK2lXZWJCcm93c2VyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZU5hdmlnYXRlKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3NlciwgU3RyaW5nIHVybCwgU3RyaW5nIHRhcmdldEZyYW1lTmFtZSwgYm9vbGVhbiBpc0luTmF2aWdhdGlvbil7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbltdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgaWYoZXhzID09bnVsbCkgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZXhzW2ldLmdldExpc3RlbmVyKCkuYmVmb3JlTmF2aWdhdGUoaVdlYkJyb3dzZXIsIHVybCwgdGFyZ2V0RnJhbWVOYW1lLCBpc0luTmF2aWdhdGlvbik7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbXlSZWZyZXNoKElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKSB7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbltdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJteVJlZnJlc2giKTsKLSAgICAgICAgCi0gICAgICAgIGlmKGV4cyA9PW51bGwpIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGV4c1tpXS5nZXRMaXN0ZW5lcigpLm15UmVmcmVzaCh3ZWJCcm93c2VyKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbXlSZWZyZXNoQ29tcGxldGUoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpIHsKLSAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJteVJlZnJlc2hDb21wbGV0ZSIpOwotICAgICAgICAKLSAgICAgICAgaWYoZXhzID09bnVsbCkgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZXhzW2ldLmdldExpc3RlbmVyKCkubXlSZWZyZXNoQ29tcGxldGUod2ViQnJvd3Nlcik7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbmF2aWdhdGVTdG9wKElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKSB7Ci0gICAgICAgIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbltdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgaWYoZXhzID09bnVsbCkgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZXhzW2ldLmdldExpc3RlbmVyKCkubmF2aWdhdGVTdG9wKHdlYkJyb3dzZXIpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb2N1c0dhaW5lZE9mQWRkcmVzc1RleHQoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpIHsKLSAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICBpZihleHMgPT1udWxsKSByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHNbaV0uZ2V0TGlzdGVuZXIoKS5mb2N1c0dhaW5lZE9mQWRkcmVzc1RleHQod2ViQnJvd3Nlcik7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZvY3VzTG9zdE9mQWRkcmVzc1RleHQoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpIHsKLSAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgICBpZihleHMgPT1udWxsKSByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBleHNbaV0uZ2V0TGlzdGVuZXIoKS5mb2N1c0xvc3RPZkFkZHJlc3NUZXh0KHdlYkJyb3dzZXIpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBuZXdXaW5kb3coSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpewotICAgICAgICBXZWJCcm93c2VyRXZlbnRFeHRlbnNpb25bXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIGlmKGV4cyA9PW51bGwpIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGV4c1tpXS5nZXRMaXN0ZW5lcigpLm5ld1dpbmRvdyh3ZWJCcm93c2VyKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotCi0gICAgcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudDsKLSAgICBwcml2YXRlIElXZWJCcm93c2VyQUNURkV2ZW50TGlzdGVuZXIgbGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgaW50IGlkeCkgewotICAgICAgICB0aGlzLmNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgSVdlYkJyb3dzZXJBQ1RGRXZlbnRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHJldHVybiBsaXN0ZW5lcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxpc3RlbmVyID0gKElXZWJCcm93c2VyQUNURkV2ZW50TGlzdGVuZXIpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbGlzdGVuZXIuZGlzcG9zZSgpOwotICAgICAgICBsaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbXBsL1dlYkJyb3dzZXJJRUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbXBsL1dlYkJyb3dzZXJJRUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E0ZDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLkltYWdlUG9zaXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJJRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5Ccm93c2VyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLkRvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLlByb2dyZXNzQ2hhbmdlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLlN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbC5Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsLk5hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsLk5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLmltcGwuTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbC5Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbC5TdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsLlRpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsLldpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUud2luMzIuSVBlcnNpc3RGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT007Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVBdXRvbWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJJRUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzCi0JCUlXZWJCcm93c2VySUVDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JZID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9UTyA9IDE7Ci0KLQlPbGVGcmFtZSBmcmFtZTsKLQotCU9sZUNvbnRyb2xTaXRlIHNpdGU7Ly8gLCBzaXRlMjsKLQotCU9sZUF1dG9tYXRpb24gYXV0bzsvLyAsIGF1dG8yOwotCi0JYm9vbGVhbiBkaXNwb3NpbmcgPSBmYWxzZTsKLQotCWJvb2xlYW4gYkRpc2FibGVTY3JpcHREZWJ1Z2dlciA9IGZhbHNlOwotCi0JcHJpdmF0ZSBCcm93c2VyRXZlbnRMaXN0ZW5lcltdIGV2ZW50TGlzdGVuZXJzID0gbmV3IEJyb3dzZXJFdmVudExpc3RlbmVyWzBdOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VSX1BST0dJRCA9ICJTaGVsbC5FeHBsb3JlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IG9sZFByb2MgPSAwOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkID0gZmFsc2U7Ci0KLQkvLyBFdmVudCBJRHMKLQkvLyBUT0RPIGluIGNhcGl0YWwKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRXZlbnRJRF9CRUZPUkVOQVZJR0FURSA9IDEwMCwKLQkJCUV2ZW50SURfTkFWSUdBVEVDT01QTEVURSA9IDEwMSwgRXZlbnRJRF9TVEFUVVNURVhUQ0hBTkdFID0gMTAyLAotCQkJRXZlbnRJRF9RVUlUID0gMTAzLCBFdmVudElEX0RPV05MT0FEQ09NUExFVEUgPSAxMDQsCi0JCQlFdmVudElEX0NPTU1BTkRTVEFURUNIQU5HRSA9IDEwNSwgRXZlbnRJRF9ET1dOTE9BREJFR0lOID0gMTA2LAotCQkJRXZlbnRJRF9ORVdXSU5ET1cgPSAxMDcsIEV2ZW50SURfUFJPR1JFU1NDSEFOR0UgPSAxMDgsCi0JCQlFdmVudElEX1dJTkRPV01PVkUgPSAxMDksIEV2ZW50SURfV0lORE9XUkVTSVpFID0gMTEwLAotCQkJRXZlbnRJRF9XSU5ET1dBQ1RJVkFURSA9IDExMSwgRXZlbnRJRF9QUk9QRVJUWUNIQU5HRSA9IDExMiwKLQkJCUV2ZW50SURfVElUTEVDSEFOR0UgPSAxMTMsIEV2ZW50SURfVElUTEVJQ09OQ0hBTkdFID0gMTE0LAotCQkJRXZlbnRJRF9GUkFNRUJFRk9SRU5BVklHQVRFID0gMjAwLAotCQkJRXZlbnRJRF9GUkFNRU5BVklHQVRFQ09NUExFVEUgPSAyMDEsIEV2ZW50SURfRlJBTUVORVdXSU5ET1cgPSAyMDQsCi0JCQlFdmVudElEX0JFRk9SRU5BVklHQVRFMiA9IDI1MCwgRXZlbnRJRF9ORVdXSU5ET1cyID0gMjUxLAotCQkJRXZlbnRJRF9OQVZJR0FURUNPTVBMRVRFMiA9IDI1MiwgRXZlbnRJRF9PTlFVSVQgPSAyNTMsCi0JCQlFdmVudElEX09OVklTSUJMRSA9IDI1NCwgRXZlbnRJRF9PTlRPT0xCQVIgPSAyNTUsCi0JCQlFdmVudElEX09OTUVOVUJBUiA9IDI1NiwgRXZlbnRJRF9PTlNUQVRVU0JBUiA9IDI1NywKLQkJCUV2ZW50SURfT05GVUxMU0NSRUVOID0gMjU4LCBFdmVudElEX0RPQ1VNRU5UQ09NUExFVEUgPSAyNTksCi0JCQlFdmVudElEX09OVEhFQVRFUk1PREUgPSAyNjAsIEV2ZW50SURfT05BRERSRVNTQkFSID0gMjYxLAotCQkJRXZlbnRJRF9XSU5ET1dTRVRSRVNJWkFCTEUgPSAyNjIsIEV2ZW50SURfV0lORE9XQ0xPU0lORyA9IDI2MywKLQkJCUV2ZW50SURfV0lORE9XU0VUTEVGVCA9IDI2NCwgRXZlbnRJRF9XSU5ET1dTRVRUT1AgPSAyNjUsCi0JCQlFdmVudElEX1dJTkRPV1NFVFdJRFRIID0gMjY2LCBFdmVudElEX1dJTkRPV1NFVEhFSUdIVCA9IDI2NywKLQkJCUV2ZW50SURfQ0xJRU5UVE9IT1NUV0lORE9XID0gMjY4LCBFdmVudElEX1NFVFNFQ1VSRUxPQ0tJQ09OID0gMjY5LAotCQkJRXZlbnRJRF9GSUxFRE9XTkxPQUQgPSAyNzAsIEV2ZW50SURfTkFWSUdBVEVFUlJPUiA9IDI3MSwKLQkJCUV2ZW50SURfUFJJVkFDWUlNUEFDVEVEU1RBVEVDSEFOR0UgPSAyNzIsIEV2ZW50SURfTkVXV0lORE9XMyA9IDI3MzsKLQotCXB1YmxpYyBXZWJCcm93c2VySUVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkvKgotCQkgKiBDcmVhdGUgT0xFIGZyYW1lCi0JCSAqLwotCQl0cnkgewotCQkJZnJhbWUgPSBuZXcgT2xlRnJhbWUodGhpcywgU1dULk5PTkUpOwotCQkJZnJhbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlzaXRlID0gbmV3IFdlYkJyb3dzZXJJRUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgQlJPV1NFUl9QUk9HSUQpOwotCQkJc2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX0lOUExBQ0VBQ1RJVkFURSk7Ci0JCQlhdXRvID0gbmV3IE9sZUF1dG9tYXRpb24oc2l0ZSk7Ci0KLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCWRpc3Bvc2UoKTsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfTk9fSEFORExFUyk7Ci0JCX0KLQotCQkvKgotCQkgKiBNaXNjIHNldHRpbmdzCi0JCSAqLwotCQlzZXRCcm93c2VyQm9vbGVhbigiUmVnaXN0ZXJBc0Ryb3BUYXJnZXQiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8qCi0JCSAqIEFkZCBTV1QgRXZlbnQgaGFuZGxlcnMKLQkJICovCi0JCUxpc3RlbmVyIHN3dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuRGlzcG9zZTogewotCQkJCQlpZiAoIWRpc3Bvc2luZykgewotCQkJCQkJZGlzcG9zaW5nID0gdHJ1ZTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhlLnR5cGUsIGUpOwotCQkJCQkJZS50eXBlID0gU1dULk5PTkU7Ci0JCQkJCQlpZiAoYXV0byAhPSBudWxsKSB7Ci0JCQkJCQkJYXV0by5kaXNwb3NlKCk7Ci0JCQkJCQkJYXV0byA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlJlc2l6ZTogewotCQkJCQlmcmFtZS5zZXRCb3VuZHMoZ2V0Q2xpZW50QXJlYSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIHN3dExpc3RlbmVyKTsKLQkJYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgc3d0TGlzdGVuZXIpOwotCi0JCUxpc3RlbmVyIGtleUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuS2V5RG93bjoKLQkJCQljYXNlIFNXVC5LZXlVcDogewotCQkJCQlub3RpZnlMaXN0ZW5lcnMoZS50eXBlLCBlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2l0ZS5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwga2V5TGlzdGVuZXIpOwotCQlzaXRlLmFkZExpc3RlbmVyKFNXVC5LZXlVcCwga2V5TGlzdGVuZXIpOwotCi0JCS8qCi0JCSAqIEFkZCBPTEUgRXZlbnQgaGFuZGxlcnMKLQkJICovCi0JCU9sZUxpc3RlbmVyIGJyb3dzZXJMaXN0ZW5lciA9IG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKG51bGwgIT0gYXV0bykgewotCQkJCQl0cnkgewotCQkJCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCQljYXNlIEV2ZW50SURfQkVGT1JFTkFWSUdBVEUyOgotCQkJCQkJCW9uQmVmb3JlTmF2aWdhdGUyKG5ldyBCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzSW1wbCgKLQkJCQkJCQkJCWV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfTkFWSUdBVEVDT01QTEVURTI6Ci0JCQkJCQkJb25OYXZpZ2F0ZUNvbXBsZXRlMihuZXcgTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzSW1wbCgKLQkJCQkJCQkJCWV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfTkFWSUdBVEVFUlJPUjoKLQkJCQkJCQlvbk5hdmlnYXRlRXJyb3IobmV3IE5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzSW1wbCgKLQkJCQkJCQkJCWV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfRE9DVU1FTlRDT01QTEVURToKLQkJCQkJCQlvbkRvY3VtZW50Q29tcGxldGUobmV3IERvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzSW1wbCgKLQkJCQkJCQkJCWV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfTkVXV0lORE9XMjoKLQkJCQkJCQlvbk5ld1dpbmRvdzIobmV3IE5ld1dpbmRvdzJQYXJhbWV0ZXJzSW1wbChldmVudCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFdmVudElEX1dJTkRPV0NMT1NJTkc6Ci0JCQkJCQkJb25XaW5kb3dDbG9zaW5nKG5ldyBXaW5kb3dDbG9zaW5nUGFyYW1ldGVyc0ltcGwoCi0JCQkJCQkJCQlldmVudCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFdmVudElEX1NUQVRVU1RFWFRDSEFOR0U6Ci0JCQkJCQkJb25TdGF0dXNUZXh0Q2hhbmdlKG5ldyBTdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVyc0ltcGwoCi0JCQkJCQkJCQlldmVudCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFdmVudElEX1RJVExFQ0hBTkdFOgotCQkJCQkJCW9uVGl0bGVDaGFuZ2UobmV3IFRpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGwoZXZlbnQpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRXZlbnRJRF9QUk9HUkVTU0NIQU5HRToKLQkJCQkJCQlvblByb2dyZXNzQ2hhbmdlKG5ldyBQcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsKAotCQkJCQkJCQkJZXZlbnQpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oImV2ZW50LnR5cGU9IiArIGV2ZW50LnR5cGUgKyAiICxldmVudC5hcmd1bWVudHM9IiArIGR1bXBBcmFncyhldmVudC5hcmd1bWVudHMpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZHVtcEFyYWdzKGV2ZW50LmFyZ3VtZW50cykpOyAvLyROT04tTkxTLTEkCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihFdmVudElEX0JFRk9SRU5BVklHQVRFMiwgYnJvd3Nlckxpc3RlbmVyKTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfRE9DVU1FTlRDT01QTEVURSwgYnJvd3Nlckxpc3RlbmVyKTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfTkFWSUdBVEVDT01QTEVURTIsIGJyb3dzZXJMaXN0ZW5lcik7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihFdmVudElEX05BVklHQVRFRVJST1IsIGJyb3dzZXJMaXN0ZW5lcik7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihFdmVudElEX05FV1dJTkRPVzIsIGJyb3dzZXJMaXN0ZW5lcik7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihFdmVudElEX1BST0dSRVNTQ0hBTkdFLCBicm93c2VyTGlzdGVuZXIpOwotCQlzaXRlLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRJRF9TVEFUVVNURVhUQ0hBTkdFLCBicm93c2VyTGlzdGVuZXIpOwotCQlzaXRlLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRJRF9USVRMRUNIQU5HRSwgYnJvd3Nlckxpc3RlbmVyKTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfV0lORE9XQ0xPU0lORywgYnJvd3Nlckxpc3RlbmVyKTsKLQotCQkvLyBmb3IgSmF2YVNjcmlwdCB3aW5kb3cuY2xvc2UoKQotCi0JCUNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKHRoaXMsICJzaXRlV2luZG93UHJvYyIsIDQpOyAvLyROT04tTkxTLTEkCi0JCWludCBhZGRyZXNzID0gY2FsbGJhY2suZ2V0QWRkcmVzcygpOwotCQlpZiAoYWRkcmVzcyAhPSAwKSB7Ci0JCQlvbGRQcm9jID0gT1MuR2V0V2luZG93TG9uZyhzaXRlLmhhbmRsZSwgT1MuR1dMX1dORFBST0MpOwotCQkJT1MuU2V0V2luZG93TG9uZyhzaXRlLmhhbmRsZSwgT1MuR1dMX1dORFBST0MsIGFkZHJlc3MpOwotCQl9IGVsc2UgewotCQkJY2FsbGJhY2suZGlzcG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIFB1YmxpYyBpbnRlcmZhY2VzCi0JICovCi0KLQlwdWJsaWMgdm9pZCBhZGRCcm93c2VyRXZlbnRMaXN0ZW5lcihCcm93c2VyRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlTZXQgc2V0ID0gZ2V0RXZlbnRMaXN0ZW5lcnMoKTsKLQkJc2V0LmFkZChsaXN0ZW5lcik7Ci0JCXNldEV2ZW50TGlzdGVuZXJzKHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQnJvd3NlckV2ZW50TGlzdGVuZXIoQnJvd3NlckV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJU2V0IHNldCA9IGdldEV2ZW50TGlzdGVuZXJzKCk7Ci0JCXNldC5yZW1vdmUobGlzdGVuZXIpOwotCQlzZXRFdmVudExpc3RlbmVycyhzZXQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVmdCgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJJbnRlZ2VyKCJMZWZ0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvcCgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJJbnRlZ2VyKCJUb3AiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXRCcm93c2VySW50ZWdlcigiV2lkdGgiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QnJvd3NlckludGVnZXIoIkhlaWdodCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRSZWFkeVN0YXRlKCkgewotCQlyZXR1cm4gZ2V0QnJvd3NlckludGVnZXIoIlJlYWR5U3RhdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJTdHJpbmcoIlR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkwoKSB7Ci0JCXJldHVybiBnZXRCcm93c2VyU3RyaW5nKCJMb2NhdGlvblVSTCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBnZXRCcm93c2VyU3RyaW5nKCJMb2NhdGlvbk5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNpbGVudCgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJCb29sZWFuKCJTaWxlbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpbGVudChib29sZWFuIHNpbGVudCkgewotCQlzZXRCcm93c2VyQm9vbGVhbigiU2lsZW50Iiwgc2lsZW50KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVTY3JpcHREZWJ1Z2dlcigpIHsKLQkJcmV0dXJuIGJEaXNhYmxlU2NyaXB0RGVidWdnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKGJvb2xlYW4gYkRpc2FibGUpIHsKLQkJYkRpc2FibGVTY3JpcHREZWJ1Z2dlciA9IGJEaXNhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdvQmFjaygpIHsKLQkJcmV0dXJuIGludm9rZUJyb3dzZXJNZXRob2QoIkdvQmFjayIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZ29Gb3J3YXJkKCkgewotCQlyZXR1cm4gaW52b2tlQnJvd3Nlck1ldGhvZCgiR29Gb3J3YXJkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdG9wKCkgewotCQlyZXR1cm4gaW52b2tlQnJvd3Nlck1ldGhvZCgiU3RvcCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaCgpIHsKLQkJcmV0dXJuIGludm9rZUJyb3dzZXJNZXRob2QoIlJlZnJlc2giKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hdmlnYXRlKFN0cmluZyB1cmwpIHsKLQkJaW50W10gcElkTmF2aWdhdGUgPSBhdXRvCi0JCQkJLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIk5hdmlnYXRlIiwgIlVSTCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAobnVsbCAhPSBwSWROYXZpZ2F0ZSkgewotCQkJVmFyaWFudCB2YXJVcmwgPSBuZXcgVmFyaWFudCh1cmwpOwotCQkJVmFyaWFudCB2YXJSZXN1bHQgPSBhdXRvLmludm9rZShwSWROYXZpZ2F0ZVswXSwKLQkJCQkJbmV3IFZhcmlhbnRbXSB7IHZhclVybCB9LCBuZXcgaW50W10geyBwSWROYXZpZ2F0ZVsxXSB9KTsKLQkJCXZhclVybC5kaXNwb3NlKCk7Ci0JCQlpZiAodmFyUmVzdWx0ICE9IG51bGwpIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IHZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZOwotCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmF2aWdhdGUyKFN0cmluZyB1cmwsIGludCBmbGFncywgU3RyaW5nIHRhcmdldEZyYW1lTmFtZSwKLQkJCU9iamVjdCBwb3N0RGF0YSwgU3RyaW5nIGhlYWRlcnMpIHsKLQkJaW50W10gcElkTmF2aWdhdGUyID0gYXV0by5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJOYXZpZ2F0ZTIiIH0pOyAvLyROT04tTkxTLTEkCi0JCWlmIChudWxsICE9IHBJZE5hdmlnYXRlMikgewotCQkJVmFyaWFudCB2YXJVcmwgPSBuZXcgVmFyaWFudCh1cmwpOwotCQkJVmFyaWFudCB2YXJGbGFncyA9IG5ldyBWYXJpYW50KGZsYWdzKTsKLQkJCVZhcmlhbnQgdmFyVGFyZ2V0RnJhbWVOYW1lID0gbnVsbCA9PSB0YXJnZXRGcmFtZU5hbWUgPyBuZXcgVmFyaWFudCgpCi0JCQkJCTogbmV3IFZhcmlhbnQodGFyZ2V0RnJhbWVOYW1lKTsKLQkJCVZhcmlhbnQgdmFySGVhZGVycyA9IG51bGwgPT0gaGVhZGVycyA/IG5ldyBWYXJpYW50KCkgOiBuZXcgVmFyaWFudCgKLQkJCQkJaGVhZGVycyk7Ci0JCQlpZiAoIShwb3N0RGF0YSBpbnN0YW5jZW9mIFZhcmlhbnQpKSB7Ci0JCQkJcG9zdERhdGEgPSBuZXcgVmFyaWFudCgpOwotCQkJfQotCQkJVmFyaWFudCB2YXJSZXN1bHQgPSBhdXRvLmludm9rZShwSWROYXZpZ2F0ZTJbMF0sIG5ldyBWYXJpYW50W10gewotCQkJCQl2YXJVcmwsIHZhckZsYWdzLCB2YXJUYXJnZXRGcmFtZU5hbWUsIChWYXJpYW50KSBwb3N0RGF0YSwKLQkJCQkJdmFySGVhZGVycyB9KTsKLQkJCXZhclVybC5kaXNwb3NlKCk7Ci0JCQl2YXJGbGFncy5kaXNwb3NlKCk7Ci0JCQl2YXJUYXJnZXRGcmFtZU5hbWUuZGlzcG9zZSgpOwotCQkJdmFySGVhZGVycy5kaXNwb3NlKCk7Ci0JCQlpZiAodmFyUmVzdWx0ICE9IG51bGwpIHsKLQkJCQlib29sZWFuIHJlc3VsdCA9IHZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZOwotCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9udFNpemUoaW50IG5TaXplKSB7Ci0JCVZhcmlhbnQgdmFySW4gPSBuZXcgVmFyaWFudChuU2l6ZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gT0xFLlNfT0sgPT0gc2l0ZS5leGVjKE9MRS5PTEVDTURJRF9aT09NLAotCQkJCQlPTEUuT0xFQ01ERVhFQ09QVF9ET05UUFJPTVBUVVNFUiwgdmFySW4sIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJdmFySW4uZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZvbnRTaXplKCkgewotCQlWYXJpYW50IHZhck91dCA9IG5ldyBWYXJpYW50KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoT0xFLlNfT0sgPT0gc2l0ZS5leGVjKE9MRS5PTEVDTURJRF9aT09NLAotCQkJCQlPTEUuT0xFQ01ERVhFQ09QVF9ET05UUFJPTVBUVVNFUiwgbnVsbCwgdmFyT3V0KSkgewotCQkJCWlmIChPTEUuVlRfSTQgPT0gdmFyT3V0LmdldFR5cGUoKSkgewotCQkJCQlyZXR1cm4gdmFyT3V0LmdldEludCgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXZhck91dC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmVMaXZlRG9tKFN0cmluZyBmaWxlTmFtZSkgewotCQlWYXJpYW50IHZhckRvY3VtZW50ID0gZ2V0QnJvd3NlclZhcmlhbnQoIkRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG51bGwgIT0gdmFyRG9jdW1lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJT2xlQXV0b21hdGlvbiBkb2N1bWVudCA9IHZhckRvY3VtZW50LmdldEF1dG9tYXRpb24oKTsKLQkJCQlWYXJpYW50IHZhckRvY0VsZSA9IGdldFZhcmlhbnQoZG9jdW1lbnQsICJkb2N1bWVudEVsZW1lbnQiKTsKLQkJCQlkb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQkJaWYgKG51bGwgIT0gdmFyRG9jRWxlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPbGVBdXRvbWF0aW9uIGRvY0VsZSA9IHZhckRvY0VsZS5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJCQlWYXJpYW50IHZhck91dGVySFRNTCA9IGdldFZhcmlhbnQoZG9jRWxlLCAib3V0ZXJIVE1MIik7Ci0JCQkJCQlkb2NFbGUuZGlzcG9zZSgpOwotCQkJCQkJaWYgKG51bGwgIT0gdmFyT3V0ZXJIVE1MKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJLy8gZm9yIGJ1ZwotCQkJCQkJCQkvLyByZXBsYWNlICJhbHQ9XHUzMDAwIiB3aXRoICJhbHQ9XCIgXCIiCi0JCQkJCQkJCS8vIHJlcGxhY2UgImFsdD0qICIgd2l0aCAiYWx0PVwiKlwiICIKLQotCQkJCQkJCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcigKLQkJCQkJCQkJCQluZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpLAotCQkJCQkJCQkJCQkJIlVURi04IikpOwotCQkJCQkJCQlwdy5wcmludGxuKHZhck91dGVySFRNTC5nZXRTdHJpbmcoKSk7Ci0JCQkJCQkJCXB3LmZsdXNoKCk7Ci0JCQkJCQkJCXB3LmNsb3NlKCk7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMykgewotCQkJCQkJCQllMy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQl2YXJPdXRlckhUTUwuZGlzcG9zZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXZhckRvY0VsZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyRG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKFN0cmluZyBmaWxlTmFtZSkgewotCQlWYXJpYW50IHZhckRvY3VtZW50ID0gZ2V0QnJvd3NlclZhcmlhbnQoIkRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG51bGwgIT0gdmFyRG9jdW1lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHNhdmVEb2N1bWVudCh2YXJEb2N1bWVudCwgZmlsZU5hbWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKSB7Ci0JCVZhcmlhbnQgdmFyaWFudCA9IG5ldyBWYXJpYW50KGF1dG8pOwotCQlJRGlzcGF0Y2ggaURpc3BhdGNoID0gdmFyaWFudC5nZXREaXNwYXRjaCgpOwotCQlyZXR1cm4gaURpc3BhdGNoLmdldEFkZHJlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgaW50W10gZ2V0V2hvbGVTaXplKCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W10geyAtMSwgLTEgfTsKLQkJVmFyaWFudCB2YXJEb2N1bWVudCA9IGdldEJyb3dzZXJWYXJpYW50KCJEb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChudWxsICE9IHZhckRvY3VtZW50KSB7Ci0JCQl0cnkgewotCQkJCU9sZUF1dG9tYXRpb24gZG9jdW1lbnQgPSB2YXJEb2N1bWVudC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJVmFyaWFudCB2YXJEb2NFbGUgPSBnZXRWYXJpYW50KGRvY3VtZW50LCAiZG9jdW1lbnRFbGVtZW50Iik7Ci0JCQkJaWYgKG51bGwgIT0gdmFyRG9jRWxlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPbGVBdXRvbWF0aW9uIGRvY0VsZSA9IHZhckRvY0VsZS5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJCQlyZXN1bHRbMF0gPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihkb2NFbGUsICJzY3JvbGxXaWR0aCIpOwotCQkJCQkJcmVzdWx0WzFdID0gZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oZG9jRWxlLCAic2Nyb2xsSGVpZ2h0Iik7Ci0JCQkJCQlkb2NFbGUuZGlzcG9zZSgpOwotCi0JCQkJCQlpbnQgYm9keVNpemVbXSA9IGdldEJvZHlTaXplKGRvY3VtZW50KTsKLQotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdFswXSsiICIrcmVzdWx0WzFdKyIgOgotCQkJCQkJLy8gIitib2R5U2l6ZVswXSsiICIrYm9keVNpemVbMV0pOwotCi0JCQkJCQlpZiAocmVzdWx0WzBdIDwgYm9keVNpemVbMF0pIHsKLQkJCQkJCQlyZXN1bHRbMF0gPSBib2R5U2l6ZVswXTsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZXN1bHRbMV0gPCBib2R5U2l6ZVsxXSkgewotCQkJCQkJCXJlc3VsdFsxXSA9IGJvZHlTaXplWzFdOwotCQkJCQkJfQotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQl2YXJEb2NFbGUuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRvY3VtZW50LmRpc3Bvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyRG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAocmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VQb3NpdGlvbkluZm9bXSBnZXRBbGxJbWFnZVBvc2l0aW9uKCkgewotCQlJbWFnZVBvc2l0aW9uSW5mb1tdIHJlc3VsdCA9IG5ldyBJbWFnZVBvc2l0aW9uSW5mb1swXTsKLQkJVmFyaWFudCB2YXJEb2N1bWVudCA9IGdldEJyb3dzZXJWYXJpYW50KCJEb2N1bWVudCIpOwotCQlpZiAobnVsbCAhPSB2YXJEb2N1bWVudCkgewotCQkJdHJ5IHsKLQkJCQlPbGVBdXRvbWF0aW9uIGRvY3VtZW50ID0gdmFyRG9jdW1lbnQuZ2V0QXV0b21hdGlvbigpOwotCQkJCVZhcmlhbnQgdmFySW1hZ2VzID0gZ2V0VmFyaWFudChkb2N1bWVudCwgImltYWdlcyIpOwotCQkJCWRvY3VtZW50LmRpc3Bvc2UoKTsKLQkJCQlpZiAobnVsbCAhPSB2YXJJbWFnZXMpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9sZUF1dG9tYXRpb24gaW1hZ2VzID0gdmFySW1hZ2VzLmdldEF1dG9tYXRpb24oKTsKLQkJCQkJCXJlc3VsdCA9ICBnZXRBbGxJbWFnZVBvc2l0aW9uKGltYWdlcyk7Ci0JCQkJCQlpbWFnZXMuZGlzcG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJdmFySW1hZ2VzLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyRG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2Nyb2xsKGludCB4LCBpbnQgeSwgaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gMCB8fCB0eXBlID09IDEpIHsKLQkJCVZhcmlhbnQgdmFyRG9jdW1lbnQgPSBnZXRCcm93c2VyVmFyaWFudCgiRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG51bGwgIT0gdmFyRG9jdW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQlPbGVBdXRvbWF0aW9uIGRvY3VtZW50ID0gdmFyRG9jdW1lbnQuZ2V0QXV0b21hdGlvbigpOwotCQkJCQlWYXJpYW50IHZhcldpbmRvdyA9IGdldFZhcmlhbnQoZG9jdW1lbnQsICJwYXJlbnRXaW5kb3ciKTsKLQkJCQkJZG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJCQlpZiAobnVsbCAhPSB2YXJXaW5kb3cpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJT2xlQXV0b21hdGlvbiB3aW5kb3cgPSB2YXJXaW5kb3cuZ2V0QXV0b21hdGlvbigpOwotCQkJCQkJCVN0cmluZyBzY3JvbGxUeXBlID0gInNjcm9sbEJ5IjsKLQkJCQkJCQlpZiAodHlwZSA9PSAxKSB7Ci0JCQkJCQkJCXNjcm9sbFR5cGUgPSAic2Nyb2xsVG8iOwotCQkJCQkJCX0KLQkJCQkJCQlpbnRbXSBpZFNjcm9sbCA9IHdpbmRvdwotCQkJCQkJCQkJLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgc2Nyb2xsVHlwZSB9KTsKLQkJCQkJCQlpZiAobnVsbCAhPSBpZFNjcm9sbCkgewotCQkJCQkJCQl3aW5kb3cuaW52b2tlKGlkU2Nyb2xsWzBdLCBuZXcgVmFyaWFudFtdIHsKLQkJCQkJCQkJCQluZXcgVmFyaWFudCh4KSwgbmV3IFZhcmlhbnQoeSkgfSk7Ci0JCQkJCQkJCXdpbmRvdy5kaXNwb3NlKCk7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQl3aW5kb3cuZGlzcG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXZhcldpbmRvdy5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdmFyRG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBCcm93c2VyIGV2ZW50IGhhbmRsZXJzCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBvbkJlZm9yZU5hdmlnYXRlMihCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWV2ZW50TGlzdGVuZXJzW2ldLmJlZm9yZU5hdmlnYXRlMihwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvbk5hdmlnYXRlQ29tcGxldGUyKE5hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVycyBwYXJhbSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlldmVudExpc3RlbmVyc1tpXS5uYXZpZ2F0ZUNvbXBsZXRlMihwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvbk5hdmlnYXRlRXJyb3IoTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0ubmF2aWdhdGVFcnJvcihwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvbkRvY3VtZW50Q29tcGxldGUoRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0uZG9jdW1lbnRDb21wbGV0ZShwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvbk5ld1dpbmRvdzIoTmV3V2luZG93MlBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0ubmV3V2luZG93MihwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd0Nsb3NpbmcoV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMgcGFyYW0pIHsKLQkJLy8gcGFyYW0uc2V0Q2FuY2VsKHRydWUpOwotCQkvLyAgICAgICAgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWV2ZW50TGlzdGVuZXJzW2ldLndpbmRvd0Nsb3NpbmcocGFyYW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb25XaW5kb3dDbG9zZWQoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWV2ZW50TGlzdGVuZXJzW2ldLndpbmRvd0Nsb3NlZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb25TdGF0dXNUZXh0Q2hhbmdlKFN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWV2ZW50TGlzdGVuZXJzW2ldLnN0YXR1c1RleHRDaGFuZ2UocGFyYW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb25UaXRsZUNoYW5nZShUaXRsZUNoYW5nZVBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0udGl0bGVDaGFuZ2UocGFyYW0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb25Qcm9ncmVzc0NoYW5nZShQcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0ucHJvZ3Jlc3NDaGFuZ2UocGFyYW0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcml2YXRlIG1ldGhvZHMKLQkgKi8KLQotCXByaXZhdGUgU2V0IGdldEV2ZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IExpbmtlZEhhc2hTZXQoQXJyYXlzLmFzTGlzdChldmVudExpc3RlbmVycykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFdmVudExpc3RlbmVycyhTZXQgc2V0KSB7Ci0JCWV2ZW50TGlzdGVuZXJzID0gKEJyb3dzZXJFdmVudExpc3RlbmVyW10pIHNldAotCQkJCS50b0FycmF5KG5ldyBCcm93c2VyRXZlbnRMaXN0ZW5lcltzZXQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYXZlRG9jdW1lbnQoVmFyaWFudCB2YXJEb2N1bWVudCwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChPTEUuVlRfRElTUEFUQ0ggPT0gdmFyRG9jdW1lbnQuZ2V0VHlwZSgpKSB7Ci0JCQlpbnRbXSBwUGVyc2lzdEZpbGUgPSBuZXcgaW50WzFdOwotCQkJdHJ5IHsKLQkJCQlpZiAoT0xFLlNfT0sgPT0gdmFyRG9jdW1lbnQuZ2V0RGlzcGF0Y2goKS5RdWVyeUludGVyZmFjZSgKLQkJCQkJCUNPTS5JSURJUGVyc2lzdEZpbGUsIHBQZXJzaXN0RmlsZSkpIHsKLQkJCQkJaW50IHBTdHJBZGRyZXNzID0gQ09NCi0JCQkJCQkJLlN5c0FsbG9jU3RyaW5nKChmaWxlTmFtZSArICJcMCIpLnRvQ2hhckFycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gT0xFLlNfT0sgPT0gbmV3IElQZXJzaXN0RmlsZShwUGVyc2lzdEZpbGVbMF0pCi0JCQkJCQkJCS5TYXZlKHBTdHJBZGRyZXNzLCBmYWxzZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlDT00uU3lzRnJlZVN0cmluZyhwU3RyQWRkcmVzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbnZva2VCcm93c2VyTWV0aG9kKFN0cmluZyBuYW1lKSB7Ci0JCWludFtdIHBJZE5hbWUgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKLQkJaWYgKG51bGwgIT0gcElkTmFtZSkgewotCQkJVmFyaWFudCB2YXJSZXN1bHQgPSBhdXRvLmludm9rZShwSWROYW1lWzBdKTsKLQkJCWlmIChudWxsICE9IHZhclJlc3VsdCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiB2YXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl2YXJSZXN1bHQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBWYXJpYW50IGdldEJyb3dzZXJWYXJpYW50KFN0cmluZyBuYW1lKSB7Ci0JCWludFtdIHBJZE5hbWUgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKLQkJaWYgKG51bGwgIT0gcElkTmFtZSkgewotCQkJcmV0dXJuIGF1dG8uZ2V0UHJvcGVydHkocElkTmFtZVswXSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0QnJvd3NlckludGVnZXIoU3RyaW5nIG5hbWUpIHsKLQkJVmFyaWFudCB2YXJSZXN1bHQgPSBnZXRCcm93c2VyVmFyaWFudChuYW1lKTsKLQkJaWYgKG51bGwgIT0gdmFyUmVzdWx0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiB2YXJSZXN1bHQuZ2V0SW50KCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QnJvd3NlclN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlWYXJpYW50IHZhclJlc3VsdCA9IGdldEJyb3dzZXJWYXJpYW50KG5hbWUpOwotCQlpZiAobnVsbCAhPSB2YXJSZXN1bHQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0QnJvd3NlckJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJVmFyaWFudCB2YXJSZXN1bHQgPSBnZXRCcm93c2VyVmFyaWFudChuYW1lKTsKLQkJaWYgKG51bGwgIT0gdmFyUmVzdWx0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiB2YXJSZXN1bHQuZ2V0Qm9vbGVhbigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJSZXN1bHQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0QnJvd3NlclZhcmlhbnQoU3RyaW5nIG5hbWUsIFZhcmlhbnQgdmFyKSB7Ci0JCWludFtdIHBJZE5hbWUgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKLQkJaWYgKG51bGwgIT0gcElkTmFtZSkgewotCQkJcmV0dXJuIGF1dG8uc2V0UHJvcGVydHkocElkTmFtZVswXSwgdmFyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEJyb3dzZXJJbnRlZ2VyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHNldEJyb3dzZXJWYXJpYW50KG5hbWUsIG5ldyBWYXJpYW50KHZhbHVlKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEJyb3dzZXJTdHJpbmcoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gc2V0QnJvd3NlclZhcmlhbnQobmFtZSwgbmV3IFZhcmlhbnQodmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0QnJvd3NlckJvb2xlYW4oU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuIHNldEJyb3dzZXJWYXJpYW50KG5hbWUsIG5ldyBWYXJpYW50KHZhbHVlKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnRbXSBnZXRCb2R5U2l6ZShPbGVBdXRvbWF0aW9uIGRvY3VtZW50KSB7Ci0JCWludFtdIHJlc3VsdCA9IHsgLTEsIC0xIH07Ci0JCVZhcmlhbnQgdmFyQm9keSA9IGdldFZhcmlhbnQoZG9jdW1lbnQsICJib2R5Iik7Ci0JCWlmIChudWxsICE9IHZhckJvZHkpIHsKLQkJCXRyeSB7Ci0JCQkJT2xlQXV0b21hdGlvbiBib2R5ID0gdmFyQm9keS5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJaW50IHNjcm9sbFdpZHRoID0gZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oYm9keSwgInNjcm9sbFdpZHRoIik7Ci0JCQkJaW50IG9mZnNldExlZnQgPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihib2R5LCAib2Zmc2V0TGVmdCIpOwotCQkJCWludCBzY3JvbGxIZWlnaHQgPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihib2R5LCAic2Nyb2xsSGVpZ2h0Iik7Ci0JCQkJaW50IG9mZnNldFRvcCA9IGdldEludEZyb21PbGVBdXRvbWF0aW9uKGJvZHksICJvZmZzZXRUb3AiKTsKLQotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzY3JvbGxXaWR0aCsiICIrb2Zmc2V0TGVmdCsiCi0JCQkJLy8gIitzY3JvbGxIZWlnaHQrIiAiK29mZnNldFRvcCk7Ci0KLQkJCQlyZXN1bHRbMF0gPSBzY3JvbGxXaWR0aCArIG9mZnNldExlZnQgKiAyOwotCQkJCXJlc3VsdFsxXSA9IHNjcm9sbEhlaWdodCArIG9mZnNldFRvcCAqIDI7Ci0KLQkJCQlib2R5LmRpc3Bvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyQm9keS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlUG9zaXRpb25JbmZvW10gZ2V0QWxsSW1hZ2VQb3NpdGlvbihPbGVBdXRvbWF0aW9uIGltYWdlcykgewotCQlJbWFnZVBvc2l0aW9uSW5mb1tdIHJlc3VsdCA9IG5ldyBJbWFnZVBvc2l0aW9uSW5mb1swXTsKLQkJaW50IHNpemUgPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihpbWFnZXMsICJsZW5ndGgiKTsKLQkJaWYgKHNpemUgPiAtMSkgewotCQkJSW1hZ2VQb3NpdGlvbkluZm9bXSB0bXAgPSBuZXcgSW1hZ2VQb3NpdGlvbkluZm9bc2l6ZV07Ci0JCQlpbnRbXSBpZEl0ZW0gPSBpbWFnZXMuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiSXRlbSIgfSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVZhcmlhbnQgdmFySW1hZ2UgPSBpbWFnZXMuaW52b2tlKGlkSXRlbVswXSwKLQkJCQkJCW5ldyBWYXJpYW50W10geyBuZXcgVmFyaWFudChpKSB9KTsKLQkJCQlpZiAobnVsbCAhPSB2YXJJbWFnZSkgewotCQkJCQl0cnkgewotCQkJCQkJT2xlQXV0b21hdGlvbiBpbWFnZSA9IHZhckltYWdlLmdldEF1dG9tYXRpb24oKTsKLQkJCQkJCWludFtdIGJjciA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChpbWFnZSk7Ci0JCQkJCQlpbnQgd2lkdGggPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihpbWFnZSwgIldpZHRoIik7Ci0JCQkJCQlpbnQgaGVpZ2h0ID0gZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oaW1hZ2UsICJIZWlnaHQiKTsKLQkJCQkJCVN0cmluZyB1cmwgPSBnZXRTdHJpbmdGcm9tT2xlQXV0b21hdGlvbihpbWFnZSwgInNyYyIpOwotCQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCi0JCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihiY3JbMF0rIiAiK2JjclsxXSsiICIrYmNyWzJdKyIgIitiY3JbM10rIiAiK3dpZHRoKyIgIitoZWlnaHQrIiAiK3VybCk7Ci0JCQkJCQkKLQkJCQkJCXRtcFtpXSA9IG5ldyBJbWFnZVBvc2l0aW9uSW5mbyhiY3JbMF0sYmNyWzFdLHdpZHRoLGhlaWdodCx1cmwpOwotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJdmFySW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gdG1wOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnRbXSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoT2xlQXV0b21hdGlvbiBpbWFnZSkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W10geyAwLCAwfTsvL0xlZnQsIFRvcAotCQlpZiAobnVsbCAhPSBpbWFnZSkgewotCQkJaW50W10gaWRCQ1IgPSBpbWFnZS5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJ9KTsKLQkJCVZhcmlhbnQgdmFyQkNSID0gaW1hZ2UuaW52b2tlKGlkQkNSWzBdKTsKLQkJCWlmIChudWxsICE9IHZhckJDUikgewotCQkJCXRyeSB7Ci0JCQkJCU9sZUF1dG9tYXRpb24gYmNyID0gdmFyQkNSLmdldEF1dG9tYXRpb24oKTsKLQkJCQkJcmVzdWx0ID0gbmV3IGludFtdIHsgZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oYmNyLCAiTGVmdCIpLAotCQkJCQkJCWdldEludEZyb21PbGVBdXRvbWF0aW9uKGJjciwgIlRvcCIpLAotCQkJCQkJCS8vZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oYmNyLCAiUmlnaHQiKSwKLQkJCQkJCQkvL2dldEludEZyb21PbGVBdXRvbWF0aW9uKGJjciwgIkJvdHRvbSIpCi0JCQkJCQkJfTsKLQkJCQkJYmNyLmRpc3Bvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXZhckJDUi5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ly8KLQl9Ci0KLQlwcml2YXRlIFZhcmlhbnQgZ2V0VmFyaWFudChPbGVBdXRvbWF0aW9uIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG51bGwgIT0gdGFyZ2V0KSB7Ci0JCQlpbnRbXSBwSWROYW1lID0gdGFyZ2V0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKLQkJCWlmIChudWxsICE9IHBJZE5hbWUpIHsKLQkJCQlyZXR1cm4gdGFyZ2V0LmdldFByb3BlcnR5KHBJZE5hbWVbMF0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGdldEludEZyb21PbGVBdXRvbWF0aW9uKE9sZUF1dG9tYXRpb24gdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlWYXJpYW50IHZhclJlc3VsdCA9IGdldFZhcmlhbnQodGFyZ2V0LCBuYW1lKTsKLQkJaWYgKG51bGwgIT0gdmFyUmVzdWx0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiB2YXJSZXN1bHQuZ2V0SW50KCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOy8vIFRPRE8KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdGcm9tT2xlQXV0b21hdGlvbihPbGVBdXRvbWF0aW9uIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJVmFyaWFudCB2YXJSZXN1bHQgPSBnZXRWYXJpYW50KHRhcmdldCwgbmFtZSk7Ci0JCWlmIChudWxsICE9IHZhclJlc3VsdCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdmFyUmVzdWx0LmdldFN0cmluZygpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJSZXN1bHQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsvLyBUT0RPCi0JfQotCi0JLyoqCi0JICogV2luZG93IHByb2NlZHVyZQotCSAqIAotCSAqIEBwYXJhbSBod25kCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSB3UGFyYW0KLQkgKiBAcGFyYW0gbFBhcmFtCi0JICogQHJldHVybgotCSAqLwotCWludCBzaXRlV2luZG93UHJvYyhpbnQgaHduZCwgaW50IG1zZywgaW50IHdQYXJhbSwgaW50IGxQYXJhbSkgewotCQl0cnkgewotCQkJaWYgKCFpc0Nsb3NlZCAmJiBPUy5XTV9QQVJFTlROT1RJRlkgPT0gbXNnCi0JCQkJCSYmIHdQYXJhbSA9PSBPUy5XTV9ERVNUUk9ZKSB7Ci0JCQkJaXNDbG9zZWQgPSB0cnVlOwotCQkJCW9uV2luZG93Q2xvc2VkKCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gT1MuQ2FsbFdpbmRvd1Byb2Mob2xkUHJvYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVycm9yOiBzaXRlV2luZG93UHJvYyIpOwotCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIGZvciBkZWJ1ZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkdW1wQXJhZ3MoVmFyaWFudFtdIGFyZ3MpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2IuYXBwZW5kKGkgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoKE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UKSA9PSBhcmdzW2ldLmdldFR5cGUoKSkgewotCQkJCWludCBieVJlZiA9IGFyZ3NbaV0uZ2V0QnlSZWYoKTsKLQkJCQlzaG9ydFtdIGRhdGFUeXBlID0gbmV3IHNob3J0WzFdOwotCQkJCUNPTS5Nb3ZlTWVtb3J5KGRhdGFUeXBlLCBieVJlZiwgMik7Ci0JCQkJU3RyaW5nIHN0clR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWludCB0eXBlID0gZGF0YVR5cGVbMF07Ci0JCQkJaWYgKCh0eXBlICYgT0xFLlZUX0JZUkVGKSAhPSAwKSB7Ci0JCQkJCXN0clR5cGUgPSAiVlRfQllSRUZ8IjsgLy8kTk9OLU5MUy0xJAotCQkJCQl0eXBlID0gdHlwZSAmIH5PTEUuVlRfQllSRUY7Ci0JCQkJfQotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgT0xFLlZUX0JPT0w6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX0JPT0wiO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBPTEUuVlRfSTI6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX0kyIjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX0k0OgotCQkJCQlzdHJUeXBlICs9ICJWVF9JNCI7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIE9MRS5WVF9JODoKLQkJCQkJc3RyVHlwZSArPSAiVlRfSTgiO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBPTEUuVlRfUjQ6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX1I0IjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX1I4OgotCQkJCQlzdHJUeXBlICs9ICJWVF9SOCI7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIE9MRS5WVF9CU1RSOgotCQkJCQlzdHJUeXBlICs9ICJWVF9CU1RSIjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX0RJU1BBVENIOgotCQkJCQlzdHJUeXBlICs9ICJWVF9ESVNQQVRDSCI7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIE9MRS5WVF9VTktOT1dOOgotCQkJCQlzdHJUeXBlICs9ICJWVF9VTktOT1dOIjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX0VNUFRZOgotCQkJCQlzdHJUeXBlICs9ICJWVF9FTVBUWSI7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIE9MRS5WVF9WQVJJQU5UOgotCQkJCQlzdHJUeXBlICs9ICJWVF9WQVJJQU5UIjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWRlZmF1bHQ6Ci0JCQkJCXN0clR5cGUgKz0gInR5cGU9IiArIHR5cGU7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCJSRUZfVkFSSUFOVCgiICsgc3RyVHlwZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoYXJnc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlcklFQ29udHJvbFNpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVDb250cm9sU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODVmYzlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVDb250cm9sU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuR1VJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuTVNHOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNvbnRyb2xTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJJRUNvbnRyb2xTaXRlIGV4dGVuZHMgT2xlQ29udHJvbFNpdGUgewotICAgIENPTU9iamVjdCBpRG9jSG9zdFVJSGFuZGxlcjsKLSAgICBDT01PYmplY3QgaU9sZUNvbW1hbmRUYXJnZXQ7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE9MRUNNRElEX1NIT1dTQ1JJUFRFUlJPUiA9IDQwOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfQkxBTksgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIFdlYkJyb3dzZXJJRUNvbnRyb2xTaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHByb2dJZCkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlLCBwcm9nSWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNPTUludGVyZmFjZXMoKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNPTUludGVyZmFjZXMoKTsKLSAgICAgICAgaURvY0hvc3RVSUhhbmRsZXIgPSBuZXcgQ09NT2JqZWN0KG5ldyBpbnRbXXsyLCAwLCAwLCA0LCAxLCA1LCAwLCAwLCAxLCAxLCAxLCAzLCAzLCAyLCAyLCAxLCAzLCAyfSl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDAoaW50W10gYXJncykge3JldHVybiBRdWVyeUludGVyZmFjZShhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDEoaW50W10gYXJncykge3JldHVybiBBZGRSZWYoKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDIoaW50W10gYXJncykge3JldHVybiBSZWxlYXNlKCk7fQotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QzKGludFtdIGFyZ3MpIHtyZXR1cm4gU2hvd0NvbnRleHRNZW51KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kNChpbnRbXSBhcmdzKSB7cmV0dXJuIEdldEhvc3RJbmZvKGFyZ3NbMF0pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kNShpbnRbXSBhcmdzKSB7cmV0dXJuIFNob3dVSShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDYoaW50W10gYXJncykge3JldHVybiBIaWRlVUkoKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDcoaW50W10gYXJncykge3JldHVybiBVcGRhdGVVSSgpO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kOChpbnRbXSBhcmdzKSB7cmV0dXJuIEVuYWJsZU1vZGVsZXNzKGFyZ3NbMF0pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kOShpbnRbXSBhcmdzKSB7cmV0dXJuIE9uRG9jV2luZG93QWN0aXZhdGUoYXJnc1swXSk7fQotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QxMChpbnRbXSBhcmdzKSB7cmV0dXJuIE9uRnJhbWVXaW5kb3dBY3RpdmF0ZShhcmdzWzBdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDExKGludFtdIGFyZ3MpIHtyZXR1cm4gUmVzaXplQm9yZGVyKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kMTIoaW50W10gYXJncykge3JldHVybiBUcmFuc2xhdGVBY2NlbGVyYXRvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDEzKGludFtdIGFyZ3MpIHtyZXR1cm4gR2V0T3B0aW9uS2V5UGF0aChhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDE0KGludFtdIGFyZ3MpIHtyZXR1cm4gR2V0RHJvcFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDE1KGludFtdIGFyZ3MpIHtyZXR1cm4gR2V0RXh0ZXJuYWwoYXJnc1swXSk7fQotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QxNihpbnRbXSBhcmdzKSB7cmV0dXJuIFRyYW5zbGF0ZVVybChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTt9ICAgICAgIAotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QxNyhpbnRbXSBhcmdzKSB7cmV0dXJuIEZpbHRlckRhdGFPYmplY3QoYXJnc1swXSwgYXJnc1sxXSk7fQotICAgICAgICB9OwotICAgICAgICBpT2xlQ29tbWFuZFRhcmdldCA9IG5ldyBDT01PYmplY3QobmV3IGludFtdezIsIDAsIDAsIDQsIDV9KSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDAoaW50W10gYXJncykge3JldHVybiBRdWVyeUludGVyZmFjZShhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDEoaW50W10gYXJncykge3JldHVybiBBZGRSZWYoKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDIoaW50W10gYXJncykge3JldHVybiBSZWxlYXNlKCk7fSAgICAgIAotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QzKGludFtdIGFyZ3MpIHtyZXR1cm4gUXVlcnlTdGF0dXMoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7fSAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDQoaW50W10gYXJncykge3JldHVybiBFeGVjKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO30KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQ09NSW50ZXJmYWNlcygpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZUNPTUludGVyZmFjZXMoKTsKLSAgICAgICAgaWYgKGlEb2NIb3N0VUlIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlEb2NIb3N0VUlIYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGlEb2NIb3N0VUlIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaU9sZUNvbW1hbmRUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaU9sZUNvbW1hbmRUYXJnZXQuZGlzcG9zZSgpOwotICAgICAgICAgICAgaU9sZUNvbW1hbmRUYXJnZXQgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBRdWVyeUludGVyZmFjZShpbnQgcmlpZCwgaW50IHBwdk9iamVjdCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gc3VwZXIuUXVlcnlJbnRlcmZhY2UocmlpZCwgcHB2T2JqZWN0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBDT00uU19PSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgaWYgKHJpaWQgPT0gMCB8fCBwcHZPYmplY3QgPT0gMCkgcmV0dXJuIENPTS5FX0lOVkFMSURBUkc7Ci0gICAgICAgIEdVSUQgZ3VpZCA9IG5ldyBHVUlEKCk7Ci0gICAgICAgIENPTS5Nb3ZlTWVtb3J5KGd1aWQsIHJpaWQsIEdVSUQuc2l6ZW9mKTsKLSAgICAgICAgaWYgKENPTS5Jc0VxdWFsR1VJRChndWlkLCBDT00uSUlESURvY0hvc3RVSUhhbmRsZXIpKSB7Ci0gICAgICAgICAgICBDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnRbXSB7aURvY0hvc3RVSUhhbmRsZXIuZ2V0QWRkcmVzcygpfSwgNCk7Ci0gICAgICAgICAgICBBZGRSZWYoKTsKLSAgICAgICAgICAgIHJldHVybiBDT00uU19PSzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJT2xlQ29tbWFuZFRhcmdldCkpIHsKLSAgICAgICAgICAgIENPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludFtdIHtpT2xlQ29tbWFuZFRhcmdldC5nZXRBZGRyZXNzKCl9LCA0KTsKLSAgICAgICAgICAgIEFkZFJlZigpOwotICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICB9Ci0gICAgICAgIENPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludFtdIHswfSwgNCk7Ci0gICAgICAgIHJldHVybiBDT00uRV9OT0lOVEVSRkFDRTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IEFkZFJlZigpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLkFkZFJlZigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgUmVsZWFzZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLlJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICAvKiBJRG9jSG9zdFVJSGFuZGxlciAqLwotCi0gICAgaW50IEVuYWJsZU1vZGVsZXNzKGludCBFbmFibGVNb2RlbGVzcykgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgRmlsdGVyRGF0YU9iamVjdChpbnQgcERPLCBpbnQgcHBET1JldCkgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgR2V0RHJvcFRhcmdldChpbnQgcERyb3BUYXJnZXQsIGludCBwcERyb3BUYXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IEdldEV4dGVybmFsKGludCBwcERpc3BhdGNoKSB7Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkocHBEaXNwYXRjaCwgbmV3IGludFtdIHswfSwgNCk7Ci0gICAgICAgIHJldHVybiBDT00uU19GQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgR2V0SG9zdEluZm8oaW50IHBJbmZvKSB7Ci0gICAgICAgIGludCBzdHlsZSA9IGdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFN0eWxlKCk7Ci0gICAgICAgIGludCBpbmZvID0gMHgwMDA0MDAwMDsKLS8vICAgICAgICBpZiAoKHN0eWxlICYgU1dULkJPUkRFUikgPT0gMCkgaW5mbyB8PSAweDAwMjAwMDAwOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBJbmZvICsgNCwgbmV3IGludFtdIHtpbmZvfSwgNCk7Ci0gICAgICAgIHJldHVybiBDT00uU19PSzsKLSAgICB9Ci0KLSAgICBpbnQgR2V0T3B0aW9uS2V5UGF0aChpbnQgcGNoS2V5LCBpbnQgZHcpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IEhpZGVVSSgpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IE9uRG9jV2luZG93QWN0aXZhdGUoaW50IGZBY3RpdmF0ZSkgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgT25GcmFtZVdpbmRvd0FjdGl2YXRlKGludCBmQWN0aXZhdGUpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IFJlc2l6ZUJvcmRlcihpbnQgcHJjQm9yZGVyLCBpbnQgcFVJV2luZG93LCBpbnQgZkZyYW1lV2luZG93KSB7Ci0gICAgICAgIHJldHVybiBDT00uRV9OT1RJTVBMOwotICAgIH0KLQotICAgIGludCBTaG93Q29udGV4dE1lbnUoaW50IGR3SUQsIGludCBwcHQsIGludCBwY21kdFJlc2VydmVkLCBpbnQgcGRpc3BSZXNlcnZlZCkgewotICAgICAgICAvKiBTaG93IGRlZmF1bHQgSUUgcG9wdXAgbWVudSAqLwotICAgICAgICByZXR1cm4gQ09NLlNfRkFMU0U7Ci0gICAgfQotCi0gICAgaW50IFNob3dVSShpbnQgZHdJRCwgaW50IHBBY3RpdmVPYmplY3QsIGludCBwQ29tbWFuZFRhcmdldCwgaW50IHBGcmFtZSwgaW50IHBEb2MpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IFRyYW5zbGF0ZUFjY2VsZXJhdG9yKGludCBscE1zZywgaW50IHBndWlkQ21kR3JvdXAsIGludCBuQ21kSUQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSGFuZGxlIG1lbnUgYWNjZWxlcmF0b3IKLSAgICAgICAgICovCi0gICAgICAgIE1lbnUgbWVudWJhciA9IGdldFNoZWxsKCkuZ2V0TWVudUJhcigpOwotICAgICAgICBpZiAobWVudWJhciAhPSBudWxsICYmICFtZW51YmFyLmlzRGlzcG9zZWQoKSAmJiBtZW51YmFyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IG1lbnViYXIuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgIGludCBod25kID0gc2hlbGwuaGFuZGxlOwotICAgICAgICAgICAgaW50IGhBY2NlbCA9IE9TLlNlbmRNZXNzYWdlKGh3bmQsIE9TLldNX0FQUCsxLCAwLCAwKTsKLSAgICAgICAgICAgIGlmIChoQWNjZWwgIT0gMCkgewotICAgICAgICAgICAgICAgIE1TRyBtc2cgPSBuZXcgTVNHKCk7Ci0gICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShtc2csIGxwTXNnLCBNU0cuc2l6ZW9mKTsKLSAgICAgICAgICAgICAgICBpZiAoT1MuVHJhbnNsYXRlQWNjZWxlcmF0b3IoaHduZCwgaEFjY2VsLCBtc2cpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBCbG9jayBDdHJsK04gKE5ldyB3aW5kb3cpCi0gICAgICAgICAqLwotICAgICAgICBNU0cgbXNnID0gbmV3IE1TRygpOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KG1zZywgbHBNc2csIE1TRy5zaXplb2YpOwotICAgICAgICBpZiAobXNnLm1lc3NhZ2UgPT0gT1MuV01fS0VZRE9XTiAmJiBtc2cud1BhcmFtID09IE9TLlZLX04gJiYgT1MuR2V0S2V5U3RhdGUgKE9TLlZLX0NPTlRST0wpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDT00uU19GQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgVHJhbnNsYXRlVXJsKGludCBkd1RyYW5zbGF0ZSwgaW50IHBjaFVSTEluLCBpbnQgcHBjaFVSTE91dCkgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgVXBkYXRlVUkoKSB7Ci0gICAgICAgIHJldHVybiBDT00uRV9OT1RJTVBMOwotICAgIH0KLQotICAgIC8qIElPbGVDb21tYW5kVGFyZ2V0ICovCi0gICAgaW50IFF1ZXJ5U3RhdHVzKGludCBwZ3VpZENtZEdyb3VwLCBpbnQgY0NtZHMsIGludCBwcmdDbWRzLCBpbnQgcENtZFRleHQpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVFNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpbnQgRXhlYyhpbnQgcGd1aWRDbWRHcm91cCwgaW50IG5DbWRJRCwgaW50IG5DbWRFeGVjT3B0LCBpbnQgcHZhSW4sIGludCBwdmFPdXQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogRGlzYWJsZSBzY3JpcHQgZXJyb3IgZGlhbG9nLgotICAgICAgICAgKi8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBndWlkQ21kR3JvdXA9IitwZ3VpZENtZEdyb3VwKyIsIG5DbWRJRD0iK25DbWRJRCsiLCBuQ21kRXhlY09wdD0iK25DbWRFeGVjT3B0KyIsIHB2YUluPSIrcHZhSW4rIiwgcHZhT3V0PSIrcHZhT3V0KTsKLSAgICAgICAgaWYgKHBndWlkQ21kR3JvdXAgIT0gMCAmJiBuQ21kSUQgPT0gT0xFQ01ESURfU0hPV1NDUklQVEVSUk9SKSB7Ci0gICAgICAgICAgICBib29sZWFuIGJEaXNhYmxlID0gKChXZWJCcm93c2VySUVDb21wb3NpdGUpKGdldFBhcmVudCgpLmdldFBhcmVudCgpKSkuYkRpc2FibGVTY3JpcHREZWJ1Z2dlcjsKLSAgICAgICAgICAgIGlmKCBiRGlzYWJsZSApIHsKLSAgICAgICAgICAgICAgICBHVUlEIGd1aWQgPSBuZXcgR1VJRCgpOwotICAgICAgICAgICAgICAgIENPTS5Nb3ZlTWVtb3J5KGd1aWQsIHBndWlkQ21kR3JvdXAsIEdVSUQuc2l6ZW9mKTsKLSAgICAgICAgICAgICAgICBpZiAoQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5DR0lEX0RvY0hvc3RDb21tYW5kSGFuZGxlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09NLkVfTk9UU1VQUE9SVEVEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlcklFSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA1OGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5JTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklXZWJCcm93c2VyQUNURjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLk1vZGVsU2VydmljZVNpemVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkRvbUJ5Q29tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLkltYWdlUG9zaXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJJRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLklOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5JV2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5Ccm93c2VyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLkRvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLlByb2dyZXNzQ2hhbmdlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLlN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLndpbjMyLlJlZ2lzdHJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuRGVidWdQcmludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJJRUltcGwgaW1wbGVtZW50cyBJV2ViQnJvd3NlckFDVEYsCi0JCUlXZWJCcm93c2VySUVDb25zdGFudHMsIEJyb3dzZXJFdmVudExpc3RlbmVyIHsKLQotCXByaXZhdGUgV2ViQnJvd3NlclRvb2xiYXIgdG9vbGJhcjsKLQotCXByaXZhdGUgV2ViQnJvd3NlcklFQ29tcG9zaXRlIGJyb3dzZXJDb21wb3NpdGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2luTmF2aWdhdGlvbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIF9pblJlbG9hZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIF9pblN0b3AgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBfaW5KYXZhc2NyaXB0ID0gZmFsc2U7Ci0KLQkvLyBUT0RPIGJhY2ssZm9ydyxzdG9wLHJlcGxhY2UsZXRjLgotCXByaXZhdGUgYm9vbGVhbiBfdXJsRXhpc3Q7Ci0KLQlwcml2YXRlIGludCBfbmF2aWdhdGVFcnJvckNvZGU7Ci0KLQlwcml2YXRlIElXZWJCcm93c2VyUGFydCBfd2ViQnJvd3NlclBhcnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIG9ubG9hZFBvcHVwQmxvY2sgPSB0cnVlOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFsbG93TmV3V2luZG93ID0gZmFsc2U7Ci0KLQlwcml2YXRlIElNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyIHNjcm9sbE1hbmFnZXI7Ci0KLQlwcml2YXRlIGludCBzY3JvbGxiYXJXaWR0aDsKLQotCXByaXZhdGUgRG9tQnlDb20gZG9tQnlDb207Ci0KLQlwcml2YXRlIElOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIgbmV3V2luZG93MkV2ZW50TGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJV2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lciB3aW5kb3dDbG9zZWRFdmVudExpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRV9TRVRUSU5HU19LRVkgPSAiU29mdHdhcmVcXE1pY3Jvc29mdFxcSW50ZXJuZXQgRXhwbG9yZXJcXFNldHRpbmdzIiwgLy8kTk9OLU5MUy0xJAotCQkJQU5DSE9SX0NPTE9SID0gIkFuY2hvciBDb2xvciIsIC8vJE5PTi1OTFMtMSQKLQkJCUFOQ0hPUl9DT0xPUl9WSVNJVEVEID0gIkFuY2hvciBDb2xvciBWaXNpdGVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdlYkJyb3dzZXJJRUltcGwoSVdlYkJyb3dzZXJQYXJ0IHdlYkJyb3dzZXJQYXJ0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0YXJ0VVJMKSB7Ci0JCXRoaXMuX3dlYkJyb3dzZXJQYXJ0ID0gd2ViQnJvd3NlclBhcnQ7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGFyZW50LnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQl0b29sYmFyID0gbmV3IFdlYkJyb3dzZXJUb29sYmFyKHRoaXMsIHBhcmVudCwgU1dULk5PTkUpOwotCQlicm93c2VyQ29tcG9zaXRlID0gbmV3IFdlYkJyb3dzZXJJRUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJyb3dzZXJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJyb3dzZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKG51bGwgPT0gc3RhcnRVUkwpIHsKLQkJCXN0YXJ0VVJMID0gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRvb2xiYXIuc2V0QWRkcmVzc1RleHRTdHJpbmcoc3RhcnRVUkwpOwotCi0JCWJyb3dzZXJDb21wb3NpdGUuc2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKHRydWUpOwotCi0JCWJyb3dzZXJDb21wb3NpdGUuYWRkQnJvd3NlckV2ZW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJc2Nyb2xsTWFuYWdlciA9IG5ldyBXZWJCcm93c2VySUVTY3JvbGxNYW5hZ2VyKHRoaXMpOwotCi0JCWRvbUJ5Q29tID0gbmV3IERvbUJ5Q29tKGdldElXZWJCcm93c2VyMigpKTsKLQotCQluYXZpZ2F0ZShzdGFydFVSTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXNBZGRyZXNzVGV4dChib29sZWFuIHNlbGVjdEFsbCkgewotCQl0b29sYmFyLnNldEZvY3VzVG9BZGRyZXNzVGV4dChzZWxlY3RBbGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dBZGRyZXNzVGV4dChib29sZWFuIGZsYWcpIHsKLQkJdG9vbGJhci5zaG93QWRkcmVzc1RleHQoZmxhZyk7Ci0JfQotCi0JLyoKLQkgKiBicm93c2UgY29tbWFuZHMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIG5hdmlnYXRlKFN0cmluZyB1cmwpIHsKLQotCQl0b29sYmFyLnNldEFkZHJlc3NUZXh0U3RyaW5nKHVybCk7Ci0KLQkJdGhpcy5fdXJsRXhpc3QgPSB0cnVlOwotCQl0aGlzLl9uYXZpZ2F0ZUVycm9yQ29kZSA9IDIwMDsKLQotCQlicm93c2VyQ29tcG9zaXRlLm5hdmlnYXRlKHVybCk7Ci0KLQkJLy8gVE9ETyBmaWxlOi8vIGNhc2UgKFJlYWR5U3RhdGUgPSAxKQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlOiIrZ2V0UmVhZHlTdGF0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnb0JhY2t3YXJkKCkgewotCQkvLyBUT0RPIHJlbmFtZT8KLQkJYnJvd3NlckNvbXBvc2l0ZS5nb0JhY2soKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnb0ZvcndhcmQoKSB7Ci0JCWJyb3dzZXJDb21wb3NpdGUuZ29Gb3J3YXJkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmF2aWdhdGVTdG9wKCkgewotCQlpZiAoX2luTmF2aWdhdGlvbiB8fCBfaW5SZWxvYWQpIHsKLQkJCV9pblN0b3AgPSB0cnVlOwotCQkJX2luTmF2aWdhdGlvbiA9IGZhbHNlOwotCQkJX2luUmVsb2FkID0gZmFsc2U7Ci0JCQlfaW5KYXZhc2NyaXB0ID0gZmFsc2U7Ci0JCX0KLQkJYnJvd3NlckNvbXBvc2l0ZS5zdG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmF2aWdhdGVSZWZyZXNoKCkgewotCQlpZiAoIV9pblJlbG9hZCkgewotCQkJX2luUmVsb2FkID0gdHJ1ZTsKLQkJCV9pbkphdmFzY3JpcHQgPSBmYWxzZTsKLQkJCVdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi5teVJlZnJlc2goV2ViQnJvd3NlcklFSW1wbC50aGlzKTsKLQkJfQotCQlicm93c2VyQ29tcG9zaXRlLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNXaG9sZQotCSAqIEByZXR1cm4gKGJyb3dzZXJTaXplWCwgYnJvd3NlclNpemVZLCBwYWdlU2l6ZVgsIHBhZ2VTaXplWSkKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxTZXJ2aWNlU2l6ZUluZm8gZ2V0QnJvd3NlclNpemUoYm9vbGVhbiBpc1dob2xlKSB7Ci0JCWludFtdIHNpemUgPSBuZXcgaW50W10geyAxLCAxLCAxLCAxIH07Ci0JCWludCB3aWR0aCA9IGJyb3dzZXJDb21wb3NpdGUuZ2V0V2lkdGgoKS00OwotCQlpbnQgaGVpZ2h0ID0gYnJvd3NlckNvbXBvc2l0ZS5nZXRIZWlnaHQoKS00OwotCQlzaXplWzBdID0gd2lkdGgtc2Nyb2xsYmFyV2lkdGg7Ci0JCXNpemVbMV0gPSBoZWlnaHQ7Ci0JCXNpemVbMl0gPSB3aWR0aC1zY3JvbGxiYXJXaWR0aDsKLQkJc2l6ZVszXSA9IGhlaWdodDsJCQkKLQkJaWYoaXNXaG9sZSl7Ci0JCQlpbnRbXSB0bXBTaXplID0gYnJvd3NlckNvbXBvc2l0ZS5nZXRXaG9sZVNpemUoKTsKLQkJCWlmKHRtcFNpemUubGVuZ3RoPT0yJiZ0bXBTaXplWzBdPi0xJiZ0bXBTaXplWzFdPi0xKXsKLQkJCQlzaXplWzJdID0gdG1wU2l6ZVswXTsKLQkJCQlzaXplWzNdID0gdG1wU2l6ZVsxXTsKLQkJCQlpZih0bXBTaXplWzBdPnNpemVbMF0pewotCQkJCQlzaXplWzFdIC09c2Nyb2xsYmFyV2lkdGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJcmV0dXJuIChuZXcgTW9kZWxTZXJ2aWNlU2l6ZUluZm8oc2l6ZVswXSwgc2l6ZVsxXSwgc2l6ZVsyXSwgc2l6ZVszXSkpOwotCX0KLQotCS8qCi0JICogbmF2aWdhdGlvbiByZXN1bHQKLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0UmVhZHlTdGF0ZSgpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0UmVhZHlTdGF0ZSgpOwotCX0KLQotCS8vIFRPRE8gYWRkIHRvIElXZWJCcm93c2VyIEludGVyZmFjZQotCS8vIEJyb3dzZXIgcHJvcGVydGllcwotCS8vICJXaWR0aCIKLQkvLyAiSGVpZ2h0IgotCS8vICJMZWZ0IgotCS8vICJUb3AiCi0JLy8gIkJyb3dzZXJUeXBlIgotCS8vICJTaWxlbnQiCi0JLy8gInNldFNpbGVudCIKLQotCS8vIFRPRE8gcmVtb3ZlPwotCXB1YmxpYyBib29sZWFuIGlzUmVhZHkoKSB7Ci0JCXJldHVybiAoZ2V0UmVhZHlTdGF0ZSgpID09IFJFQURZU1RBVEVfQ09NUExFVEUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gYnJvd3NlckNvbXBvc2l0ZS5nZXRMb2NhdGlvblVSTCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25OYW1lKCkgewotCQlyZXR1cm4gYnJvd3NlckNvbXBvc2l0ZS5nZXRMb2NhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VybEV4aXN0cygpIHsKLQkJLy8gVE9ETwotCQlyZXR1cm4gdGhpcy5fdXJsRXhpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXROYXZpZ2F0ZUVycm9yQ29kZSgpIHsKLQkJLy8gVE9ETwotCQlyZXR1cm4gdGhpcy5fbmF2aWdhdGVFcnJvckNvZGU7Ci0JfQotCi0JLyoKLQkgKiBTY3JvbGwKLQkgKi8KLQotCXB1YmxpYyBJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlciBnZXRTY3JvbGxNYW5hZ2VyKCkgewotCQlyZXR1cm4gc2Nyb2xsTWFuYWdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzY3JvbGxZKGludCB5KSB7Ci0JCWJyb3dzZXJDb21wb3NpdGUuc2Nyb2xsKDAsIHksIFdlYkJyb3dzZXJJRUNvbXBvc2l0ZS5TQ1JPTExfQlkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNjcm9sbFRvKGludCB4LCBpbnQgeSkgewotCQlicm93c2VyQ29tcG9zaXRlLnNjcm9sbCh4LCB5LCBXZWJCcm93c2VySUVDb21wb3NpdGUuU0NST0xMX1RPKTsKLQl9Ci0KLQkvKgotCSAqIGJyb3dzZXIgc2V0dGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhsaW5rU3RvcChib29sZWFuIGJTdG9wKSB7Ci0JCS8vIFRPRE8gbG93IHByaW9yaXR5Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2ViQnJvd3NlclNpbGVudChib29sZWFuIGJTaWxlbnQpIHsKLQkJYnJvd3NlckNvbXBvc2l0ZS5zZXRTaWxlbnQoYlNpbGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKGJvb2xlYW4gYkRpc2FibGUpIHsKLQkJYnJvd3NlckNvbXBvc2l0ZS5zZXREaXNhYmxlU2NyaXB0RGVidWdnZXIoYkRpc2FibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlJbWFnZShib29sZWFuIGRpc3BsYXkpIHsKLQkJLy8gVE9ETwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzYWJsZVNjcmlwdERlYnVnZ2VyKCkgewotCQlyZXR1cm4gYnJvd3NlckNvbXBvc2l0ZS5nZXREaXNhYmxlU2NyaXB0RGVidWdnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZShpbnQgZm9udFNpemUpIHsKLQkJYnJvd3NlckNvbXBvc2l0ZS5zZXRGb250U2l6ZShmb250U2l6ZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRGb250U2l6ZSgpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0Rm9udFNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIGhpZ2hsaWdodAotCSAqLwotCi0JcHVibGljIHZvaWQgaGlnaGxpZ2h0RWxlbWVudEJ5SWQoU3RyaW5nIGlkVmFsKSB7Ci0JCS8vIFRPRE8gbG93IHByaW9yaXR5Ci0JfQotCi0JcHVibGljIHZvaWQgaGlnaHRsaWdodEVsZW1lbnRCeUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCS8vIFRPRE8gbG93IHByaW9yaXR5Ci0JfQotCi0JcHVibGljIHZvaWQgcmVjb3ZlcnlIaWdobGlnaHQoKSB7Ci0JCS8vIFRPRE8gbG93IHByaW9yaXR5Ci0JfQotCi0JcHVibGljIFJHQiBnZXRBbmNob3JDb2xvcigpIHsKLQkJU3RyaW5nIGNvbG9yID0gUmVnaXN0cnlVdGlsLmdldFJlZ2lzdG9yeVN0cmluZyhPUy5IS0VZX0NVUlJFTlRfVVNFUiwKLQkJCQlJRV9TRVRUSU5HU19LRVksIEFOQ0hPUl9DT0xPUik7Ci0JCXJldHVybiBnZXRSR0IoY29sb3IpOwotCX0KLQotCXB1YmxpYyBSR0IgZ2V0VmlzaXRlZEFuY2hvckNvbG9yKCkgewotCQlTdHJpbmcgY29sb3IgPSBSZWdpc3RyeVV0aWwuZ2V0UmVnaXN0b3J5U3RyaW5nKE9TLkhLRVlfQ1VSUkVOVF9VU0VSLAotCQkJCUlFX1NFVFRJTkdTX0tFWSwgQU5DSE9SX0NPTE9SX1ZJU0lURUQpOwotCQlyZXR1cm4gZ2V0UkdCKGNvbG9yKTsKLQl9Ci0KLQlwcml2YXRlIFJHQiBnZXRSR0IoU3RyaW5nIGNvbG9yKSB7Ci0JCWlmIChudWxsICE9IGNvbG9yKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZ1tdIHN0ckFycmF5ID0gY29sb3Iuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgUkdCKEludGVnZXIucGFyc2VJbnQoc3RyQXJyYXlbMF0pLCBJbnRlZ2VyCi0JCQkJCQkucGFyc2VJbnQoc3RyQXJyYXlbMV0pLCBJbnRlZ2VyLnBhcnNlSW50KHN0ckFycmF5WzJdKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SVdlYkJyb3dzZXIyKCkgewotCQlyZXR1cm4gYnJvd3NlckNvbXBvc2l0ZS5nZXRCcm93c2VyQWRkcmVzcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0TUlNRVR5cGVzKCkgewotCQlyZXR1cm4gTUlNRVRZUEVTX0hUTUw7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gRVhUU19IVE1MOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oU3RyaW5nIHVybCkgewotCQluYXZpZ2F0ZSh1cmwpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oRmlsZSB0YXJnZXQpIHsKLQkJaWYgKG51bGwgIT0gdGFyZ2V0KSB7Ci0JCQkvLyBUT0RPIHRlc3QKLQkJCW5hdmlnYXRlKHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCS8vIFRPRE8gdXNlciBzYXZlKGZpbGVuYW1lKSBhbmQgaHRtbCBwYXJzZXIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldExpdmVEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGRvbUJ5Q29tLmdldERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBnZXRUYXJnZXRDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBicm93c2VyQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyBGaWxlIHNhdmVEb2N1bWVudEFzSFRNTEZpbGUoU3RyaW5nIGZpbGUpIHsKLQkJaWYgKG51bGwgIT0gZmlsZSkgewotCQkJLy8gVE9ETyByZXBsYWNlIHdpdGggRG9tQnlDT00gKG5lZWQgd3JpdGUgYXMgWE1MIHN1cHBvcnQpCi0JCQlib29sZWFuIHNhdmVMaXZlRE9NID0gKGJyb3dzZXJDb21wb3NpdGUuc2F2ZUxpdmVEb20oZmlsZSkpOwotCQkJaWYgKCFzYXZlTGl2ZURPTSkgewotCQkJCXJldHVybiBuZXcgRmlsZShmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBzYXZlT3JpZ2luYWxEb2N1bWVudChTdHJpbmcgZmlsZSkgewotCQlpZiAobnVsbCAhPSBmaWxlKSB7Ci0JCQlib29sZWFuIHNhdmVPcmlnSHRtbFNvdXJjZSA9IChicm93c2VyQ29tcG9zaXRlLnNhdmUoZmlsZSkpOwotCQkJaWYgKCFzYXZlT3JpZ0h0bWxTb3VyY2UpIHsKLQkJCQlyZXR1cm4gbmV3IEZpbGUoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQganVtcFRvTm9kZShOb2RlIHRhcmdldCkgewotCQkvLyBUT0RPIGltcGwgZm9yIFJ1bnRpbWUgRG9tCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50TUlNRVR5cGUoKSB7Ci0JCS8vIFRPRE8gZ2V0IGluZm8gZnJvbSBicm93c2VyCi0JCXJldHVybiBNSU1FVFlQRVNfSFRNTFswXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY3JvbGxiYXJXaWR0aChpbnQgd2lkdGgpIHsKLQkJLy8gVE9ETyBJbXBsZW1lbnQgd2l0aGluIEJyb3dzZXIgLT4gcmVtb3ZlIGZyb20gaW50ZXJmYWNlCi0JCS8vIGN1cnJlbnRseSB1c2VzIGxvd1Zpc2lvblZpZXcuZ2V0VmFydGljYWxCYXJTaXplKCkueAotCQlzY3JvbGxiYXJXaWR0aCA9IHdpZHRoOwotCQlzY3JvbGxNYW5hZ2VyLnNldFNjcm9sbEJhcldpZHRoKHdpZHRoKTsKLQl9Ci0KLQkvKgotCSAqIEJyb3dzZXJFdmVudExpc3RlbmVyIGltcGxlbWVudGF0aW9ucwotCSAqLwotCi0JcHVibGljIHZvaWQgYmVmb3JlTmF2aWdhdGUyKEJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJLy8gX2luTmF2aWdhdGlvbiA9IHRydWU7Ci0JCVN0cmluZyB0YXJnZXQgPSBwYXJhbS5nZXRVcmwoKTsKLQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJCTjogIiArIHRhcmdldCArICIgIgotCQkJCSsgcGFyYW0uZ2V0VGFyZ2V0RnJhbWVOYW1lKCkpOwotCQlpZiAoIV9pblJlbG9hZCkgewotCQkJaWYgKCF0YXJnZXQuc3RhcnRzV2l0aCgiamF2YXNjcmlwdCIpKSB7IC8vIFRPRE8gLy8kTk9OLU5MUy0xJAotCQkJCV9pbkphdmFzY3JpcHQgPSBmYWxzZTsKLQkJCQlfaW5OYXZpZ2F0aW9uID0gdHJ1ZTsKLQkJCQlfaW5SZWxvYWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJX2luSmF2YXNjcmlwdCA9IHRydWU7Ci0JCQkJX2luTmF2aWdhdGlvbiA9IGZhbHNlOwotCQkJCV9pblJlbG9hZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCVdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi5iZWZvcmVOYXZpZ2F0ZSh0aGlzLCB0YXJnZXQsIHBhcmFtCi0JCQkJLmdldFRhcmdldEZyYW1lTmFtZSgpLCBfaW5OYXZpZ2F0aW9uKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q29tcGxldGUoRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJaWYgKHBhcmFtLmlzVG9wV2luZG93KCkpIHsKLQkJCVdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi5teURvY3VtZW50Q29tcGxldGUodGhpcyk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm15RG9jQ29tcGxldGUiKTsKLQkJCV9pbk5hdmlnYXRpb24gPSBmYWxzZTsKLQkJCV9pbkphdmFzY3JpcHQgPSBmYWxzZTsKLQkJCV9pblJlbG9hZCA9IGZhbHNlOwotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnQgQ29tcGxldGU6IitwYXJhbS5nZXRVcmwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuYXZpZ2F0ZUNvbXBsZXRlMihOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLm5hdmlnYXRlQ29tcGxldGUodGhpcywgcGFyYW0uZ2V0VXJsKCkpOwotCQl0b29sYmFyCi0JCQkJLnNldEFkZHJlc3NUZXh0U3RyaW5nKGJyb3dzZXJDb21wb3NpdGUuZ2V0TG9jYXRpb25VUkwoKS8qIHBhcmFtLmdldFVybCgpICovKTsKLQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJOYXZpZ2F0ZUNvbXBsZXRlMiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5hdmlnYXRlRXJyb3IoTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJOYXZpZ2F0ZSBFcnJvci4gVVJMOiIgKyBwYXJhbS5nZXRVcmwoKQotCQkJCSsgIiBTdGF0dXMgQ29kZToiICsgcGFyYW0uZ2V0U3RhdHVzQ29kZSgpKTsKLQotCQlfbmF2aWdhdGVFcnJvckNvZGUgPSBwYXJhbS5nZXRTdGF0dXNDb2RlKCk7Ci0JCV91cmxFeGlzdCA9IGZhbHNlOwotCQlfaW5OYXZpZ2F0aW9uID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3V2luZG93MihOZXdXaW5kb3cyUGFyYW1ldGVycyBwYXJhbSkgewotCQlpZiAoX2luTmF2aWdhdGlvbiAmJiBvbmxvYWRQb3B1cEJsb2NrLyogIWJyb3dzZXIyLlJFQURZU1RBVEVfQ09NUExFVEUgKi8pIHsKLQkJCS8vIFRPRE8KLQkJCXBhcmFtLnNldENhbmNlbCh0cnVlKTsKLQkJfSBlbHNlIGlmIChuZXdXaW5kb3cyRXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQluZXdXaW5kb3cyRXZlbnRMaXN0ZW5lci5uZXdXaW5kb3cyKHBhcmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2dyZXNzQ2hhbmdlKFByb2dyZXNzQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotCQlpbnQgcHJvZyA9IHBhcmFtLmdldFByb2dyZXNzKCk7Ci0JCWludCBwcm9nTWF4ID0gcGFyYW0uZ2V0UHJvZ3Jlc3NNYXgoKTsKLQkJV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLnByb2dyZXNzQ2hhbmdlKHRoaXMsIHByb2csIHByb2dNYXgpOwotCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oIlN0b3A6ICIgKyBfaW5TdG9wICsgIiBSZWxvYWQ6ICIKLQkJCQkrIF9pblJlbG9hZCArICIgaW5KYXZhU2NyaXB0OiAiICsgX2luSmF2YXNjcmlwdAotCQkJCSsgIiBuYXZpZ2F0aW9uOiAiICsgX2luTmF2aWdhdGlvbik7Ci0JCWlmIChfaW5TdG9wKSB7Ci0JCQlpZiAocHJvZyA9PSAwICYmIHByb2dNYXggPT0gMCkgewotCQkJCV9pblN0b3AgPSBmYWxzZTsKLQkJCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oInN0b3AgZmluIik7Ci0JCQkJV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLm5hdmlnYXRlU3RvcCh0aGlzKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChfaW5SZWxvYWQpIHsKLQkJCWlmIChwcm9nID09IDAgJiYgcHJvZ01heCA9PSAwKSB7Ci0JCQkJX2luUmVsb2FkID0gZmFsc2U7Ci0JCQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJyZWxvYWQgZmluIik7Ci0JCQkJV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLm15UmVmcmVzaENvbXBsZXRlKHRoaXMpOwotCQkJfQotCQl9IGVsc2UgaWYgKF9pbkphdmFzY3JpcHQpIHsKLQkJCWlmIChwcm9nID09IC0xICYmIHByb2dNYXggPT0gLTEpIHsKLQkJCQlfaW5KYXZhc2NyaXB0ID0gZmFsc2U7Ci0JCQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJqYXZhc2NyaXB0IGZpbiIpOwotCQkJfQotCQl9IGVsc2UgaWYgKCFfaW5OYXZpZ2F0aW9uICYmICEocHJvZyA9PSAwICYmIHByb2dNYXggPT0gMCkpIHsKLQkJCS8vIDAvMCBpcyBjb21wbGV0ZQotCQkJX2luUmVsb2FkID0gdHJ1ZTsKLQkJCURlYnVnUHJpbnRVdGlsLmRlYnVnUHJpbnRsbigicmVsb2FkIik7Ci0JCQlXZWJCcm93c2VyRXZlbnRFeHRlbnNpb24ubXlSZWZyZXNoKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdHVzVGV4dENoYW5nZShTdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocGFyYW0uZ2V0VGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0aXRsZUNoYW5nZShUaXRsZUNoYW5nZVBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0aXRsZSA9IHBhcmFtLmdldFRleHQoKTsKLQkJCVdlYkJyb3dzZXJFdmVudEV4dGVuc2lvbi50aXRsZUNoYW5nZSh0aGlzLCB0aXRsZSk7Ci0JCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oIlRpdGxlQ2hhbmdlIik7Ci0JCQlpZiAoIShfaW5OYXZpZ2F0aW9uIHx8IF9pblN0b3ApKSB7Ci0JCQkJaWYgKCFfaW5SZWxvYWQpIHsKLQkJCQkJX2luUmVsb2FkID0gdHJ1ZTsKLQkJCQkJX2luSmF2YXNjcmlwdCA9IGZhbHNlOwotCQkJCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oInJlbG9hZCIpOwotCQkJCQlXZWJCcm93c2VyRXZlbnRFeHRlbnNpb24ubXlSZWZyZXNoKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChfd2ViQnJvd3NlclBhcnQgIT0gbnVsbCkgewotCQkJCV93ZWJCcm93c2VyUGFydC5jaGFuZ2VUaXRsZSh0aGlzLCB0aXRsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dDbG9zaW5nUGFyYW1ldGVycyBwYXJhbSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZCgpIHsKLQkJaWYgKHdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJd2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lci53aW5kb3dDbG9zZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIFdlYkJyb3dzZXJJRUltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIjoiICsgdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb25OYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3V2luZG93MkV2ZW50TGlzdGVuZXIoCi0JCQlJTmV3V2lvbmRvdzJFdmVudExpc3RlbmVyIG5ld1dpbmRvdzJFdmVudExpc3RuZXIpIHsKLQkJdGhpcy5uZXdXaW5kb3cyRXZlbnRMaXN0ZW5lciA9IG5ld1dpbmRvdzJFdmVudExpc3RuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lcigKLQkJCUlXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyIHdpbmRvd0Nsb3NpbmdFdmVudExpc3RlbmVyKSB7Ci0JCXRoaXMud2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lciA9IHdpbmRvd0Nsb3NpbmdFdmVudExpc3RlbmVyOwotCX0KLQotCXB1YmxpYyBJbWFnZVBvc2l0aW9uSW5mb1tdIGdldEFsbEltYWdlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBicm93c2VyQ29tcG9zaXRlLmdldEFsbEltYWdlUG9zaXRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVTY3JvbGxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlcklFU2Nyb2xsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzNlMWRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW1wbC9XZWJCcm93c2VySUVTY3JvbGxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5Nb2RlbFNlcnZpY2VTaXplSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJJRVNjcm9sbE1hbmFnZXIgaW1wbGVtZW50cyBJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlciB7Ci0KLSAgICBpbnQgc2Nyb2xsQmFyV2lkdGg7Ci0gICAgV2ViQnJvd3NlcklFSW1wbCBicm93c2VySUU7Ci0KLSAgICBwdWJsaWMgV2ViQnJvd3NlcklFU2Nyb2xsTWFuYWdlcihXZWJCcm93c2VySUVJbXBsIGJyb3dzZXJJRSkgewotICAgICAgICB0aGlzLmJyb3dzZXJJRSA9IGJyb3dzZXJJRTsKLSAgICB9Ci0gICAgCi0gICAgLy9kbyBub3QgaGF2ZSB0byB3YWl0IHJlbmRlcmluZyAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaW50IHksIGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICBicm93c2VySUUuc2Nyb2xsWSh5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaW50IHgsIGludCB5LCBib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgYnJvd3NlcklFLnNjcm9sbFRvKHgsIHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50U2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50U2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50U2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50U2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50TGFyZ2VTY3JvbGxYKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZWNyZW1lbnRMYXJnZVNjcm9sbFkoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluY3JlbWVudExhcmdlU2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50TGFyZ2VTY3JvbGxZKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZWNyZW1lbnRQYWdlU2Nyb2xsKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmNyZW1lbnRQYWdlU2Nyb2xsKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSAgICAgICAgICAgIAotICAgIAotICAgIHB1YmxpYyBpbnQganVtcFRvUGFnZShpbnQgcGFnZU51bWJlciwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRQYWdlTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMYXN0UGFnZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNjcm9sbFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBQlNPTFVURV9DT09SRElOQVRFOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RlbFNlcnZpY2VTaXplSW5mbyBnZXRTaXplKGJvb2xlYW4gaXNXaG9sZSkgewotICAgICAgICByZXR1cm4gYnJvd3NlcklFLmdldEJyb3dzZXJTaXplKGlzV2hvbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjcm9sbEJhcldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBzY3JvbGxCYXJXaWR0aCA9IHdpZHRoOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbXBsL1dlYkJyb3dzZXJUb29sYmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlclRvb2xiYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2YjBkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ltcGwvV2ViQnJvd3NlclRvb2xiYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklXZWJCcm93c2VyQUNURjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuQnJvd3NlcklFX1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmludGVybmFsLmVkaXRvci5Nb2RlbFNlcnZpY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyVG9vbGJhciBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLSAgICAvLyBUT0RPIG1vdmUgdG8gYmFzZSBwbHVnaW4KLQotICAgIHByaXZhdGUgVGV4dCBfYWRkcmVzc1RleHQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gX2lzRm9jdXNPblRleHQ7Ci0KLSAgICBwcml2YXRlIElXZWJCcm93c2VyQUNURiBicm93c2VyOwotCi0gICAgcHVibGljIFdlYkJyb3dzZXJUb29sYmFyKElXZWJCcm93c2VyQUNURiBicm93c2VyLCBDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLSAgICAgICAgdGhpcy5icm93c2VyID0gYnJvd3NlcjsKLSAgICAgICAgCi0gICAgICAgIHNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAxOwotICAgICAgICBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgaW5pdExheW91dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0TGF5b3V0KCkgewotICAgICAgICBMYWJlbCBhZGRyZXNzTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotICAgICAgICBhZGRyZXNzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0gICAgICAgIGFkZHJlc3NMYWJlbC5zZXRUZXh0KCIgIiArIE1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiV2ViQnJvd3Nlci5BZGRyZXNzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYWRkcmVzc0xhYmVsLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBhcmcwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZzAuc3RhdGVNYXNrID09IFNXVC5BTFQgJiYgKGFyZzAuY2hhcmFjdGVyID09ICdkJyB8fCBhcmcwLmNoYXJhY3RlciA9PSAnRCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzVGV4dC5zZXRGb2N1cygpOwotICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLl9hZGRyZXNzVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAxMDI0OwotICAgICAgICBfYWRkcmVzc1RleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHRoaXMuX2FkZHJlc3NUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBfaXNGb2N1c09uVGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChicm93c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgV2ViQnJvd3NlckV2ZW50RXh0ZW5zaW9uLmZvY3VzTG9zdE9mQWRkcmVzc1RleHQoYnJvd3Nlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBXZWJCcm93c2VyRXZlbnRFeHRlbnNpb24uZm9jdXNHYWluZWRPZkFkZHJlc3NUZXh0KGJyb3dzZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5fYWRkcmVzc1RleHQuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9pc0ZvY3VzT25UZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgX2lzRm9jdXNPblRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIFRPRE8gdXNlIGFjdGlvbgotCi0gICAgICAgIHRoaXMuX2FkZHJlc3NUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5vcGVuKF9hZGRyZXNzVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtYWluaW5nIHRoZSBmb2N1cyBvbiB0aGUgYWRkcmVzcyBmaWVsZCBjYXVzZXMgbmF2aWdhdGlvbiBwcm9ibGVtIG9uIGFpQnJvd3NlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgYSBtYWtlc2hpZnQsIHdlIG1vdmUgdGhlIGZvY3VzIHRvIHRoZSB0b29sYmFyIHBhcmVudCBidXQgd2Ugc2hvdWxkIHJlY29uc2lkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJlYXRtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgV2ViQnJvd3NlclRvb2xiYXIudGhpcy5mb3JjZUZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQnV0dG9uIHNlYXJjaEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5VTEwpOwotICAgICAgICBzZWFyY2hCdXR0b24uc2V0TGF5b3V0RGF0YShnZXRCdXR0b25zR3JpZERhdGEoKSk7Ci0gICAgICAgIHNlYXJjaEJ1dHRvbi5zZXRUZXh0KE1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiV2ViQnJvd3Nlci5HbyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZWFyY2hCdXR0b24uc2V0VG9vbFRpcFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJCcm93c2VyLkdvX3RwIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vVE9ETwotICAgICAgICBzZWFyY2hCdXR0b24uc2V0SW1hZ2UoQnJvd3NlcklFX1BsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENvbW1vblBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9icm93c2VyL2dvLnBuZyIpLmNyZWF0ZUltYWdlKCkpOwotICAgICAgICBzZWFyY2hCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIub3BlbihfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAvLyBfY29tcG9zaXRlUGFyZW50LmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihzZWFyY2hCdXR0b24pOwotICAgIH0KLQotICAgIHByaXZhdGUgR3JpZERhdGEgZ2V0QnV0dG9uc0dyaWREYXRhKCkgewotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMzI7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDMyOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVI7Ci0KLSAgICAgICAgcmV0dXJuIGdyaWREYXRhOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkcmVzc1RleHRTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBfYWRkcmVzc1RleHQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBZGRyZXNzVGV4dFN0cmluZyhTdHJpbmcgdGFyZ2V0UykgewotICAgICAgICBfYWRkcmVzc1RleHQuc2V0VGV4dCh0YXJnZXRTKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Rm9jdXNUb0FkZHJlc3NUZXh0KGJvb2xlYW4gc2VsZWN0QWxsKSB7Ci0gICAgICAgIGlmICghaXNWaXNpYmxlKCkpIHNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIF9hZGRyZXNzVGV4dC5zZXRGb2N1cygpOwotICAgICAgICBpZiAoc2VsZWN0QWxsKSB7Ci0gICAgICAgICAgICBfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfYWRkcmVzc1RleHQuc2V0U2VsZWN0aW9uKDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd0FkZHJlc3NUZXh0KGJvb2xlYW4gZmxhZykgewotICAgICAgICB0aGlzLnNldFZpc2libGUoZmxhZyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzhkMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHM7Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgaW50IGdldEJyb3dzZXJBZGRyZXNzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCi0gICAgcHVibGljIGludCBnZXRGbGFncygpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRGcmFtZU5hbWUoKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UG9zdERhdGEoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVycygpOwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWwoYm9vbGVhbiBjYW5jZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9Ccm93c2VyRXZlbnRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9Ccm93c2VyRXZlbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDA1ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvQnJvd3NlckV2ZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHM7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJvd3NlckV2ZW50QWRhcHRlciBpbXBsZW1lbnRzIEJyb3dzZXJFdmVudExpc3RlbmVyIHsKLQotICAgIHB1YmxpYyB2b2lkIGJlZm9yZU5hdmlnYXRlMihCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbmF2aWdhdGVDb21wbGV0ZTIoTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbmF2aWdhdGVFcnJvcihOYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyBwYXJhbSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50Q29tcGxldGUoRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXdXaW5kb3cyKE5ld1dpbmRvdzJQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvZ3Jlc3NDaGFuZ2UoUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhdHVzVGV4dENoYW5nZShTdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRpdGxlQ2hhbmdlKFRpdGxlQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL0Jyb3dzZXJFdmVudExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9Ccm93c2VyRXZlbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGMxN2U3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL0Jyb3dzZXJFdmVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQnJvd3NlckV2ZW50TGlzdGVuZXIgewotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlTmF2aWdhdGUyKEJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMgcGFyYW0pOwotICAgIAotICAgIHB1YmxpYyB2b2lkIG5hdmlnYXRlQ29tcGxldGUyKE5hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVycyBwYXJhbSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBuYXZpZ2F0ZUVycm9yKE5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzIHBhcmFtKTsKLQotICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50Q29tcGxldGUoRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMgcGFyYW0pOwotCi0gICAgcHVibGljIHZvaWQgbmV3V2luZG93MihOZXdXaW5kb3cyUGFyYW1ldGVycyBwYXJhbSk7Ci0KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzIHBhcmFtKTsKLQotICAgIHB1YmxpYyB2b2lkIHN0YXR1c1RleHRDaGFuZ2UoU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMgcGFyYW0pOwotCi0gICAgcHVibGljIHZvaWQgdGl0bGVDaGFuZ2UoVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKTsKLQotICAgIHB1YmxpYyB2b2lkIHByb2dyZXNzQ2hhbmdlKFByb2dyZXNzQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL0RvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVlMjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL0RvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMgewotCi0gICAgcHVibGljIGludCBnZXRXaW5kb3dBZGRyZXNzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUb3BXaW5kb3coKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhNTU5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzOwotCi0KLQotcHVibGljIGludGVyZmFjZSBOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMgewotCi0gICAgcHVibGljIGludCBnZXRCcm93c2VyQWRkcmVzcygpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL05hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTYyYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzOwotCi0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIE5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzIHsKLQotICAgIHB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEZyYW1lTmFtZSgpOwotCi0gICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWwoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbChib29sZWFuIGNhbmNlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL05ld1dpbmRvdzJQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9OZXdXaW5kb3cyUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA3Y2ZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL05ld1dpbmRvdzJQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTmV3V2luZG93MlBhcmFtZXRlcnMgewotCi0gICAgcHVibGljIGludCBnZXRCcm93c2VyQWRkcmVzcygpOwotCi0gICAgcHVibGljIHZvaWQgc2V0QnJvd3NlckFkZHJlc3MoaW50IGFkZHJlc3MpOwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWwoYm9vbGVhbiBjYW5jZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL1Byb2dyZXNzQ2hhbmdlUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzQ4ZWQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL1Byb2dyZXNzQ2hhbmdlUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHM7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2dyZXNzQ2hhbmdlUGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgaW50IGdldFByb2dyZXNzKCk7Ci0KLSAgICBwdWJsaWMgaW50IGdldFByb2dyZXNzTWF4KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL1N0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9TdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjYxOGUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL1N0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMgewotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL1RpdGxlQ2hhbmdlUGFyYW1ldGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWMwM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzIHsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9XaW5kb3dDbG9zaW5nUGFyYW1ldGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxNTAzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9XaW5kb3dDbG9zaW5nUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHM7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFdpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGdldElzQ2hpbGRXaW5kb3coKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGdldENhbmNlbCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsKGJvb2xlYW4gY2FuY2VsKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9BYnN0cmFjdEV2ZW50UGFyYW1ldGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9BYnN0cmFjdEV2ZW50UGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEyYjE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT007Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVBdXRvbWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ29udHJvbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQ7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgewotCi0gICAgcHJvdGVjdGVkIE9sZUV2ZW50IGV2ZW50OwotICAgIAotICAgIHByb3RlY3RlZCBBYnN0cmFjdEV2ZW50UGFyYW1ldGVycyhPbGVFdmVudCBldmVudCkgewotICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBWYXJpYW50IGdldFZhcmlhbnQoaW50IGluZGV4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZlbnQuYXJndW1lbnRzW2luZGV4XTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBldmVudC5hcmd1bWVudHNbaW5kZXhdLmdldFN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBpbnQgZ2V0SW50ZWdlcihpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBldmVudC5hcmd1bWVudHNbaW5kZXhdLmdldEludCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGdldEJvb2xlYW4oaW50IGluZGV4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZlbnQuYXJndW1lbnRzW2luZGV4XS5nZXRCb29sZWFuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldEJvb2xlYW5CeVJlZihpbnQgaW5kZXgsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV2ZW50LmFyZ3VtZW50c1tpbmRleF0uc2V0QnlSZWYodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGludCBnZXRJbnRlZ2VyQnlSZWYoaW50IGluZGV4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgYnlSZWYgPSBldmVudC5hcmd1bWVudHNbaW5kZXhdLmdldEJ5UmVmKCk7Ci0gICAgICAgICAgICBpZiggMCAhPSBieVJlZiApIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBwVmFsdWUgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgICAgIENPTS5Nb3ZlTWVtb3J5KHBWYWx1ZSwgYnlSZWYsIDQpOwotICAgICAgICAgICAgICAgIHJldHVybiBwVmFsdWVbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0SW50ZWdlckJ5UmVmKGludCBpbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBldmVudC5hcmd1bWVudHNbaW5kZXhdLnNldEJ5UmVmKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBpbnQgZ2V0RGlzcGF0Y2hBZGRyZXNzKGludCBpbmRleCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmFyZ3VtZW50c1tpbmRleF0uZ2V0RGlzcGF0Y2goKS5nZXRBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGludCBnZXRDb250cm9sU2l0ZUFkZHJlc3MoKSB7Ci0gICAgICAgIGlmKCBldmVudC53aWRnZXQgaW5zdGFuY2VvZiBPbGVDb250cm9sU2l0ZSApIHsKLSAgICAgICAgICAgIFZhcmlhbnQgdmFyV2ViU2l0ZSA9IG5ldyBWYXJpYW50KG5ldyBPbGVBdXRvbWF0aW9uKChPbGVDb250cm9sU2l0ZSkoZXZlbnQud2lkZ2V0KSkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFyV2ViU2l0ZS5nZXREaXNwYXRjaCgpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHZhcldlYlNpdGUuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVyc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVyc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2ODBmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL0JlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi1wdWJsaWMgY2xhc3MgQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVyc0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UGFyYW1ldGVycyBpbXBsZW1lbnRzIEJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCAKLSAgICAgICAgSU5ERVhfQnJvd3NlciA9IDAsICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfdXJsID0gMSwgICAgICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfZmxhZ3MgPSAyLCAgICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfdGFyZ2V0RnJhbWVOYW1lID0gMywgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfcG9zdERhdGEgPSA0LCAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfaGVhZGVycyA9IDUsICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfY2FuY2VsID0gNjsgICAgICAgICAgIC8vIFtpbixvdXRdCi0KLSAgICBwdWJsaWMgQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVyc0ltcGwoT2xlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3VwZXIoZXZlbnQpOwotICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgIGludCAgICAgZGlzcEJyb3dzZXIgPSAgICAgZ2V0QnJvd3NlckFkZHJlc3MoKTsKLSAgICAgICAgICAgIFN0cmluZyAgdXJsID0gICAgICAgICAgICAgZ2V0VXJsKCk7Ci0gICAgICAgICAgICBpbnQgICAgIGZsYWdzID0gICAgICAgICAgIGdldEZsYWdzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgIHRhcmdldEZyYW1lTmFtZSA9IGdldFRhcmdldEZyYW1lTmFtZSgpOwotICAgICAgICAgICAgT2JqZWN0ICBwb3N0RGF0YSA9ICAgICAgICBnZXRQb3N0RGF0YSgpOwotICAgICAgICAgICAgU3RyaW5nICBoZWFkZXJzID0gICAgICAgICBnZXRIZWFkZXJzKCk7Ci0gICAgICAgICAgICBib29sZWFuIGNhbmNlbCA9ICAgICAgICAgIGdldENhbmNlbCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCZWZvcmVOYXZpZ2F0ZTIoIitkaXNwQnJvd3NlcisiLFwiIit1cmwrIlwiLCIrZmxhZ3MrIixcIiIrdGFyZ2V0RnJhbWVOYW1lKyJcIiwiK3Bvc3REYXRhKyIsXCIiK2hlYWRlcnMrIlwiLCIrY2FuY2VsKyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzI2dldEJyb3dzZXJBZGRyZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJyb3dzZXJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGF0Y2hBZGRyZXNzKElOREVYX0Jyb3dzZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyNnZXRVcmwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKElOREVYX3VybCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzI2dldEZsYWdzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEZsYWdzKCkgewotICAgICAgICByZXR1cm4gZ2V0SW50ZWdlcihJTkRFWF9mbGFncyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzI2dldFRhcmdldEZyYW1lTmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRGcmFtZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoSU5ERVhfdGFyZ2V0RnJhbWVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMjZ2V0UG9zdERhdGEoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UG9zdERhdGEoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYXJpYW50KElOREVYX3Bvc3REYXRhKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMjZ2V0SGVhZGVycygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKElOREVYX2hlYWRlcnMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyNnZXRDYW5jZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldENhbmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oSU5ERVhfY2FuY2VsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMjc2V0Q2FuY2VsKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsKGJvb2xlYW4gY2FuY2VsKSB7Ci0gICAgICAgIHNldEJvb2xlYW5CeVJlZihJTkRFWF9jYW5jZWwsIGNhbmNlbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL0RvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVyc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyMzc5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL0RvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQ7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVyc0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UGFyYW1ldGVycyBpbXBsZW1lbnRzIERvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGludAotICAgICAgICBJTkRFWF9XaW5kb3cgPSAwLCAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfdXJsID0gMTsgICAgICAvLyBbaW5dCi0gICAgICAgIAotICAgIHB1YmxpYyBEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVyc0ltcGwoT2xlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3VwZXIoZXZlbnQpOwotICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgIGludCAgICAgZGlzcFdpbmRvdyA9IGdldFdpbmRvd0FkZHJlc3MoKTsKLSAgICAgICAgICAgIFN0cmluZyAgdXJsID0gICAgICAgIGdldFVybCgpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1RvcCA9ICAgICAgaXNUb3BXaW5kb3coKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRDb21wbGV0ZSgiK2Rpc3BXaW5kb3crIixcIiIrdXJsKyJcIikgdG9wPSIraXNUb3ApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMjZ2V0V2luZG93QWRkcmVzcygpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRXaW5kb3dBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGF0Y2hBZGRyZXNzKElOREVYX1dpbmRvdyk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMjZ2V0VXJsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhJTkRFWF91cmwpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkRvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzI2lzVG9wV2luZG93KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIGdldFdpbmRvd0FkZHJlc3MoKSA9PSBnZXRDb250cm9sU2l0ZUFkZHJlc3MoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL05hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVyc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTllMDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgCi0gICAgICAgIElOREVYX0Jyb3dzZXIgPSAwLCAgICAgICAgICAvLyBbaW5dCi0gICAgICAgIElOREVYX3VybCA9IDE7ICAgICAgICAgICAgICAvLyBbaW5dCi0KLSAgICBwdWJsaWMgTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgaW50ICAgICBkaXNwQnJvd3NlciA9ICAgICBnZXRCcm93c2VyQWRkcmVzcygpOwotICAgICAgICAgICAgU3RyaW5nICB1cmwgPSAgICAgICAgICAgICBnZXRVcmwoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmF2aWdhdGVDb21wbGV0ZTIoIitkaXNwQnJvd3NlcisiLFwiIit1cmwrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzI2dldEJyb3dzZXJBZGRyZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJyb3dzZXJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGF0Y2hBZGRyZXNzKElOREVYX0Jyb3dzZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzI2dldFVybCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoSU5ERVhfdXJsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvTmF2aWdhdGVFcnJvclBhcmFtZXRlcnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL05hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQ0NjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvTmF2aWdhdGVFcnJvclBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5OYXZpZ2F0ZUVycm9yUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLQotCi0KLQotcHVibGljIGNsYXNzIE5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCAKLSAgICAgICAgSU5ERVhfQnJvd3NlciA9IDAsICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfdXJsID0gMSwgICAgICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfdGFyZ2V0RnJhbWVOYW1lID0gMiwgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfc3RhdHVzQ29kZSA9IDMsICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfY2FuY2VsID0gNDsgICAgICAgICAgIC8vIFtpbixvdXRdCi0KLSAgICBwdWJsaWMgTmF2aWdhdGVFcnJvclBhcmFtZXRlcnNJbXBsKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyKGV2ZW50KTsKLSAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0gICAgICAgICAgICBpbnQgICAgIGRpc3BCcm93c2VyID0gICAgIGdldEJyb3dzZXJBZGRyZXNzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgIHVybCA9ICAgICAgICAgICAgIGdldFVybCgpOwotICAgICAgICAgICAgU3RyaW5nICB0YXJnZXRGcmFtZU5hbWUgPSBnZXRUYXJnZXRGcmFtZU5hbWUoKTsKLSAgICAgICAgICAgIGludCAgICAgc3RhdHVzQ29kZSA9ICAgICAgZ2V0U3RhdHVzQ29kZSgpOwotICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWwgPSAgICAgICAgICBnZXRDYW5jZWwoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmF2aWdhdGVFcnJvcigiK2Rpc3BCcm93c2VyKyIsXCIiK3VybCsiXCIsIit0YXJnZXRGcmFtZU5hbWUrIlwiLCIrc3RhdHVzQ29kZSsiXCIsIitjYW5jZWwrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLk5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzI2dldEJyb3dzZXJBZGRyZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJyb3dzZXJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGF0Y2hBZGRyZXNzKElOREVYX0Jyb3dzZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMjZ2V0VXJsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhJTkRFWF91cmwpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMjZ2V0VGFyZ2V0RnJhbWVOYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEZyYW1lTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhJTkRFWF90YXJnZXRGcmFtZU5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMjZ2V0U3RhdHVzQ29kZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0SW50ZWdlcihJTkRFWF9zdGF0dXNDb2RlKTsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMjZ2V0Q2FuY2VsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCb29sZWFuKElOREVYX2NhbmNlbCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyNzZXRDYW5jZWwoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWwoYm9vbGVhbiBjYW5jZWwpIHsKLSAgICAgICAgc2V0Qm9vbGVhbkJ5UmVmKElOREVYX2NhbmNlbCwgY2FuY2VsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL05ld1dpbmRvdzJQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNjZjA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLQotCi0KLQotcHVibGljIGNsYXNzIE5ld1dpbmRvdzJQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgTmV3V2luZG93MlBhcmFtZXRlcnMgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludAotICAgICAgICBJTkRFWF9Ccm93c2VyID0gMCwgIC8vIFtpbixvdXRdCi0gICAgICAgIElOREVYX2NhbmNlbCA9IDE7ICAgLy8gW2luLG91dF0KLQotICAgIHB1YmxpYyBOZXdXaW5kb3cyUGFyYW1ldGVyc0ltcGwoT2xlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3VwZXIoZXZlbnQpOwotICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgIGludCAgICAgZGlzcEJyb3dzZXIgPSBnZXRCcm93c2VyQWRkcmVzcygpOwotICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWwgPSAgICAgIGdldENhbmNlbCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOZXdXaW5kb3cyKCIrZGlzcEJyb3dzZXIrIiwiK2NhbmNlbCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmV3V2luZG93MlBhcmFtZXRlcnMjZ2V0QnJvd3NlckFkZHJlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRlZ2VyQnlSZWYoSU5ERVhfQnJvd3Nlcik7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmV3V2luZG93MlBhcmFtZXRlcnMjc2V0QnJvd3NlckFkZHJlc3MoaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJyb3dzZXJBZGRyZXNzKGludCBhZGRyZXNzKSB7Ci0gICAgICAgIHNldEludGVnZXJCeVJlZihJTkRFWF9Ccm93c2VyLCBhZGRyZXNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVycyNnZXRDYW5jZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldENhbmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oSU5ERVhfY2FuY2VsKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVycyNzZXRDYW5jZWwoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWwoYm9vbGVhbiBjYW5jZWwpIHsKLSAgICAgICAgc2V0Qm9vbGVhbkJ5UmVmKElOREVYX2NhbmNlbCwgY2FuY2VsKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL1Byb2dyZXNzQ2hhbmdlUGFyYW1ldGVyc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmRkNmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGludAotICAgICAgICBJTkRFWF9uUHJvZ3Jlc3MgPSAwLCAgICAvLyBbaW5dCi0gICAgICAgIElOREVYX25Qcm9ncmVzc01heCA9IDE7IC8vIFtpbl0KLSAgICAKLSAgICBwdWJsaWMgUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgaW50IG5Qcm9ncmVzcyA9ICAgIGdldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICBpbnQgblByb2dyZXNzTWF4ID0gZ2V0UHJvZ3Jlc3NNYXgoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZ3Jlc3NDaGFuZ2UoIituUHJvZ3Jlc3MrIiwiK25Qcm9ncmVzc01heCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzI2dldFByb2dyZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByb2dyZXNzKCkgewotICAgICAgICByZXR1cm4gZ2V0SW50ZWdlcihJTkRFWF9uUHJvZ3Jlc3MpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlByb2dyZXNzQ2hhbmdlUGFyYW1ldGVycyNnZXRQcm9ncmVzc01heCgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcm9ncmVzc01heCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEludGVnZXIoSU5ERVhfblByb2dyZXNzTWF4KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL1N0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9TdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVyc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2OWM5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL2ludGVybmFsL2V2ZW50cy9pbXBsL1N0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5pbnRlcm5hbC5ldmVudHMuU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLQotCi0KLQotcHVibGljIGNsYXNzIFN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50Ci0gICAgICAgIElOREVYX3RleHQgPSAwOyAvLyBbaW5dCi0gICAgCi0gICAgcHVibGljIFN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0vLyAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0vLyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXR1c1RleHRDaGFuZ2UoXCIiK3RleHQrIlwiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMjZ2V0VGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKElOREVYX3RleHQpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9UaXRsZUNoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDk3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9UaXRsZUNoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmludGVybmFsLmV2ZW50cy5UaXRsZUNoYW5nZVBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQ7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBUaXRsZUNoYW5nZVBhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBUaXRsZUNoYW5nZVBhcmFtZXRlcnMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50Ci0gICAgSU5ERVhfdGV4dCA9IDA7IC8vIFtpbl0KLQotICAgIHB1YmxpYyBUaXRsZUNoYW5nZVBhcmFtZXRlcnNJbXBsKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyKGV2ZW50KTsKLSAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGVDaGFuZ2UoXCIiK3RleHQrIlwiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlRpdGxlQ2hhbmdlUGFyYW1ldGVycyNnZXRUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoSU5ERVhfdGV4dCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9XaW5kb3dDbG9zaW5nUGFyYW1ldGVyc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvaW50ZXJuYWwvZXZlbnRzL2ltcGwvV2luZG93Q2xvc2luZ1BhcmFtZXRlcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxM2MxNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9pbnRlcm5hbC9ldmVudHMvaW1wbC9XaW5kb3dDbG9zaW5nUGFyYW1ldGVyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuaW50ZXJuYWwuZXZlbnRzLldpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgV2luZG93Q2xvc2luZ1BhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBXaW5kb3dDbG9zaW5nUGFyYW1ldGVycyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQKLSAgICAgICAgSU5ERVhfaXNDaGlsZFdpbmRvdyA9IDAsICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfY2FuY2VsID0gMTsgICAgICAgICAgIC8vIFtpbixvdXRdCi0gICAgCi0gICAgcHVibGljIFdpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgYm9vbGVhbiBpc0NoaWxkV2luZG93ID0gZ2V0SXNDaGlsZFdpbmRvdygpOwotICAgICAgICAgICAgYm9vbGVhbiBjYW5jZWwgPSAgICAgICAgZ2V0Q2FuY2VsKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldpbmRvd0Nsb3NpbmcoIitpc0NoaWxkV2luZG93KyIsIitjYW5jZWwrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLldpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzI2dldElzQ2hpbGRXaW5kb3coKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldElzQ2hpbGRXaW5kb3coKSB7Ci0gICAgICAgIHJldHVybiBnZXRCb29sZWFuKElOREVYX2lzQ2hpbGRXaW5kb3cpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLldpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzI2dldENhbmNlbCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsKCkgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhbihJTkRFWF9jYW5jZWwpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLldpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzI3NldENhbmNlbChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbChib29sZWFuIGNhbmNlbCkgewotICAgICAgICBzZXRCb29sZWFuQnlSZWYoSU5ERVhfY2FuY2VsLCBjYW5jZWwpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvd2luMzIvSVBlcnNpc3RGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL2llL3dpbjMyL0lQZXJzaXN0RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU4OGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvd2luMzIvSVBlcnNpc3RGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT007Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5JUGVyc2lzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBJUGVyc2lzdEZpbGUgZXh0ZW5kcyBJUGVyc2lzdCB7Ci0gICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsKLSAgICBwdWJsaWMgSVBlcnNpc3RGaWxlKGludCBhZGRyZXNzKSB7Ci0gICAgICAgIHN1cGVyKGFkZHJlc3MpOwotICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOwotICAgIH0KLSAgICBwdWJsaWMgaW50IElzRGlydHkoKSB7Ci0gICAgICAgIHJldHVybiBDT00uVnRibENhbGwoNCwgYWRkcmVzcyk7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgTG9hZChpbnQgcHN6RmlsZW5hbWUsIGludCBkd01vZGUpIHsKLSAgICAgICAgcmV0dXJuIENPTS5WdGJsQ2FsbCg1LCBhZGRyZXNzLCBwc3pGaWxlbmFtZSwgZHdNb2RlKTsKLSAgICB9Ci0gICAgcHVibGljIGludCBTYXZlKGludCBwc3pGaWxlbmFtZSwgYm9vbGVhbiBmUmVtZW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIENPTS5WdGJsQ2FsbCg2LCBhZGRyZXNzLCBwc3pGaWxlbmFtZSwgZlJlbWVtYmVyKTsKLSAgICB9Ci0gICAgcHVibGljIGludCBTYXZlQ29tcGxldGVkKGludCBwc3pGaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gQ09NLlZ0YmxDYWxsKDcsIGFkZHJlc3MsIHBzekZpbGVuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIGludCBHZXRDdXJGaWxlKGludCBwcHN6RmlsZW5hbWUpewotICAgICAgICByZXR1cm4gQ09NLlZ0YmxDYWxsKDksIGFkZHJlc3MsIHBwc3pGaWxlbmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS93aW4zMi9SZWdpc3RyeVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvd2luMzIvUmVnaXN0cnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjNmMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS93aW4zMi9SZWdpc3RyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5UQ0hBUjsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeVV0aWwgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50Ci0gICAgICAgIFJFR19OT05FID0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgIFJFR19TWiA9ICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgIFJFR19FWFBBTkRfU1ogPSAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgIFJFR19CSU5BUlkgPSAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgIFJFR19EV09SRCA9ICAgICAgICAgICAgICAgICAgICAgIDQsCi0gICAgICAgIFJFR19EV09SRF9CSUdfRU5ESUFOID0gICAgICAgICAgIDUsCi0gICAgICAgIFJFR19MSU5LID0gICAgICAgICAgICAgICAgICAgICAgIDYsCi0gICAgICAgIFJFR19NVUxUSV9TWiA9ICAgICAgICAgICAgICAgICAgIDcsCi0gICAgICAgIFJFR19SRVNPVVJDRV9MSVNUID0gICAgICAgICAgICAgIDgsCi0gICAgICAgIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1IgPSAgIDksCi0gICAgICAgIFJFR19SRVNPVVJDRV9SRVFVSVJFTUVOVFNfTElTVCA9IDEwLAotICAgICAgICBSRUdfUVdPUkQgPSAgICAgICAgICAgICAgICAgICAgICAxMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50Ci0gICAgICAgIEtFWV9SRUFEID0gICAgICAgMHgyMDAxOTsKLQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UmVnaXN0b3J5SW50KGludCBoS2V5UGFyZW50LCBTdHJpbmcgc3ViS2V5U3RyaW5nLCBTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLSAgICAgICAgaW50IGhLZXkgPSBvcGVuKGhLZXlQYXJlbnQsIHN1YktleVN0cmluZywgMCwgS0VZX1JFQUQpOwotICAgICAgICBpZiggMCAhPSBoS2V5ICkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50ZWdlclZhbHVlKGhLZXksIHZhbHVlU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGNsb3NlKGhLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWdpc3RvcnlTdHJpbmcoaW50IGhLZXlQYXJlbnQsIFN0cmluZyBzdWJLZXlTdHJpbmcsIFN0cmluZyB2YWx1ZVN0cmluZykgewotICAgICAgICBpbnQgaEtleSA9IG9wZW4oaEtleVBhcmVudCwgc3ViS2V5U3RyaW5nLCAwLCBLRVlfUkVBRCk7Ci0gICAgICAgIGlmKCAwICE9IGhLZXkgKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmdWYWx1ZShoS2V5LCB2YWx1ZVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjbG9zZShoS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG9wZW4oaW50IGhLZXlQYXJlbnQsIFN0cmluZyBzdWJLZXlTdHJpbmcsIGludCB1bE9wdGlvbnMsIGludCBzYW1EZXNpcmVkKSB7Ci0gICAgICAgIFRDSEFSIGtleU5hbWUgPSBuZXcgVENIQVIoMCwgc3ViS2V5U3RyaW5nLCB0cnVlKTsKLSAgICAgICAgaW50W10gcGhLZXkgPSBuZXcgaW50WzFdOwotICAgICAgICBpZiAoMCA9PSBPUy5SZWdPcGVuS2V5RXgoaEtleVBhcmVudCwga2V5TmFtZSwgdWxPcHRpb25zLCBzYW1EZXNpcmVkLCBwaEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBwaEtleVswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsb3NlKGludCBoS2V5KSB7Ci0gICAgICAgIHJldHVybiBPUy5SZWdDbG9zZUtleShoS2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW50ZWdlclZhbHVlKGludCBoS2V5LCBTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLSAgICAgICAgVENIQVIgdmFsdWVOYW1lID0gbmV3IFRDSEFSKDAsIHZhbHVlU3RyaW5nLCB0cnVlKTsKLSAgICAgICAgaW50W10gcGNiRGF0YSA9IG5ldyBpbnRbXSB7IDQgfTsKLSAgICAgICAgaW50W10gcFR5cGUgPSBuZXcgaW50WzFdOwotICAgICAgICBpbnRbXSBwRGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGlmICgwID09IE9TLlJlZ1F1ZXJ5VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsIDAsIHBUeXBlLCBwRGF0YSwgcGNiRGF0YSkpIHsKLSAgICAgICAgICAgIGlmKCBSRUdfRFdPUkQgPT0gcFR5cGVbMF0gKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBEYXRhWzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoaW50IGhLZXksIFN0cmluZyB2YWx1ZVN0cmluZykgewotICAgICAgICBUQ0hBUiB2YWx1ZU5hbWUgPSBuZXcgVENIQVIoMCwgdmFsdWVTdHJpbmcsIHRydWUpOwotICAgICAgICBpbnRbXSBwY2JEYXRhID0gbmV3IGludFsxXTsKLSAgICAgICAgaW50W10gcFR5cGUgPSBuZXcgaW50WzFdOwotICAgICAgICBpZiAoMCA9PSBPUy5SZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCAwLCBwVHlwZSwgKFRDSEFSKW51bGwsIHBjYkRhdGEpKSB7Ci0gICAgICAgICAgICBpZiggUkVHX1NaID09IHBUeXBlWzBdICkgewotICAgICAgICAgICAgICAgIFRDSEFSIGJ1ZmYgPSBuZXcgVENIQVIoMCxwY2JEYXRhWzBdL1RDSEFSLnNpemVvZik7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPT0gT1MuUmVnUXVlcnlWYWx1ZUV4KGhLZXksIHZhbHVlTmFtZSwgMCwgcFR5cGUsIGJ1ZmYsIHBjYkRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKDAsIGJ1ZmYuc3RybGVuKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmYzNjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZjZGNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBPREYgQnJvd3NlciBJbml0aWFsaXplciBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjAuMQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIua2lja2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28iLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIuT09vRWRpdG9ySW5pdFBsdWdpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiMzc3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotCQkJICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL09Pb0VkaXRvckluaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbml0aWFsaXplci9PT29FZGl0b3JJbml0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmUxZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL09Pb0VkaXRvckluaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIudXRpbC5PT29FZGl0b3JJbml0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIE9Pb0VkaXRvckluaXRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIE9Pb0VkaXRvckluaXRQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBPT29FZGl0b3JJbml0UGx1Z2luKCkgewkJCi0JCU9Pb0VkaXRvckluaXRVdGlsLmluaXQoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9Pb0VkaXRvckluaXRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbml0aWFsaXplci9raWNrZXIvSU9Pb0VkaXRvckluaXRpYWxpemVyS2lja2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIva2lja2VyL0lPT29FZGl0b3JJbml0aWFsaXplcktpY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmUwZjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbml0aWFsaXplci9raWNrZXIvSU9Pb0VkaXRvckluaXRpYWxpemVyS2lja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIua2lja2VyOwotCi0KLS8vRHVtbXkgaW50ZXJmYWNlIHRvIHN0YXJ0IE9Pb0VkaXRvckluaXRpYWxpemVyIFBsdWctaW4gYmVmb3JlIHRoZSBPT29FZGl0b3IgUGx1Zy1pbgotLy8oYnkgdXNpbmcgTGF6eVN0YXJ0KQotcHVibGljIGludGVyZmFjZSBJT09vRWRpdG9ySW5pdGlhbGl6ZXJLaWNrZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIvdXRpbC9PT29FZGl0b3JJbml0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL3V0aWwvT09vRWRpdG9ySW5pdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiZTQxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIvdXRpbC9PT29FZGl0b3JJbml0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLlRDSEFSOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBPT29FZGl0b3JJbml0VXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIElTX0lOSVRJQUxJWkVEID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluaXQoKSB7Ci0JCXJldHVybiBpc09Pb0luc3RhbGxlZChmYWxzZSk7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzT09vSW5zdGFsbGVkKGJvb2xlYW4gc2hvd0hlbHApIHsKLQotCQlpZiAoSVNfSU5JVElBTElaRUQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJcGF0aCA9IGdldE9wZW5PZmZpY2VQYXRoKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJaWYgKHNob3dIZWxwKSB7Ci0JCQkJUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCQkuZGlzcGxheUhlbHBSZXNvdXJjZSgKLQkJCQkJCQkJIi9vcmcuZWNsaXBzZS5hY3RmLmV4YW1wbGVzLmFkZXNpZ25lci5kb2MvZG9jcy9vZGYvaW5zdGFsbC5odG1sIik7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJU19JTklUSUFMSVpFRCA9IHRydWU7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiT09vX1BST0dSQU1fUEFUSCIsIHBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGdldCBPcGVuT2ZmaWNlIChsYXRlciB0aGFuIDIuMCkgcGF0aAotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9wZW5PZmZpY2VQYXRoKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgU3RyaW5nIGVudHJ5ID0gIlNPRlRXQVJFXFxPcGVuT2ZmaWNlLm9yZ1xcVU5PXFxJbnN0YWxsUGF0aCI7Ci0KLQkJZmluYWwgaW50W10gaEtleSA9IG5ldyBpbnRbMV07Ci0JCXRyeSB7Ci0JCQlpbnQgcmMgPSBPUy5SZWdPcGVuS2V5RXgoT1MuSEtFWV9MT0NBTF9NQUNISU5FLCBuZXcgVENIQVIoCi0JCQkJCU9TLkNQX0lOU1RBTExFRCwgZW50cnksIHRydWUpLCAwLCAweEYwMDNGLCBoS2V5KTsKLQkJCWlmICgwICE9IHJjKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJGYWlsZWQgdG8gY2FsbCBSZWdPcGVuS2V5RXguIik7Ci0JCQl9Ci0KLQkJCVRDSEFSIGJ1ZiA9IG5ldyBUQ0hBUihPUy5DUF9JTlNUQUxMRUQsIDI1Nik7Ci0JCQlmaW5hbCBpbnRbXSBsZW4gPSBuZXcgaW50W10geyAyNTYgfTsKLQkJCXJjID0gT1MuUmVnUXVlcnlWYWx1ZUV4KGhLZXlbMF0sIChUQ0hBUikgbnVsbCwgMCwgbnVsbCwgYnVmLCBsZW4pOwotCQkJaWYgKDAgIT0gcmMpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIkZhaWxlZCB0byBjYWxsIFJlZ1F1ZXJ5VmFsdWVFeC4iKTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygwLCBidWYuc3RybGVuKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGhLZXlbMF0gIT0gMCkgewotCQkJCU9TLlJlZ0Nsb3NlS2V5KGhLZXlbMF0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBJU19JTklUSUFMSVpFRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjFiZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJPT09fSE9NRS9wcm9ncmFtL2NsYXNzZXMvanVoLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik9PT19IT01FL3Byb2dyYW0vY2xhc3Nlcy9qdXJ0LmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik9PT19IT01FL3Byb2dyYW0vY2xhc3Nlcy9yaWRsLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik9PT19IT01FL3Byb2dyYW0vY2xhc3Nlcy91bm9pbC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNmNzI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb288L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM2ODRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBPREYgQnJvd3NlciBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vbztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjAuMQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5PT29FZGl0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5jb21tb24sCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXI7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtQ2xhc3NQYXRoOiBydW50aW1lcy9hY2Nlc3NpYmlsaXR5X2Jyb3dzZXJfb2RmLmphciwKLSBleHRlcm5hbDokT09vX1BST0dSQU1fUEFUSCRcY2xhc3Nlc1xqdWguamFyLAotIGV4dGVybmFsOiRPT29fUFJPR1JBTV9QQVRIJFxjbGFzc2VzXGp1cnQuamFyLAotIGV4dGVybmFsOiRPT29fUFJPR1JBTV9QQVRIJFxjbGFzc2VzXHJpZGwuamFyLAotIGV4dGVybmFsOiRPT29fUFJPR1JBTV9QQVRIJFxjbGFzc2VzXHVub2lsLmphciwKLSBleHRlcm5hbDpDOlxQcm9ncmFtIEZpbGVzXE9wZW5PZmZpY2Uub3JnIDIuM1xwcm9ncmFtXGNsYXNzZXNcanVoLmphciwKLSBleHRlcm5hbDpDOlxQcm9ncmFtIEZpbGVzXE9wZW5PZmZpY2Uub3JnIDIuM1xwcm9ncmFtXGNsYXNzZXNcanVydC5qYXIsCi0gZXh0ZXJuYWw6QzpcUHJvZ3JhbSBGaWxlc1xPcGVuT2ZmaWNlLm9yZyAyLjNccHJvZ3JhbVxjbGFzc2VzXHJpZGwuamFyLAotIGV4dGVybmFsOkM6XFByb2dyYW0gRmlsZXNcT3Blbk9mZmljZS5vcmcgMi4zXHByb2dyYW1cY2xhc3Nlc1x1bm9pbC5qYXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmVkaXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkMDRhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotCQkJICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHJ1bnRpbWVzL2FjY2Vzc2liaWxpdHlfYnJvd3Nlcl9vZGYuamFyCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBydW50aW1lcy9hY2Nlc3NpYmlsaXR5X2Jyb3dzZXJfb2RmLmphcgotc291cmNlLnJ1bnRpbWVzL2FjY2Vzc2liaWxpdHlfYnJvd3Nlcl9vZGYuamFyID0gc3JjLwotb3V0cHV0LnJ1bnRpbWVzL2FjY2Vzc2liaWxpdHlfYnJvd3Nlcl9vZGYuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL2ljb25zL2V4Y2xhd2hpdGUxNi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vaWNvbnMvZXhjbGF3aGl0ZTE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiNGZkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vaWNvbnMvZXhjbGF3aGl0ZTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmM2QyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vZGYuZWRpdG9yLnRpdGxlPU9wZW5Eb2N1bWVudAotCi1PREZFZGl0b3JBY3Rpb24uT3Blbj1PcGVuIE9ERiBGaWxlCi0KLU9ERkVkaXRvci5jb252ZXJ0SFRNTD1Db252ZXJ0aW5nIE9ERiB0byBIVE1MLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0MWU1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uZWRpdG9yLk9Pb0VkaXRvciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uZWRpdG9yLk9Pb0VkaXRvckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJvZHQsIG9kcCwgb2RzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXhjbGF3aGl0ZTE2LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmVkaXRvci5PT29FZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlb2RmLmVkaXRvci50aXRsZSIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW5famEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW5famEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiOGU3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vZGYuZWRpdG9yLnRpdGxlPU9wZW5Eb2N1bWVudAotCi1PREZFZGl0b3JBY3Rpb24uT3Blbj1PREYgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU5NThiXHUzMDRmCi0KLU9ERkVkaXRvci5jb252ZXJ0SFRNTD1PREYgXHUzMDkyIEhUTUwgXHUzMDZiXHU1OTA5XHU2M2RiXHU0ZTJkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3JlYWRtZS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2OWJiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLURldmVsb3BtZW50IGluc3RydWN0aW9uIGZvciB0aGlzIHBsdWdpbi4KLQotT3Blbk9mZmljZS5vcmcgKHZlci4gMi4xLjAgb3IgYWJvdmUpIGlzIHByZS1yZXEgZm9yIHRoaXMgcGx1Z2luLgotUGxlYXNlIGFkZCBuZXcgQ2xhc3NwYXRoIFZhcmlhYmxlcyAiT09PX0hPTUUiIGJ5IHVzaW5nIAotV2luZG93PlByZWZlcmVuY2VzLT5KYXZhLT5CdWlsZCBQYXRoLT5DbGFzc3BhdGggVmFyaWFibGVzLgotVXN1YWxseSwgT3Blbk9mZmljZS5vcmcgd2lsbCBiZSBpbnN0YWxsZWQgaW50byAKLSJjOlxQcm9ncmFtIEZpbGVzXE9wZW5PZmZpY2Uub3JnIDx2ZXJzaW9uPiIuCi0KLTxleGFtcGxlPgotCi1OYW1lOiBPT09fSE9NRQotUGF0aDogYzpcUHJvZ3JhbSBGaWxlc1xPcGVuT2ZmaWNlLm9yZyAyLjMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9PT29FZGl0b3JQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9PT29FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyYWQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLmtpY2tlci5JT09vRWRpdG9ySW5pdGlhbGl6ZXJLaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgT09vRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiBpbXBsZW1lbnRzIElPT29FZGl0b3JJbml0aWFsaXplcktpY2tlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vbyI7Ci0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgT09vRWRpdG9yUGx1Z2luIHBsdWdpbjsKLQkKLSAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIF9yZXNvdXJjZUJ1bmRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgX2NvbnRleHQ7Ci0gICAgCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBPT29FZGl0b3JQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCQotCQkvL09Pb0VkaXRvckluaXRVdGlsIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHVzaW5nIGR1bW15IGludGVyZmFjZStMYXp5U3RhcnQJCQotLy8JCWlmKCFPT29FZGl0b3JJbml0VXRpbC5pc0luaXRpYWxpemVkKCkpewotLy8JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlBsZWFzZSBjYWxsIE9Pb0VkaXRvckluaXRVdGlsLmluaXQoKSBiZWZvcmUgdXNpbmcgT09vRWRpdG9yLiIpOwotLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0gICAgICAgIF9jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPT29FZGl0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gT09vRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChudWxsICE9IGJ1bmRsZSkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgICAgIHJldHVybiAiPz8/IiArIGtleSArICI/Pz8iOwotICAgICAgICB9Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIGlmIChudWxsID09IF9yZXNvdXJjZUJ1bmRsZSAmJiBudWxsICE9IF9jb250ZXh0KSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gX2NvbnRleHQuZ2V0QnVuZGxlKCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBidW5kbGUpIHsKLSAgICAgICAgICAgICAgICBfcmVzb3VyY2VCdW5kbGUgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShidW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUJ1bmRsZTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2FjdGlvbnMvRWRpdE9ERkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2FjdGlvbnMvRWRpdE9ERkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc5OWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL0VkaXRPREZBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudWkuUGxhdGZvcm1VSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgRWRpdE9ERkFjdGlvbiBleHRlbmRzIEFjdGlvbnsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkVkaXQiOwotCi0gICAgcHVibGljIEVkaXRPREZBY3Rpb24oKSB7Ci0gICAgICAgIHNldFRleHQobWVzc2FnZSk7Ci0gICAgICAgIHNldFRvb2xUaXBUZXh0KG1lc3NhZ2UpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSVV0aWwuZ2V0U2hhcmVkSW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX0RFRl9WSUVXKSk7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgTWVzc2FnZUJveCBtc2dCb3ggPSBuZXcgTWVzc2FnZUJveChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT0spOwotICAgICAgICBtc2dCb3guc2V0TWVzc2FnZSgibm90IGltcGxlbWVudGVkIHlldCIpOwotICAgICAgICBtc2dCb3gub3BlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL09wZW5PREZBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL09wZW5PREZBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2ZWMzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9PcGVuT0RGQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5Nb2RlbFNlcnZpY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLk9Pb0VkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmVkaXRvci5PT29FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnVpLlBsYXRmb3JtVUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLQotcHVibGljIGNsYXNzIE9wZW5PREZBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IE9Pb0VkaXRvclBsdWdpbgotCQkJLmdldFJlc291cmNlU3RyaW5nKCJPREZFZGl0b3JBY3Rpb24uT3BlbiIpOwotCi0JcHVibGljIE9wZW5PREZBY3Rpb24oKSB7Ci0JCXNldFRleHQobWVzc2FnZSk7Ci0JCXNldFRvb2xUaXBUZXh0KG1lc3NhZ2UpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSVV0aWwKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUZpbGVEaWFsb2cgb3BlbkRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJb3BlbkRpYWxvZwotCQkJCS5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyAiT3BlbkRvY3VtZW50ICgqLm9kdDsgKi5vZHA7ICoub2RzKSIgfSk7Ci0JCW9wZW5EaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi5vZHQ7ICoub2RwOyAqLm9kcyIgfSk7Ci0JCVN0cmluZyBzVXJsID0gb3BlbkRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKHNVcmwgIT0gbnVsbCkgewotCQkJTW9kZWxTZXJ2aWNlVXRpbHMubGF1bmNoKHNVcmwsIE9Pb0VkaXRvci5JRCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9TYXZlT0RGQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9TYXZlT0RGQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzM2JjOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2FjdGlvbnMvU2F2ZU9ERkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC51aS5QbGF0Zm9ybVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBTYXZlT0RGQWN0aW9uIGV4dGVuZHMgQWN0aW9uewotICAgIAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiU2F2ZSI7Ci0KLSAgICBwdWJsaWMgU2F2ZU9ERkFjdGlvbigpIHsKLSAgICAgICAgc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgICAgc2V0VG9vbFRpcFRleHQobWVzc2FnZSk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJVXRpbC5nZXRTaGFyZWRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfREVGX1ZJRVcpKTsgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBNZXNzYWdlQm94IG1zZ0JveCA9IG5ldyBNZXNzYWdlQm94KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PSyk7Ci0gICAgICAgIG1zZ0JveC5zZXRNZXNzYWdlKCJub3QgaW1wbGVtZW50ZWQgeWV0Iik7Ci0gICAgICAgIG1zZ0JveC5vcGVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2VkaXRvci9PT29Db21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvT09vQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNWQwYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2VkaXRvci9PT29Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIE5vcmltYXNhIEhBWUFTSElEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5JTW9kZWxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERlBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuT0RGQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlci5PREZDb252ZXJ0ZXJDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLkltYWdlUG9zaXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uZWRpdG9yLmltcGwuSU9Pb0VkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5lZGl0b3IuaW1wbC5PT29FZGl0b3JTY3JvbGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uZWRpdG9yLmltcGwuT09vRWRpdG9yVG9vbGJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmVkaXRvci5pbXBsLk9Pb1dpbmRvd0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLnV0aWwuT09vRWRpdG9ySW5pdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbnRlcm5hbC51dGlsLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmludGVybmFsLnV0aWwuT09vTmF2aWdhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBPT29Db21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBJTW9kZWxTZXJ2aWNlIHsKLQlwcml2YXRlIE9Pb1dpbmRvd0NvbXBvc2l0ZSBfb09vV2luZG93Q29tcG9zaXRlID0gbnVsbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIF9jb21wOwotCi0JcHJpdmF0ZSBPT29FZGl0b3JTY3JvbGxNYW5hZ2VyIHNjcm9sbE1hbmFnZXI7Ci0KLQlwcml2YXRlIFZlY3RvcjxJT09vRWRpdG9yUGFydD4gZXZlbnRMaXN0ZW5lcnNWID0gbmV3IFZlY3RvcjxJT09vRWRpdG9yUGFydD4oKTsKLQotCU9Pb0VkaXRvclRvb2xiYXIgX3Rvb2xiYXI7Ci0KLQlwcml2YXRlIFN0cmluZyBsYXN0VVJMID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlID0gIiI7Ci0KLQlwdWJsaWMgT09vQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJaWYgKE9Pb0VkaXRvckluaXRVdGlsLmlzT09vSW5zdGFsbGVkKHRydWUpKSB7Ci0JCQlpbml0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJdGhpcy5fdG9vbGJhciA9IG5ldyBPT29FZGl0b3JUb29sYmFyKHRoaXMsIHRoaXMsIFNXVC5OT05FLCB0cnVlKTsKLQkJdGhpcy5fY29tcCA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULkVNQkVEREVEKTsKLQkJdGhpcy5fY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdHJ5IHsKLQkJCXRoaXMuX2NvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkJdGhpcy5fb09vV2luZG93Q29tcG9zaXRlID0gbmV3IE9Pb1dpbmRvd0NvbXBvc2l0ZSh0aGlzLl9jb21wLAotCQkJCQlTV1QuRU1CRURERUQpOwotCQkJdGhpcy5fb09vV2luZG93Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLAotCQkJCQlTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJc2Nyb2xsTWFuYWdlciA9IG5ldyBPT29FZGl0b3JTY3JvbGxNYW5hZ2VyKHRoaXMuX29Pb1dpbmRvd0NvbXBvc2l0ZSk7Ci0JCX0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkvLyB0aGlzLl9vT29CZWFuUGFuZWwuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydE1JTUVUeXBlcygpIHsKLQkJcmV0dXJuIE1JTUVUWVBFU19PREY7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gRVhUU19PREY7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbihTdHJpbmcgdXJsKSB7Ci0JCWlmIChudWxsICE9IHVybCAmJiBudWxsICE9IHRoaXMuX29Pb1dpbmRvd0NvbXBvc2l0ZSkgewotCQkJLy8gbW92ZSB0aGlzIHVybCBmb3JtYXQgdG8gT09vV2luZG93Q29tcG9zaXRlOjpsb2FkCi0JCQkvKgotCQkJICogaWYgKDAgIT0gdXJsLmluZGV4T2YoInByaXZhdGU6IikgJiYgMCAhPSB1cmwuaW5kZXhPZigiZmlsZTovLy8iKSkgewotCQkJICogdHJ5IHsgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUodXJsKTsgU3RyaW5nQnVmZmVyIHNiID0gbmV3Ci0JCQkgKiBTdHJpbmdCdWZmZXIoImZpbGU6Ly8vIik7Ci0JCQkgKiBzYi5hcHBlbmQoc3JjRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpKTsgdXJsID0KLQkJCSAqIHNiLnRvU3RyaW5nKCk7IGlmICghc3JjRmlsZS5jYW5SZWFkKCkpIHsgcmV0dXJuOyB9IH0gY2F0Y2gKLQkJCSAqIChJT0V4Y2VwdGlvbiBpb2UpIHsgaW9lLnByaW50U3RhY2tUcmFjZSgpOyByZXR1cm47IH0gfQotCQkJICovCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwpOwotCQkJaWYgKChudWxsICE9IGZpbGUpICYmIChmaWxlLmV4aXN0cygpKSkgewotCQkJCXRoaXMuX29Pb1dpbmRvd0NvbXBvc2l0ZS5vcGVuKHVybCk7Ci0JCQkJdGhpcy5fdG9vbGJhci5nZXRBZGRyZXNzVGV4dCgpLnNldFRleHQodXJsKTsKLQotCQkJCS8vIE9ERkJyb3dzZXJFZGl0b3Igb2RmQnJvd3NlckVkaXRvciA9Ci0JCQkJLy8gT0RGQnJvd3NlckVkaXRvck1hbmFnZXIuZ2V0T0RGRWRpdG9yUGFydCh1cmwpOwotCQkJCS8vIG9kZkJyb3dzZXJFZGl0b3IuY2hhbmdlVGl0bGUodXJsKTsKLQotCQkJCXRpdGxlQ2hhbmdlKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oRmlsZSB0YXJnZXQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCWlmIChudWxsICE9IF9vT29XaW5kb3dDb21wb3NpdGUpIHsKLQkJCXJldHVybiB0aGlzLl9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCXB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldEVsZW1MaXN0KE5vZGUgcm9vdCkgewotCQlMaXN0PEVsZW1lbnQ+IGVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOwotCi0JCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbmwuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCWVsZW1MaXN0LmFkZCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQllbGVtTGlzdC5hZGRBbGwoZ2V0RWxlbUxpc3Qobm9kZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtTGlzdDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCVN0cmluZyBjdXJyZW50VVJMID0gZ2V0VVJMKCk7Ci0JCWlmIChjdXJyZW50VVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT09vTmF2aWdhdGlvbiBvb29OYXZpZ2F0aW9uID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRPb29OYXZpZ2F0aW9uKCk7Ci0JCU9ERkRvY3VtZW50IG9kZkRvYyA9IG9vb05hdmlnYXRpb24uZ2V0Q29udGVudFhNTCgpOwotCQlpZiAoKG9kZkRvYyAhPSBudWxsKSAmJiAoY3VycmVudFVSTC5lcXVhbHMobGFzdFVSTCkpKQotCQkJcmV0dXJuIG9kZkRvYzsKLQotCQkvLyBjcmVhdGUgT0RGIERvY3VtZW50IGJ5IE9ERiBBUEkKLQkJT0RGUGFyc2VyIG9kZlBhcnNlciA9IG5ldyBPREZQYXJzZXIoKTsKLQkJb2RmRG9jID0gb2RmUGFyc2VyLmdldERvY3VtZW50KGN1cnJlbnRVUkwpOwotCQkvLyBzZXQgSUQgdG8gZWFjaCBPREYgZWxlbWVudAotCQkvKgotCQkgKiBOb2RlSXRlcmF0b3Igbm9kZUl0ZXIgPSAoKERvY3VtZW50VHJhdmVyc2FsKQotCQkgKiBvZGZEb2MpLmNyZWF0ZU5vZGVJdGVyYXRvcihvZGZEb2MsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCBudWxsLAotCQkgKiBmYWxzZSk7IGludCBjb250ZW50SUQgPSAwOyBOb2RlIG5vZGUgPSBub2RlSXRlci5uZXh0Tm9kZSgpOyB3aGlsZQotCQkgKiAobm9kZSAhPSBudWxsKSB7ICgoRWxlbWVudCkKLQkJICogbm9kZSkuc2V0QXR0cmlidXRlKE9ERkNvbnN0YW50cy5PREZfQ09OVEVOVF9JRCwgbmV3Ci0JCSAqIEludGVnZXIoY29udGVudElEKS50b1N0cmluZygpKTsgbm9kZSA9IG5vZGVJdGVyLm5leHROb2RlKCk7Ci0JCSAqIGNvbnRlbnRJRCsrOyB9Ci0JCSAqLwotCQlpbnQgY29udGVudElEID0gMDsKLQkJTGlzdDxFbGVtZW50PiBlbGVtTGlzdCA9IGdldEVsZW1MaXN0KG9kZkRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUVsZW1lbnQgZWxlbSA9IGVsZW1MaXN0LmdldChpKTsKLQkJCWVsZW0uc2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCwKLQkJCQkJbmV3IEludGVnZXIoY29udGVudElEKS50b1N0cmluZygpKTsKLQkJCWNvbnRlbnRJRCsrOwotCQl9Ci0KLQkJb29vTmF2aWdhdGlvbi5zZXRDb250ZW50WE1MKG9kZkRvYyk7Ci0JCWxhc3RVUkwgPSBjdXJyZW50VVJMOwotCQlyZXR1cm4gb2RmRG9jOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudCBnZXRMaXZlRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0VGFyZ2V0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gX2NvbXA7Ci0JfQotCi0JcHVibGljIEZpbGUgc2F2ZURvY3VtZW50QXNIVE1MRmlsZShTdHJpbmcgZmlsZSkgewotCQlpZiAobnVsbCA9PSBmaWxlKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gVE9ETwotCQkvLyBzZXRTdGF0dXNNZXNzYWdlKE9kZlBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiT0RGRWRpdG9yLmNvbnZlcnRIVE1MIikpOwotCi0JCS8vIFRPRE8gZmlsZSBjaGVjawotCQlPREZEb2N1bWVudCBvZGZEb2MgPSAoT0RGRG9jdW1lbnQpIGdldERvY3VtZW50KCk7Ci0JCU9ERkNvbnZlcnRlciBvZGZDb252ZXJ0ZXIgPSBPREZDb252ZXJ0ZXJDcmVhdG9yLmNyZWF0ZUhUTUxDb252ZXJ0ZXIoKTsKLQkJb2RmQ29udmVydGVyLnNldERvY3VtZW50KG9kZkRvYyk7Ci0JCW9kZkNvbnZlcnRlci5jb252ZXJ0RG9jdW1lbnQoZmlsZSwgZmFsc2UpOwotCQlyZXR1cm4gKG5ldyBGaWxlKGZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIgZ2V0U2Nyb2xsTWFuYWdlcigpIHsKLQkJcmV0dXJuIHNjcm9sbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQganVtcFRvTm9kZShOb2RlIHRhcmdldCkgewotCQlpZiAobnVsbCAhPSB0YXJnZXQpIHsKLQkJCW5ldyBPT29OYXZpZ2F0aW9uVGhyZWFkKHRhcmdldCkuc3RhcnQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgT09vTmF2aWdhdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0KLQkJcHJpdmF0ZSBOb2RlIF90YXJnZXROb2RlOwotCi0JCXB1YmxpYyBPT29OYXZpZ2F0aW9uVGhyZWFkKE5vZGUgdGFyZ2V0Tm9kZSkgewotCQkJdGhpcy5fdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCV9vT29XaW5kb3dDb21wb3NpdGUuZ2V0T29vTmF2aWdhdGlvbigpLmp1bXBUb1Byb2JsZW1Qb3NpdGlvbigKLQkJCQkJCV90YXJnZXROb2RlKTsKLQkJCX0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBvZGZlKSB7Ci0JCQkJb2RmZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjcm9sbGJhcldpZHRoKGludCBtZXRyaWMpIHsKLQkJc2Nyb2xsTWFuYWdlci5zZXRTY3JvbGxCYXJXaWR0aChtZXRyaWMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudE1JTUVUeXBlKCkgewotCQkvLyBUT0RPIHJldHVybiBhY3R1YWwgTUlNRSB0eXBlCi0JCXJldHVybiBNSU1FVFlQRVNfT0RGWzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE9ERkJyb3dzZXJFdmVudExpc3RlbmVyKElPT29FZGl0b3JQYXJ0IGxpc3RlbmVyKSB7Ci0JCWV2ZW50TGlzdGVuZXJzVi5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZU9ERkJyb3dzZXJFdmVudExpc3RlbmVyKElPT29FZGl0b3JQYXJ0IGxpc3RlbmVyKSB7Ci0JCXJldHVybiAoZXZlbnRMaXN0ZW5lcnNWLnJlbW92ZShsaXN0ZW5lcikpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aXRsZUNoYW5nZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlmb3IgKElPT29FZGl0b3JQYXJ0IGxpc3RlbmVyIDogZXZlbnRMaXN0ZW5lcnNWKSB7Ci0JCQlsaXN0ZW5lci50aXRsZUNoYW5nZSh0aXRsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBPT29Db21wb3NpdGUuY2xhc3MuZ2V0TmFtZSgpICsgIjoiICsgdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIEZpbGUgc2F2ZU9yaWdpbmFsRG9jdW1lbnQoU3RyaW5nIGZpbGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VQb3NpdGlvbkluZm9bXSBnZXRBbGxJbWFnZVBvc2l0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBuZXcgSW1hZ2VQb3NpdGlvbkluZm9bMF07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL09Pb0VkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2VkaXRvci9PT29FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhMGNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL09Pb0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5EdW1teUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuSU1vZGVsU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklNb2RlbFNlcnZpY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5lZGl0b3IuaW1wbC5JT09vRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgT09vRWRpdG9yIGV4dGVuZHMgRWRpdG9yUGFydCBpbXBsZW1lbnRzIElNb2RlbFNlcnZpY2VIb2xkZXIsIElPT29FZGl0b3JQYXJ0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gT09vRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIHByaXZhdGUgT09vQ29tcG9zaXRlIF9vZGZCcm93c2VyOwotCi0gICAgcHJpdmF0ZSBJRWRpdG9ySW5wdXQgaW5wdXQ7Ci0KLSAgICBwdWJsaWMgT09vRWRpdG9yKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0U2l0ZShzaXRlKTsKLSAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRVcmwgPSBudWxsOwotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEdW1teUVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICB0YXJnZXRVcmwgPSAoKER1bW15RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVcmwoKTsKLSAgICAgICAgICAgIGlmICgiIi5lcXVhbHModGFyZ2V0VXJsKSkgewotICAgICAgICAgICAgICAgIHRhcmdldFVybCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLl9vZGZCcm93c2VyID0gbmV3IE9Pb0NvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgX29kZkJyb3dzZXIuYWRkT0RGQnJvd3NlckV2ZW50TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGlmICh0YXJnZXRVcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgX29kZkJyb3dzZXIub3Blbih0YXJnZXRVcmwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBJTW9kZWxTZXJ2aWNlIGdldE1vZGVsU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuX29kZkJyb3dzZXI7Ci0gICAgfQotCi0gICAgcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIHRoaXMuX29kZkJyb3dzZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRpdGxlQ2hhbmdlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBzZXRQYXJ0TmFtZSh0aXRsZSk7Ci0gICAgICAgIHNldElucHV0V2l0aE5vdGlmeShuZXcgRHVtbXlFZGl0b3JJbnB1dChfb2RmQnJvd3Nlci5nZXRVUkwoKSxpbnB1dC5nZXROYW1lKCkpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL09Pb0VkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL09Pb0VkaXRvckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMGNhOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2VkaXRvci9PT29FZGl0b3JDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmFjdGlvbnMuT3Blbk9ERkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBPT29FZGl0b3JDb250cmlidXRvciBleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotICAgIHB1YmxpYyBPT29FZGl0b3JDb250cmlidXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobmV3IE9wZW5PREZBY3Rpb24oKSk7Ci0vLyAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBFZGl0T0RGQWN0aW9uKCkpOwotLy8gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2F2ZU9ERkFjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL2ltcGwvSU9Pb0VkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvaW1wbC9JT09vRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDVmYTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvaW1wbC9JT09vRWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uZWRpdG9yLmltcGw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJT09vRWRpdG9yUGFydCB7Ci0JLy9UT0RPIG1vdmUgdG8gSURhdGFTb3VyY2VIb2xkZXIKLSAgICB2b2lkIHRpdGxlQ2hhbmdlKFN0cmluZyB0aXRsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL2ltcGwvT09vRWRpdG9yU2Nyb2xsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2VkaXRvci9pbXBsL09Pb0VkaXRvclNjcm9sbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5OThlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL2ltcGwvT09vRWRpdG9yU2Nyb2xsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmVkaXRvci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5Nb2RlbFNlcnZpY2VTaXplSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuT0RGRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW50ZXJuYWwudXRpbC5PREZFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuYWNjZXNzaWJpbGl0eS5YQWNjZXNzaWJsZUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIE9Pb0VkaXRvclNjcm9sbE1hbmFnZXIgaW1wbGVtZW50cyBJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlciB7Ci0KLSAgICBPT29XaW5kb3dDb21wb3NpdGUgX29Pb1dpbmRvd0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgaW50IHNjcm9sbGJhcldpZHRoID0gMDsKLQotICAgIHB1YmxpYyBPT29FZGl0b3JTY3JvbGxNYW5hZ2VyKE9Pb1dpbmRvd0NvbXBvc2l0ZSBvT29XaW5kb3dDb21wb3NpdGUpIHsKLSAgICAgICAgX29Pb1dpbmRvd0NvbXBvc2l0ZSA9IG9Pb1dpbmRvd0NvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaW50IHksIGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFic29sdXRlQ29vcmRpbmF0ZVNjcm9sbChpbnQgeCwgaW50IHksIGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50U2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotICAgICAgICBpZiAoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQuZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkb1Njcm9sbEFjdGlvbigwLCBPT29XaW5kb3dDb21wb3NpdGUuQUNUSU9OX1NDUk9MTF9JTkNSRU1FTlRfTElORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGRlY3JlbWVudFNjcm9sbFgoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgICAgIFN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLSAgICAgICAgaWYgKENvbnRlbnRUeXBlLlNQUkVBRFNIRUVULmVxdWFscyhPREZGaWxlVXRpbHMuZ2V0T0RGRmlsZVR5cGUoc1VybCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9TY3JvbGxBY3Rpb24oMCwgT09vV2luZG93Q29tcG9zaXRlLkFDVElPTl9TQ1JPTExfREVDUkVNRU5UX0xJTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmNyZW1lbnRTY3JvbGxZKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICBTdHJpbmcgc1VybCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0gICAgICAgIGlmIChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMoT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKHNVcmwpKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDEsIE9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0lOQ1JFTUVOVF9MSU5FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50U2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotICAgICAgICBpZiAoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQuZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkb1Njcm9sbEFjdGlvbigxLCBPT29XaW5kb3dDb21wb3NpdGUuQUNUSU9OX1NDUk9MTF9ERUNSRU1FTlRfTElORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluY3JlbWVudExhcmdlU2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotICAgICAgICBDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKTsKLSAgICAgICAgaWYgKChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMob2RmRmlsZVR5cGUpKQotICAgICAgICAgICAgICAgIHx8KENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMob2RmRmlsZVR5cGUpKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDAsIE9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0lOQ1JFTUVOVF9CTE9DSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGRlY3JlbWVudExhcmdlU2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotICAgICAgICBDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKTsKLSAgICAgICAgaWYgKChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMob2RmRmlsZVR5cGUpKQotICAgICAgICAgICAgICAgIHx8KENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMob2RmRmlsZVR5cGUpKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDAsIE9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0RFQ1JFTUVOVF9CTE9DSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluY3JlbWVudExhcmdlU2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotICAgICAgICBDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKTsKLSAgICAgICAgaWYgKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMob2RmRmlsZVR5cGUpKSB7Ci0gICAgICAgIAlfb09vV2luZG93Q29tcG9zaXRlLnNldERyYXdpbmdNb2RlKCk7ICAgICAgICAJCi0gICAgICAgICAgICByZXR1cm4gX29Pb1dpbmRvd0NvbXBvc2l0ZS5tb3ZlUHJlc2VudGF0aW9uUGFnZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMob2RmRmlsZVR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9TY3JvbGxBY3Rpb24oMSwgT09vV2luZG93Q29tcG9zaXRlLkFDVElPTl9TQ1JPTExfSU5DUkVNRU5UX0JMT0NLKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50TGFyZ2VTY3JvbGxZKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICBTdHJpbmcgc1VybCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0gICAgICAgIENvbnRlbnRUeXBlIG9kZkZpbGVUeXBlID0gT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKHNVcmwpOwotICAgICAgICBpZiAoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OLmVxdWFscyhvZGZGaWxlVHlwZSkpIHsKLSAgICAgICAgCV9vT29XaW5kb3dDb21wb3NpdGUuc2V0RHJhd2luZ01vZGUoKTsgICAgIAkKLSAgICAgICAgICAgIHJldHVybiBfb09vV2luZG93Q29tcG9zaXRlLm1vdmVQcmVzZW50YXRpb25QYWdlKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMob2RmRmlsZVR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9TY3JvbGxBY3Rpb24oMSwgT09vV2luZG93Q29tcG9zaXRlLkFDVElPTl9TQ1JPTExfREVDUkVNRU5UX0JMT0NLKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50UGFnZVNjcm9sbChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAJU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotICAgICAgICBDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKTsKLSAgICAgICAgaWYgKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMob2RmRmlsZVR5cGUpKSB7Ci0gICAgICAgIAlfb09vV2luZG93Q29tcG9zaXRlLnNldERyYXdpbmdNb2RlKCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5tb3ZlUHJlc2VudGF0aW9uUGFnZShmYWxzZSk7Ci0gICAgICAgICAgICBpZih3YWl0UmVuZGVyaW5nKSB3YWl0UmVuZGVyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluY3JlbWVudFBhZ2VTY3JvbGwoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgICAgIFN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLSAgICAgICAgQ29udGVudFR5cGUgb2RmRmlsZVR5cGUgPSBPREZGaWxlVXRpbHMuZ2V0T0RGRmlsZVR5cGUoc1VybCk7Ci0gICAgICAgIGlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotICAgICAgICAJX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXREcmF3aW5nTW9kZSgpOwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IF9vT29XaW5kb3dDb21wb3NpdGUubW92ZVByZXNlbnRhdGlvblBhZ2UodHJ1ZSk7Ci0gICAgICAgICAgICBpZih3YWl0UmVuZGVyaW5nKSB3YWl0UmVuZGVyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBpbnQganVtcFRvUGFnZShpbnQgcGFnZU51bWJlciwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLSAgICAJCV9vT29XaW5kb3dDb21wb3NpdGUuc2V0RHJhd2luZ01vZGUoKTsKLSAgICAJCWludCByZXN1bHQgPSBfb09vV2luZG93Q29tcG9zaXRlLmp1bXBUb1ByZXNlbnRhdGlvblBhZ2UocGFnZU51bWJlcik7ICAgIAkJCi0gICAgICAgICAgICBpZih3YWl0UmVuZGVyaW5nKSB3YWl0UmVuZGVyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9ICAgIAkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFBhZ2VOdW1iZXIoKSB7Ci0gICAgCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLSAgICAJCXJldHVybiBfb09vV2luZG93Q29tcG9zaXRlLmdldEN1cnJlbnRQYWdlTnVtYmVyKCk7Ci0gICAgICAgIH0gICAgCQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0TGFzdFBhZ2VOdW1iZXIoKSB7Ci0gICAgICAgIGlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLSAgICAgICAgCXJldHVybiBfb09vV2luZG93Q29tcG9zaXRlLmdldFByZXNlbnRhdGlvblBhZ2VDb3VudCgpOwotICAgICAgICB9Ci0gICAgCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFNjcm9sbFR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLSAgICAgICAgaWYgKHNVcmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBOT05FOwotCi0gICAgICAgIGlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQQUdFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIE5PTkU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBkb1Njcm9sbEFjdGlvbihpbnQgYXhpcywgaW50IGFjdGlvbikgewotICAgICAgICBpbnRbXSBwcmV2Vmlld0RhdGEgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFZpZXdEYXRhKCk7Ci0gICAgICAgIGlmIChwcmV2Vmlld0RhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgCi0gICAgICAgIFhBY2Nlc3NpYmxlQWN0aW9uW10gc2Nyb2xsQWN0aW9uID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRTY3JvbGxBY3Rpb24oKTsKLSAgICAgICAgaWYoKHNjcm9sbEFjdGlvbj09bnVsbCl8fChzY3JvbGxBY3Rpb24ubGVuZ3RoPD1heGlzKXx8KHNjcm9sbEFjdGlvbltheGlzXT09bnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjcm9sbEFjdGlvbltheGlzXS5kb0FjY2Vzc2libGVBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGludFtdIHZpZXdEYXRhID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRWaWV3RGF0YSgpOwotICAgICAgICByZXR1cm4gTWF0aC5hYnModmlld0RhdGFbYXhpc10gLSBwcmV2Vmlld0RhdGFbYXhpc10pOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RlbFNlcnZpY2VTaXplSW5mbyBnZXRTaXplKGJvb2xlYW4gaXNXaG9sZSkgewotICAgICAgICAvLyBpbml0aWFsaXplIHdpbmRvdyBzZXR0aW5nCi0gICAgICAgIGlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLSAgICAgICAgICAgIF9vT29XaW5kb3dDb21wb3NpdGUuc2V0RHJhd2luZ01vZGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gc3RhcnQgY2FsY3VsYXRlIHdpbmRvdyBzaXplCi0gICAgICAgIGludFtdIHdpblNpemU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aW5TaXplID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRPT29XaW5TaXplKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG5ldyBNb2RlbFNlcnZpY2VTaXplSW5mbygwLCAwLCAwLCAwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTW9kZWxTZXJ2aWNlU2l6ZUluZm8gdmlld1NpemUgPSBuZXcgTW9kZWxTZXJ2aWNlU2l6ZUluZm8od2luU2l6ZVswXSAtIHNjcm9sbGJhcldpZHRoLCB3aW5TaXplWzFdIC0gc2Nyb2xsYmFyV2lkdGgsCi0gICAgICAgICAgICAgICAgd2luU2l6ZVswXSAtIHNjcm9sbGJhcldpZHRoLCB3aW5TaXplWzFdIC0gc2Nyb2xsYmFyV2lkdGgpOwotCi0gICAgICAgIGlmIChpc1dob2xlKSB7Ci0gICAgICAgICAgICBpZiAoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OLmVxdWFscyhPREZGaWxlVXRpbHMuZ2V0T0RGRmlsZVR5cGUoX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKSkpKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhZ2VDb3VudCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0UHJlc2VudGF0aW9uUGFnZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgTW9kZWxTZXJ2aWNlU2l6ZUluZm8gc2l6ZSA9IG5ldyBNb2RlbFNlcnZpY2VTaXplSW5mbyh3aW5TaXplWzBdIC0gc2Nyb2xsYmFyV2lkdGgsIHdpblNpemVbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0gc2Nyb2xsYmFyV2lkdGgsIHdpblNpemVbMF0gLSBzY3JvbGxiYXJXaWR0aCwgd2luU2l6ZVsxXSAqIHBhZ2VDb3VudCAtIHNjcm9sbGJhcldpZHRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaW5jcmVtZW50TGFyZ2VTY3JvbGxYKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoKG9mZnNldCA9PSAwKSB8fCAob2Zmc2V0ID09IC0xKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBpbmNyZW1lbnRMYXJnZVNjcm9sbFkoZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmICgob2Zmc2V0ID09IDApIHx8IChvZmZzZXQgPT0gLTEpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50W10gdmlld0RhdGEgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFZpZXdEYXRhKCk7Ci0gICAgICAgICAgICBpZiAodmlld0RhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIF9vT29XaW5kb3dDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmlld1NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNb2RlbFNlcnZpY2VTaXplSW5mbyBzaXplID0gbmV3IE1vZGVsU2VydmljZVNpemVJbmZvKHdpblNpemVbMF0gLSBzY3JvbGxiYXJXaWR0aCwgd2luU2l6ZVsxXSAtIHNjcm9sbGJhcldpZHRoLAotICAgICAgICAgICAgICAgICAgICB2aWV3RGF0YVsyXSAtIHNjcm9sbGJhcldpZHRoLCB2aWV3RGF0YVszXSAtIHNjcm9sbGJhcldpZHRoKTsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZGVjcmVtZW50TGFyZ2VTY3JvbGxYKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoKG9mZnNldCA9PSAwKSB8fCAob2Zmc2V0ID09IC0xKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBkZWNyZW1lbnRMYXJnZVNjcm9sbFkoZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmICgob2Zmc2V0ID09IDApIHx8IChvZmZzZXQgPT0gLTEpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9vT29XaW5kb3dDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIF9vT29XaW5kb3dDb21wb3NpdGUucmVkcmF3KCk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB2aWV3U2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjcm9sbEJhcldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBzY3JvbGxiYXJXaWR0aCA9IHdpZHRoOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3YWl0UmVuZGVyaW5nKCl7Ci0gICAgICAgIFRocmVhZCB0bXAgPSBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg3NTApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRtcC5ydW4oKTsKLSAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgdG1wLmpvaW4oKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvaW1wbC9PT29FZGl0b3JUb29sYmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL2ltcGwvT09vRWRpdG9yVG9vbGJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWQ1NzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvaW1wbC9PT29FZGl0b3JUb29sYmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5lZGl0b3IuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5PT29FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5pbnRlcm5hbC5lZGl0b3IuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0KLQotcHVibGljIGNsYXNzIE9Pb0VkaXRvclRvb2xiYXIgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gICAgcHJpdmF0ZSBUZXh0IF9hZGRyZXNzVGV4dDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBfaXNGb2N1c09uVGV4dDsKLQotICAgIHByaXZhdGUgSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgT09vRWRpdG9yVG9vbGJhcihJTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZSwgQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBib29sZWFuIGlzRWRpdG9yKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotCi0gICAgICAgIHRoaXMubW9kZWxTZXJ2aWNlID0gbW9kZWxTZXJ2aWNlOwotCi0gICAgICAgIHNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAxOwotICAgICAgICBncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgaW5pdExheW91dChpc0VkaXRvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYXlvdXQoYm9vbGVhbiBpc0VkaXRvcikgewotCi0gICAgICAgIExhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFkZHJlc3NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgYWRkcmVzc0xhYmVsLnNldFRleHQoIiAiICsgTW9kZWxTZXJ2aWNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJCcm93c2VyLkFkZHJlc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBhZGRyZXNzTGFiZWwuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnMC5zdGF0ZU1hc2sgPT0gU1dULkFMVCAmJiAoYXJnMC5jaGFyYWN0ZXIgPT0gJ2QnIHx8IGFyZzAuY2hhcmFjdGVyID09ICdEJykpIHsKLSAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3NUZXh0LnNldEZvY3VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuX2FkZHJlc3NUZXh0ID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDEwMjQ7Ci0gICAgICAgIF9hZGRyZXNzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgdGhpcy5fYWRkcmVzc1RleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgYXJnMCkgewotICAgICAgICAgICAgICAgIF9pc0ZvY3VzT25UZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgYXJnMCkgewotICAgICAgICAgICAgICAgIF9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5fYWRkcmVzc1RleHQuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGFyZzApIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9pc0ZvY3VzT25UZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgX2lzRm9jdXNPblRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuX2FkZHJlc3NUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnJvd3NlckV2ZW50TGlzdGVuZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZmlyZU5hdmlnYXRlKF9hZGRyZXNzVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbFNlcnZpY2Uub3BlbihfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gc2VhcmNoIGJ1dHRvbgotICAgICAgICBCdXR0b24gc2VhcmNoQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuTlVMTCk7Ci0gICAgICAgIHNlYXJjaEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdldEJ1dHRvbnNHcmlkRGF0YSgpKTsKLSAgICAgICAgc2VhcmNoQnV0dG9uLnNldFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJCcm93c2VyLkdvIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlYXJjaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIldlYkJyb3dzZXIuR29fdHAiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2VhcmNoQnV0dG9uLnNldEltYWdlKE9Pb0VkaXRvclBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENvbW1vblBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9icm93c2VyL2dvLnBuZyIpLmNyZWF0ZUltYWdlKCkpOwotICAgICAgICBzZWFyY2hCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAvLyBCcm93c2VyRXZlbnRMaXN0ZW5lck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5maXJlTmF2aWdhdGUoX2FkZHJlc3NUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgbW9kZWxTZXJ2aWNlLm9wZW4oX2FkZHJlc3NUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAvLyBfY29tcG9zaXRlUGFyZW50LmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihzZWFyY2hCdXR0b24pOwotICAgIH0KLQotICAgIHByaXZhdGUgR3JpZERhdGEgZ2V0QnV0dG9uc0dyaWREYXRhKCkgewotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMzI7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDMyOwotCi0gICAgICAgIHJldHVybiBncmlkRGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGV4dCBnZXRBZGRyZXNzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuX2FkZHJlc3NUZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvaW1wbC9PT29XaW5kb3dDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9lZGl0b3IvaW1wbC9PT29XaW5kb3dDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkYzk2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vZWRpdG9yL2ltcGwvT09vV2luZG93Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5lZGl0b3IuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERlBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5tYW5pZmVzdC5NYW5pZmVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5PREZGaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbnRlcm5hbC51dGlsLkJvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmludGVybmFsLnV0aWwuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW50ZXJuYWwudXRpbC5PREZVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmludGVybmFsLnV0aWwuT09vTmF2aWdhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmludGVybmFsLnV0aWwuT09vVUlDb250cm9sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5zdW4uc3Rhci5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVSb2xlOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5hY2Nlc3NpYmlsaXR5LlhBY2Nlc3NpYmxlOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5hY2Nlc3NpYmlsaXR5LlhBY2Nlc3NpYmxlQWN0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5hY2Nlc3NpYmlsaXR5LlhBY2Nlc3NpYmxlQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnN0YXIuYXd0LlBvc1NpemU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmF3dC5YU3lzdGVtQ2hpbGRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5hd3QuWFRvb2xraXQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmF3dC5YV2luZG93OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5hd3QuWFdpbmRvd1BlZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlByb3BlcnR5VmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuWFByb3BlcnR5U2V0OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5jb21wLmhlbHBlci5Cb290c3RyYXBFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5kcmF3aW5nLlhEcmF3UGFnZXM7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlc1N1cHBsaWVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5kcmF3aW5nLlhEcmF3VmlldzsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuRnJhbWVTZWFyY2hGbGFnOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YQ29tcG9uZW50TG9hZGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YQ29udHJvbGxlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWERlc2t0b3A7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhGcmFtZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWEZyYW1lczsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWEZyYW1lc1N1cHBsaWVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLkRpc3Bvc2VkRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuU3lzdGVtRGVwZW5kZW50OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLldyYXBwZWRUYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuWENvbXBvbmVudDsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5YTXVsdGlTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnN0YXIuc2hlZXQuWFNwcmVhZHNoZWV0VmlldzsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dERvY3VtZW50OwotaW1wb3J0IGNvbS5zdW4uc3Rhci51bm8uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci51bm8uVW5vUnVudGltZTsKLWltcG9ydCBjb20uc3VuLnN0YXIudXRpbC5DbG9zZVZldG9FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnV0aWwuWENsb3NlYWJsZTsKLQotcHVibGljIGNsYXNzIE9Pb1dpbmRvd0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NDUk9MTF9ERUNSRU1FTlRfTElORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NDUk9MTF9JTkNSRU1FTlRfTElORSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NDUk9MTF9ERUNSRU1FTlRfQkxPQ0sgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TQ1JPTExfSU5DUkVNRU5UX0JMT0NLID0gMzsKLQkKLQlwcml2YXRlIFhEZXNrdG9wIHhEZXNrdG9wID0gbnVsbDsKLSAgICBwcml2YXRlIFhNdWx0aVNlcnZpY2VGYWN0b3J5IHhNU0YgPSBudWxsOwotICAgIHByaXZhdGUgT09vV2luZG93IG9vb1dpbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBYRnJhbWUgeEZyYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFhDb21wb25lbnQgeENvbXBvbmVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBYQWNjZXNzaWJsZUFjdGlvbltdIHNjcm9sbEFjdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfdXJsID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIE9Pb05hdmlnYXRpb24gb29vTmF2aWdhdGlvbiA9IG51bGw7Ci0gICAgCi0JcHVibGljIE9Pb1dpbmRvd0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHRocm93cyBPREZFeGNlcHRpb24gewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJaW5pdCgpOwotCQlhZGRDb250cm9sTGlzdGVuZXIobmV3IE9Pb1dpbmRvd0NvbnRyb2xMaXN0ZW5lcigpKTsKLSAgICAgICAgYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotICAgICAgICAgICAgCWRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBPREZVdGlscy5sb2FkT3Blbk9mZmljZUxpYnMoKTsKLSAgICAgICAgICAgIEJvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5ib290c3RyYXAoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgeE1TRiA9IEJvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5nZXRYTXVsdGlTZXJ2aWNlRmFjdG9yeSgpOwotCQkJeERlc2t0b3AgPSBCb290c3RyYXBGb3JPT29Db21wb3NpdGUuZ2V0WERlc2t0b3AoKTsKLSAgICAgICAgfSBjYXRjaCAoQm9vdHN0cmFwRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCXByaXZhdGUgY2xhc3MgT09vV2luZG93Q29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgQ29udHJvbExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlpZiAob29vV2luIT1udWxsKSB7Ci0JCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQlQb2ludCBzaXplID0gKChDb21wb3NpdGUpc291cmNlKS5nZXRTaXplKCk7Ci0JCQkJCW9vb1dpbi5zZXRTaXplKHNpemUueCwgc2l6ZS55KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAJc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB4TVNGID0gbnVsbDsKLSAgICAgICAgaWYgKG9vb1dpbiE9bnVsbCkgb29vV2luLmRpc3Bvc2UoKTsKLSAgICAJaWYgKHhGcmFtZSE9bnVsbCkgY2xvc2VGcmFtZSgpOwotICAgICAgICB4RnJhbWUgPSBudWxsOwotICAgICAgICB4Q29tcG9uZW50ID0gbnVsbDsKLSAgICAJaWYgKCh4RGVza3RvcCE9bnVsbCkmJihPREZVdGlscy5nZXRPcGVuT2ZmaWNlRnJhbWVOdW0oKT09MCkpIHsKLSAgICAJCWRpc3BhdGhNZXNzYWdlVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCQkJCXRyeSB7Ci0gICAgCQkJCQl4RGVza3RvcC50ZXJtaW5hdGUoKTsKLSAgICAJCQkJfSBjYXRjaCAoRGlzcG9zZWRFeGNlcHRpb24gZGUpIHsKLSAgICAJCQkJfQotICAgIAkJCX19KTsKLSAgICAJfQotICAgIAl4RGVza3RvcCA9IG51bGw7Ci0gICAgCWlmIChzY3JvbGxBY3Rpb24hPW51bGwpIHsKLSAgICAJCWZvciAoaW50IGk9MDsgaTxzY3JvbGxBY3Rpb24ubGVuZ3RoOyBpKyspIAotICAgIAkJCXNjcm9sbEFjdGlvbltpXSA9IG51bGw7Ci0gICAgCX0KLSAgICAJc2Nyb2xsQWN0aW9uID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcGF0aE1lc3NhZ2VUaHJlYWQoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQocnVubmFibGUpOwotICAgICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIHdoaWxlKHRocmVhZC5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCk7Ci0gICAgICAgICAgICB0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlRnJhbWUoKSB7Ci0gICAgCWlmKHhGcmFtZSE9bnVsbCl7Ci0gICAgICAgIAlkaXNwYXRoTWVzc2FnZVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIAkJcHVibGljIHZvaWQgcnVuKCkgeyAgICAJCQotICAgICAgICAJCQlYQ2xvc2VhYmxlIHhDbG9zZWFibGUgPSAoWENsb3NlYWJsZSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYQ2xvc2VhYmxlLmNsYXNzLCB4RnJhbWUpOwotICAgICAgICAJCQlpZiAoeENsb3NlYWJsZSE9bnVsbCl7Ci0gICAgICAgIAkJCQl0cnkgewotICAgICAgICAJCQkJCXhDbG9zZWFibGUuY2xvc2UodHJ1ZSk7Ci0gICAgICAgIAkJCQl9IGNhdGNoIChDbG9zZVZldG9FeGNlcHRpb24gZSkgewotICAgICAgICAJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIAkJCQl9Ci0gICAgICAgIAkJCX1lbHNlewotICAgICAgICAJCQkJWENvbXBvbmVudCB4Q29tcG9uZW50ID0gKFhDb21wb25lbnQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWENvbXBvbmVudC5jbGFzcywgeEZyYW1lKTsKLSAgICAgICAgCQkJCWlmICh4Q29tcG9uZW50IT1udWxsKXsKLSAgICAgICAgCQkJCQl4Q29tcG9uZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgCQkJCX0KLSAgICAgICAgCQkJfQotICAgICAgICAJCX19KTsKLSAgICAgICAgCXhGcmFtZSA9IG51bGw7Ci0gICAgICAgIAl4Q29tcG9uZW50ID0gbnVsbDsKLSAgICAJfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkKFN0cmluZyBzVXJsKSB7Ci0gICAgICAgIGlmICgwICE9IHNVcmwuaW5kZXhPZigicHJpdmF0ZToiKSAmJiAwICE9IHNVcmwuaW5kZXhPZigiZmlsZTovLy8iKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzVXJsKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJmaWxlOi8vLyIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcmNGaWxlLmdldENhbm9uaWNhbFBhdGgoKS5yZXBsYWNlKCdcXCcsICcvJykpOwotICAgICAgICAgICAgICAgIHNVcmwgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICghc3JjRmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAJCi0gICAgCVhDb21wb25lbnRMb2FkZXIgeENvbXBvbmVudExvYWRlciA9IChYQ29tcG9uZW50TG9hZGVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhDb21wb25lbnRMb2FkZXIuY2xhc3MsIHhGcmFtZSk7Ci0gICAgCXRyeXsKLSAgICAJCVByb3BlcnR5VmFsdWVbXSBsb2FkUHJvcCA9IG5ldyBQcm9wZXJ0eVZhbHVlWzFdOwotICAgIAkJbG9hZFByb3BbMF0gPSBuZXcgUHJvcGVydHlWYWx1ZSgpOwotICAgIAkJbG9hZFByb3BbMF0uTmFtZSA9ICJSZWFkT25seSI7Ci0gICAgCQlsb2FkUHJvcFswXS5WYWx1ZSA9IEJvb2xlYW4uVFJVRTsgICAgICAgICAgICAKLSAgICAJCXhDb21wb25lbnQgPSB4Q29tcG9uZW50TG9hZGVyLmxvYWRDb21wb25lbnRGcm9tVVJMKHNVcmwsIHhGcmFtZS5nZXROYW1lKCksIEZyYW1lU2VhcmNoRmxhZy5BTEwsIGxvYWRQcm9wKTsKLSAgICAJCW9vb05hdmlnYXRpb24gPSBuZXcgT09vTmF2aWdhdGlvbih4TVNGLCB4Q29tcG9uZW50KTsgICAgCQkKLSAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAJCXhDb21wb25lbnQgPSBudWxsOwotICAgIAl9Ci0gICAgfQotICAgIAotCXByaXZhdGUgWEFjY2Vzc2libGUgZmluZFhBY2Nlc3NpYmxlQnlSb2xlKFhBY2Nlc3NpYmxlIHhBYywgc2hvcnQgcm9sZSkgewotCQlYQWNjZXNzaWJsZUNvbnRleHQgeEFjQ29udGV4dCA9IHhBYy5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpOwotCQlpZiAoeEFjLmdldEFjY2Vzc2libGVDb250ZXh0KCkuZ2V0QWNjZXNzaWJsZVJvbGUoKT09cm9sZSkgewotCQkJcmV0dXJuIHhBYzsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8eEFjQ29udGV4dC5nZXRBY2Nlc3NpYmxlQ2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCVhBY2Nlc3NpYmxlIHhBY0NoaWxkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJeEFjQ2hpbGQgPSB4QWNDb250ZXh0LmdldEFjY2Vzc2libGVDaGlsZChpKTsKLQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlYQWNjZXNzaWJsZSBmb3VuZEFjID0gZmluZFhBY2Nlc3NpYmxlQnlSb2xlKHhBY0NoaWxkLCByb2xlKTsKLQkJCWlmIChmb3VuZEFjIT1udWxsKSByZXR1cm4gZm91bmRBYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLy8gaW5kZXggMCA6IFggc2Nyb2xsIGJhcgotCS8vIGluZGV4IDEgOiBZIHNjcm9sbCBiYXIgCi0JLy9hY3Rpb24gZm9yIFNDUk9MTCBQQU5FCi0JLy8wIC0tLSBkZWNyZW1lbnRMaW5lCi0JLy8xIC0tLSBpbmNyZW1lbnRMaW5lCi0JLy8yIC0tLSBkZWNyZW1lbnRCbG9jawotCS8vMyAtLS0gaW5jcmVtZW50QmxvY2sKLQlwcml2YXRlIFhBY2Nlc3NpYmxlQWN0aW9uW10gZmluZFNjcm9sbEFjdGlvbigpIHsKLQkJWFdpbmRvdyB4V2luZG93ID0gb29vV2luLmdldFhXaW5kb3coKTsKLQkJWEFjY2Vzc2libGUgeEFjV2luZG93ID0gKFhBY2Nlc3NpYmxlKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhBY2Nlc3NpYmxlLmNsYXNzLCB4V2luZG93KTsKLQkJWEFjY2Vzc2libGUgeEFjU2Nyb2xsUGFuZSA9IGZpbmRYQWNjZXNzaWJsZUJ5Um9sZSh4QWNXaW5kb3csIEFjY2Vzc2libGVSb2xlLlNDUk9MTF9QQU5FKTsKLQkJCi0JCVhBY2Nlc3NpYmxlQ29udGV4dCBzY3JvbGxQYW5lQ29udGV4dCA9IHhBY1Njcm9sbFBhbmUuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKTsKLQkJWEFjY2Vzc2libGVbXSB4QWNTY3JvbGxCYXIgPSBuZXcgWEFjY2Vzc2libGVbMl07Ci0JCVhBY2Nlc3NpYmxlQWN0aW9uW10gc2Nyb2xsQWN0aW9uID0gbmV3IFhBY2Nlc3NpYmxlQWN0aW9uWzJdOwotCQlmb3IgKGludCBpPTAsIGo9MDsgaTxzY3JvbGxQYW5lQ29udGV4dC5nZXRBY2Nlc3NpYmxlQ2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJWEFjY2Vzc2libGUgY2hpbGQgPSBzY3JvbGxQYW5lQ29udGV4dC5nZXRBY2Nlc3NpYmxlQ2hpbGQoaSk7Ci0JCQkJWEFjY2Vzc2libGVDb250ZXh0IGNoaWxkQ29udGV4dCA9IGNoaWxkLmdldEFjY2Vzc2libGVDb250ZXh0KCk7Ci0JCQkJaWYgKGNoaWxkQ29udGV4dC5nZXRBY2Nlc3NpYmxlUm9sZSgpPT1BY2Nlc3NpYmxlUm9sZS5TQ1JPTExfQkFSKSB7Ci0JCQkJCXhBY1Njcm9sbEJhcltqXSA9IGNoaWxkOwotCQkJCQlzY3JvbGxBY3Rpb25bal0gPSAoWEFjY2Vzc2libGVBY3Rpb24pIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWEFjY2Vzc2libGVBY3Rpb24uY2xhc3MsCi0JCQkJCQkJeEFjU2Nyb2xsQmFyW2pdLmdldEFjY2Vzc2libGVDb250ZXh0KCkpOwotCQkJCQlqKys7Ci0JCQkJfQkJCQkKLQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNjcm9sbEFjdGlvbjsKLQl9Ci0JCi0gICAgcHJpdmF0ZSBjbGFzcyBPT29XaW5kb3cgewotICAgIAlDb21wb3NpdGUgcGFyZW50ID0gbnVsbDsKLSAgICAJWFdpbmRvdyB4V2luZG93ID0gbnVsbDsKLSAgICAJCi0gICAgCXB1YmxpYyBPT29XaW5kb3coQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQotICAgIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAkJeFdpbmRvdyA9IG51bGw7Ci0gICAgCX0KLSAgICAJCi0gICAgCXB1YmxpYyB2b2lkIGNyZWF0ZShYTXVsdGlTZXJ2aWNlRmFjdG9yeSB4TVNGKSB7Ci0gICAgICAJICBpZih4V2luZG93PT1udWxsKXsKLSAgICAgIAkJICBYVG9vbGtpdCB4VG9vbGtpdCA9IG51bGw7Ci0gICAgICAJCSAgdHJ5IHsKLSAgICAgIAkJCSAgeFRvb2xraXQgPSAoWFRvb2xraXQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFRvb2xraXQuY2xhc3MsIHhNU0YuY3JlYXRlSW5zdGFuY2UoImNvbS5zdW4uc3Rhci5hd3QuVG9vbGtpdCIpKTsKLSAgICAgIAkJICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgCQkJICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgCQkgIH0gICAgICAJCSAgCi0gICAgICAJCSAgaWYoeFRvb2xraXQhPW51bGwpIHsKLSAgICAgIAkJCSAgWFN5c3RlbUNoaWxkRmFjdG9yeSB4U3lzdGVtQ2hpbGRGYWN0b3J5ID0gKFhTeXN0ZW1DaGlsZEZhY3RvcnkpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFN5c3RlbUNoaWxkRmFjdG9yeS5jbGFzcywgeFRvb2xraXQpOwotICAgICAgCQkJICBpZih4U3lzdGVtQ2hpbGRGYWN0b3J5IT1udWxsKXsKLSAgICAgIAkJCQkgIGJ5dGVbXSBwcm9jSUQgPSBuZXcgYnl0ZVswXTsKLSAgICAgIAkJCQkgIFhXaW5kb3dQZWVyIHhXaW5kb3dQZWVyID0geFN5c3RlbUNoaWxkRmFjdG9yeS5jcmVhdGVTeXN0ZW1DaGlsZChuZXcgSW50ZWdlcihwYXJlbnQuaGFuZGxlKSwgcHJvY0lELCBTeXN0ZW1EZXBlbmRlbnQuU1lTVEVNX1dJTjMyKTsKLSAgICAgIAkJCQkgIGlmKHhXaW5kb3dQZWVyIT1udWxsKXsKLSAgICAgIAkJCQkJICB4V2luZG93ID0gKFhXaW5kb3cpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFdpbmRvdy5jbGFzcywgeFdpbmRvd1BlZXIpOwotICAgICAgCQkJCSAgfQotICAgICAgCQkJICB9Ci0gICAgICAJCSAgfQotICAgICAgCSAgfQotICAgIAl9Ci0gICAgCQotICAgIAlwdWJsaWMgWFdpbmRvdyBnZXRYV2luZG93KCkge3JldHVybiB4V2luZG93O30KLSAgICAJCi0gICAgCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLSAgICAJCWlmKHhXaW5kb3chPW51bGwpewotICAgIAkJCXhXaW5kb3cuc2V0UG9zU2l6ZSgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBQb3NTaXplLlNJWkUpOwotICAgIAkJfQotICAgIAl9Ci0KLSAgICAJcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKXsKLSAgICAJCWlmKHhXaW5kb3chPW51bGwpewotICAgIAkJCXhXaW5kb3cuc2V0UG9zU2l6ZSgwLCAwLCB3aWR0aCwgMCwgUG9zU2l6ZS5XSURUSCk7Ci0gICAgCQl9Ci0gICAgCX0KLQotICAgIAlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCl7Ci0gICAgCQlpZih4V2luZG93IT1udWxsKXsKLSAgICAJCQl4V2luZG93LnNldFBvc1NpemUoMCwgMCwgMCwgaGVpZ2h0LCBQb3NTaXplLkhFSUdIVCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKXsKLSAgICAJCWlmKHhXaW5kb3chPW51bGwpeyAgICAJCQotICAgIAkJCXhXaW5kb3cuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAJCX0KLSAgICAJfSAgICAJCi0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkUHJvdGVjdGVkKFN0cmluZyB1cmwpIHsKLSAgICAJT0RGUGFyc2VyIHBhcnNlciA9IG5ldyBPREZQYXJzZXIoKTsKLSAgICAJRG9jdW1lbnQgbWFuaWZlc3REb2MgPSBwYXJzZXIuZ2V0RG9jdW1lbnQodXJsLCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLk9ERl9NQU5JRkVTVF9GSUxFTkFNRSk7Ci0gICAgCWlmIChtYW5pZmVzdERvYz09bnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIAlOb2RlTGlzdCBubCA9IG1hbmlmZXN0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoTWFuaWZlc3RDb25zdGFudHMuTUFOSUZFU1RfTkFNRVNQQUNFX1VSSSwgTWFuaWZlc3RDb25zdGFudHMuRUxFTUVOVF9FTkNSWVBUSU9OX0RBVEEpOwotICAgIAlpZiAoKG5sIT1udWxsKSYmKG5sLmdldExlbmd0aCgpIT0wKSkgcmV0dXJuIHRydWU7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgb3BlbihTdHJpbmcgc1VybCkgewotICAgICAgICBpZiAoaXNQYXNzd29yZFByb3RlY3RlZChzVXJsKSkgewotICAgICAgICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuZGlzcGxheUhlbHBSZXNvdXJjZSgiL29yZy5lY2xpcHNlLmFjdGYuZXhhbXBsZXMuYWRlc2lnbmVyLmRvYy9kb2NzL29kZi9lcnJvci5odG1sIik7Ci0gICAgICAgIAlyZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAJCi0gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91cyBPT28gd2luZG93Ci0gICAgICAgIGlmIChvb29XaW4hPW51bGwpIHsKLSAgICAgICAgCW9vb1dpbi5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhGcmFtZSE9bnVsbCkgewotICAgICAgICAJY2xvc2VGcmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotCQlvb29XaW4gPSBuZXcgT09vV2luZG93KHRoaXMpOwotICAgICAgICB0aGlzLl91cmwgPSBzVXJsOwotICAgICAgICAKLSAgICAJZGlzcGF0aE1lc3NhZ2VUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgIAkJcHVibGljIHZvaWQgcnVuKCkgeyAgICAJCQotICAgIAkJCXRyeSB7Ci0gICAgCQkJCW9vb1dpbi5jcmVhdGUoeE1TRik7Ci0KLSAgICAJCQkJeEZyYW1lID0gKFhGcmFtZSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRnJhbWUuY2xhc3MsIHhNU0YuY3JlYXRlSW5zdGFuY2UoImNvbS5zdW4uc3Rhci5mcmFtZS5GcmFtZSIpKTsKLSAgICAJCQkJWEZyYW1lc1N1cHBsaWVyIHhGcmFtZXNTdXBwbGllciA9IChYRnJhbWVzU3VwcGxpZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWEZyYW1lc1N1cHBsaWVyLmNsYXNzLCB4TVNGLmNyZWF0ZUluc3RhbmNlKCJjb20uc3VuLnN0YXIuZnJhbWUuRGVza3RvcCIpKTsKLSAgICAJCQkJWEZyYW1lcyB4RnJhbWVzID0geEZyYW1lc1N1cHBsaWVyLmdldEZyYW1lcygpOwotICAgIAkJCQl4RnJhbWVzLmFwcGVuZCh4RnJhbWUpOwotICAgIAkJCQl4RnJhbWUuaW5pdGlhbGl6ZShvb29XaW4uZ2V0WFdpbmRvdygpKTsKLQotICAgIAkJCQlsb2FkKF91cmwpOwotICAgIAkJCQkKLSAgICAJCQkJc2Nyb2xsQWN0aW9uID0gZmluZFNjcm9sbEFjdGlvbigpOwotICAgIAkJCQkKLSAgICAJCQkJdHJ5IHsKLSAgICAJCQkJCU9Pb1VJQ29udHJvbHMuaGlkZVVJRWxlbWVudHMoeEZyYW1lLCB4TVNGKTsKLSAgICAJCQkJfSBjYXRjaCAoT0RGRXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCQkJCX0KLSAgICAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAkJCX0gICAgICAgIAotICAgICAgICAJfX0pOwotICAgIAkKLSAgICAJUG9pbnQgc2l6ZSA9IHRoaXMuZ2V0U2l6ZSgpOwotICAgIAlvb29XaW4uc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAJb29vV2luLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLl91cmw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPT29OYXZpZ2F0aW9uIGdldE9vb05hdmlnYXRpb24oKSB7Ci0gICAgCXJldHVybiB0aGlzLm9vb05hdmlnYXRpb247Ci0gICAgfQotICAgIAotCXB1YmxpYyBYQWNjZXNzaWJsZUFjdGlvbltdIGdldFNjcm9sbEFjdGlvbigpIHsKLQkJcmV0dXJuIHNjcm9sbEFjdGlvbjsKLQl9Ci0JCi0JcHVibGljIGludFtdIGdldFZpZXdEYXRhKCkgewotICAgICAgICBDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShfdXJsKTsKLQkJaWYgKENvbnRlbnRUeXBlLldSSVRFLmVxdWFscyhvZGZGaWxlVHlwZSkpIHsKLQkJCVhUZXh0RG9jdW1lbnQgeFRleHREb2N1bWVudCA9IChYVGV4dERvY3VtZW50KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhUZXh0RG9jdW1lbnQuY2xhc3MsIHhDb21wb25lbnQpOwotCQkJaWYgKHhUZXh0RG9jdW1lbnQhPW51bGwpIHsKLQkJCQlTdHJpbmcgdmlld0RhdGEgPSAoU3RyaW5nKSB4RnJhbWUuZ2V0Q29udHJvbGxlcigpLmdldFZpZXdEYXRhKCk7Ci0JCQkJU3RyaW5nW10gcG9pbnRzU3RyID0gdmlld0RhdGEuc3BsaXQoIjsiKTsKLQkJCQlpbnRbXSBwb2ludHMgPSBuZXcgaW50WzRdOwkJCi0JCQkJcG9pbnRzWzBdID0gbmV3IEludGVnZXIocG9pbnRzU3RyWzNdKS5pbnRWYWx1ZSgpOwotCQkJCXBvaW50c1sxXSA9IG5ldyBJbnRlZ2VyKHBvaW50c1N0cls0XSkuaW50VmFsdWUoKTsKLQkJCQlwb2ludHNbMl0gPSBuZXcgSW50ZWdlcihwb2ludHNTdHJbNV0pLmludFZhbHVlKCk7Ci0JCQkJcG9pbnRzWzNdID0gbmV3IEludGVnZXIocG9pbnRzU3RyWzZdKS5pbnRWYWx1ZSgpOwotCQkJCXJldHVybiBwb2ludHM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQuZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJWENvbnRyb2xsZXIgeENvbnRyb2xsZXIgPSB4RnJhbWUuZ2V0Q29udHJvbGxlcigpOwotCQkJWFNwcmVhZHNoZWV0VmlldyB4U3ByZWFkVmlldyA9IChYU3ByZWFkc2hlZXRWaWV3KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhTcHJlYWRzaGVldFZpZXcuY2xhc3MsIHhDb250cm9sbGVyKTsKLQkJCVhQcm9wZXJ0eVNldCB4UHJvcFNldCA9IChYUHJvcGVydHlTZXQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFByb3BlcnR5U2V0LmNsYXNzLCB4U3ByZWFkVmlldyk7Ci0JCQl0cnkgewotCQkJCVJlY3RhbmdsZSB2aXNpYmxlQXJlYSA9IChSZWN0YW5nbGUpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoUmVjdGFuZ2xlLmNsYXNzLCB4UHJvcFNldC5nZXRQcm9wZXJ0eVZhbHVlKCJWaXNpYmxlQXJlYSIpKTsKLQkJCQlpbnRbXSBwb2ludHMgPSBuZXcgaW50WzRdOwotCQkJCXBvaW50c1swXSA9IHZpc2libGVBcmVhLlg7Ci0JCQkJcG9pbnRzWzFdID0gdmlzaWJsZUFyZWEuWTsKLQkJCQlwb2ludHNbMl0gPSB2aXNpYmxlQXJlYS5YICsgdmlzaWJsZUFyZWEuV2lkdGg7Ci0JCQkJcG9pbnRzWzNdID0gdmlzaWJsZUFyZWEuWSArIHZpc2libGVBcmVhLkhlaWdodDsKLQkJCQlyZXR1cm4gcG9pbnRzOwotCQkJfSBjYXRjaCAoVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OLmVxdWFscyhvZGZGaWxlVHlwZSkpIHsKLQkJCVhDb250cm9sbGVyIHhDb250cm9sbGVyID0geEZyYW1lLmdldENvbnRyb2xsZXIoKTsKLQkJCVhEcmF3VmlldyB4RHJhd1ZpZXcgPSAoWERyYXdWaWV3KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3Vmlldy5jbGFzcywgeENvbnRyb2xsZXIpOwotCQkJWFByb3BlcnR5U2V0IHhQcm9wU2V0ID0gKFhQcm9wZXJ0eVNldCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYUHJvcGVydHlTZXQuY2xhc3MsIHhEcmF3Vmlldyk7Ci0JCQl0cnkgewotCQkJCVJlY3RhbmdsZSB2aXNpYmxlQXJlYSA9IChSZWN0YW5nbGUpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoUmVjdGFuZ2xlLmNsYXNzLCB4UHJvcFNldC5nZXRQcm9wZXJ0eVZhbHVlKCJWaXNpYmxlQXJlYSIpKTsKLQkJCQlpbnRbXSBwb2ludHMgPSBuZXcgaW50WzRdOwotCQkJCXBvaW50c1swXSA9IHZpc2libGVBcmVhLlg7Ci0JCQkJcG9pbnRzWzFdID0gdmlzaWJsZUFyZWEuWTsKLQkJCQlwb2ludHNbMl0gPSB2aXNpYmxlQXJlYS5YICsgdmlzaWJsZUFyZWEuV2lkdGg7Ci0JCQkJcG9pbnRzWzNdID0gdmlzaWJsZUFyZWEuWSArIHZpc2libGVBcmVhLkhlaWdodDsKLQkJCQlyZXR1cm4gcG9pbnRzOwotCQkJfSBjYXRjaCAoVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgaW50W10gZ2V0T09vV2luU2l6ZSgpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICBpZih4RnJhbWU9PW51bGwpewotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbigibm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCVhXaW5kb3cgY29tcG9uZW50V2luZG93ID0geEZyYW1lLmdldENvbXBvbmVudFdpbmRvdygpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvbmVudFdpbmRvdy5nZXRQb3NTaXplKCk7Ci0JCWludFtdIHNpemUgPSBuZXcgaW50WzJdOwotCQlzaXplWzBdID0gcmVjdC5XaWR0aDsKLQkJc2l6ZVsxXSA9IHJlY3QuSGVpZ2h0OwotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQcmVzZW50YXRpb25QYWdlQ291bnQoKSB7Ci0JCXJldHVybiBPREZVdGlscy5nZXREcmF3UGFnZUNvdW50KHhDb21wb25lbnQpOwotCX0KLQkKLQlwdWJsaWMgaW50IGp1bXBUb1ByZXNlbnRhdGlvblBhZ2UoaW50IHBhZ2VOdW1iZXIpIHsKLQkJWERyYXdQYWdlc1N1cHBsaWVyIHhEcmF3UGFnZXNTdXBwID0gKFhEcmF3UGFnZXNTdXBwbGllcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2VzU3VwcGxpZXIuY2xhc3MsIHhDb21wb25lbnQpOwotCQlYRHJhd1BhZ2VzIHhEcmF3UGFnZXMgPSB4RHJhd1BhZ2VzU3VwcC5nZXREcmF3UGFnZXMoKTsKLQotCQlYQ29udHJvbGxlciB4Q29udHJvbGxlciA9IHhGcmFtZS5nZXRDb250cm9sbGVyKCk7Ci0JCVhEcmF3VmlldyB4RHJhd1ZpZXcgPSAoWERyYXdWaWV3KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3Vmlldy5jbGFzcywgeENvbnRyb2xsZXIpOwotCQl0cnkgewotCQkJWERyYXdQYWdlIHBhZ2UgPSAoWERyYXdQYWdlKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZS5jbGFzcywgeERyYXdQYWdlcy5nZXRCeUluZGV4KHBhZ2VOdW1iZXItMSkpOwotCQkJeERyYXdWaWV3LnNldEN1cnJlbnRQYWdlKHBhZ2UpOwkKLQkJCXJldHVybiAxOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0gICAgfQkKLQkKLQlwdWJsaWMgaW50IGdldEN1cnJlbnRQYWdlTnVtYmVyKCl7Ci0JCVhDb250cm9sbGVyIHhDb250cm9sbGVyID0geEZyYW1lLmdldENvbnRyb2xsZXIoKTsKLQkJWERyYXdWaWV3IHhEcmF3VmlldyA9IChYRHJhd1ZpZXcpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdWaWV3LmNsYXNzLCB4Q29udHJvbGxlcik7Ci0JCVhEcmF3UGFnZSBjdXJQYWdlID0geERyYXdWaWV3LmdldEN1cnJlbnRQYWdlKCk7Ci0JCVhQcm9wZXJ0eVNldCBjdXJQYWdlUHJvcCA9IChYUHJvcGVydHlTZXQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFByb3BlcnR5U2V0LmNsYXNzLCBjdXJQYWdlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoKFNob3J0KSBjdXJQYWdlUHJvcC5nZXRQcm9wZXJ0eVZhbHVlKCJOdW1iZXIiKSkuaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlMSkgewotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gCi0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIGludCBtb3ZlUHJlc2VudGF0aW9uUGFnZShib29sZWFuIGZvcndhcmQpewotCQlYRHJhd1BhZ2VzU3VwcGxpZXIgeERyYXdQYWdlc1N1cHAgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgeENvbXBvbmVudCk7Ci0JCVhEcmF3UGFnZXMgeERyYXdQYWdlcyA9IHhEcmF3UGFnZXNTdXBwLmdldERyYXdQYWdlcygpOwotCQlpbnQgcGFnZUNvdW50ID0geERyYXdQYWdlcy5nZXRDb3VudCgpOwotCi0JCWludCBjdXJQYWdlTnVtYmVyID0gZ2V0Q3VycmVudFBhZ2VOdW1iZXIoKTsKLQkJaWYgKGN1clBhZ2VOdW1iZXI9PS0xKSByZXR1cm4gLTE7Ci0JCQotCQlpZiAoKGZvcndhcmQ9PXRydWUpJiYoY3VyUGFnZU51bWJlcj09cGFnZUNvdW50KSkgcmV0dXJuIDA7Ci0JCWlmICgoZm9yd2FyZD09ZmFsc2UpJiYoY3VyUGFnZU51bWJlcj09MSkpIHJldHVybiAwOwkJCi0JCQotCQlpbnQgbmV3UGFnZUluZGV4OwotCQlpZiAoZm9yd2FyZCkgbmV3UGFnZUluZGV4ID0gY3VyUGFnZU51bWJlcjsKLQkJZWxzZSBuZXdQYWdlSW5kZXggPSBjdXJQYWdlTnVtYmVyLTI7Ci0JCQotCQlYQ29udHJvbGxlciB4Q29udHJvbGxlciA9IHhGcmFtZS5nZXRDb250cm9sbGVyKCk7Ci0JCVhEcmF3VmlldyB4RHJhd1ZpZXcgPSAoWERyYXdWaWV3KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3Vmlldy5jbGFzcywgeENvbnRyb2xsZXIpOwotCQl0cnkgewotCQkJWERyYXdQYWdlIG5ld1BhZ2UgPSAoWERyYXdQYWdlKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZS5jbGFzcywgeERyYXdQYWdlcy5nZXRCeUluZGV4KG5ld1BhZ2VJbmRleCkpOwotCQkJeERyYXdWaWV3LnNldEN1cnJlbnRQYWdlKG5ld1BhZ2UpOwkJCQotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgICAgICB0cnl7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0T09vV2luU2l6ZSgpWzFdOwotICAgICAgICB9Y2F0Y2goT0RGRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCQotCXB1YmxpYyBib29sZWFuIHNldERyYXdpbmdNb2RlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIE9Pb1VJQ29udHJvbHMuc2V0RHJhd2luZ01vZGUoeE1TRiwgeEZyYW1lLmdldENvbnRyb2xsZXIoKSk7Ci0JCX0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW50ZXJuYWwvdXRpbC9Cb290c3RyYXBGb3JPT29Db21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbnRlcm5hbC91dGlsL0Jvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDEwOGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbnRlcm5hbC91dGlsL0Jvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotCi1pbXBvcnQgY29tLnN1bi5zdGFyLmJyaWRnZS5Vbm9VcmxSZXNvbHZlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuYnJpZGdlLlhVbm9VcmxSZXNvbHZlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuY29tcC5oZWxwZXIuQm9vdHN0cmFwOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5jb21wLmhlbHBlci5Cb290c3RyYXBFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbm5lY3Rpb24uTm9Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRGVza3RvcDsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5YTXVsdGlDb21wb25lbnRGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhNdWx0aVNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5saWIudW5vLmhlbHBlci5Vbm9Vcmw7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxpYi51dGlsLk5hdGl2ZUxpYnJhcnlMb2FkZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5Vbm9SdW50aW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci51bm8uWENvbXBvbmVudENvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlIGV4dGVuZHMgQm9vdHN0cmFwIHsKLQlwcml2YXRlIHN0YXRpYyBYQ29tcG9uZW50Q29udGV4dCB4Q29tcG9uZW50Q29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgWE11bHRpU2VydmljZUZhY3RvcnkgeE1TRiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgWERlc2t0b3AgeERlc2t0b3AgPSBudWxsOwotCQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJvY2VzcyBib290c3RyYXAoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBCb290c3RyYXBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgUHJvY2VzcyBwcm9jZXNzICA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgeENvbXBvbmVudENvbnRleHQgPSBjcmVhdGVJbml0aWFsQ29tcG9uZW50Q29udGV4dChudWxsKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHhDb21wb25lbnRDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJvb3RzdHJhcEV4Y2VwdGlvbigibm8gbG9jYWwgY29tcG9uZW50IGNvbnRleHQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHNPZmZpY2VFeGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luZG93cyIpID8gInNvZmZpY2UuZXhlIiA6ICJzb2ZmaWNlIjsKLSAgICAgICAgICAgIEZpbGUgc09mZmljZUZpbGUgPSBOYXRpdmVMaWJyYXJ5TG9hZGVyLmdldFJlc291cmNlKGNsYXNzTG9hZGVyLCBzT2ZmaWNlRXhlTmFtZSk7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBzT2ZmaWNlRmlsZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCb290c3RyYXBFeGNlcHRpb24oIm5vIG9mZmljZSBleGVjdXRhYmxlIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhNdWx0aUNvbXBvbmVudEZhY3RvcnkgeE1DRiA9IHhDb21wb25lbnRDb250ZXh0LmdldFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSB4TUNGKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJvb3RzdHJhcEV4Y2VwdGlvbigibm8gaW5pdGlhbCBzZXJ2aWNlIG1hbmFnZXIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWFVub1VybFJlc29sdmVyIHhVbm9VcmxSZXNvbHZlciA9IFVub1VybFJlc29sdmVyLmNyZWF0ZSh4Q29tcG9uZW50Q29udGV4dCk7Ci0gICAgICAgICAgICBTdHJpbmcgc1Vub1VybCA9ICJ1bm86cGlwZSxuYW1lPSIgKyBnZXRQaXBlTmFtZSgpICsgIjt1cnA7U3Rhck9mZmljZS5TZXJ2aWNlTWFuYWdlciI7Ci0KLSAgICAgICAgICAgIFVub1VybCB1bm91cmwgPSBVbm9VcmwucGFyc2VVbm9Vcmwoc1Vub1VybCk7Ci0gICAgICAgICAgICBTdHJpbmcgY29ublR5cGUgPSB1bm91cmwuZ2V0Q29ubmVjdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gdW5vdXJsLmdldFByb3RvY29sKCk7Ci0gICAgICAgICAgICBTdHJpbmcgaW5pdE9iaiA9IHVub3VybC5nZXRSb290T2lkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBhc1tdID0gbmV3IFN0cmluZ1s1XTsKLSAgICAgICAgICAgIGFzWzBdID0gc09mZmljZUZpbGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgYXNbMV0gPSAiLW5vbG9nbyI7Ci0gICAgICAgICAgICBhc1syXSA9ICItbm9kZWZhdWx0IjsKLSAgICAgICAgICAgIGFzWzNdID0gIi1ub3Jlc3RvcmUiOyAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvbm5UeXBlLmVxdWFscygicGlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgYXNbNF0gPSAiLWFjY2VwdD1waXBlLG5hbWU9IiArIGdldFBpcGVOYW1lKCkgKyAiOyIgKyBwcm90b2NvbCArICI7IiArIGluaXRPYmo7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibm90IGNvbm5lY3Rpb24gc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGFzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IG9TZXJ2aWNlTWFuYWdlcjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvU2VydmljZU1hbmFnZXIgPSB4VW5vVXJsUmVzb2x2ZXIucmVzb2x2ZSgidW5vOnBpcGUsbmFtZT0iICsgZ2V0UGlwZU5hbWUoKSArICI7dXJwO1N0YXJPZmZpY2UuU2VydmljZU1hbmFnZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9Db25uZWN0RXhjZXB0aW9uIG5jZSkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgICAgICAgICB9IH0gd2hpbGUgKHRydWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgeE1TRiA9IChYTXVsdGlTZXJ2aWNlRmFjdG9yeSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYTXVsdGlTZXJ2aWNlRmFjdG9yeS5jbGFzcywgb1NlcnZpY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIHhEZXNrdG9wID0gKFhEZXNrdG9wKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEZXNrdG9wLmNsYXNzLCB4TVNGLmNyZWF0ZUluc3RhbmNlKCJjb20uc3VuLnN0YXIuZnJhbWUuRGVza3RvcCIpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQm9vdHN0cmFwRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcHJvY2VzczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGlwZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSArICJfT2ZmaWNlIjsKLSAgICAgICAgcyA9IHJlcGxhY2VBbGwocywgIl8iLCAiJUI3Iik7Ci0KLSAgICAgICAgcmV0dXJuIHJlcGxhY2VBbGwocmVwbGFjZUFsbChVUkxFbmNvZGVyLmVuY29kZShzKSwgIisiLCAiJTIwIiksICIlIiwgIl8iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUFsbChTdHJpbmcgcywgU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocyk7Ci0gICAgICAgIGludCBpID0gcy5sZW5ndGgoKTsKLSAgICAgICAgaW50IGogPSBzMS5sZW5ndGgoKTsKLSAgICAgICAgd2hpbGUgKChpID0gcy5sYXN0SW5kZXhPZihzMSwgaSAtIDEpKSA+IC0xKSB7Ci0gICAgICAgICAgICBzdHJpbmdidWZmZXIucmVwbGFjZShpLCBpICsgaiwgczIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZ2J1ZmZlci50b1N0cmluZygpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFhDb21wb25lbnRDb250ZXh0IGdldFhDb21wb25lbnRDb250ZXh0KCkge3JldHVybiB4Q29tcG9uZW50Q29udGV4dDt9Ci0JcHVibGljIHN0YXRpYyBYTXVsdGlTZXJ2aWNlRmFjdG9yeSBnZXRYTXVsdGlTZXJ2aWNlRmFjdG9yeSgpIHtyZXR1cm4geE1TRjt9Ci0JcHVibGljIHN0YXRpYyBYRGVza3RvcCBnZXRYRGVza3RvcCgpIHtyZXR1cm4geERlc2t0b3A7fQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2ludGVybmFsL3V0aWwvT0RGRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW50ZXJuYWwvdXRpbC9PREZFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlYjRiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW50ZXJuYWwvdXRpbC9PREZFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbnRlcm5hbC51dGlsOwotCi0KLQotcHVibGljIGNsYXNzIE9ERkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY2Nzc3Mjc4MjIxNjc4MTYyNjNMOwotCQotCXB1YmxpYyBPREZFeGNlcHRpb24oKXsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIE9ERkV4Y2VwdGlvbihTdHJpbmcgbXNnKXsKLQkJc3VwZXIobXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW50ZXJuYWwvdXRpbC9PREZVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2ludGVybmFsL3V0aWwvT0RGVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzNjViOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW50ZXJuYWwvdXRpbC9PREZVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLnV0aWwuT09vRWRpdG9ySW5pdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5UQ0hBUjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuWFByb3BlcnR5U2V0OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5jb21wLmhlbHBlci5Cb290c3RyYXA7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbnRhaW5lci5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5jb250YWluZXIuWEVudW1lcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5jb250YWluZXIuWEVudW1lcmF0aW9uQWNjZXNzOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5kcmF3aW5nLlhEcmF3UGFnZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2VzOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5kcmF3aW5nLlhEcmF3UGFnZXNTdXBwbGllcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWERlc2t0b3A7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhEaXNwYXRjaEhlbHBlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWEZyYW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWE1vZGVsOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuV3JhcHBlZFRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5YQ29tcG9uZW50OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhNdWx0aUNvbXBvbmVudEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5Vbm9SdW50aW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci51bm8uWENvbXBvbmVudENvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgT0RGVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERyYXdQYWdlQ291bnQoWENvbXBvbmVudCB4Q29tcCkgewotICAgICAgICBYRHJhd1BhZ2VzU3VwcGxpZXIgeERyYXdQYWdlc1N1cHBsaWVyID0gKFhEcmF3UGFnZXNTdXBwbGllcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZSgKLSAgICAgICAgICAgICAgICBYRHJhd1BhZ2VzU3VwcGxpZXIuY2xhc3MsIHhDb21wKTsKLSAgICAgICAgWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHBsaWVyLmdldERyYXdQYWdlcygpOwotCi0gICAgICAgIHJldHVybiB4RHJhd1BhZ2VzLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYRHJhd1BhZ2UgZ2V0RHJhd1BhZ2VCeUluZGV4KFhDb21wb25lbnQgeENvbXAsIGludCBpbmRleCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhEcmF3UGFnZXNTdXBwbGllciB4RHJhd1BhZ2VzU3VwcGxpZXIgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKAotICAgICAgICAgICAgICAgICAgICBYRHJhd1BhZ2VzU3VwcGxpZXIuY2xhc3MsIHhDb21wKTsKLSAgICAgICAgICAgIFhEcmF3UGFnZXMgeERyYXdQYWdlcyA9IHhEcmF3UGFnZXNTdXBwbGllci5nZXREcmF3UGFnZXMoKTsKLQotICAgICAgICAgICAgcmV0dXJuIChYRHJhd1BhZ2UpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdQYWdlLmNsYXNzLCB4RHJhd1BhZ2VzLmdldEJ5SW5kZXgoaW5kZXgpKTsKLQotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlvb2JlKSB7Ci0gICAgICAgICAgICBpb29iZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oaW9vYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiB3dGUpIHsKLSAgICAgICAgICAgIHd0ZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24od3RlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRUeXBlIGdldE9ERkZpbGVUeXBlKERvY3VtZW50IG9kZkNvbnRlbnQpIHsKLSAgICAgICAgaWYgKG9kZkNvbnRlbnQhPW51bGwpIHsgICAgIAotICAgICAgICAgICAgRWxlbWVudCBjb250ZW50ID0gb2RmQ29udGVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKERvY3VtZW50Q29udGVudEVsZW1lbnQpY29udGVudCkuZ2V0Qm9keUVsZW1lbnQoKS5nZXRDb250ZW50KCkuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29udGVudFR5cGUuTk9ORTsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWEZyYW1lIGdldFhGcmFtZShYQ29tcG9uZW50Q29udGV4dCB4Q29tcENvbnRleHQpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICBYQ29tcG9uZW50IHhDb21wID0gZ2V0WENvbXBvbmVudCh4Q29tcENvbnRleHQpOwotICAgICAgICBYTW9kZWwgbW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywgeENvbXApOwotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0Q3VycmVudENvbnRyb2xsZXIoKS5nZXRGcmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWERpc3BhdGNoSGVscGVyIGdldFhEaXNwYXRjaEhlbHBlcihYQ29tcG9uZW50Q29udGV4dCB4Q29tcENvbnRleHQpIHRocm93cyBPREZFeGNlcHRpb24gewotCi0gICAgICAgIFhEaXNwYXRjaEhlbHBlciB4RGlzcGF0Y2hIZWxwZXIgPSBudWxsOwotCi0gICAgICAgIFhNdWx0aUNvbXBvbmVudEZhY3RvcnkgeE1DRiA9IHhDb21wQ29udGV4dC5nZXRTZXJ2aWNlTWFuYWdlcigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3Qgb0Rpc3BhdGNoSGVscGVyID0geE1DRi5jcmVhdGVJbnN0YW5jZVdpdGhDb250ZXh0KCJjb20uc3VuLnN0YXIuZnJhbWUuRGlzcGF0Y2hIZWxwZXIiLCB4Q29tcENvbnRleHQpOwotICAgICAgICAgICAgeERpc3BhdGNoSGVscGVyID0gKFhEaXNwYXRjaEhlbHBlcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRGlzcGF0Y2hIZWxwZXIuY2xhc3MsIG9EaXNwYXRjaEhlbHBlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4RGlzcGF0Y2hIZWxwZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYTGF5b3V0TWFuYWdlciBnZXRYTGF5b3V0TWFuYWdlcihYRnJhbWUgeEZyYW1lKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLQotICAgICAgICBYTGF5b3V0TWFuYWdlciB4TGF5b3V0TWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgWFByb3BlcnR5U2V0IGZyYW1lUHJvcFNldCA9IChYUHJvcGVydHlTZXQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFByb3BlcnR5U2V0LmNsYXNzLCB4RnJhbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgeExheW91dE1hbmFnZXIgPSAoWExheW91dE1hbmFnZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWExheW91dE1hbmFnZXIuY2xhc3MsIGZyYW1lUHJvcFNldAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgiTGF5b3V0TWFuYWdlciIpKTsKLSAgICAgICAgfSBjYXRjaCAoVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIHVwZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbih1cGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiB3dGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24od3RlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4geExheW91dE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYQ29tcG9uZW50IGdldFhDb21wb25lbnQoWENvbXBvbmVudENvbnRleHQgeENvbXBvbmVudENvbnRleHQpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgIAlYRGVza3RvcCB4RGVza3RvcCA9IEJvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5nZXRYRGVza3RvcCgpOwotICAgICAgICBYRW51bWVyYXRpb25BY2Nlc3MgeEVudW1lcmF0aW9uQWNjZXNzID0geERlc2t0b3AuZ2V0Q29tcG9uZW50cygpOwotICAgICAgICBYRW51bWVyYXRpb24geEVudW1lcmF0aW9uID0geEVudW1lcmF0aW9uQWNjZXNzLmNyZWF0ZUVudW1lcmF0aW9uKCk7Ci0gICAgICAgIHdoaWxlICh4RW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvQ29tcCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9Db21wID0geEVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKG5zZWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gd3RlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbih3dGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bGwgIT0gb0NvbXApIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIChYQ29tcG9uZW50KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhDb21wb25lbnQuY2xhc3MsIG9Db21wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWERlc2t0b3AgZ2V0WERlc2t0b3AoWENvbXBvbmVudENvbnRleHQgeENvbXBvbmVudENvbnRleHQpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICBYRGVza3RvcCB4RGVza3RvcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlYTXVsdGlDb21wb25lbnRGYWN0b3J5IHhNQ0YgPSB4Q29tcG9uZW50Q29udGV4dC5nZXRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICAgICAgT2JqZWN0IG9EZXNrdG9wID0geE1DRi5jcmVhdGVJbnN0YW5jZVdpdGhDb250ZXh0KCJjb20uc3VuLnN0YXIuZnJhbWUuRGVza3RvcCIsIHhDb21wb25lbnRDb250ZXh0KTsKLSAgICAgICAgICAgIHhEZXNrdG9wID0gKFhEZXNrdG9wKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEZXNrdG9wLmNsYXNzLCBvRGVza3RvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4RGVza3RvcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBsb2FkT3Blbk9mZmljZUxpYnMoKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG9wZW5PZmZpY2VQcm9ncmFtUGF0aCA9IE9Pb0VkaXRvckluaXRVdGlsLmdldE9wZW5PZmZpY2VQYXRoKCkgKyAiXFwiOwotCi0gICAgICAgIEZpbGUgbXN2Y3I3MSA9IG5ldyBGaWxlKG9wZW5PZmZpY2VQcm9ncmFtUGF0aCArICJtc3ZjcjcxLmRsbCIpOwotICAgICAgICBpZiAobXN2Y3I3MS5leGlzdHMoKSkgewotICAgICAgICAgICAgU3lzdGVtLmxvYWQobXN2Y3I3MS5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKS5lcXVhbHMoIklCTSBDb3Jwb3JhdGlvbiIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbS5pYm0ub3RpLnZtLmJvb3RzdHJhcC5saWJyYXJ5LnBhdGgiKTsKLQotICAgICAgICAgICAgLy8gZHVtbXkgdmFyaWFibGUgdG8gbG9hZCBhd3QuZGxsCi0gICAgICAgICAgICBqYXZhLmF3dC5Db2xvciBhd3RDb2xvciA9IG5ldyBqYXZhLmF3dC5Db2xvcigwLCAwLCAwKTsKLSAgICAgICAgICAgIFN5c3RlbS5sb2FkKGphdmFIb21lICsgIlxcamF3dC5kbGwiKTsKLSAgICAgICAgfSBlbHNlIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVuZG9yIikuZXF1YWxzKCJTdW4gTWljcm9zeXN0ZW1zIEluYy4iKSkgewotICAgICAgICAgICAgU3RyaW5nIGphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9kdW1teSB2YXJpYWJsZSB0byBsb2FkIGF3dC5kbGwKLSAgICAgICAgICAgIGphdmEuYXd0LkNvbG9yIGF3dENvbG9yID0gbmV3IGphdmEuYXd0LkNvbG9yKDAsIDAsIDApOwotICAgICAgICAgICAgU3lzdGVtLmxvYWQoamF2YUhvbWUgKyAiXFxiaW5cXGphd3QuZGxsIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAl0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKCJzaG91bGQgYmUgbGF1bmNoZWQgYnkgdXNpbmcgSUJNIEphdmEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5sb2FkKG9wZW5PZmZpY2VQcm9ncmFtUGF0aCArICJ1d2luYXBpLmRsbCIpOwotICAgICAgICBTeXN0ZW0ubG9hZChvcGVuT2ZmaWNlUHJvZ3JhbVBhdGggKyAib2ZmaWNlYmVhbi5kbGwiKTsKLSAgICAgICAgU3lzdGVtLmxvYWQob3Blbk9mZmljZVByb2dyYW1QYXRoICsgInNhbDMuZGxsIik7Ci0gICAgICAgIFN5c3RlbS5sb2FkKG9wZW5PZmZpY2VQcm9ncmFtUGF0aCArICJqcGlwZS5kbGwiKTsKLQotICAgICAgICBDbGFzc0xvYWRlciBqYXZhQ2xhc3NMb2FkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAJVVJMW10gamFyTGlzdCA9IG5ldyBVUkxbXSB7IG5ldyBGaWxlKG9wZW5PZmZpY2VQcm9ncmFtUGF0aCArICJjbGFzc2VzXFxqdWguamFyIikudG9VUkwoKSwKLSAgICAgICAgCQkJbmV3IEZpbGUob3Blbk9mZmljZVByb2dyYW1QYXRoICsgImNsYXNzZXNcXGp1cnQuamFyIikudG9VUkwoKSwKLSAgICAgICAgCQkJbmV3IEZpbGUob3Blbk9mZmljZVByb2dyYW1QYXRoICsgImNsYXNzZXNcXHJpZGwuamFyIikudG9VUkwoKSwKLSAgICAgICAgCQkJbmV3IEZpbGUob3Blbk9mZmljZVByb2dyYW1QYXRoICsgImNsYXNzZXNcXHVub2lsLmphciIpLnRvVVJMKCkgfTsKLSAgICAgICAgCQotICAgICAgICAJamF2YUNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKGphckxpc3QsIEJvb3RzdHJhcC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24obXVybGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqYXZhQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFdpbmRvd0NsYXNzKGludCBod25kKSB7Ci0JCVRDSEFSIGJ1ZmZlciA9IG5ldyBUQ0hBUigwLCAxMjgpOwotCQlPUy5HZXRDbGFzc05hbWUoaHduZCwgYnVmZmVyLCBidWZmZXIubGVuZ3RoKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKDAsIGJ1ZmZlci5zdHJsZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBnZXRPcGVuT2ZmaWNlRnJhbWVOdW0oaW50IGhXbmQsIGludCBmcmFtZU51bSkgewotCQlpbnQgcmVzdWx0ID0gZnJhbWVOdW07Ci0JCWludCBoRnJhbWUgPSAwOwotCQlpbnQgaHduZENoaWxkID0gT1MuR2V0V2luZG93IChoV25kLCBPUy5HV19DSElMRCk7Ci0JCXdoaWxlIChod25kQ2hpbGQgIT0gMCkgewotCQkJU3RyaW5nIHdpbkNsYXNzID0gZ2V0V2luZG93Q2xhc3MoaHduZENoaWxkKTsKLQkJCWlmICh3aW5DbGFzcy5lcXVhbHMoIlNBTFRNUFNVQkZSQU1FIikpIHsKLQkJCQlyZXN1bHQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gZ2V0T3Blbk9mZmljZUZyYW1lTnVtKGh3bmRDaGlsZCwgcmVzdWx0KTsKLQkJCX0KLQkJCWh3bmRDaGlsZCA9IE9TLkdldFdpbmRvdyhod25kQ2hpbGQsIE9TLkdXX0hXTkRORVhUKTsJCQkKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRPcGVuT2ZmaWNlRnJhbWVOdW0oKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpbnQgaHduZENoaWxkID0gT1MuR2V0V2luZG93IChPUy5HZXREZXNrdG9wV2luZG93KCksIE9TLkdXX0NISUxEKTsKLQkJd2hpbGUgKGh3bmRDaGlsZCAhPSAwKSB7Ci0JCQlyZXN1bHQgPSBnZXRPcGVuT2ZmaWNlRnJhbWVOdW0oaHduZENoaWxkLCByZXN1bHQpOwotCQkJU3RyaW5nIHdpbkNsYXNzID0gZ2V0V2luZG93Q2xhc3MoaHduZENoaWxkKTsKLQkJCWlmICh3aW5DbGFzcy5lcXVhbHMoIlNBTEZSQU1FIikpewotCQkJCXJlc3VsdCsrOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBnZXRPcGVuT2ZmaWNlRnJhbWVOdW0oaHduZENoaWxkLCByZXN1bHQpOwotCQkJfQkJCQotCQkJaHduZENoaWxkID0gT1MuR2V0V2luZG93KGh3bmRDaGlsZCwgT1MuR1dfSFdORE5FWFQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2ludGVybmFsL3V0aWwvT09vTmF2aWdhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2ludGVybmFsL3V0aWwvT09vTmF2aWdhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFmNWViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbnRlcm5hbC91dGlsL09Pb05hdmlnYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIE5vcmltYXNhIEhBWUFTSElEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZC5EcjNkQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNvbnRyb2xFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRnJhbWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBhZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlci5PREZDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuY29udGFpbmVyLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbnRhaW5lci5YTmFtZUFjY2VzczsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2U7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlczsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2VzU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhDb250cm9sbGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRnJhbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhNb2RlbDsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5XcmFwcGVkVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhDb21wb25lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuWE11bHRpU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnRhYmxlLlhDZWxsOwotaW1wb3J0IGNvbS5zdW4uc3Rhci50ZXh0LlhUZXh0RG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnRleHQuWFRleHRFbWJlZGRlZE9iamVjdHNTdXBwbGllcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dEdyYXBoaWNPYmplY3RzU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnRleHQuWFRleHRUYWJsZTsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dFRhYmxlc1N1cHBsaWVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci50ZXh0LlhUZXh0Vmlld0N1cnNvcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dFZpZXdDdXJzb3JTdXBwbGllcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLlVub1J1bnRpbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnZpZXcuWFNlbGVjdGlvblN1cHBsaWVyOwotCi0KLQotcHVibGljIGNsYXNzIE9Pb05hdmlnYXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgX3RhcmdldENvbnRlbnRJRCA9IG51bGw7Ci0JcHJpdmF0ZSBPREZEb2N1bWVudCBfY29udGVudFhNTCA9IG51bGw7Ci0JcHJpdmF0ZSBDb250ZW50VHlwZSBfZmlsZVR5cGUgPSBudWxsOwotICAgIHByaXZhdGUgWE11bHRpU2VydmljZUZhY3RvcnkgX3hNU0YgPSBudWxsOwotCXByaXZhdGUgWENvbXBvbmVudCBfeENvbXAgPSBudWxsOwotCi0JcHVibGljIE9Pb05hdmlnYXRpb24oWE11bHRpU2VydmljZUZhY3RvcnkgeE1TRiwgWENvbXBvbmVudCB4Q29tcG9uZW50KSB7Ci0gICAgICAgIHRoaXMuX3hNU0YgPSB4TVNGOwotCQl0aGlzLl94Q29tcCA9IHhDb21wb25lbnQ7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFhNTChPREZEb2N1bWVudCBjb250ZW50WE1MKXsKLSAgICAgICAgdGhpcy5fY29udGVudFhNTCA9IGNvbnRlbnRYTUw7Ci0gICAgfQotCi0gICAgcHVibGljIE9ERkRvY3VtZW50IGdldENvbnRlbnRYTUwoKXsKLSAgICAJcmV0dXJuIHRoaXMuX2NvbnRlbnRYTUw7Ci0gICAgfQotICAgIAotICAgIC8vVE9ETyBmaW5kIE5vZGUgZnJvbSBCcm93c2VyCi0gICAgcHVibGljIHZvaWQganVtcFRvUHJvYmxlbVBvc2l0aW9uKE5vZGUgdGFyZ2V0Tm9kZSkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0JCXRoaXMuX3RhcmdldENvbnRlbnRJRCA9ICgoRWxlbWVudCkgdGFyZ2V0Tm9kZSkuZ2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCk7Ci0JCWlmIChudWxsID09IHRoaXMuX3RhcmdldENvbnRlbnRJRCkgewotCQkJcmV0dXJuOwotCQl9ICAgICAgICAJCQotICAgICAgICAKLQkJaWYgKG51bGwgPT0gdGhpcy5fZmlsZVR5cGUpIHsKLQkJCXRoaXMuX2ZpbGVUeXBlID0gT0RGVXRpbHMuZ2V0T0RGRmlsZVR5cGUodGhpcy5fY29udGVudFhNTCk7Ci0JCX0KLQkJaWYgKHRoaXMuX2ZpbGVUeXBlPT1Db250ZW50VHlwZS5OT05FKSB7Ci0JCSAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywgdGhpcy5feENvbXApOwotICAgICAgICBYQ29udHJvbGxlciB4Q29udHJvbGxlciA9IHhNb2RlbC5nZXRDdXJyZW50Q29udHJvbGxlcigpOwotICAgICAgICAvLyBiZWZvcmUgc2VsZWN0IGVycm9yIGNvbnRlbnQgc2V0IERyYXdpbmcgbW9kZSAgICAgICAgCi0gICAgICAgIGlmICh0aGlzLl9maWxlVHlwZSA9PSBDb250ZW50VHlwZS5QUkVTRU5UQVRJT04pIHsKLSAgICAgICAgICAgIE9Pb1VJQ29udHJvbHMuc2V0RHJhd2luZ01vZGUoX3hNU0YsIHhDb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGRyYXdQcmVmaXggPSB0aGlzLl9jb250ZW50WE1MLmxvb2t1cFByZWZpeChEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIFN0cmluZyBkcjNkUHJlZml4ID0gdGhpcy5fY29udGVudFhNTC5sb29rdXBQcmVmaXgoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRhcmdldE5vZGVOYW1lID0gdGFyZ2V0Tm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0T2RmTm9kZU5hbWUgPSAoKEVsZW1lbnQpIHRhcmdldE5vZGUpLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX1RBR05BTUUpOwotICAgICAgICBpZiAodGFyZ2V0Tm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1nIikpIHsKLSAgICAgICAgICAgIGp1bXBUb1Byb2JsZW1JbWFnZSh0YXJnZXROb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9PQkpFQ1QpKSB7Ci0gICAgICAgICAgICBqdW1wVG9Qcm9ibGVtT2JqZWN0KHRhcmdldE5vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKHRhcmdldE5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRhYmxlIikpIHsKLSAgICAgICAgICAgIGp1bXBUb1Byb2JsZW1UYWJsZSh0YXJnZXROb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmICggKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NBUFRJT04pKQotICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DSVJDTEUpKQotICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DVVNUT01fU0hBUEUpKQotICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9FTExJUFNFKSkKLSAgICAgICAgICAgICAgICB8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRykpCi0gICAgICAgICAgICAgICAgfHwgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0xJTkUpKQotICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DT05ORUNUT1IpKQotICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QT0xZR09OKSkKLSAgICAgICAgICAgICAgICB8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUxJTkUpKQotICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUNUKSkKLSAgICAgICAgICAgICAgICB8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUkVHVUxBUl9QT0xZR09OKSkKLSAgICAgICAgICAgICAgICB8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyM2RQcmVmaXggKyAiOiIgKyBEcjNkQ29uc3RhbnRzLkVMRU1FTlRfU0NFTkUpKSApIHsKLSAgICAgICAgICAgIGp1bXBUb1Byb2JsZW1EcmF3aW5nU2hhcGUodGFyZ2V0Tm9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFHRSkpIHsKLSAgICAgICAgICAgIGp1bXBUb1Byb2JsZW1EcmF3aW5nUGFnZSh0YXJnZXROb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DT05UUk9MKSkgewotICAgICAgICAgICAganVtcFRvUHJvYmxlbUZvcm1Db250cm9sKHRhcmdldE5vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWZ0ZXIgc2VsZWN0IGVycm9yIGNvbnRlbnQgaGlkZSBVSSBlbGVtZW50cwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWEZyYW1lIHhGcmFtZSA9IHhDb250cm9sbGVyLmdldEZyYW1lKCk7Ci0gICAgICAgICAgICBPT29VSUNvbnRyb2xzLmhpZGVVSUVsZW1lbnRzKHhGcmFtZSwgdGhpcy5feE1TRik7Ci0gICAgICAgIH0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGp1bXBUb1Byb2JsZW1UYWJsZShOb2RlIHRhcmdldE5vZGUpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICBYTW9kZWwgeE1vZGVsID0gKFhNb2RlbCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYTW9kZWwuY2xhc3MsIHRoaXMuX3hDb21wKTsKLSAgICAgICAgWFNlbGVjdGlvblN1cHBsaWVyIHNlbGVjdGlvblN1cHBsaWVyID0gKFhTZWxlY3Rpb25TdXBwbGllcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYU2VsZWN0aW9uU3VwcGxpZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgeE1vZGVsLmdldEN1cnJlbnRDb250cm9sbGVyKCkpOwotCi0gICAgICAgIGlmIChDb250ZW50VHlwZS5XUklURS5lcXVhbHModGhpcy5fZmlsZVR5cGUpKSB7Ci0gICAgICAgICAgICBYVGV4dERvY3VtZW50IHhUZXh0RG9jID0gKFhUZXh0RG9jdW1lbnQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFRleHREb2N1bWVudC5jbGFzcywgdGhpcy5feENvbXApOwotCi0gICAgICAgICAgICBYVGV4dFRhYmxlc1N1cHBsaWVyIHhUYWJsZVN1cHBsaWVyID0gKFhUZXh0VGFibGVzU3VwcGxpZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgICAgIFhUZXh0VGFibGVzU3VwcGxpZXIuY2xhc3MsIHhUZXh0RG9jKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE5hbWVBY2Nlc3MgeE5hbWVBY2Nlc3MgPSB4VGFibGVTdXBwbGllci5nZXRUZXh0VGFibGVzKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuOwotICAgICAgICAgICAgICAgIFN0cmluZyBvZGZDb250ZW50SWQgPSAoKEVsZW1lbnQpdGFyZ2V0Tm9kZSkuZ2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCk7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QoX2NvbnRlbnRYTUwuZ2V0RG9jdW1lbnRFbGVtZW50KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgIi8vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJIAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJ11bQCIgKyBPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQgKyAiPSciICsgb2RmQ29udGVudElkICsgIiddIik7Ci0gICAgICAgICAgICAgICAgaWYgKChubD09bnVsbCl8fChubC5nZXRMZW5ndGgoKSE9MSkpIHJldHVybjsKLSAgICAgICAgICAgICAgICBUYWJsZUVsZW1lbnQgdGFibGVFbGVtID0gKFRhYmxlRWxlbWVudCkgbmwuaXRlbSgwKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gdGFibGVFbGVtLmdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksIFRhYmxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9UYWJsZSA9IHhOYW1lQWNjZXNzLmdldEJ5TmFtZSh0YWJsZU5hbWUpOwotICAgICAgICAgICAgICAgIFhUZXh0VGFibGUgeFRhYmxlID0gKFhUZXh0VGFibGUpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UgKFhUZXh0VGFibGUuY2xhc3MsIG9UYWJsZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KHhUYWJsZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHdob2xlIHRhYmxlCi0gICAgICAgICAgICAgICAgWENvbnRyb2xsZXIgeENvbnRyb2xsZXIgPSB4TW9kZWwuZ2V0Q3VycmVudENvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgICAgICBYVGV4dFZpZXdDdXJzb3JTdXBwbGllciB4VGV4dFZpZXdDdXJzb3JTdXBwbGllciA9IChYVGV4dFZpZXdDdXJzb3JTdXBwbGllcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYVGV4dFZpZXdDdXJzb3JTdXBwbGllci5jbGFzcywgeENvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIFhUZXh0Vmlld0N1cnNvciB4VGV4dFZpZXdDdXJzb3IgPSB4VGV4dFZpZXdDdXJzb3JTdXBwbGllci5nZXRWaWV3Q3Vyc29yKCk7Ci0gICAgICAgICAgICAgICAgeFRleHRWaWV3Q3Vyc29yLmNvbGxhcHNlVG9TdGFydCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhDZWxsIGxhc3RDZWxsID0geFRhYmxlLmdldENlbGxCeU5hbWUoeFRhYmxlLmdldENlbGxOYW1lcygpW3hUYWJsZS5nZXRDZWxsTmFtZXMoKS5sZW5ndGggLSAxXSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KGxhc3RDZWxsKTsKLSAgICAgICAgICAgICAgICB4VGV4dFZpZXdDdXJzb3IuZ290b1N0YXJ0KHRydWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQganVtcFRvUHJvYmxlbUltYWdlKE5vZGUgdGFyZ2V0Tm9kZSkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywgdGhpcy5feENvbXApOwotICAgICAgICBYU2VsZWN0aW9uU3VwcGxpZXIgc2VsZWN0aW9uU3VwcGxpZXIgPSAoWFNlbGVjdGlvblN1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhTZWxlY3Rpb25TdXBwbGllci5jbGFzcywgeE1vZGVsLmdldEN1cnJlbnRDb250cm9sbGVyKCkpOwotCi0gICAgICAgIGlmICghKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuOwotICAgICAgICBTdHJpbmcgb2RmQ29udGVudElkID0gKChFbGVtZW50KXRhcmdldE5vZGUpLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpOwotICAgICAgICBOb2RlTGlzdCBubCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdChfY29udGVudFhNTC5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAiLy8qW0AiICsgT0RGQ29udmVydGVyLk9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEICsgIj0nIiArIG9kZkNvbnRlbnRJZCArICInXSIpOwotICAgICAgICBpZiAoKG5sPT1udWxsKXx8KG5sLmdldExlbmd0aCgpIT0xKSkgcmV0dXJuOwotICAgICAgICBpZiAoIShubC5pdGVtKDApIGluc3RhbmNlb2YgT0RGRWxlbWVudCkpIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIE5vZGUgcGFyZW50ID0gbmwuaXRlbSgwKS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIEZyYW1lRWxlbWVudCkpIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIEZyYW1lRWxlbWVudCBmcmFtZUVsZW0gPSAoRnJhbWVFbGVtZW50KSBwYXJlbnQ7Ci0gICAgICAgIFN0cmluZyBkcmF3TmFtZSA9IGZyYW1lRWxlbS5nZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwgRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpOwotICAgICAgICBpZiAoZHJhd05hbWU9PW51bGwpIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdCB4RG9jID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYVGV4dERvY3VtZW50LmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0gICAgICAgIGlmICgoeERvYyE9bnVsbCkmJih4RG9jIGluc3RhbmNlb2YgWFRleHREb2N1bWVudCkpIHsKLSAgICAgICAgICAgIFhUZXh0RG9jdW1lbnQgeFRleHREb2MgPSAoWFRleHREb2N1bWVudCkgeERvYzsgCi0gICAgICAgICAgICBYVGV4dEdyYXBoaWNPYmplY3RzU3VwcGxpZXIgeEdyYXBoaWNTdXBwbGllciA9IChYVGV4dEdyYXBoaWNPYmplY3RzU3VwcGxpZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFRleHRHcmFwaGljT2JqZWN0c1N1cHBsaWVyLmNsYXNzLCB4VGV4dERvYyk7Ci0gICAgICAgICAgICBYTmFtZUFjY2VzcyB4TmFtZUFjY2VzcyA9IHhHcmFwaGljU3VwcGxpZXIuZ2V0R3JhcGhpY09iamVjdHMoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHhOYW1lQWNjZXNzLmdldEJ5TmFtZShkcmF3TmFtZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHhQYWdlU3VwcGxpZXIgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgdGhpcy5feENvbXApOwotICAgICAgICBpZiAoKHhQYWdlU3VwcGxpZXIhPW51bGwpJiYoeFBhZ2VTdXBwbGllciBpbnN0YW5jZW9mIFhEcmF3UGFnZXNTdXBwbGllcikpIHsKLSAgICAgICAgICAgIFhEcmF3UGFnZXNTdXBwbGllciB4RHJhd1BhZ2VzU3VwcGxpZXIgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSB4UGFnZVN1cHBsaWVyOwotICAgICAgICAgICAgaW50IHpJbmRleCA9IChpbnQpIGZyYW1lRWxlbS5nZXRaSW5kZXgoKTsKLSAgICAgICAgICAgIGludCBwYWdlSW5kZXggPSAoaW50KSBmcmFtZUVsZW0uZ2V0UGFnZUluZGV4KCk7Ci0gICAgICAgICAgICBpZiAoKHpJbmRleCE9LTEpJiYocGFnZUluZGV4IT0tMSkpIHsKLSAgICAgICAgICAgICAgICBYRHJhd1BhZ2VzIHhEcmF3UGFnZXMgPSB4RHJhd1BhZ2VzU3VwcGxpZXIuZ2V0RHJhd1BhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHhQYWdlID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2UuY2xhc3MsIHhEcmF3UGFnZXMuZ2V0QnlJbmRleChwYWdlSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh4UGFnZSE9bnVsbCkmJih4UGFnZSBpbnN0YW5jZW9mIFhEcmF3UGFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhEcmF3UGFnZSB4RHJhd1BhZ2UgPSAoWERyYXdQYWdlKSB4UGFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSB4RHJhd1BhZ2UuZ2V0QnlJbmRleCh6SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGp1bXBUb1Byb2JsZW1PYmplY3QoTm9kZSB0YXJnZXROb2RlKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLSAgICAgICAgWE1vZGVsIHhNb2RlbCA9IChYTW9kZWwpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWE1vZGVsLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0gICAgICAgIFhTZWxlY3Rpb25TdXBwbGllciBzZWxlY3Rpb25TdXBwbGllciA9IChYU2VsZWN0aW9uU3VwcGxpZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFNlbGVjdGlvblN1cHBsaWVyLmNsYXNzLCB4TW9kZWwuZ2V0Q3VycmVudENvbnRyb2xsZXIoKSk7Ci0KLSAgICAgICAgaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47Ci0gICAgICAgIFN0cmluZyBvZGZDb250ZW50SWQgPSAoKEVsZW1lbnQpdGFyZ2V0Tm9kZSkuZ2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCk7Ci0gICAgICAgIE5vZGVMaXN0IG5sID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KF9jb250ZW50WE1MLmdldERvY3VtZW50RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICIvLypbQCIgKyBPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQgKyAiPSciICsgb2RmQ29udGVudElkICsgIiddIik7Ci0gICAgICAgIGlmICgobmw9PW51bGwpfHwobmwuZ2V0TGVuZ3RoKCkhPTEpKSByZXR1cm47Ci0gICAgICAgIGlmICghKG5sLml0ZW0oMCkgaW5zdGFuY2VvZiBPREZFbGVtZW50KSkgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBubC5pdGVtKDApLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSkgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgRnJhbWVFbGVtZW50IGZyYW1lRWxlbSA9IChGcmFtZUVsZW1lbnQpIHBhcmVudDsKLSAgICAgICAgU3RyaW5nIGRyYXdOYW1lID0gZnJhbWVFbGVtLmdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICAgIGlmIChkcmF3TmFtZT09bnVsbCkgcmV0dXJuOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0IHhEb2MgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhUZXh0RG9jdW1lbnQuY2xhc3MsIHRoaXMuX3hDb21wKTsKLSAgICAgICAgaWYgKCh4RG9jIT1udWxsKSYmKHhEb2MgaW5zdGFuY2VvZiBYVGV4dERvY3VtZW50KSkgewotICAgICAgICAgICAgWFRleHREb2N1bWVudCB4VGV4dERvYyA9IChYVGV4dERvY3VtZW50KSB4RG9jOyAKLSAgICAgICAgICAgIFhUZXh0RW1iZWRkZWRPYmplY3RzU3VwcGxpZXIgeEdyYXBoaWNTdXBwbGllciA9IChYVGV4dEVtYmVkZGVkT2JqZWN0c1N1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhUZXh0RW1iZWRkZWRPYmplY3RzU3VwcGxpZXIuY2xhc3MsIHhUZXh0RG9jKTsKLSAgICAgICAgICAgIFhOYW1lQWNjZXNzIHhOYW1lQWNjZXNzID0geEdyYXBoaWNTdXBwbGllci5nZXRFbWJlZGRlZE9iamVjdHMoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHhOYW1lQWNjZXNzLmdldEJ5TmFtZShkcmF3TmFtZSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCB4UGFnZVN1cHBsaWVyID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2VzU3VwcGxpZXIuY2xhc3MsIHRoaXMuX3hDb21wKTsKLSAgICAgICAgaWYgKCh4UGFnZVN1cHBsaWVyIT1udWxsKSYmKHhQYWdlU3VwcGxpZXIgaW5zdGFuY2VvZiBYRHJhd1BhZ2VzU3VwcGxpZXIpKSB7Ci0gICAgICAgICAgICBYRHJhd1BhZ2VzU3VwcGxpZXIgeERyYXdQYWdlc1N1cHBsaWVyID0gKFhEcmF3UGFnZXNTdXBwbGllcikgeFBhZ2VTdXBwbGllcjsKLSAgICAgICAgICAgIGludCB6SW5kZXggPSAoaW50KSBmcmFtZUVsZW0uZ2V0WkluZGV4KCk7Ci0gICAgICAgICAgICBpbnQgcGFnZUluZGV4ID0gKGludCkgZnJhbWVFbGVtLmdldFBhZ2VJbmRleCgpOwotICAgICAgICAgICAgaWYgKCh6SW5kZXghPS0xKSYmKHBhZ2VJbmRleCE9LTEpKSB7Ci0gICAgICAgICAgICAgICAgWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHBsaWVyLmdldERyYXdQYWdlcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB4UGFnZSA9IFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdQYWdlLmNsYXNzLCB4RHJhd1BhZ2VzLmdldEJ5SW5kZXgocGFnZUluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoeFBhZ2UhPW51bGwpJiYoeFBhZ2UgaW5zdGFuY2VvZiBYRHJhd1BhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYRHJhd1BhZ2UgeERyYXdQYWdlID0gKFhEcmF3UGFnZSkgeFBhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0geERyYXdQYWdlLmdldEJ5SW5kZXgoekluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN1cHBsaWVyLnNlbGVjdChvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIHJldHVybjsgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQganVtcFRvUHJvYmxlbURyYXdpbmdTaGFwZShOb2RlIHRhcmdldE5vZGUpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1vZGVsIHhNb2RlbCA9IChYTW9kZWwpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWE1vZGVsLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0gICAgICAgICAgICBYU2VsZWN0aW9uU3VwcGxpZXIgc2VsZWN0aW9uU3VwcGxpZXIgPSAoWFNlbGVjdGlvblN1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhTZWxlY3Rpb25TdXBwbGllci5jbGFzcywgeE1vZGVsLmdldEN1cnJlbnRDb250cm9sbGVyKCkpOwotCi0gICAgICAgICAgICBpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjsKLSAgICAgICAgICAgIFN0cmluZyBvZGZDb250ZW50SWQgPSAoKEVsZW1lbnQpdGFyZ2V0Tm9kZSkuZ2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCk7Ci0gICAgICAgICAgICBOb2RlTGlzdCBubCA9IFhQYXRoVXRpbC5ldmFsWFBhdGhOb2RlTGlzdChfY29udGVudFhNTC5nZXREb2N1bWVudEVsZW1lbnQoKSwgCi0gICAgICAgICAgICAgICAgICAgICIvLypbQCIgKyBPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQgKyAiPSciICsgb2RmQ29udGVudElkICsgIiddIik7Ci0gICAgICAgICAgICBpZiAoKG5sPT1udWxsKXx8KG5sLmdldExlbmd0aCgpIT0xKSkgcmV0dXJuOwotICAgICAgICAgICAgaWYgKCEobmwuaXRlbSgwKSBpbnN0YW5jZW9mIERyYXdpbmdPYmplY3RFbGVtZW50KSkgcmV0dXJuOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBEcmF3aW5nT2JqZWN0RWxlbWVudCBzaGFwZUVsZW0gPSAoRHJhd2luZ09iamVjdEVsZW1lbnQpIG5sLml0ZW0oMCk7Ci0gICAgICAgICAgICBpbnQgekluZGV4ID0gKGludCkgc2hhcGVFbGVtLmdldFpJbmRleCgpOwotICAgICAgICAgICAgaWYoIHpJbmRleCA+PSAwICkgewotICAgICAgICAgICAgICAgIE9iamVjdCB4UGFnZVN1cHBsaWVyID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2VTdXBwbGllci5jbGFzcywgdGhpcy5feENvbXApOwotICAgICAgICAgICAgICAgIGlmICh4UGFnZVN1cHBsaWVyIGluc3RhbmNlb2YgWERyYXdQYWdlU3VwcGxpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgWERyYXdQYWdlU3VwcGxpZXIgeERyYXdQYWdlU3VwcGxpZXIgPSAoWERyYXdQYWdlU3VwcGxpZXIpeFBhZ2VTdXBwbGllcjsKLSAgICAgICAgICAgICAgICAgICAgWERyYXdQYWdlIHhEcmF3UGFnZSA9IHhEcmF3UGFnZVN1cHBsaWVyLmdldERyYXdQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBudWxsICE9IHhEcmF3UGFnZSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHhEcmF3UGFnZS5nZXRCeUluZGV4KHpJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHhQYWdlc1N1cHBsaWVyID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2VzU3VwcGxpZXIuY2xhc3MsIHRoaXMuX3hDb21wKTsKLSAgICAgICAgICAgICAgICBpZiAoKHhQYWdlc1N1cHBsaWVyIT1udWxsKSYmKHhQYWdlc1N1cHBsaWVyIGluc3RhbmNlb2YgWERyYXdQYWdlc1N1cHBsaWVyKSkgewotICAgICAgICAgICAgICAgICAgICBYRHJhd1BhZ2VzU3VwcGxpZXIgeERyYXdQYWdlc1N1cHBsaWVyID0gKFhEcmF3UGFnZXNTdXBwbGllcikgeFBhZ2VzU3VwcGxpZXI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwYWdlSW5kZXggPSAoaW50KSBzaGFwZUVsZW0uZ2V0UGFnZUluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoekluZGV4IT0tMSkmJihwYWdlSW5kZXghPS0xKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHBsaWVyLmdldERyYXdQYWdlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgeFBhZ2UgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZS5jbGFzcywgeERyYXdQYWdlcy5nZXRCeUluZGV4KHBhZ2VJbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeFBhZ2UhPW51bGwpJiYoeFBhZ2UgaW5zdGFuY2VvZiBYRHJhd1BhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhEcmF3UGFnZSB4RHJhd1BhZ2UgPSAoWERyYXdQYWdlKSB4UGFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHhEcmF3UGFnZS5nZXRCeUluZGV4KHpJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN1cHBsaWVyLnNlbGVjdChvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIGlhZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGp1bXBUb1Byb2JsZW1EcmF3aW5nUGFnZShOb2RlIHRhcmdldE5vZGUpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1vZGVsIHhNb2RlbCA9IChYTW9kZWwpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWE1vZGVsLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0gICAgICAgICAgICBYU2VsZWN0aW9uU3VwcGxpZXIgc2VsZWN0aW9uU3VwcGxpZXIgPSAoWFNlbGVjdGlvblN1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhTZWxlY3Rpb25TdXBwbGllci5jbGFzcywgeE1vZGVsLmdldEN1cnJlbnRDb250cm9sbGVyKCkpOwotCi0gICAgICAgICAgICBpZiAoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OLmVxdWFscyh0aGlzLl9maWxlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb2RmQ29udGVudElkID0gKChFbGVtZW50KXRhcmdldE5vZGUpLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpOwotICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5sID0gWFBhdGhVdGlsLmV2YWxYUGF0aE5vZGVMaXN0KF9jb250ZW50WE1MLmdldERvY3VtZW50RWxlbWVudCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICIvLypbbmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFCi0gICAgICAgICAgICAgICAgICAgICAgICArICInXVtAIiArIE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCArICI9JyIgKyBvZGZDb250ZW50SWQgKyAiJ10iKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5sPT1udWxsKXx8KG5sLmdldExlbmd0aCgpIT0xKSkgcmV0dXJuOwotICAgICAgICAgICAgICAgIGlmIChubC5pdGVtKDApIGluc3RhbmNlb2YgUGFnZUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFnZUVsZW1lbnQgcGFnZUVsZW0gPSAoUGFnZUVsZW1lbnQpIG5sLml0ZW0oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwYWdlSW5kZXggPSAoaW50KSBwYWdlRWxlbS5nZXRQYWdlSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgWERyYXdQYWdlIHhEcmF3UGFnZSA9IE9ERlV0aWxzLmdldERyYXdQYWdlQnlJbmRleCh0aGlzLl94Q29tcCwgcGFnZUluZGV4KTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdXBwbGllci5zZWxlY3QoeERyYXdQYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICBpYWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGlhZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBqdW1wVG9Qcm9ibGVtRm9ybUNvbnRyb2woTm9kZSB0YXJnZXROb2RlKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywgdGhpcy5feENvbXApOwotICAgICAgICAgICAgWFNlbGVjdGlvblN1cHBsaWVyIHNlbGVjdGlvblN1cHBsaWVyID0gKFhTZWxlY3Rpb25TdXBwbGllcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYU2VsZWN0aW9uU3VwcGxpZXIuY2xhc3MsIHhNb2RlbC5nZXRDdXJyZW50Q29udHJvbGxlcigpKTsKLQotICAgICAgICAgICAgaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47Ci0gICAgICAgICAgICBTdHJpbmcgb2RmQ29udGVudElkID0gKChFbGVtZW50KXRhcmdldE5vZGUpLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpOwotICAgICAgICAgICAgTm9kZUxpc3QgbmwgPSBYUGF0aFV0aWwuZXZhbFhQYXRoTm9kZUxpc3QoX2NvbnRlbnRYTUwuZ2V0RG9jdW1lbnRFbGVtZW50KCksIAotICAgICAgICAgICAgICAgICAgICAiLy8qW25hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0gICAgICAgICAgICAgICAgICAgICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DT05UUk9MCi0gICAgICAgICAgICAgICAgICAgICsgIiddW0AiICsgT0RGQ29udmVydGVyLk9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEICsgIj0nIiArIG9kZkNvbnRlbnRJZCArICInXSIpOwotICAgICAgICAgICAgaWYgKChubD09bnVsbCl8fChubC5nZXRMZW5ndGgoKSE9MSkpIHJldHVybjsKLSAgICAgICAgICAgIGlmICghKG5sLml0ZW0oMCkgaW5zdGFuY2VvZiBDb250cm9sRWxlbWVudCkpIHJldHVybjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29udHJvbEVsZW1lbnQgZWxlbSA9IChDb250cm9sRWxlbWVudCkgbmwuaXRlbSgwKTsKLSAgICAgICAgICAgIGludCB6SW5kZXggPSAoaW50KWVsZW0uZ2V0WkluZGV4KCk7Ci0gICAgICAgICAgICBpZiggekluZGV4ID49IDAgKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHhQYWdlU3VwcGxpZXIgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZVN1cHBsaWVyLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHhQYWdlU3VwcGxpZXIgaW5zdGFuY2VvZiBYRHJhd1BhZ2VTdXBwbGllcikgewotICAgICAgICAgICAgICAgICAgICBYRHJhd1BhZ2VTdXBwbGllciB4RHJhd1BhZ2VTdXBwbGllciA9IChYRHJhd1BhZ2VTdXBwbGllcil4UGFnZVN1cHBsaWVyOwotICAgICAgICAgICAgICAgICAgICBYRHJhd1BhZ2UgeERyYXdQYWdlID0geERyYXdQYWdlU3VwcGxpZXIuZ2V0RHJhd1BhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG51bGwgIT0geERyYXdQYWdlICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0geERyYXdQYWdlLmdldEJ5SW5kZXgoekluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdXBwbGllci5zZWxlY3Qob2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPYmplY3QgeFBhZ2VzU3VwcGxpZXIgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgdGhpcy5feENvbXApOwotICAgICAgICAgICAgICAgIGlmICgoeFBhZ2VzU3VwcGxpZXIhPW51bGwpJiYoeFBhZ2VzU3VwcGxpZXIgaW5zdGFuY2VvZiBYRHJhd1BhZ2VzU3VwcGxpZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhEcmF3UGFnZXNTdXBwbGllciB4RHJhd1BhZ2VzU3VwcGxpZXIgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSB4UGFnZXNTdXBwbGllcjsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VJbmRleCA9IChpbnQpIGVsZW0uZ2V0UGFnZUluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoekluZGV4IT0tMSkmJihwYWdlSW5kZXghPS0xKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHBsaWVyLmdldERyYXdQYWdlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgeFBhZ2UgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZS5jbGFzcywgeERyYXdQYWdlcy5nZXRCeUluZGV4KHBhZ2VJbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeFBhZ2UhPW51bGwpJiYoeFBhZ2UgaW5zdGFuY2VvZiBYRHJhd1BhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhEcmF3UGFnZSB4RHJhd1BhZ2UgPSAoWERyYXdQYWdlKSB4UGFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHhEcmF3UGFnZS5nZXRCeUluZGV4KHpJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN1cHBsaWVyLnNlbGVjdChvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIGlhZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbnRlcm5hbC91dGlsL09Pb1VJQ29udHJvbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbnRlcm5hbC91dGlsL09Pb1VJQ29udHJvbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjMmU4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW50ZXJuYWwvdXRpbC9PT29VSUNvbnRyb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuUHJvcGVydHk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlByb3BlcnR5VmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlByb3BlcnR5VmV0b0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuVW5rbm93blByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5iZWFucy5YUHJvcGVydHlTZXQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlhQcm9wZXJ0eVNldEluZm87Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhDb250cm9sbGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRGlzcGF0Y2g7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhEaXNwYXRjaEhlbHBlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWERpc3BhdGNoUHJvdmlkZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhGcmFtZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWExheW91dE1hbmFnZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLldyYXBwZWRUYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuWE11bHRpU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVpLlhVSUVsZW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5BbnlDb252ZXJ0ZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5Vbm9SdW50aW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci51dGlsLlhVUkxUcmFuc2Zvcm1lcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBPT29VSUNvbnRyb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBoaWRlVUlFbGVtZW50cyhYRnJhbWUgeEZyYW1lLCBYTXVsdGlTZXJ2aWNlRmFjdG9yeSB4TVNGKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkgICAgICAgIFhEaXNwYXRjaFByb3ZpZGVyIHhEaXNwYXRjaFByb3ZpZGVyID0gKFhEaXNwYXRjaFByb3ZpZGVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEaXNwYXRjaFByb3ZpZGVyLmNsYXNzLCB4RnJhbWUpOwkJCQotCSAgICAgICAgT2JqZWN0IG9EaXNwYXRjaEhlbHBlciA9IHhNU0YuY3JlYXRlSW5zdGFuY2UoImNvbS5zdW4uc3Rhci5mcmFtZS5EaXNwYXRjaEhlbHBlciIpOwotCSAgICAJWERpc3BhdGNoSGVscGVyIGRpc3BhdGNoSGVscGVyID0gKFhEaXNwYXRjaEhlbHBlcilBbnlDb252ZXJ0ZXIudG9PYmplY3QoWERpc3BhdGNoSGVscGVyLmNsYXNzLCBvRGlzcGF0Y2hIZWxwZXIpOwotCi0JICAgIAlleGVjdXRlWERpc3BhdGNoKCJOb3JtYWxNdWx0aVBhbmVHVUkiLCBCb29sZWFuLlRSVUUsIHhEaXNwYXRjaFByb3ZpZGVyLCBkaXNwYXRjaEhlbHBlcik7Ci0JICAgICAgICBleGVjdXRlWERpc3BhdGNoKCJJbnB1dExpbmVWaXNpYmxlIiwgQm9vbGVhbi5GQUxTRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLSAgICAgICAgICAgIGV4ZWN1dGVYRGlzcGF0Y2goIkxlZnRQYW5lRHJhdyIsIEJvb2xlYW4uRkFMU0UsIHhEaXNwYXRjaFByb3ZpZGVyLCBkaXNwYXRjaEhlbHBlcik7Ci0gICAgICAgICAgICBleGVjdXRlWERpc3BhdGNoKCJMZWZ0UGFuZUltcHJlc3MiLCBCb29sZWFuLkZBTFNFLCB4RGlzcGF0Y2hQcm92aWRlciwgZGlzcGF0Y2hIZWxwZXIpOwotCSAgICAgICAgZXhlY3V0ZVhEaXNwYXRjaCgiUmlnaHRQYW5lIiwgQm9vbGVhbi5GQUxTRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLQkgICAgICAgIGV4ZWN1dGVYRGlzcGF0Y2goIlJ1bGVyIiwgQm9vbGVhbi5GQUxTRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLSAgICAgICAgICAgIGV4ZWN1dGVYRGlzcGF0Y2goIlNob3dSdWxlciIsIEJvb2xlYW4uRkFMU0UsIHhEaXNwYXRjaFByb3ZpZGVyLCBkaXNwYXRjaEhlbHBlcik7Ci0gICAgICAgICAgICBleGVjdXRlWERpc3BhdGNoKCJab29tUGFnZSIsIEJvb2xlYW4uVFJVRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLSAgICAgICAgICAgIAotCSAgICAgICAgaGlkZVhVSUVsZW1lbnRzKHhGcmFtZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9CQkKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RHJhd2luZ01vZGUoWE11bHRpU2VydmljZUZhY3RvcnkgeE1TRiwgWENvbnRyb2xsZXIgY29udHJvbGxlcikgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgCXJldHVybiBleGVjdXRlWERpc3BhdGNoQWN0aW9uKHhNU0YsIGNvbnRyb2xsZXIsICJzbG90OjI3MDA5Iik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaGlkZVhVSUVsZW1lbnRzKFhGcmFtZSB4RnJhbWUpIHRocm93cyBPREZFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTGF5b3V0TWFuYWdlciB4TGF5b3V0TWFuYWdlciA9IE9ERlV0aWxzLmdldFhMYXlvdXRNYW5hZ2VyKHhGcmFtZSk7Ci0gICAgICAgICAgICBYVUlFbGVtZW50W10geFVJRWxlbXMgPSB4TGF5b3V0TWFuYWdlci5nZXRFbGVtZW50cygpOwotCi0gICAgICAgICAgICBYUHJvcGVydHlTZXQgeFVJRWxlbVByb3BTZXQ7Ci0gICAgICAgICAgICBYUHJvcGVydHlTZXRJbmZvIHhVSUVsZW1Qcm9wU2V0SW5mbzsKLSAgICAgICAgICAgIFByb3BlcnR5W10geFVJRWxlbVByb3BzOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4VUlFbGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHhVSUVsZW1Qcm9wU2V0ID0gKFhQcm9wZXJ0eVNldCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYUHJvcGVydHlTZXQuY2xhc3MsIHhVSUVsZW1zW2ldKTsKLSAgICAgICAgICAgICAgICB4VUlFbGVtUHJvcFNldEluZm8gPSB4VUlFbGVtUHJvcFNldC5nZXRQcm9wZXJ0eVNldEluZm8oKTsKLSAgICAgICAgICAgICAgICBpZih4VUlFbGVtUHJvcFNldEluZm8uaGFzUHJvcGVydHlCeU5hbWUoIlBlcnNpc3RlbnQiKSkgewotICAgICAgICAgICAgICAgICAgICB4VUlFbGVtUHJvcFNldC5zZXRQcm9wZXJ0eVZhbHVlKCJQZXJzaXN0ZW50IiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhVSUVsZW1Qcm9wcyA9IHhVSUVsZW1Qcm9wU2V0SW5mby5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB4VUlFbGVtUHJvcHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhVSUVsZW1Qcm9wc1tqXS5OYW1lLmVxdWFscygiUmVzb3VyY2VVUkwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeExheW91dE1hbmFnZXIuaGlkZUVsZW1lbnQoeFVJRWxlbVByb3BTZXQuZ2V0UHJvcGVydHlWYWx1ZSh4VUlFbGVtUHJvcHNbal0uTmFtZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Qcm9wZXJ0eUV4Y2VwdGlvbiB1cGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24odXBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gd3RlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKHd0ZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChQcm9wZXJ0eVZldG9FeGNlcHRpb24gcHZlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKHB2ZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGlhZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleGVjdXRlWERpc3BhdGNoKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIFhEaXNwYXRjaFByb3ZpZGVyIHhEaXNwYXRjaFByb3ZpZGVyLAotICAgIAkJWERpc3BhdGNoSGVscGVyIGRpc3BhdGNoSGVscGVyKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLSAgICAJUHJvcGVydHlWYWx1ZVtdIHBWYWx1ZSA9IG5ldyBQcm9wZXJ0eVZhbHVlWzFdOwotICAgICAgICBwVmFsdWVbMF0gPSBuZXcgUHJvcGVydHlWYWx1ZSgpOwotICAgICAgICBwVmFsdWVbMF0uTmFtZSA9IG5hbWU7Ci0gICAgICAgIHBWYWx1ZVswXS5WYWx1ZSA9IHZhbHVlOwotCi0gICAgICAgIGRpc3BhdGNoSGVscGVyLmV4ZWN1dGVEaXNwYXRjaCh4RGlzcGF0Y2hQcm92aWRlciwgIi51bm86IiArIG5hbWUsICIiLCAwLCBwVmFsdWUpOwotICAgIH0KLSAgICAKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZVhEaXNwYXRjaEFjdGlvbihYTXVsdGlTZXJ2aWNlRmFjdG9yeSB4TVNGLCBYQ29udHJvbGxlciBjb250cm9sbGVyLCBTdHJpbmcgYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlYRGlzcGF0Y2hQcm92aWRlciBkaXNwYXRjaFByb3ZpZGVyID0gKFhEaXNwYXRjaFByb3ZpZGVyKVVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERpc3BhdGNoUHJvdmlkZXIuY2xhc3MsIGNvbnRyb2xsZXIpOwotCQkJaWYgKG51bGwgIT0gZGlzcGF0Y2hQcm92aWRlcikgewotCQkJCWNvbS5zdW4uc3Rhci51dGlsLlVSTCBhY3Rpb25VUkxbXSA9IG5ldyBjb20uc3VuLnN0YXIudXRpbC5VUkxbMV07Ci0JCQkJYWN0aW9uVVJMWzBdID0gbmV3IGNvbS5zdW4uc3Rhci51dGlsLlVSTCgpOwotCQkJCWFjdGlvblVSTFswXS5Db21wbGV0ZSA9IGFjdGlvbjsKLQkJCQlYVVJMVHJhbnNmb3JtZXIgdXJsVHJhbnNmb3JtZXIgPSAoWFVSTFRyYW5zZm9ybWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhVUkxUcmFuc2Zvcm1lci5jbGFzcywKLQkJCQkJCXhNU0YuY3JlYXRlSW5zdGFuY2UoImNvbS5zdW4uc3Rhci51dGlsLlVSTFRyYW5zZm9ybWVyIikpOwotCQkJCXVybFRyYW5zZm9ybWVyLnBhcnNlU3RyaWN0KGFjdGlvblVSTCk7Ci0JCQkJWERpc3BhdGNoIGRpc3BhdGNoID0gZGlzcGF0Y2hQcm92aWRlci5xdWVyeURpc3BhdGNoKGFjdGlvblVSTFswXSwgIiIsIDApOwotCQkJCWlmIChudWxsICE9IGRpc3BhdGNoKSB7Ci0JCQkJCWRpc3BhdGNoLmRpc3BhdGNoKGFjdGlvblVSTFswXSwgbmV3IFByb3BlcnR5VmFsdWVbMF0pOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9ICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDBlMWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSouamFyCi0qLmFyZ3MKLWJ1aWxkLnhtbAotYmluCi1sb2cuZm9sZGVyCi10ZW1wLmZvbGRlcgotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM3YjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM4NGY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYudWkuQWN0ZlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLAotIG9yZy5lY2xpcHNlLmFjdGYuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi51aSwKLSBvcmcuZWNsaXBzZS5hY3RmLnVpLnByZWZlcmVuY2VzCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTg2M2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmY4ODBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGx1Z2luTmFtZT1BQ1RGIFVJIFBsdWctaW4gKEluY3ViYXRpb24pCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWFib3V0VGV4dD1cblxuQUNURiBVSSBQbHVnLWluIChJbmN1YmF0aW9uKVxuXAotVmVyc2lvbjogMC4zLjBcblwKLUJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBJQk0gMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFhYzViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGYudmFsaWRhdGlvbi5qYXZhcHAudWkuSmF2YVBvcHVwQ29udHJpYnV0aW9uIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBsYWJlbD0iQWNjZXNzaWJpbGl0eSBUb29scyIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLnVpLmFjdGZDb250ZXh0TWVudSI+Ci0gICAgICAgICAgIDxncm91cE1hcmtlciBuYW1lPSJhY3RmIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICA8L2V4dGVuc2lvbj4gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iQUNURiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICAgCi0gICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91aS9BY3RmVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91aS9BY3RmVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1MjJmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdWkvQWN0ZlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGZVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RGX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5hY3RmLnVpIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU0lCSUxJVFlfVE9PTFNfTUVOVSA9ICJvcmcuZWNsaXBzZS5hY3RmLnVpLmFjdGZDb250ZXh0TWVudSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QUkVGUkVOQ0VfUEFHRV9JRCA9ICJvcmcuZWNsaXBzZS5hY3RmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0ZlVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0ZlVJUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RmVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91aS9wcmVmZXJlbmNlcy9BYnN0cmFjdEJhc2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0QmFzZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWNlZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0QmFzZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICBNaWtlIFNxdWlsbGFjZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UKLXsKLQotCS8qKgotCSAqIFRoZSBmaWVsZCBlZGl0b3JzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgY3JlYXRlZCB5ZXQuCi0JICovCi0JLy8gdXNlcyBjaGlsZCdzIGNyZWF0ZUNvbnRlbnRzIGltcGxlbWVudGVkIG1ldGhvZAotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzIChDb21wb3NpdGUgcGFyZW50KTsKLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlU3RhbmRhcmRMYXlvdXQgKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2xzKSB7Ci0JCUNvbXBvc2l0ZSBzdGRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCS8vIGlmIG51bUNvbHMgPT0gMCB0aGlzIGp1c3Qgc2tpcCB0aGlzIHN0ZXAgYWx0b2dldGhlcgotCQlpZiAobnVtQ29scyAhPSAwKSB7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHM7Ci0JCX0KLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXN0ZENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBudWxsOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlzdGRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBzdGRDb21wb3NpdGU7Ci0JfSAvLyBlbmQtLWNyZWF0ZVN0YW5kYXJkTGF5b3V0Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUV4Y2VwdGlvbkxheW91dCAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZXhDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGV4TGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlleENvbXBvc2l0ZS5zZXRMYXlvdXQoZXhMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZXhDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBleENvbXBvc2l0ZTsKLQl9IC8vIGVuZC0tY3JlYXRlRXhjZXB0aW9uTGF5b3V0Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRWRpdG9yIChQcmVmZXJlbmNlUGFnZSBwcmVmUGFnZSwgRmllbGRFZGl0b3IgZWRpdG9yLAotCQkJCQkJCQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUpIHsKLQkJLy8gVE9ETwotCQkvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBFY2xpcHNlIDMuMSBBUEkgb25seS4gSXQgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIGl0IGJyZWFrcyBFY2xpcHNlIDMuMC4KLQkJLy8gV2hlbiB3ZSBubyBsb25nZXIgc3VwcG9ydCBFY2xpcHNlIDMuMCB3ZSBzaG91bGQgdW5jb21tZW50IHRoaXMgbGluZS4KLQkJLy9lZGl0b3Iuc2V0UGFnZShwcmVmUGFnZSk7Ci0JCWVkaXRvci5zZXRQcmVmZXJlbmNlU3RvcmUocHJlZmVyZW5jZVN0b3JlKTsKLQkJZWRpdG9yLmxvYWQoKTsKLQl9IC8vIGVuZC0taW5pdGlhbGl6ZUVkaXRvcgotCi0JcHVibGljIHZvaWQgY3JlYXRlTGluZVNlcGFyYXRvciAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgYSBsaW5lCi0JCUxhYmVsIHMwID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgZ2QwID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkMC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXMwLnNldExheW91dERhdGEoZ2QwKTsKLQl9IC8vIGVuZC0tY3JlYXRlTGluZVNlcGFyYXRvcgotfSAvLyBlbmQtLUFic3RyYWN0QmFzZVByZWZlcmVuY2VQYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0OWRhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgTWlrZSBTcXVpbGxhY2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLmNvcmUuY29uZmlnLklDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5sb2dnaW5nLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcgotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9OT05FID0gIlNFVkVSRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9FUlJPUiA9ICJFUlJPUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9XQVJOSU5HID0gIldBUk5JTkciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfSU5GTyA9ICJJTkZPIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWX0FMTCA9ICJERVRBSUwiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfTU9ERUxTID0gSUNvbmZpZ3VyYXRpb24uTU9ERUxfSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9BTElBU0VTID0gCSJhbGlhc2VzIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSBJUmVwb3J0ZXIuU0VWRVJFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SUyA9IElSZXBvcnRlci5FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HUyA9IElSZXBvcnRlci5XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NfSU5GTyA9IElSZXBvcnRlci5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0NFU1NfQUxMID0gSVJlcG9ydGVyLkNPTkZJRzsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91aS9wcmVmZXJlbmNlcy9Sb290UHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91aS9wcmVmZXJlbmNlcy9Sb290UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MTQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgTWlrZSBTcXVpbGxhY2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51aS5BY3RmVUlQbHVnaW47Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnZhbGlkYXRpb24udWkucHJlZmVyZW5jZXMuVmFsaWRhdGlvblByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdAotICogaXMgY29udHJhdmVudXRlZCB0byB0aGUgUHJlZmVyZW5jZXMgZGlhbG9nLiBCeQotICogc3ViY2xhc3NpbmcgPHNhbXA+RmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTwvc2FtcD4sIHdlCi0gKiBjYW4gdXNlIHRoZSBmaWVsZCBzdXBwb3J0IGJ1aWx0IGludG8gSkZhY2UgdGhhdCBhbGxvd3MKLSAqIHVzIHRvIGNyZWF0ZSBhIHBhZ2UgdGhhdCBpcyBzbWFsbCBhbmQga25vd3MgaG93IHRvCi0gKiBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5Ci0gKiBhcmUgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0bwotICogdGhlIG1haW4gcGx1Zy1pbiBjbGFzcy4gVGhhdCB3YXksIHByZWZlcmVuY2VzIGNhbgotICogYmUgYWNjZXNzZWQgZGlyZWN0bHkgdmlhIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICovCi1wdWJsaWMgY2xhc3MgUm9vdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RCYXNlUHJlZmVyZW5jZVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotewotCi0JLy9UaGlzIHN0cmluZyBjb250YWlucyB0aGUgQUNURiB0aXRsZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RGX1RJVExFX1NUUklORyA9ICJBY2Nlc3NpYmlsaXR5IFRvb2xzIEZyYW1ld29yayAoQUNURikuXHJcblxyXG4iOwotCi0JLy8gVGV4dCBDb250cm9sIHRvIGhvbGQgQUNURiBpbmZvcm1hdGlvbi4KLQlwcml2YXRlIHN0YXRpYyBUZXh0IGFjdGZEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgaW50IG1hcFRvTGV2ZWwgKFN0cmluZyBsZXZlbEtleSkgewotCQlpbnQgbGV2ZWwgPSBBYnN0cmFjdFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLldBUk5JTkdTOwotCQlpZiAobGV2ZWxLZXkuZXF1YWxzKEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuVl9BTEwpKSB7Ci0JCQlsZXZlbCA9IEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPQ0VTU19BTEw7Ci0JCX1lbHNlIGlmIChsZXZlbEtleS5lcXVhbHMoQWJzdHJhY3RVSVByZWZlcmVuY2VJbml0aWFsaXplci5WX0lORk8pKSB7Ci0JCQlsZXZlbCA9IEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPQ0VTU19JTkZPOwotCQl9ZWxzZSBpZiAobGV2ZWxLZXkuZXF1YWxzKEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuVl9XQVJOSU5HKSkgewotCQkJbGV2ZWwgPSBBYnN0cmFjdFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLldBUk5JTkdTOwotCQl9ZWxzZSBpZiAobGV2ZWxLZXkuZXF1YWxzKEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuVl9FUlJPUikpIHsKLQkJCWxldmVsID0gQWJzdHJhY3RVSVByZWZlcmVuY2VJbml0aWFsaXplci5FUlJPUlM7Ci0JCX1lbHNlIGlmIChsZXZlbEtleS5lcXVhbHMoQWJzdHJhY3RVSVByZWZlcmVuY2VJbml0aWFsaXplci5WX05PTkUpKSB7Ci0JCQlsZXZlbCA9IEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuTk9ORTsKLQkJfQotCQlyZXR1cm4gbGV2ZWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGlzdFByb3BlcnR5IChTdHJpbmcgcCkgewotCQlyZXR1cm4gcC5lcXVhbHMoQWJzdHJhY3RVSVByZWZlcmVuY2VJbml0aWFsaXplci5QX01PREVMUykKLQkJCQl8fCBwLmVuZHNXaXRoKEFic3RyYWN0VUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUF9BTElBU0VTKTsKLQl9Ci0KLQlwdWJsaWMgUm9vdFByZWZlcmVuY2VQYWdlICgpIHsKLQkJc3VwZXIoKTsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGZVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzIChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkZXNjQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBkZXNjTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlkZXNjQ29tcG9zaXRlLnNldExheW91dChkZXNjTGF5b3V0KTsKLQkJR3JpZERhdGEgbGFiZWxHZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpOwotCQlMYWJlbCBkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKGRlc2NDb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KCJBQ1RGIEluZm9ybWF0aW9uIik7Ci0JCWRlc2NyaXB0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbEdkKTsKLQkJYWN0ZkRlc2NyaXB0aW9uID0gbmV3IFRleHQoZGVzY0NvbXBvc2l0ZSwgKFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCB8IFNXVC5NVUxUSSkpOwotCQlTdHJpbmcgYWN0ZkRlc2NyaXB0aW9uU3RyaW5nID0gQUNURl9USVRMRV9TVFJJTkc7Ci0JCWFjdGZEZXNjcmlwdGlvbi5zZXRUZXh0KGFjdGZEZXNjcmlwdGlvblN0cmluZyk7Ci0JCUdyaWREYXRhIGRlc2NyaXB0aW9uR2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYWN0ZkRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGVzY3JpcHRpb25HZCk7Ci0JCXJldHVybiAocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRQcmVmZXJlbmNlcyAoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpZWxkIGVkaXRvcnMuIEZpZWxkIGVkaXRvcnMgYXJlIGFic3RyYWN0aW9ucyBvZgotCSAqIHRoZSBjb21tb24gR1VJIGJsb2NrcyBuZWVkZWQgdG8gbWFuaXB1bGF0ZSB2YXJpb3VzIHR5cGVzCi0JICogb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQgZWRpdG9yIGtub3dzIGhvdyB0byBzYXZlIGFuZAotCSAqIHJlc3RvcmUgaXRzZWxmLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycyAoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCAoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5Ly5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzExZWU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyYzhjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgSHR0cHByb3h5IFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMC4xCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUKLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHksCi0gb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHksCi0gb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZGExZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvRXh0ZXJuYWxQcm94eUNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L0V4dGVybmFsUHJveHlDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5ZDM4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvRXh0ZXJuYWxQcm94eUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eTsKLQotcHVibGljIGNsYXNzIEV4dGVybmFsUHJveHlDb25maWcgewotCXByaXZhdGUgYm9vbGVhbiBleHRlcm5hbFByb3h5RmxhZyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGV4dGVybmFsUHJveHlIb3N0ID0gImxvY2FsaG9zdCI7Ci0JcHJpdmF0ZSBpbnQgZXh0ZXJuYWxQcm94eVBvcnQgPSA4MDgwOwotCi0JcHVibGljIEV4dGVybmFsUHJveHlDb25maWcoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHRlcm5hbFByb3h5RmxhZygpIHsKLQkJcmV0dXJuIGV4dGVybmFsUHJveHlGbGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsUHJveHlGbGFnKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLmV4dGVybmFsUHJveHlGbGFnID0gZmxhZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsUHJveHlIb3N0KCkgewotCQlyZXR1cm4gZXh0ZXJuYWxQcm94eUhvc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRFeHRlcm5hbFByb3h5UG9ydCgpIHsKLQkJcmV0dXJuIGV4dGVybmFsUHJveHlQb3J0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsUHJveHkoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0JCXRoaXMuZXh0ZXJuYWxQcm94eUhvc3QgPSBob3N0OwotCQl0aGlzLmV4dGVybmFsUHJveHlQb3J0ID0gcG9ydDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9IVFRQUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9IVFRQUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NmM4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvSFRUUFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLkNsaWVudENvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFNlc3Npb25PdmVycmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSVNlY3JldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5pbXBsLkNsaWVudFN0YXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LmltcGwuSFRUUFByb3h5Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuSU9iamVjdFBvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLklXb3JrcGlsZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuaW1wbC5PYmplY3RQb29sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuaW1wbC5Xb3JrcGlsZUNvbnRyb2xsZXJJbXBsOwotCi1wdWJsaWMgY2xhc3MgSFRUUFByb3h5IGltcGxlbWVudHMgQ2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQUHJveHkuY2xhc3MpOwotCi0JcHJpdmF0ZSBmaW5hbCBJV29ya3BpbGVDb250cm9sbGVyIHdwYzsKLQotCXByaXZhdGUgZmluYWwgU2VydmVyU29ja2V0IGZTZXJ2ZXJTb2NrOwotCi0JcHJpdmF0ZSBmaW5hbCBsb25nIGZLZWVwQWxpdmU7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBmUXVldWVTaXplOwotCi0JLy8gcHJpdmF0ZSBmaW5hbCBBc3luY1dvcmtNYW5hZ2VyIGZEaXNwYXRjaFdvcmtNYW47Ci0KLQlwcml2YXRlIGZpbmFsIElPYmplY3RQb29sIGNvbm5lY3Rpb25Qb29sOwotCi0JcHJpdmF0ZSBmaW5hbCBJU2VjcmV0TWFuYWdlciBzZWNyZXRNYW5hZ2VyOwotCQotCXByaXZhdGUgZmluYWwgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBzZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeTsKLQkKLQlwcml2YXRlIGZpbmFsIElIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeSBwcm94eVRyYW5zY29kZXJGYWN0b3J5OwotCQotCXByaXZhdGUgZmluYWwgSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkgbG9jYWxTZXJ2ZXJGYWN0b3J5OwotCQotCXByaXZhdGUgRXh0ZXJuYWxQcm94eUNvbmZpZyBleHRlcm5hbFByb3h5Q29uZmlnOwotCi0JcHVibGljIElTZWNyZXRNYW5hZ2VyIGdldFNlY3JldE1hbmFnZXIoKSB7Ci0JCXJldHVybiBzZWNyZXRNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGlzdGVuUG9ydCgpIHsKLQkJcmV0dXJuIGZTZXJ2ZXJTb2NrLmdldExvY2FsUG9ydCgpOwotCX0KLQkKLQlwdWJsaWMgRXh0ZXJuYWxQcm94eUNvbmZpZyBnZXRFeHRlcm5hbFByb3h5Q29uZmlnKCl7Ci0JCXJldHVybiBleHRlcm5hbFByb3h5Q29uZmlnOwotCX0KLQkJCi0JcHVibGljIElIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkgZ2V0U2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBzZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5IGdldFByb3h5VHJhbnNjb2RlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwcm94eVRyYW5zY29kZXJGYWN0b3J5OwotCX0JCi0KLQlwdWJsaWMgSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkgZ2V0TG9jYWxTZXJ2ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbG9jYWxTZXJ2ZXJGYWN0b3J5OwotCX0KLQotCXByaXZhdGUgSFRUUFByb3h5KFByb3h5Q29uZmlnIGNvbmZpZywgRXh0ZXJuYWxQcm94eUNvbmZpZyBleHRlcm5hbFByb3h5Q29uZmlnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlMb2dnZXIuc2V0Q29uZmlnUHJvcGVydHlOYW1lKCJXYVhjb2RpbmcuY29uZi5sb2dnaW5nIik7Ci0JCXRoaXMuZXh0ZXJuYWxQcm94eUNvbmZpZyA9IGV4dGVybmFsUHJveHlDb25maWc7Ci0JCXdwYyA9IG5ldyBXb3JrcGlsZUNvbnRyb2xsZXJJbXBsKCJXYVhjb2RpbmciKTsKLQkJZlNlcnZlclNvY2sgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0JCVNvY2tldEFkZHJlc3Mgc2EgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoImxvY2FsaG9zdCIsIGNvbmZpZy5nZXRQb3J0KCkpOwotCQkvLyBTb2NrZXRBZGRyZXNzIHNhID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsUG9ydCk7Ci0JCWZTZXJ2ZXJTb2NrLmJpbmQoc2EpOwotCQlmS2VlcEFsaXZlID0gY29uZmlnLmdldEtlZXBBbGl2ZUludGVydmFsKCk7Ci0JCWZRdWV1ZVNpemUgPSBjb25maWcuZ2V0TWF4UXVldWVTaXplKCk7Ci0JCWNvbm5lY3Rpb25Qb29sID0gbmV3IE9iamVjdFBvb2xJbXBsKCJXYVhjb2RpbmctY2xpZW50Y29ubmVjdGlvbnMiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcuZ2V0TWF4Q29ubmVjdGlvbigpOyBpKyspIHsKLQkJCUlIVFRQUHJveHlDb25uZWN0aW9uIG9iaiA9IG5ldyBIVFRQUHJveHlDb25uZWN0aW9uKHRoaXMsIGZRdWV1ZVNpemUsCi0JCQkJCWNvbmZpZy5nZXRUaW1lb3V0KCkpOwotCQkJY29ubmVjdGlvblBvb2wuYWRkKG9iaik7Ci0JCX0KLQkJc2VjcmV0TWFuYWdlciA9IGNvbmZpZy5nZXRTZWNyZXRNYW5hZ2VyKCk7Ci0JCXNlc3Npb25PdmVycmlkZXJGYWN0b3J5ID0gY29uZmlnLmdldFNlc3Npb25PdmVycmlkZXJGYWN0b3J5KCk7Ci0JCXByb3h5VHJhbnNjb2RlckZhY3RvcnkgPSBjb25maWcuZ2V0UHJveHlUcmFuc2NvZGVyRmFjdG9yeSgpOwotCQlsb2NhbFNlcnZlckZhY3RvcnkgPSBjb25maWcuZ2V0TG9jYWxTZXJ2ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWNyZXQoU3RyaW5nIGlkLCBib29sZWFuIHJlbW92ZSkgewotCQlpZihudWxsPT1zZWNyZXRNYW5hZ2VyKXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzZWNyZXRNYW5hZ2VyLmdldFNlY3JldChpZCwgcmVtb3ZlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRDdXJyZW50U2VydmVyR3JvdXBJbmRleCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdGlvbkNsb3NlZChJQ2xpZW50Q29ubmVjdGlvbiBvYmopIHsKLQkJY29ubmVjdGlvblBvb2wuYWRkKG9iaik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4aXQgPSBmYWxzZTsKLQotCXByaXZhdGUgdm9pZCBzdGFydFByb3h5KCkgewotCQlMT0dHRVIuaW5mbygiU3RhcnRlZCBXYVhjb2RpbmcsIExpc3RlbmluZyBwb3J0ICIKLQkJCQkrIGZTZXJ2ZXJTb2NrLmdldExvY2FsUG9ydCgpKTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVNvY2tldCBzb2NrID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJSFRUUFByb3h5Q29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEhUVFBQcm94eUNvbm5lY3Rpb24pIGNvbm5lY3Rpb25Qb29sCi0JCQkJCQkudGFrZSgwKTsKLQkJCQlzb2NrID0gZlNlcnZlclNvY2suYWNjZXB0KCk7Ci0JCQkJc29jay5zZXRTb1RpbWVvdXQoMSk7Ci0JCQkJaWYgKGV4aXQpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzb2NrICE9IG51bGwpIHsKLQkJCQkJY29ubmVjdGlvbi5pbml0KENsaWVudFN0YXRlTWFuYWdlcgotCQkJCQkJCS5nZXRDbGllbnRTdGF0ZU1hbmFnZXIodGhpcyksIHNvY2ssIGZLZWVwQWxpdmUsCi0JCQkJCQkJZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKSk7Ci0JCQkJCXdwYy5pbnB1dChjb25uZWN0aW9uKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGV4aXQpIHsKLQkJCQkJTE9HR0VSLmluZm8oIlN0b3BwaW5nIFdhWGNvZGluZy4uLiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotCQkJCS8vIHRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih3cGMudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLQkJTE9HR0VSLmluZm8oIi4uLmRvbmUiKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3h5VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBib29sZWFuIHRocmVhZEV4aXQ7Ci0KLQkJcHVibGljIHZvaWQgZXhpdCgpIHsKLQkJCWV4aXQgPSB0cnVlOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJd2hpbGUgKCF0aHJlYWRFeGl0KSB7Ci0JCQkJCXRoaXMuaW50ZXJydXB0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmU2VydmVyU29jay5jbG9zZSgpOwotCQkJCQkJd2FpdCgxMDAwKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc3RhcnRQcm94eSgpOwotCQkJY2xlYW51cCgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJdGhyZWFkRXhpdCA9IHRydWU7Ci0JCQkJbm90aWZ5QWxsKCk7Ci0JCQl9Ci0JCX0KLQotCQlQcm94eVRocmVhZCgpIHsKLQkJCXN1cGVyKCJQcm94eVRocmVhZCIpOwotCQkJdGhyZWFkRXhpdCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm94eVRocmVhZCBwcm94eVRocmVhZDsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0VGhyZWFkKCkgewotCQlpZiAocHJveHlUaHJlYWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcHJveHlUaHJlYWQgPSBuZXcgUHJveHlUaHJlYWQoKTsKLQkJcHJveHlUaHJlYWQuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wVGhyZWFkKCkgewotCQlwcm94eVRocmVhZC5leGl0KCk7Ci0JCXByb3h5VGhyZWFkID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfUEFSQU1TID0gIiA8bG9jYWxwb3J0PiI7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIFBSSU5UX1VTQUdFKFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQl9Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IGphdmEgIiArIEhUVFBQcm94eS5jbGFzcy5nZXROYW1lKCkKLQkJCQkrIFVTQUdFX1BBUkFNUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBIVFRQUHJveHkgbmV3UHJveHkoUHJveHlDb25maWcgY29uZmlnLCBFeHRlcm5hbFByb3h5Q29uZmlnIGV4dGVybmFsUHJveHlDb25maWcsIFN0cmluZyBsb2dOYW1lLAotCQkJSW5wdXRTdHJlYW0gY29uZmlnSVMpIHsKLQkJdHJ5IHsKLQkJCUxvZ2dlci5jb25maWd1cmUobG9nTmFtZSwgY29uZmlnSVMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXRyeSB7Ci0JCQlIVFRQUHJveHkgcHJveHkgPSBuZXcgSFRUUFByb3h5KGNvbmZpZywgZXh0ZXJuYWxQcm94eUNvbmZpZyk7Ci0JCQlyZXR1cm4gcHJveHk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA8IDEpIHsKLQkJCVBSSU5UX1VTQUdFKG51bGwpOwotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQlpbnQgYXJnc09mZnNldCA9IDA7Ci0KLQkJaW50IGxvY2FscG9ydCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1thcmdzT2Zmc2V0KytdKTsKLQotCQlQcm94eUNvbmZpZyBjb25maWcgPSBuZXcgUHJveHlDb25maWcoKTsKLQkJRXh0ZXJuYWxQcm94eUNvbmZpZyBleHRlcm5hbFByb3h5Q29uZmlnID0gbmV3IEV4dGVybmFsUHJveHlDb25maWcoKTsKLS8vCQlXYVhjb2RpbmdDb25maWcgd2F4Q29uZmlnID0gV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCk7Ci0JCQotCQl0cnkgewotCQkJTG9nZ2VyLmNvbmZpZ3VyZSgiSFRUUFByb3h5Iik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotLy8JCXRyeSB7Ci0vLwkJCXdheENvbmZpZy5zZXRTV0ZCb290bG9hZGVyRmxhZyhmYWxzZSk7Ci0vLwkJCWZpbmFsIEZpbGUgaW1wb3NlZFNXRlBhdGggPSBuZXcgRmlsZSgiYnJpZGdlU1dGL2ltcG9zZWQuc3dmIik7Ci0vLwkJCVNXRlRyYW5zY29kZXIuc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShuZXcgRmlsZUlucHV0U3RyZWFtKAotLy8JCQkJCWltcG9zZWRTV0ZQYXRoKSk7Ci0vLwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0vLwkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQlTeXN0ZW0uZXhpdCgxKTsKLS8vCQl9Ci0KLQkJdHJ5IHsKLQkJCUhUVFBQcm94eSBwcm94eSA9IG5ldyBIVFRQUHJveHkoY29uZmlnLCBleHRlcm5hbFByb3h5Q29uZmlnKTsKLQkJCXByb3h5LnN0YXJ0UHJveHkoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJQb3J0IGlzIGluIHVzZTogIiArIGxvY2FscG9ydCk7Ci0JCQlTeXN0ZW0uZXhpdCgxKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9Qcm94eUNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L1Byb3h5Q29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWUxODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L1Byb3h5Q29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JU2VjcmV0TWFuYWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlDb25maWcgewotCXByaXZhdGUgaW50IHBvcnQgPSAwOwotCi0JcHJpdmF0ZSBpbnQgbWF4Q29ubmVjdGlvbiA9IDIwOwotCi0JcHJpdmF0ZSBpbnQgdGltZW91dCA9IDMwMDAwOwotCi0JcHJpdmF0ZSBpbnQga2VlcEFsaXZlSW50ZXJ2YWwgPSAxMDAwOwotCi0JcHJpdmF0ZSBpbnQgbWF4UXVldWVTaXplID0gMTAwOwotCi0JcHJpdmF0ZSBpbnQga2VlcEFsaXZlVGltZW91dFdpdGhvdXRDb250ZW50TGVuZ3RoID0gMTA7Ci0JCi0JcHJpdmF0ZSBJSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkgcHJveHlUcmFuc2NvZGVyRmFjdG9yeSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBJSFRUUFNlc3Npb25PdmVycmlkZXJGYWN0b3J5IHNlc3Npb25PdmVycmlkZXJGYWN0b3J5ID0gbnVsbDsKLQkKLQlwcml2YXRlIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IGxvY2FsU2VydmVyRmFjdG9yeSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBJU2VjcmV0TWFuYWdlciBzZWNyZXRNYW5hZ2VyID0gbnVsbDsKLQotCXB1YmxpYyBQcm94eUNvbmZpZygpIHsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRNYXhDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gbWF4Q29ubmVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhDb25uZWN0aW9uKGludCBtYXhDb25uZWN0aW9uKSB7Ci0JCXRoaXMubWF4Q29ubmVjdGlvbiA9IG1heENvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRUaW1lb3V0KCkgewotCQlyZXR1cm4gdGltZW91dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0JCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRLZWVwQWxpdmVJbnRlcnZhbCgpIHsKLQkJcmV0dXJuIGtlZXBBbGl2ZUludGVydmFsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TWF4UXVldWVTaXplKCkgewotCQlyZXR1cm4gbWF4UXVldWVTaXplOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0S2VlcEFsaXZlVGltZW91dFdpdGhvdXRDb250ZW50TGVuZ3RoKCkgewotCQlyZXR1cm4ga2VlcEFsaXZlVGltZW91dFdpdGhvdXRDb250ZW50TGVuZ3RoOwotCX0KLQkKLQlwdWJsaWMgSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5IGdldFByb3h5VHJhbnNjb2RlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwcm94eVRyYW5zY29kZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3h5VHJhbnNjb2RlckZhY3RvcnkoCi0JCQlJSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkgcHJveHlUcmFuc2NvZGVyRmFjdG9yeSkgewotCQl0aGlzLnByb3h5VHJhbnNjb2RlckZhY3RvcnkgPSBwcm94eVRyYW5zY29kZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBJSFRUUFNlc3Npb25PdmVycmlkZXJGYWN0b3J5IGdldFNlc3Npb25PdmVycmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gc2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkoSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBzZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSkgewotCQl0aGlzLnNlc3Npb25PdmVycmlkZXJGYWN0b3J5ID0gc2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IGdldExvY2FsU2VydmVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGxvY2FsU2VydmVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbFNlcnZlckZhY3RvcnkoSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkgbG9jYWxTZXJ2ZXJGYWN0b3J5KSB7Ci0JCXRoaXMubG9jYWxTZXJ2ZXJGYWN0b3J5ID0gbG9jYWxTZXJ2ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBJU2VjcmV0TWFuYWdlciBnZXRTZWNyZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gc2VjcmV0TWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWNyZXRNYW5hZ2VyKElTZWNyZXRNYW5hZ2VyIHNlY3JldE1hbmFnZXIpIHsKLQkJdGhpcy5zZWNyZXRNYW5hZ2VyID0gc2VjcmV0TWFuYWdlcjsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JQ2xpZW50Q29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUNsaWVudENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlNDEzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JQ2xpZW50Q29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbC5TZXJ2ZXJDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5UaW1lb3V0RXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDbGllbnRDb25uZWN0aW9uIHsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0Q29ubmVjdGlvbigpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBjbG9zZSgpOwotCi0JcHVibGljIGFic3RyYWN0IFNvY2tldCBnZXRDbGllbnRTb2NrZXQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSGFuZGxpbmdSZXF1ZXN0KCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kUmVzcG9uc2UobG9uZyB0aW1lb3V0LAotCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UsIGJvb2xlYW4gcmVhZHlUb0hhbmRsZVJlcXVlc3QpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZFJlc3BvbnNlKGxvbmcgdGltZW91dCwgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZFJlc3BvbnNlKElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlKQotCQkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFsbG93VHVubmVsKElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxLAotCQkJU2VydmVyQ29ubmVjdGlvbiBzYywgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sCi0JCQlUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlamVjdFR1bm5lbChJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSwgbG9uZyB0aW1lb3V0KQotCQkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnRpbnVvdXNseSByZWFkIHJlcXVlc3RzIGZyb20gdGhlIGNsaWVudCBhbmQgcHV0IHRoZW0gaW50byB0aGUgc2VuZAotCSAqIHF1ZXVlIG9mIHRoZSBkaXNwYXRjaGVyLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBIZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZWRkNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQSGVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9PUFRJT05TID0gIk9QVElPTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9HRVQgPSAiR0VUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfSEVBRCA9ICJIRUFEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUE9TVCA9ICJQT1NUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUFVUID0gIlBVVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0RFTEVURSA9ICJERUxFVEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9UUkFDRSA9ICJUUkFDRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTk5FQ1QgPSAiQ09OTkVDVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVBUID0gIkFjY2VwdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVBUX0NIQVJTRVQgPSAiQWNjZXB0LUNoYXJzZXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9MQU5HVUFHRSA9ICJBY2NlcHQtTGFuZ3VhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9FTkNPRElORyA9ICJBY2NlcHQtRW5jb2RpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHRSA9ICJBZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XID0gIkFsbG93IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJWkFUSU9OID0gIkF1dGhvcml6YXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NPTlRST0wgPSAiQ2FjaGUtQ29udHJvbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTiA9ICJDb25uZWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0VOQ09ESU5HID0gIkNvbnRlbnQtRW5jb2RpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTEFOR1VBR0UgPSAiQ29udGVudC1MYW5ndWFnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9MRU5HVEggPSAiQ29udGVudC1MZW5ndGgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTUQ1ID0gIkNvbnRlbnQtTUQ1IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1JBTkdFID0gIkNvbnRlbnQtUmFuZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJDb250ZW50LVR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiRGF0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNUID0gIkV4cGVjdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJFUyA9ICJFeHBpcmVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUk9NID0gIkZyb20iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAiSG9zdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUZfTU9ESUZJRURfU0lOQ0UgPSAiSWYtTW9kaWZpZWQtU2luY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElGX1VOTU9ESUZJRURfU0lOQ0UgPSAiSWYtVW5tb2RpZmllZC1TaW5jZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9NT0RJRklFRCA9ICJMYXN0LU1vZGlmaWVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJMb2NhdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0ZPUldBUkRTID0gIk1heC1Gb3J3YXJkcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBR01BID0gIlByYWdtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ09OTkVDVElPTiA9ICJQcm94eS1Db25uZWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRSA9ICJSYW5nZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFUiA9ICJSZWZlcmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRSWV9BRlRFUiA9ICJSZXRyeS1BZnRlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSID0gIlNlcnZlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gU0VSVkVSX0EgPSBTRVJWRVIuZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0ZFUl9FTkNPRElORyA9ICJUcmFuc2Zlci1FbmNvZGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBHUkFERSA9ICJVcGdyYWRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0FHRU5UID0gIlVzZXItQWdlbnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUlkgPSAiVmFyeSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklBID0gIlZpYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1dXX0FVVEhFTlRJQ0FURSA9ICJXV1ctQXV0aGVudGljYXRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1ZFUlNJT05fMV8wID0gIkhUVFAvMS4wIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBIVFRQX1ZFUlNJT05fMV8wX0EgPSBIVFRQX1ZFUlNJT05fMV8wLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9WRVJTSU9OXzFfMSA9ICJIVFRQLzEuMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gSFRUUF9WRVJTSU9OXzFfMV9BID0gSFRUUF9WRVJTSU9OXzFfMS5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElTUE9TSVRJT04gPSAiQ29udGVudC1EaXNwb3NpdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PS0lFID0gIkNvb2tpZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0NPT0tJRSA9ICJTZXQtQ29va2llIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT05URU5UX0xFTkdUSF9BID0gQ09OVEVOVF9MRU5HVEguZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBUUkFOU0ZFUl9FTkNPRElOR19BID0gVFJBTlNGRVJfRU5DT0RJTkcKLQkJCS5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIENIVU5LRURfQSA9ICJjaHVua2VkIi5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEhPU1RfQSA9IEhPU1QuZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBQUk9YWV9DT05ORUNUSU9OX0EgPSBQUk9YWV9DT05ORUNUSU9OLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQ09OVEVOVF9UWVBFX0EgPSBDT05URU5UX1RZUEUuZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT05ORUNUSU9OX0EgPSBDT05ORUNUSU9OLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQ0FDSEVfQ09OVFJPTF9BID0gQ0FDSEVfQ09OVFJPTC5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEVYUElSRVNfQSA9IEVYUElSRVMuZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBQUkFHTUFfQSA9IFBSQUdNQS5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFJFRkVSRVJfQSA9IFJFRkVSRVIuZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBJRl9NT0RJRklFRF9TSU5DRV9BID0gSUZfTU9ESUZJRURfU0lOQ0UKLQkJCS5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEFDQ0VQVF9FTkNPRElOR19BID0gQUNDRVBUX0VOQ09ESU5HLmdldEJ5dGVzKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZW1vdmVkKGJvb2xlYW4gcmVtb3ZlZCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbW92ZWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmllbGROYW1lRXF1YWxzVG8oYnl0ZVtdIG5hbWUpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGaWVsZFZhbHVlRXF1YWxzVG8oYnl0ZVtdIHZhbHVlKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0TmFtZSgpOwotCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRWYWx1ZSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoYnl0ZVtdIHZhbHVlKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVWYWx1ZShieXRlW10gdmFsdWUpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29tcGFyZVZhbHVlSWdub3JlQ2FzZShieXRlW10gdmFsdWUpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMaW5lKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGFiOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBNZXNzYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRfTlVNX0hFQURFUlMgPSA1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDUiA9IDB4MGQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExGID0gMHgwYTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU1AgPSAweDIwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBIVCA9IDB4MDk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRTZXJpYWwoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpOwotCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBJTWVzc2FnZUJvZHkgZ2V0TWVzc2FnZUJvZHkoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldEhlYWRlcnMoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBJSFRUUEhlYWRlciByZW1vdmVIZWFkZXIoYnl0ZVtdIG5hbWUpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SGVhZGVyKGJ5dGVbXSBuYW1lLCBieXRlW10gdmFsdWUpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVHJhaWxpbmdIZWFkZXIoSUhUVFBIZWFkZXIgdHJhaWxlcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUhUVFBIZWFkZXIgZ2V0SGVhZGVyKGJ5dGVbXSBuYW1lKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0SGVhZGVyQXNCeXRlcyhieXRlW10gbmFtZSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NodW5rZWRFbmNvZGluZygpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2h1bmtlZEVuY29kaW5nKGJvb2xlYW4gaXNDaHVua2VkKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpZChsb25nIHRpZCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRUaWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQm9keShsb25nIHRpbWVvdXQsIElNZXNzYWdlQm9keSBtc2dCb2R5LAotCQkJT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUobG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gb3V0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNIVFRQVmVyc2lvbjFfMSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q29ubmVjdGlvbkhlYWRlcihib29sZWFuIGtlZXBhbGl2ZSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Nvbm5lY3Rpb25Ub0JlQ2xvc2VkKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUFJlcXVlc3RNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUFJlcXVlc3RNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmIwZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBSZXF1ZXN0TWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbC5CdWZmZXJSYW5nZTsKLQotcHVibGljIGludGVyZmFjZSBJSFRUUFJlcXVlc3RNZXNzYWdlIGV4dGVuZHMgSUhUVFBNZXNzYWdlewotCi0JcHVibGljIGFic3RyYWN0IEJ1ZmZlclJhbmdlIGdldE1ldGhvZCgpOwotCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRNZXRob2RBc0J5dGVzKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE1ldGhvZEFzU3RyaW5nKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgQnVmZmVyUmFuZ2UgZ2V0UmVxdWVzdFVSSSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmVxdWVzdFVSSVN0cmluZyhTdHJpbmcgbmV3UmVxdWVzdFVSSSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZXF1ZXN0VVJJU3RyaW5nKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgQnVmZmVyUmFuZ2UgZ2V0SFRUUFZlcnNpb24oKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTWV0aG9kRXF1YWxzVG8oYnl0ZVtdIG1ldGhvZCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jlc3BvbnNlQm9keUVtcHR5KCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Nvbm5lY3Rpb25TaHV0ZG93blJlcXVpcmVkKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUFJlc3BvbnNlTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBSZXNwb25zZU1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyMzQyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUFJlc3BvbnNlTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgSUhUVFBNZXNzYWdlewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQk9EWSA9IG5ldyBieXRlWzBdOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb2RlQXNTdHJpbmcoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0U3RhdHVzQ29kZUFzQnl0ZXMoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlQXNTdHJpbmcoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0UmVhc29uUGhyYXNlQXNCeXRlcygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWVhZjc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hpbiBTQUlUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5UaW1lb3V0RXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UgZXh0ZW5kcyBJSFRUUFJlc3BvbnNlTWVzc2FnZXsKLQotCS8vIENhdXRpb24hISEhIFdpdGhvdXQgcHVzaGJhY2sgb3B0aW9uLCBib2R5IHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSByZWFkQm9keShsb25nIHRpbWVvdXQsIGJvb2xlYW4gcHVzaGJhY2spCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0JCi0JcHVibGljIGFic3RyYWN0IElQdXNoYmFja01lc3NhZ2VCb2R5IGdldFB1c2hiYWNrTWVzc2FnZUJvZHkoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lNZXNzYWdlQm9keS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSU1lc3NhZ2VCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWY2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSU1lc3NhZ2VCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlQm9keSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbnRlbnQgbGVuZ3RoIG9mIHRoaXMgbWVzc2FnZSBib2R5LiBJZiBubyBjb250ZW50IGxlbmd0aCBpcwotCSAqIHNwZWNpZmllZCwgZS5nLiB3aGVuIGNodW5rZWQgZW5jb2RpbmcsIC0xIGlzIHJldHVybmVkLgotCSAqIAotCSAqIHJldHVybiBjb250ZW50IGxlbmd0aCwgb3IgLTEgaWYgbm8gY29udGVudCBsZW5ndGggaXMgc3BlY2lmaWVkLgotCSAqLwkKLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRMZW5ndGgoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0TWVzc2FnZUJvZHlUaW1lb3V0SW5wdXRTdHJlYW0oKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBJbnB1dFN0cmVhbSBnZXRNZXNzYWdlQm9keUlucHV0U3RyZWFtKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JUHVzaGJhY2tNZXNzYWdlQm9keS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSVB1c2hiYWNrTWVzc2FnZUJvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxNTk4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JUHVzaGJhY2tNZXNzYWdlQm9keS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQdXNoYmFja01lc3NhZ2VCb2R5IGV4dGVuZHMgSU1lc3NhZ2VCb2R5ewotCi0JLy8gQ2F1dGlvbiEhISEgV2l0aG91dCBwdXNoYmFjayBvcHRpb24sIGJvZHkgd2lsbCBiZSBpbnZhbGlkYXRlZC4KLQlwdWJsaWMgYWJzdHJhY3QgUHVzaGJhY2tJbnB1dFN0cmVhbSBnZXRNZXNzYWdlQm9keVB1c2hCYWNrSW5wdXRTdHJlYW0oKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQmlmdXJjYXRlZE91dHB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9CaWZ1cmNhdGVkT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGIwMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9CaWZ1cmNhdGVkT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQmlmdXJjYXRlZE91dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7Ci0gICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbzI7Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgbzIuY2xvc2UoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZmx1c2goKTsKLSAgICAgICAgbzIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIud3JpdGUoYik7Ci0gICAgICAgIG8yLndyaXRlKGIpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIEJpZnVyY2F0ZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG8xLCBPdXRwdXRTdHJlYW0gbzIpIHsKLSAgICAgICAgc3VwZXIobzEpOwotICAgICAgICB0aGlzLm8yID0gbzI7Ci0gICAgfQotfQotCQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9CdWZmZXJSYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9CdWZmZXJSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDllNmJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQnVmZmVyUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1wdWJsaWMgY2xhc3MgQnVmZmVyUmFuZ2UgewotICAgIHByaXZhdGUgaW50IGZTdGFydDsKLSAgICBwcml2YXRlIGludCBmTGVuZ3RoOwotICAgICAgICAKLSAgICBwdWJsaWMgQnVmZmVyUmFuZ2UoKSB7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZlN0YXJ0ID0gMDsKLSAgICAgICAgZkxlbmd0aCA9IDA7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKLSAgICAgICAgZlN0YXJ0ID0gc3RhcnQ7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotICAgICAgICBmTGVuZ3RoID0gbGVuZ3RoOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGludCBnZXRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIGZTdGFydDsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZkxlbmd0aDsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCdbJykuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZlN0YXJ0KSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnLCcpLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZMZW5ndGgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQnl0ZUJ1ZmZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9CeXRlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNDlkNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9CeXRlQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotcHVibGljIGNsYXNzIEJ5dGVCdWZmZXIgewotICAgIHByaXZhdGUgaW50IGZJZHg7Ci0gICAgcHJpdmF0ZSBieXRlW10gZkJ1ZmZlcjsKLSAgICAgICAgCi0gICAgcHVibGljIEJ5dGVCdWZmZXIoKSB7Ci0gICAgICAgIGZJZHggPSAwOwotICAgICAgICBmQnVmZmVyID0gbnVsbDsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGluaXQoaW50IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgZklkeCA9IDA7Ci0gICAgICAgIGZCdWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChieXRlIGRhdGEpIHsKLSAgICAgICAgaWYgKGZJZHggPj0gZkJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgICAgICAgIGJ5dGVbXSBuZXdCdWZmZXIgPSBuZXcgYnl0ZVtmQnVmZmVyLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmQnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIGZCdWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgIGZCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZkJ1ZmZlcltmSWR4KytdID0gZGF0YTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBieXRlW10gY2xvc2UoKSB7Ci0gICAgICAgIGlmIChmSWR4IDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtmSWR4XTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShmQnVmZmVyLCAwLCBidWYsIDAsIGZJZHgpOwotICAgICAgICByZXR1cm4gYnVmOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0NodW5rRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ1MTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuVGltZW91dEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2h1bmtEZWNvZGVyIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDaHVua0RlY29kZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENSID0gMHgwZDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTEYgPSAweDBhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTUCA9IDB4MjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEhUID0gMHgwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLQotICAgIHByaXZhdGUgaW50IGZDaHVua1NpemUgPSAwOwotICAgIHByaXZhdGUgaW50IGZOdW1DaHVuayA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgZlJlYWRCeXRlcyA9IDA7Ci0gICAgcHJpdmF0ZSBsb25nIGZMYXN0UmVhZFRpbWUgPSAwOwotICAgIHByaXZhdGUgQ2h1bmtMaXN0ZW5lciBmQ2h1bmtMaXN0ZW5lciA9IG51bGw7Ci0vLyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBmUmVwbGljYSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQ2h1bmtEZWNvZGVyKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaHVua0xpc3RlbmVyKENodW5rTGlzdGVuZXIgbCkgewotICAgICAgICBpZiAoZkNodW5rTGlzdGVuZXIgIT0gbnVsbCAmJiBsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNodW5rTGlzdGVuZXIgaXMgYWxyZWFkeSBzZXQ6ICIgKyBmQ2h1bmtMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZkNodW5rTGlzdGVuZXIgPSBsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldENodW5rU2l6ZSgpIHsKLSAgICAgICAgaWYgKGZSZWFkQnl0ZXMgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2h1bmtTaXplIGlzIHVua25vd24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZkNodW5rU2l6ZTsKLSAgICB9Ci0gICAgCi0vLyAgICBwdWJsaWMgQ2h1bmtEZWNvZGVyKElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gcmVwbGljYSkgewotLy8gICAgICAgIHN1cGVyKGluKTsKLS8vICAgICAgICBmUmVwbGljYSA9IHJlcGxpY2E7Ci0vLyAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QXZhaWxhYmxlSW5wdXQobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpbnQgZGF0YTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGluLnJlYWQoKTsKLS8vICAgICAgICAgICAgICAgIGlmIChkYXRhID49IDAgJiYgZlJlcGxpY2EgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgICAgIGZSZXBsaWNhLndyaXRlKGRhdGEpOwotLy8gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmTGFzdFJlYWRUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBmTGFzdFJlYWRUaW1lID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIkhUVFBSZWFkZXIuZ2V0QXZhaWxhYmxlSW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotLyoKLSAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgYXZhaWxhYmxlOwotICAgICAgICAgICAgd2hpbGUgKChhdmFpbGFibGUgPSBpbi5hdmFpbGFibGUoKSkgPD0gMCkgewotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGF2YWlsYWJsZSA9PSAwCi0gICAgICAgICAgICAgICAgaWYgKGZMYXN0UmVhZFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZkxhc3RSZWFkVGltZSA+IHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJIVFRQUmVhZGVyLmdldEF2YWlsYWJsZUlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkYXRhID0gaW4ucmVhZCgpOwotICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotKi8KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QXZhaWxhYmxlSW5wdXQobG9uZyB0aW1lb3V0LCBieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQgYXZhaWxhYmxlOwotICAgICAgICBpbnQgbnJlYWQgPSAwOwotICAgICAgICB3aGlsZSAoKGF2YWlsYWJsZSA9IGluLmF2YWlsYWJsZSgpKSA8PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhdmFpbGFibGUgPT0gMAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZGF0YSA9IGluLnJlYWQoKTsKLSAgICAgICAgICAgICAgICBiW29mZisrXSA9IChieXRlKSBkYXRhOwotICAgICAgICAgICAgICAgIG5yZWFkID0gMTsKLSAgICAgICAgICAgICAgICBsZW4gLT0gMTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSBpbi5hdmFpbGFibGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZkxhc3RSZWFkVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZkxhc3RSZWFkVGltZSA+IHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF2YWlsYWJsZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnJlYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiA+IGF2YWlsYWJsZSkgewotICAgICAgICAgICAgbGVuID0gYXZhaWxhYmxlOwotICAgICAgICB9Ci0gICAgICAgIGludCByZWFkID0gaW4ucmVhZChiLCBvZmYsIGxlbik7Ci0gICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcmV0dXJuIHJlYWQgKyBucmVhZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkQ2h1bmtTaXplTGluZShsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBkYXRhID0gZ2V0QXZhaWxhYmxlSW5wdXQodGltZW91dCk7Ci0gICAgICAgIGlmIChkYXRhID09IEVPRikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBjciA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNybGYgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHRva2VuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAoZGF0YSAhPSBFT0YpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZGF0YSkgewotICAgICAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgICAgICBjciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIExGOgotICAgICAgICAgICAgICAgIGlmIChjcikgewotICAgICAgICAgICAgICAgICAgICBjcmxmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnOyc6Ci0gICAgICAgICAgICBjYXNlIFNQOgotICAgICAgICAgICAgY2FzZSBIVDoKLSAgICAgICAgICAgICAgICBjciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRva2VuLmFwcGVuZCgoY2hhcikgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3JsZikgewotICAgICAgICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY3JsZiA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YSA9IGdldEF2YWlsYWJsZUlucHV0KHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2tlbi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvLyAxKihIRVgpIENSIExGCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRDaHVua1NpemUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdG9rZW4gPSByZWFkQ2h1bmtTaXplTGluZSh0aW1lb3V0KTsKLSAgICAgICAgZk51bUNodW5rICs9IDE7Ci0gICAgICAgIC8vU3RyaW5nIHRva2VuID0gcmVhZE5leHRUb2tlbih0aW1lb3V0LCBvdXQpOwotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBmQ2h1bmtTaXplID0gRU9GOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi50cmltKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZDaHVua1NpemUgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuLCAxNik7IC8vIFBhcnNlIGEgSEVYIG51bWJlcgotICAgICAgICAgICAgICAgIGlmIChmQ2h1bmtMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDaHVua0xpc3RlbmVyLm5ld0NoYW5rUmVhZChmTnVtQ2h1bmssIGZDaHVua1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZkNodW5rU2l6ZSA9IC0xOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBjaHVuayBzaXplIGxpbmU6ICciICsgdG9rZW4gKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZSZWFkQnl0ZXMgPT0gZkNodW5rU2l6ZSkgewotICAgICAgICAgICAgZlJlYWRCeXRlcyA9IDA7Ci0gICAgICAgICAgICByZWFkQ2h1bmtTaXplKHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmQ2h1bmtTaXplID09IEVPRiB8fCBmQ2h1bmtTaXplID09IDApIHsKLSAgICAgICAgICAgIGZDaHVua1NpemUgPSBFT0Y7Ci0gICAgICAgICAgICByZXR1cm4gRU9GOwotICAgICAgICB9Ci0gICAgICAgIGludCBkYXRhID0gZ2V0QXZhaWxhYmxlSW5wdXQodGltZW91dCk7Ci0gICAgICAgIGZSZWFkQnl0ZXMgKz0gMTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZCgwKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW1wb3NzaWJsZSBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmVhZChsb25nIHRpbWVvdXQsIGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAoZlJlYWRCeXRlcyA9PSBmQ2h1bmtTaXplKSB7Ci0gICAgICAgICAgICBmUmVhZEJ5dGVzID0gMDsKLSAgICAgICAgICAgIHJlYWRDaHVua1NpemUodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZDaHVua1NpemUgPT0gRU9GIHx8IGZDaHVua1NpemUgPT0gMCkgewotICAgICAgICAgICAgZkNodW5rU2l6ZSA9IEVPRjsKLSAgICAgICAgICAgIHJldHVybiBFT0Y7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG1heCA9IGZDaHVua1NpemUgLSBmUmVhZEJ5dGVzOwotICAgICAgICBpZiAobGVuID4gbWF4KSB7Ci0gICAgICAgICAgICBsZW4gPSBtYXg7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJlYWQgPSBnZXRBdmFpbGFibGVJbnB1dCh0aW1lb3V0LCBiLCBvZmYsIGxlbik7Ci0gICAgICAgIGZSZWFkQnl0ZXMgKz0gcmVhZDsKLSAgICAgICAgcmV0dXJuIHJlYWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZWFkKDAsIGIsIG9mZiwgbGVuKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW1wb3NzaWJsZSBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgYXZhaWxhYmxlID0gaW4uYXZhaWxhYmxlKCk7Ci0gICAgICAgIGlmIChhdmFpbGFibGUgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZTsKLSAgICAgICAgfQotICAgICAgICAvLyBhdmFpbGFibGUgPiAwCi0gICAgICAgIGlmIChmUmVhZEJ5dGVzID09IGZDaHVua1NpemUpIHsKLSAgICAgICAgICAgIGZSZWFkQnl0ZXMgPSAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWFkQ2h1bmtTaXplKDEpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZlJlYWRCeXRlcyA8IGZDaHVua1NpemUKLSAgICAgICAgaWYgKGZDaHVua1NpemUgPT0gRU9GIHx8IGZDaHVua1NpemUgPT0gMCkgewotICAgICAgICAgICAgZkNodW5rU2l6ZSA9IEVPRjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGF2YWlsYWJsZSA9IGluLmF2YWlsYWJsZSgpOwotICAgICAgICBpbnQgbGVmdCA9IGZDaHVua1NpemUgLSBmUmVhZEJ5dGVzOwotICAgICAgICByZXR1cm4gKGF2YWlsYWJsZSA8IGxlZnQpID8gYXZhaWxhYmxlIDogbGVmdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAobG9uZyBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgaW50IGRhdGEgPSB0aGlzLnJlYWQoKTsKLSAgICAgICAgICAgIGlmIChkYXRhIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgICAgIC8vIG5vcAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBub3AKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtFbmNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0NodW5rRW5jb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIxZWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDaHVua0VuY29kZXIgZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDaHVua0VuY29kZXIuY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hVTktfU0laRSA9IDEwMjQ7IAotICAgIAotICAgIHByaXZhdGUgaW50IGZNYXhDaHVua1NpemU7Ci0gICAgcHJpdmF0ZSBieXRlW10gZkNodW5rQnVmZmVyOwotICAgIHByaXZhdGUgaW50IGZDaHVua1NpemU7Ci0gICAgCi0gICAgcHVibGljIENodW5rRW5jb2RlcihPdXRwdXRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIHRoaXMob3V0LCBERUZBVUxUX0NIVU5LX1NJWkUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2h1bmtFbmNvZGVyKE91dHB1dFN0cmVhbSBvdXQsIGludCBtYXhDaHVua1NpemUpIHsKLSAgICAgICAgc3VwZXIob3V0KTsKLSAgICAgICAgZk1heENodW5rU2l6ZSA9IG1heENodW5rU2l6ZTsKLSAgICAgICAgZkNodW5rU2l6ZSA9IDA7Ci0gICAgICAgIGZDaHVua0J1ZmZlciA9IG5ldyBieXRlW21heENodW5rU2l6ZV07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE1heENodW5rU2l6ZShpbnQgbWF4Q2h1bmtTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZk1heENodW5rU2l6ZSA9PSBtYXhDaHVua1NpemUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkNodW5rU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZsdXNoQ2h1bmsoKTsKLSAgICAgICAgfQotICAgICAgICBmTWF4Q2h1bmtTaXplID0gbWF4Q2h1bmtTaXplOwotICAgICAgICBmQ2h1bmtCdWZmZXIgPSBuZXcgYnl0ZVttYXhDaHVua1NpemVdOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZkNodW5rQnVmZmVyW2ZDaHVua1NpemUrK10gPSAoYnl0ZSkgYjsKLSAgICAgICAgaWYgKGZDaHVua1NpemUgPT0gZk1heENodW5rU2l6ZSkgewotICAgICAgICAgICAgZmx1c2hDaHVuaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmbHVzaENodW5rKCk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZsdXNoQ2h1bmsoKTsKLSAgICAgICAgb3V0LndyaXRlKCcwJyk7Ci0gICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkNSKTsKLSAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuTEYpOwotICAgICAgICBvdXQud3JpdGUoSFRUUFJlYWRlci5DUik7Ci0gICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkxGKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBmbHVzaENodW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZDaHVua1NpemUgPiAwKSB7Ci0gICAgICAgICAgICBieXRlW10gc2l6ZSA9IEludGVnZXIudG9IZXhTdHJpbmcoZkNodW5rU2l6ZSkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgIG91dC53cml0ZShzaXplKTsKLSAgICAgICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkNSKTsKLSAgICAgICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkxGKTsKLSAgICAgICAgICAgIG91dC53cml0ZShmQ2h1bmtCdWZmZXIsIDAsIGZDaHVua1NpemUpOwotICAgICAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuQ1IpOwotICAgICAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuTEYpOwotICAgICAgICAgICAgZkNodW5rU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIENodW5rRW5jb2RlciBlbmNvZGVyID0gbmV3IENodW5rRW5jb2RlcihidWYsIDEwKTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSAzOTsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgYiA9IGkgJiAweGZmOwotICAgICAgICAgICAgZW5jb2Rlci53cml0ZShiKTsKLSAgICAgICAgfQotICAgICAgICBlbmNvZGVyLmNsb3NlKCk7Ci0gICAgICAgIAotICAgICAgICBieXRlW10gYSA9IGJ1Zi50b0J5dGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBiID0gYVtpXTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoaSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJdICIpOwotICAgICAgICAgICAgLy9zYi5hcHBlbmQoIjB4IikuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYiA+PiA4LCAxNikpLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGIgJiAweGYsIDE2KSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhiKSk7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCgoY2hhcikgYikpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAnIikuYXBwZW5kKChjaGFyKSBiKS5hcHBlbmQoJ1wnJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICBDaHVua0RlY29kZXIgZGVjb2RlciA9IG5ldyBDaHVua0RlY29kZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGEpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IHRydWU7IGkrKykgewotICAgICAgICAgICAgaW50IGIgPSBkZWNvZGVyLnJlYWQoKTsKLSAgICAgICAgICAgIGlmIChiIDwgMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhpKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIl0gIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhiKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0NodW5rTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWI4NmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ2h1bmtMaXN0ZW5lciB7Ci0gICAgdm9pZCBuZXdDaGFua1JlYWQoaW50IG4sIGludCBzaXplKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtlZE1lc3NhZ2VCb2R5UmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0NodW5rZWRNZXNzYWdlQm9keVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBmZTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2h1bmtlZE1lc3NhZ2VCb2R5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIENodW5rZWRNZXNzYWdlQm9keVJlYWRlciBleHRlbmRzIEhUVFBSZWFkZXIgewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDaHVua2VkTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOwotICAgIAotICAgIHB1YmxpYyBDaHVua2VkTWVzc2FnZUJvZHlSZWFkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IHJlYWRDaHVua2VkTWVzc2FnZShsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSBvdXQsIEhUVFBNZXNzYWdlIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoInJlYWRDaHVua2VkTWVzc2FnZTogdGltZW91dD0iICsgdGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHRvdGFsQ2h1bmtTaXplID0gcmVhZENodW5rZWRNZXNzYWdlQm9keSh0aW1lb3V0LCBvdXQpOwotCi0gICAgICAgIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiA9IG1zZy5nZXRCdWZmZXIoKTsKLSAgICAgICAgSGVhZGVySW5CdWZmZXIgaGVhZGVyID0gcmVhZEhlYWRlcih0aW1lb3V0LCBidWYpOwotICAgICAgICB3aGlsZSAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1zZy5hZGRUcmFpbGluZ0hlYWRlcihoZWFkZXIpOwotICAgICAgICAgICAgaGVhZGVyID0gcmVhZEhlYWRlcih0aW1lb3V0LCBidWYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJyZWFkQ2h1bmtlZE1lc3NhZ2U6IHRvdGFsQ2h1bmtTaXplPSIgKyB0b3RhbENodW5rU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvdGFsQ2h1bmtTaXplOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2xpZW50Q29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9DbGllbnRDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODcxZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9DbGllbnRDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5UaW1lb3V0RXhjZXB0aW9uOwotCi0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xpZW50Q29ubmVjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBJQ2xpZW50Q29ubmVjdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ2xpZW50Q29ubmVjdGlvbi5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudENvbm5lY3Rpb25MaXN0ZW5lciBjbGllbnRDb25uZWN0aW9uTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBmUXVldWVTaXplOwotCi0gICAgLy8gcHJpdmF0ZSBmaW5hbCBBc3luY1dvcmtNYW5hZ2VyIGZEaXNwYXRjaFdvcmtNYW47Ci0KLSAgICBwcml2YXRlIGxvbmcgZktlZXBBbGl2ZTsKLQotICAgIHByaXZhdGUgU29ja2V0IGZDbGllbnRTb2NrZXQ7Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGZDbGllbnRJbjsKLQotICAgIHByaXZhdGUgQnVmZmVyZWRPdXRwdXRTdHJlYW0gZkNsaWVudE91dDsKLQotICAgIHByaXZhdGUgSFRUUFJlcXVlc3RSZWFkZXIgZlJlYWRlcjsKLQotICAgIHByaXZhdGUgUmVxdWVzdERpc3BhdGNoZXIgZkRpc3BhdGNoZXI7Ci0KLSAgICBwcml2YXRlIGxvbmcgZkxhc3RSZWFkVGltZSA9IDA7Ci0KLSAgICBwcml2YXRlIGxvbmcgZk1lc3NhZ2VTZXJpYWwgPSAwOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGxpbmdSZXF1ZXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvbk5hbWU7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldFF1ZXVlU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZRdWV1ZVNpemU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsaWVudENvbm5lY3Rpb24oQ2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyIGNsaWVudENvbm5lY3Rpb25MaXN0ZW5lciwgaW50IHF1ZXVlU2l6ZSkgewotICAgICAgICB0aGlzLmNsaWVudENvbm5lY3Rpb25MaXN0ZW5lciA9IGNsaWVudENvbm5lY3Rpb25MaXN0ZW5lcjsKLSAgICAgICAgZlF1ZXVlU2l6ZSA9IHF1ZXVlU2l6ZTsKLSAgICAgICAgLy8gZkRpc3BhdGNoV29ya01hbiA9IGRpc3BhdGNoV29ya01hbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jcmVzZXRDb25uZWN0aW9uKCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZkNsaWVudFNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZDbGllbnRJbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDbGllbnRJbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZkNsaWVudE91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDbGllbnRPdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFmQ2xpZW50U29ja2V0LmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5zZXRTb0xpbmdlcih0cnVlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmQ2xpZW50U29ja2V0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFdBUk5JTkcoIkZhaWxlZCB0byBzaHV0IGRvd24gYSBjbGllbnQgb3V0cHV0IGNvbm5lY3Rpb24gKElPRXhjZXB0aW9uKTogIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbiNjbG9zZSgpCi0JICovCi0gICAgcHVibGljIFN0cmluZyBjbG9zZSgpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBERUJVRygiU2h1dGRvd24gYSBjbGllbnQgc29ja2V0OiBsYXN0UmVhZFRpbWU9IiArIGZMYXN0UmVhZFRpbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmRGlzcGF0Y2hlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmRGlzcGF0Y2hlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmQ2xpZW50U29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5zaHV0ZG93bklucHV0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZDbGllbnRJbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDbGllbnRJbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgV0FSTklORygiRmFpbGVkIHRvIGNsb3NlIGEgY2xpZW50IGNvbm5lY3Rpb24gKElPRXhjZXB0aW9uKTogIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY05hbWVUbXAgPSBjb25uZWN0aW9uTmFtZTsKLSAgICAgICAgY29ubmVjdGlvbk5hbWUgPSBudWxsOwotICAgICAgICBmQ2xpZW50U29ja2V0ID0gbnVsbDsKLSAgICAgICAgZkNsaWVudE91dCA9IG51bGw7Ci0gICAgICAgIGZSZWFkZXIgPSBudWxsOwotICAgICAgICBmRGlzcGF0Y2hlciA9IG51bGw7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ0xPU0UiKTsKLSAgICAgICAgY2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyLmNvbm5lY3Rpb25DbG9zZWQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjTmFtZVRtcDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0SW50ZXJuYWwoU29ja2V0IGNsaWVudFNvY2ssIGxvbmcga2VlcEFsaXZlLCBpbnQgdGltZW91dCwgUmVxdWVzdERpc3BhdGNoZXIgZGlzcGF0Y2hlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZDbGllbnRTb2NrZXQgPSBjbGllbnRTb2NrOwotICAgICAgICBmQ2xpZW50U29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0KTsKLSAgICAgICAgZkNsaWVudEluID0gY2xpZW50U29jay5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBmQ2xpZW50T3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBTb2NrZXRUaW1lb3V0UmV0cnlPdXRwdXRTdHJlYW0oY2xpZW50U29jay5nZXRPdXRwdXRTdHJlYW0oKSkpOwotICAgICAgICBmS2VlcEFsaXZlID0ga2VlcEFsaXZlOwotICAgICAgICBmUmVhZGVyID0gZGlzcGF0Y2hlci5jcmVhdGVIVFRQUmVxdWVzdFJlYWRlcihmQ2xpZW50SW4pOwotICAgICAgICBpc0hhbmRsaW5nUmVxdWVzdCA9IGZhbHNlOwotICAgICAgICBmRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7Ci0gICAgICAgIGZEaXNwYXRjaGVyLnN0YXJ0KCk7Ci0gICAgICAgIERFQlVHKCJJbml0aWFsaXplZCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIVFRQUmVxdWVzdE1lc3NhZ2UgY3JlYXRlSFRUUFJlcXVlc3RNZXNzYWdlKGxvbmcgbXNnU2VyaWFsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSFRUUFJlcXVlc3RNZXNzYWdlKG1zZ1NlcmlhbCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbiNnZXRDbGllbnRTb2NrZXQoKQotCSAqLwotICAgIHB1YmxpYyBTb2NrZXQgZ2V0Q2xpZW50U29ja2V0KCkgewotICAgICAgICByZXR1cm4gZkNsaWVudFNvY2tldDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKQotCSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRDb25uZWN0aW9uTGlzdGVuZXIuZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jaXNIYW5kbGluZ1JlcXVlc3QoKQotCSAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0hhbmRsaW5nUmVxdWVzdCgpIHsKLSAgICAgICAgcmV0dXJuIGlzSGFuZGxpbmdSZXF1ZXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0SGFuZGxpbmdSZXF1ZXN0KGJvb2xlYW4gYikgewotICAgICAgICBpc0hhbmRsaW5nUmVxdWVzdCA9IGI7Ci0gICAgICAgIGlmICghaXNIYW5kbGluZ1JlcXVlc3QpIHsKLSAgICAgICAgICAgIHRoaXMubm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdhaXRIYW5kbGluZ1JlcXVlc3RGaW5pc2goKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAoaXNIYW5kbGluZ1JlcXVlc3QpIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdFJlY2VpdmVkKElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkgewotICAgICAgICAvLyBub3AKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jc2VuZFJlc3BvbnNlKGxvbmcsIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5IVFRQUmVzcG9uc2VNZXNzYWdlLCBib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRSZXNwb25zZShsb25nIHRpbWVvdXQsIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlLCBib29sZWFuIHJlYWR5VG9IYW5kbGVSZXF1ZXN0KQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIAotICAgIHsKLSAgICAgICAgaWYgKGZDbGllbnRPdXQgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGlmICghaXNIYW5kbGluZ1JlcXVlc3QoKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqKioqKklOVkFMSUQgU1RBVEU6IHJlc3BvbnNlPSIgKyByZXNwb25zZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlNlbmQgYSByZXNwb25zZSB0byB0aGUgY2xpZW50OiBzZXJpYWw9IikuYXBwZW5kKHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdGlkPSIpLmFwcGVuZChyZXNwb25zZS5nZXRUaWQoKSk7Ci0gICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHJlc3BvbnNlLmdldE1lc3NhZ2VCb2R5KCkpKTsKLSAgICAgICAgICAgIC8vIHJlc3BvbnNlLndyaXRlSGVhZGVycyhTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlJlc3BvbnNlIGFycml2ZWQ6IHRpZD0iKS5hcHBlbmQocmVzcG9uc2UuZ2V0VGlkKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtc2dTZXJpYWw9IikuYXBwZW5kKHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxuX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuIik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9iID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBCaWZ1cmNhdGVkT3V0cHV0U3RyZWFtIG8gPSBuZXcgQmlmdXJjYXRlZE91dHB1dFN0cmVhbShmQ2xpZW50T3V0LCBvYik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlKHRpbWVvdXQsIG8pOwotICAgICAgICAgICAgICAgICAgICBvYi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQob2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXG5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG4iKTsKLSAgICAgICAgICAgICAgICBERUJVRyhzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGUodGltZW91dCwgZkNsaWVudE91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmQ2xpZW50T3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2UuaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigiVGhpcyBjb25uZWN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIik7Ci0gICAgICAgICAgICB9Ci0vKgotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkZhaWxlZCB0byBzZW5kIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCAoSU9FeGNlcHRpb24pIDogdGlkPSIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHJlc3BvbnNlLmdldFRpZCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtZXNzYWdlPSIpLmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBMT0dHRVIud2FybmluZyhzYi50b1N0cmluZygpKTsKLSovCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnQgaXNIYW5kbGluZ1JlcXVlc3QoKTsKLSAgICAgICAgICAgIGlmIChyZWFkeVRvSGFuZGxlUmVxdWVzdCkgewotICAgICAgICAgICAgICAgIHNldEhhbmRsaW5nUmVxdWVzdChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jc2VuZFJlc3BvbnNlKGxvbmcsIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZSkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UobG9uZyB0aW1lb3V0LCBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gCi0gICAgewotICAgICAgICBzZW5kUmVzcG9uc2UodGltZW91dCwgcmVzcG9uc2UsIHRydWUpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jc2VuZFJlc3BvbnNlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5IVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlKQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZFJlc3BvbnNlKDAsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRpbWVvdXQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFR1bm5lbFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlcjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGVUFMVF9UVU5ORUxfQlVGRkVSX1NJWkUgPSAxMDI0OwotCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3M7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4aXRlZDsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBleGl0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgd2FpdEV4aXQoKSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gaXMuYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGlzLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIi0tLS1UVU5ORUwtLS0+XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKHNpemUgPiAwKSA/IG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBzaXplKSA6ICIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXG4tLS0tVFVOTkVMLS0tPlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBUdW5uZWxUaHJlYWQoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcykgewotICAgICAgICAgICAgdGhpcy5pcyA9IGlzOwotICAgICAgICAgICAgdGhpcy5vcyA9IG9zOwotICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgYnl0ZVtERUZVQUxUX1RVTk5FTF9CVUZGRVJfU0laRV07Ci0gICAgICAgICAgICB0aGlzLmV4aXRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jYWxsb3dUdW5uZWwob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXF1ZXN0TWVzc2FnZSwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlNlcnZlckNvbm5lY3Rpb24sIGxvbmcpCi0JICovCi0gICAgcHVibGljIHZvaWQgYWxsb3dUdW5uZWwoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEsIFNlcnZlckNvbm5lY3Rpb24gc2MsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIkNPTk5FQ1QgdG8gIiArIHNjLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kUmVzcG9uc2UodGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcS5nZXRTZXJpYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAiLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0siLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICBUdW5uZWxUaHJlYWQgYzJzID0gbmV3IFR1bm5lbFRocmVhZChmQ2xpZW50SW4sIHNjLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIFR1bm5lbFRocmVhZCBzMmMgPSBuZXcgVHVubmVsVGhyZWFkKHNjLmdldElucHV0U3RyZWFtKCksIGZDbGllbnRPdXQpOwotICAgICAgICAgICAgREVCVUcoIlR1bm5lbCBpcyBzdGFydGVkLiIpOwotICAgICAgICAgICAgYzJzLnN0YXJ0KCk7Ci0gICAgICAgICAgICBzMmMuc3RhcnQoKTsKLSAgICAgICAgICAgIGMycy53YWl0RXhpdCgpOwotICAgICAgICAgICAgczJjLndhaXRFeGl0KCk7Ci0gICAgICAgICAgICBERUJVRygiVHVubmVsIGlzIGZpbmlzaGVkLiIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2V0SGFuZGxpbmdSZXF1ZXN0KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbiNyZWplY3RUdW5uZWwob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXF1ZXN0TWVzc2FnZSwgbG9uZykKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCByZWplY3RUdW5uZWwoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNlbmRSZXNwb25zZSh0aW1lb3V0LAotICAgICAgICAgICAgICAgIG5ldyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxLmdldFNlcmlhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQwNSIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgTm90IEFsbG93ZWQiLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uI3J1bigpCi0JICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBERUJVRygiUmVhZGVyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgIFN0cmluZyBjTmFtZVRtcDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgc2V0SGFuZGxpbmdSZXF1ZXN0KGZhbHNlKTsKLSAgICAgICAgICAgIEhUVFBSZXF1ZXN0TWVzc2FnZSByZWNlaXZlZFJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgbG9uZyB0aW1lb3V0ID0gZktlZXBBbGl2ZTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB3YWl0SGFuZGxpbmdSZXF1ZXN0RmluaXNoKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWFkIG5leHQgcmVxdWVzdAotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlZFJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGFuZGxpbmdSZXF1ZXN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtc2dTZXJpYWwgPSBmTWVzc2FnZVNlcmlhbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnU2VyaWFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTWVzc2FnZVNlcmlhbCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJlcXVlc3QgPSBjcmVhdGVIVFRQUmVxdWVzdE1lc3NhZ2UobXNnU2VyaWFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJyZWFkIHcvIHRpbWVvdXQ6ICIgKyB0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVhZGVyLnJlYWRNZXNzYWdlKHJlY2VpdmVkUmVxdWVzdCwgdGltZW91dCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygicmVhZCB3L28gdGltZW91dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWFkZXIucmVhZE1lc3NhZ2UocmVjZWl2ZWRSZXF1ZXN0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZktlZXBBbGl2ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RSZWNlaXZlZChyZWNlaXZlZFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZWRSZXF1ZXN0LnNldFRpZChmVGlkR2VuLmdldElEKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZk1lc3NhZ2VTZXJpYWwgPSBtc2dTZXJpYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJSZWFkIGEgcmVxdWVzdDogIikuYXBwZW5kKGNvbm5lY3Rpb25OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgc2VyaWFsPSIpLmFwcGVuZChyZWNlaXZlZFJlcXVlc3QuZ2V0U2VyaWFsKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB0aWQ9IikuYXBwZW5kKHJlY2VpdmVkUmVxdWVzdC5nZXRUaWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZFJlcXVlc3Qud3JpdGVIZWFkZXJzKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEhhbmRsaW5nUmVxdWVzdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVxdWVzdCByZWFkaW5nIHRpbWVvdXQ6IGxhc3RSZWFkVGltZT0iKS5hcHBlbmQoZkxhc3RSZWFkVGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGVsYXBzZWQ9IikuYXBwZW5kKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZkxhc3RSZWFkVGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTZW5kIGEgcmVxdWVzdCB0byBhIHNlcnZlcgotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlZFJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkRpc3BhdGNoZXIucHV0UmVxdWVzdChyZWNlaXZlZFJlcXVlc3QsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlNlbnQgYSByZXF1ZXN0OiBzZXJpYWw9IikuYXBwZW5kKHJlY2VpdmVkUmVxdWVzdC5nZXRTZXJpYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHRpZD0iKS5hcHBlbmQocmVjZWl2ZWRSZXF1ZXN0LmdldFRpZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRyhzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkUmVxdWVzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgdHJ5IGFnYWluIGluIHRoZSBuZXh0IGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlRocmVhZCBpbnRlcnJ1cHRlZCAoRGlzcGF0Y2hlci5wdXRSZXF1ZXN0KTogc2VyaWFsPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkUmVxdWVzdC5nZXRTZXJpYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCB0cnkgYWdhaW4gaW4gdGhlIG5leHQgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUXVldWUgb3ZlcmZsb3cgKERpc3BhdGNoZXIucHV0UmVxdWVzdCk6IHNlcmlhbD0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJlcXVlc3QuZ2V0U2VyaWFsKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoaXNIYW5kbGluZ1JlcXVlc3QoKSB8fCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGZMYXN0UmVhZFRpbWUgPCBmS2VlcEFsaXZlKTsKLSAgICAgICAgICAgIC8vIFdBUk5JTkcoIlpaWlogRklOSVNISU5HOiBpc0hhbmRsaW5nUmVxdWVzdD0iICsKLSAgICAgICAgICAgIC8vIGlzSGFuZGxpbmdSZXF1ZXN0KTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaW50ZXJydXB0ZWQpIHsKLSAgICAgICAgICAgIC8vIG5vcAotICAgICAgICAgICAgLy8gV0FSTklORygiSW50ZXJydXB0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoSFRUUENvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAJREVCVUcoIlRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSB0aGUgcGVlci4iKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAvLyBFeGNlcHRpb24gZnJvbSB0aGUgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIERFQlVHKCJDbGllbnQgY29ubmVjdGlvbiBpcyBsb3N0OiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY05hbWVUbXAgPSBjbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIERFQlVHKGNOYW1lVG1wLCAiUmVhZGVyIHRocmVhZCBzdG9wcGVkIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIERFQlVHKFN0cmluZyBuYW1lLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIERFQlVHKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoY29ubmVjdGlvbk5hbWUpLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIFdBUk5JTkcoU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZChjb25uZWN0aW9uTmFtZSkuYXBwZW5kKCI6ICIpOwotICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgTE9HR0VSLndhcm5pbmcoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9DbGllbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvQ2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NmFhZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9DbGllbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyIHsKLSAgICB2b2lkIGNvbm5lY3Rpb25DbG9zZWQoSUNsaWVudENvbm5lY3Rpb24gY29uKTsKLSAgICBpbnQgZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvRml4ZWRTaXplUXVldWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvRml4ZWRTaXplUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjNmU1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0ZpeGVkU2l6ZVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5UaW1lb3V0RXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBGaXhlZFNpemVRdWV1ZSB7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSBmUXVldWU7Ci0gICAgcHJpdmF0ZSBpbnQgZlNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgZk5leHRJbmRleCA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgZk1pbkluZGV4ID0gMDsKLSAgICAgICAgCi0gICAgcHVibGljIEZpeGVkU2l6ZVF1ZXVlKGludCBxdWV1ZVNpemUpIHsKLSAgICAgICAgZlF1ZXVlID0gbmV3IE9iamVjdFtxdWV1ZVNpemVdOwotICAgICAgICBmU2l6ZSA9IHF1ZXVlU2l6ZTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0UXVldWVTaXplKCkgewotICAgICAgICByZXR1cm4gZlNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotICAgICAgICBpZiAoZk1pbkluZGV4ICE9IGZOZXh0SW5kZXgpIHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBmUXVldWVbZk1pbkluZGV4KytdID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoZk1pbkluZGV4ID4gZlNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgZk1pbkluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChmTWluSW5kZXggIT0gZk5leHRJbmRleCk7IAotICAgICAgICB9Ci0gICAgICAgIGZOZXh0SW5kZXggPSAwOwotICAgICAgICBmTWluSW5kZXggPSAwOwotICAgICAgICBmUXVldWVbMF0gPSBudWxsOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiAoZk5leHRJbmRleCA9PSBmTWluSW5kZXgpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgaW50IGQgPSBmTmV4dEluZGV4IC0gZk1pbkluZGV4OwotICAgICAgICByZXR1cm4gKGQgPj0gMCkgPyBkIDogZCArIGZTaXplOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dChPYmplY3Qgb2JqKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoZlF1ZXVlW2ZOZXh0SW5kZXhdICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgICAgIGZRdWV1ZVtmTmV4dEluZGV4KytdID0gb2JqOwotICAgICAgICBpZiAoZk5leHRJbmRleCA+PSBmU2l6ZSkgewotICAgICAgICAgICAgZk5leHRJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXQoT2JqZWN0IG9iaiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7Ci0gICAgICAgICAgICBwdXQob2JqKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmUXVldWVbZk5leHRJbmRleF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdGltZWRvdXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KHdhaXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZlF1ZXVlW2ZOZXh0SW5kZXhdID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVkb3V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQwOwotICAgICAgICAgICAgICAgICAgICB3YWl0ID0gdGltZW91dCAtIGVsYXBzZWQ7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAod2FpdCA+IDApOwotICAgICAgICAgICAgICAgIGlmICh0aW1lZG91dCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiRml4ZWRTaXplUXVldWUucHV0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZlF1ZXVlW2ZOZXh0SW5kZXgrK10gPSBvYmo7Ci0gICAgICAgICAgICBpZiAoZk5leHRJbmRleCA+PSBmU2l6ZSkgewotICAgICAgICAgICAgICAgIGZOZXh0SW5kZXggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCByZXE7Ci0gICAgICAgIHdoaWxlICgocmVxID0gZlF1ZXVlW2ZNaW5JbmRleF0pID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgICAgIGZRdWV1ZVtmTWluSW5kZXgrK10gPSBudWxsOwotICAgICAgICBpZiAoZk1pbkluZGV4ID49IGZTaXplKSB7Ci0gICAgICAgICAgICBmTWluSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgICAgIHJldHVybiByZXE7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZW1vdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBPYmplY3QgcmVxID0gZlF1ZXVlW2ZNaW5JbmRleF07Ci0gICAgICAgIGlmIChyZXEgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyB0MCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbG9uZyB3YWl0ID0gdGltZW91dDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB0aGlzLndhaXQod2FpdCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXEgPSBmUXVldWVbZk1pbkluZGV4XSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0MDsKLSAgICAgICAgICAgICAgICB3YWl0ID0gdGltZW91dCAtIGVsYXBzZWQ7Ci0gICAgICAgICAgICB9IHdoaWxlICh3YWl0ID4gMCk7Ci0gICAgICAgICAgICBpZiAocmVxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiRml4ZWRTaXplUXVldWUucmVtb3ZlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZlF1ZXVlW2ZNaW5JbmRleCsrXSA9IG51bGw7Ci0gICAgICAgIGlmIChmTWluSW5kZXggPj0gZlNpemUpIHsKLSAgICAgICAgICAgIGZNaW5JbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgICAgcmV0dXJuIHJlcTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG5vbkJsb2NraW5nUmVtb3ZlKCkgewotICAgICAgICBPYmplY3QgcmVxID0gZlF1ZXVlW2ZNaW5JbmRleF07Ci0gICAgICAgIGlmIChyZXEgIT0gbnVsbCkgewotICAgICAgICAgICAgZlF1ZXVlW2ZNaW5JbmRleCsrXSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZk1pbkluZGV4ID49IGZTaXplKSB7Ci0gICAgICAgICAgICAgICAgZk1pbkluZGV4ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG1hdGNoQW5kUmVtb3ZlKE9iamVjdCBvLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCByZXEgPSBmUXVldWVbZk1pbkluZGV4XTsKLSAgICAgICAgaWYgKHJlcSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlKG8sIHJlcSkgPT0gMCkgewotICAgICAgICAgICAgZlF1ZXVlW2ZNaW5JbmRleCsrXSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZk1pbkluZGV4ID49IGZTaXplKSB7Ci0gICAgICAgICAgICAgICAgZk1pbkluZGV4ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBDb25uZWN0aW9uRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBDb25uZWN0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTZjMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSFRUUENvbm5lY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjE1MTcxNzMyMzA3NzQ4ODY0MUw7Ci0KLQlwdWJsaWMgSFRUUENvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQSGVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4OTRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIVFRQSGVhZGVyIGltcGxlbWVudHMgSUhUVFBIZWFkZXIgewotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSB0b1VwY2FzZShieXRlIGIpIHsKLSAgICAgICAgaWYgKChiID49ICdhJykgJiYgKGIgPD0gJ3onKSkgewotICAgICAgICAgICAgcmV0dXJuIChieXRlKSAoYiAtICgnYScgLSAnQScpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZShieXRlW10gdjEsIGJ5dGVbXSB2MikgewotICAgICAgICBpbnQgbGVuID0gdjEubGVuZ3RoOwotICAgICAgICBpZiAobGVuICE9IHYyLmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKHYxW2ldICE9IHYyW2ldKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlSWdub3JlQ2FzZShieXRlW10gdjEsIGJ5dGVbXSB2MikgewotICAgICAgICBpbnQgbGVuID0gdjEubGVuZ3RoOwotICAgICAgICBpZiAobGVuICE9IHYyLmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKEhUVFBIZWFkZXIudG9VcGNhc2UodjFbaV0pICE9IEhUVFBIZWFkZXIudG9VcGNhc2UodjJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW92ZWQgPSBmYWxzZTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgSFRUUEhlYWRlcigpIHsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlciNzZXRSZW1vdmVkKGJvb2xlYW4pCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlZChib29sZWFuIHJlbW92ZWQpIHsKLSAgICAJaXNSZW1vdmVkID0gcmVtb3ZlZDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI2lzUmVtb3ZlZCgpCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZW1vdmVkKCkgewotICAgIAlyZXR1cm4gaXNSZW1vdmVkOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjaXNGaWVsZE5hbWVFcXVhbHNUbyhieXRlW10pCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGaWVsZE5hbWVFcXVhbHNUbyhieXRlW10gbmFtZSk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjaXNGaWVsZFZhbHVlRXF1YWxzVG8oYnl0ZVtdKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmllbGRWYWx1ZUVxdWFsc1RvKGJ5dGVbXSB2YWx1ZSk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjZ2V0TmFtZSgpCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXROYW1lKCk7Ci0gICAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlciNnZXRWYWx1ZSgpCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRWYWx1ZSgpOwotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjc2V0VmFsdWUoYnl0ZVtdKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKGJ5dGVbXSB2YWx1ZSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVIZWFkZXJTZXBhcmF0b3IoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKCc6Jyk7Ci0gICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLlNQKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjY29tcGFyZVZhbHVlKGJ5dGVbXSkKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21wYXJlVmFsdWUoYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlKGdldFZhbHVlKCksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjY29tcGFyZVZhbHVlSWdub3JlQ2FzZShieXRlW10pCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcGFyZVZhbHVlSWdub3JlQ2FzZShieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVJZ25vcmVDYXNlKGdldFZhbHVlKCksIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI3dyaXRlTGluZShqYXZhLmlvLk91dHB1dFN0cmVhbSkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxpbmUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAJaWYgKCFpc1JlbW92ZWQpIHsKLSAgICAgICAgICAgIHdyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoSFRUUFJlYWRlci5DUik7Ci0gICAgICAgICAgICBvdXQud3JpdGUoSFRUUFJlYWRlci5MRik7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkhlYWRlcjoiICsgbmV3IFN0cmluZyhnZXROYW1lKCkpICsgIjoiICsgbmV3IFN0cmluZyhnZXRWYWx1ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjFkMzczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZSBleHRlbmRzIEhUVFBSZXNwb25zZU1lc3NhZ2UgewotICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uOwotCi0gICAgcHVibGljIElPRXhjZXB0aW9uIGdldElPRXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIEhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UobG9uZyBzZXJpYWwsIElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICBzdXBlcihzZXJpYWwpOwotICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhUVFBWZXJzaW9uQXNTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0SFRUUFZlcnNpb25Bc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvZGVBc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRTdGF0dXNDb2RlQXNCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2VBc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRSZWFzb25QaHJhc2VBc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpcnN0TGluZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UgY2Fubm90IGJlIG91dHB1dC4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNGZjYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuVGltZW91dEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSFRUUE1lc3NhZ2UgaW1wbGVtZW50cyBJSFRUUE1lc3NhZ2UgewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQTWVzc2FnZS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIGZTZXJpYWw7Ci0gICAgcHJpdmF0ZSBIVFRQTWVzc2FnZUJ1ZmZlciBmQnVmZmVyOwotICAgIHByaXZhdGUgSU1lc3NhZ2VCb2R5IGZPcmlnaW5hbE1lc3NhZ2VCb2R5OwotICAgIHByaXZhdGUgSU1lc3NhZ2VCb2R5IGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3QgZkhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KElOSVRfTlVNX0hFQURFUlMpOwotICAgIHByaXZhdGUgTGlzdCBmVHJhaWxpbmdIZWFkZXJzOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NodW5rZWRFbmNvZGluZyA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgbG9uZyBmVGlkID0gMDsKLSAgICAgICAgCi0gICAgcHVibGljIEhUVFBNZXNzYWdlKGxvbmcgc2VyaWFsKSB7Ci0gICAgICAgIHRoaXMoc2VyaWFsLCBERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIEhUVFBNZXNzYWdlKGxvbmcgc2VyaWFsLCBpbnQgaW5pdEJ1ZmZlclNpemUpIHsKLSAgICAgICAgZlNlcmlhbCA9IHNlcmlhbDsKLSAgICAgICAgZkJ1ZmZlciA9IG5ldyBIVFRQTWVzc2FnZUJ1ZmZlcihpbml0QnVmZmVyU2l6ZSk7Ci0gICAgICAgIGZPcmlnaW5hbE1lc3NhZ2VCb2R5ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSFRUUE1lc3NhZ2UobG9uZyBzZXJpYWwsIGJ5dGVbXSBib2R5KSB7Ci0gICAgICAgIGZTZXJpYWwgPSBzZXJpYWw7Ci0gICAgICAgIGZCdWZmZXIgPSBuZXcgSFRUUE1lc3NhZ2VCdWZmZXIoKTsKLSAgICAgICAgc2V0T3JpZ2luYWxNZXNzYWdlQm9keShuZXcgTWVzc2FnZUJvZHkobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvZHkpLCBib2R5Lmxlbmd0aCkpOwotICAgIH0KLSAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRTZXJpYWwoKQotCSAqLwotICAgIHB1YmxpYyBsb25nIGdldFNlcmlhbCgpIHsKLSAgICAgICAgcmV0dXJuIGZTZXJpYWw7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2dldEhUVFBWZXJzaW9uQXNTdHJpbmcoKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpOwotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2dldEhUVFBWZXJzaW9uQXNCeXRlcygpCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzQm9keUVtcHR5KCk7Ci0KLSAgICBmaW5hbCB2b2lkIHNldE9yaWdpbmFsTWVzc2FnZUJvZHkoSU1lc3NhZ2VCb2R5IG1zZ0JvZHkpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoInNldE9yaWdpbmFsTWVzc2FnZUJvZHk6ICIgKyBtc2dCb2R5KTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVDb250ZW50TGVuZ3RoSGVhZGVyKG1zZ0JvZHkpOwotICAgICAgICBmT3JpZ2luYWxNZXNzYWdlQm9keSA9IG1zZ0JvZHk7Ci0gICAgfQotICAgIAotICAgIGZpbmFsIHZvaWQgdXBkYXRlQ29udGVudExlbmd0aEhlYWRlcihJTWVzc2FnZUJvZHkgbXNnQm9keSkgewotICAgICAgICBpbnQgb2xkQ29udGVudExlbmd0aCA9IChmT3JpZ2luYWxNZXNzYWdlQm9keSA9PSBudWxsKSA/IC0xIDogZk9yaWdpbmFsTWVzc2FnZUJvZHkuZ2V0Q29udGVudExlbmd0aCgpOwotICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IChtc2dCb2R5ID09IG51bGwpID8gLTEgOiBtc2dCb2R5LmdldENvbnRlbnRMZW5ndGgoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgewotICAgICAgICAgICAgc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTlRFTlRfTEVOR1RIX0EsIEludGVnZXIudG9TdHJpbmcoY29udGVudExlbmd0aCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQ29udGVudExlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICByZW1vdmVIZWFkZXIoSUhUVFBIZWFkZXIuQ09OVEVOVF9MRU5HVEhfQSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElNZXNzYWdlQm9keSBnZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KCkgewotICAgICAgICByZXR1cm4gZk9yaWdpbmFsTWVzc2FnZUJvZHk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJTWVzc2FnZUJvZHkgZ2V0VHJhbnNmb3JtZWRNZXNzYWdlQm9keSgpIHsKLSAgICAgICAgcmV0dXJuIGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5OwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2dldE1lc3NhZ2VCb2R5KCkKLQkgKi8KLSAgICBwdWJsaWMgSU1lc3NhZ2VCb2R5IGdldE1lc3NhZ2VCb2R5KCkgewotICAgICAgICByZXR1cm4gKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ICE9IG51bGwpID8gZlRyYW5zZm9ybWVkTWVzc2FnZUJvZHkgOiBmT3JpZ2luYWxNZXNzYWdlQm9keTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVGaXJzdExpbmUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgcHJvdGVjdGVkIEhUVFBNZXNzYWdlQnVmZmVyIGdldEJ1ZmZlcigpIHsKLSAgICAgICAgcmV0dXJuIGZCdWZmZXI7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2dldEhlYWRlcnMoKQotCSAqLwotICAgIHB1YmxpYyBmaW5hbCBMaXN0IGdldEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBmSGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI3JlbW92ZUhlYWRlcihieXRlW10pCi0JICovCi0gICAgcHVibGljIGZpbmFsIElIVFRQSGVhZGVyIHJlbW92ZUhlYWRlcihieXRlW10gbmFtZSkgewotICAgICAgICBpbnQgbmhlYWRlcnMgPSBmSGVhZGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmhlYWRlcnM7IGkrKykgewotICAgICAgICAgICAgSUhUVFBIZWFkZXIgaCA9IChJSFRUUEhlYWRlcikgZkhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKCFoLmlzUmVtb3ZlZCgpICYmIGguaXNGaWVsZE5hbWVFcXVhbHNUbyhuYW1lKSkgewotICAgICAgICAgICAgICAgIGguc2V0UmVtb3ZlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNzZXRIZWFkZXIoYnl0ZVtdLCBieXRlW10pCi0JICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0SGVhZGVyKGJ5dGVbXSBuYW1lLCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgSGVhZGVyVG9BZGQgaGVhZGVyID0gbmV3IEhlYWRlclRvQWRkKCk7Ci0gICAgICAgIGhlYWRlci5pbml0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgcmVtb3ZlSGVhZGVyKG5hbWUpOwotICAgICAgICBmSGVhZGVycy5hZGQoaGVhZGVyKTsKLSAgICB9Ci0gICAgCi0gICAgZmluYWwgdm9pZCBhZGRIZWFkZXIoSGVhZGVySW5CdWZmZXIgaGVhZGVyKSB7Ci0gICAgICAgIGZIZWFkZXJzLmFkZChoZWFkZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjYWRkVHJhaWxpbmdIZWFkZXIob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyKQotCSAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFRyYWlsaW5nSGVhZGVyKElIVFRQSGVhZGVyIHRyYWlsZXIpIHsKLSAgICAgICAgaWYgKGZUcmFpbGluZ0hlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgZlRyYWlsaW5nSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoSU5JVF9OVU1fSEVBREVSUyk7Ci0gICAgICAgIH0KLSAgICAgICAgZlRyYWlsaW5nSGVhZGVycy5hZGQodHJhaWxlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRIZWFkZXIoYnl0ZVtdKQotCSAqLwotICAgIHB1YmxpYyBmaW5hbCBJSFRUUEhlYWRlciBnZXRIZWFkZXIoYnl0ZVtdIG5hbWUpIHsKLSAgICAgICAgaW50IGxlbiA9IGZIZWFkZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgSUhUVFBIZWFkZXIgaGVhZGVyID0gKElIVFRQSGVhZGVyKSBmSGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyLmlzRmllbGROYW1lRXF1YWxzVG8obmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRIZWFkZXJBc0J5dGVzKGJ5dGVbXSkKLQkgKi8KLSAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldEhlYWRlckFzQnl0ZXMoYnl0ZVtdIG5hbWUpIHsKLSAgICAgICAgSUhUVFBIZWFkZXIgaGVhZGVyID0gZ2V0SGVhZGVyKG5hbWUpOwotICAgICAgICByZXR1cm4gKGhlYWRlciA9PSBudWxsKSA/IG51bGwgOiBoZWFkZXIuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjaXNDaHVua2VkRW5jb2RpbmcoKQotCSAqLwotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gaXNDaHVua2VkRW5jb2Rpbmc7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI3NldENodW5rZWRFbmNvZGluZyhib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENodW5rZWRFbmNvZGluZyhib29sZWFuIGlzQ2h1bmtlZCkgewotICAgICAgICBpc0NodW5rZWRFbmNvZGluZyA9IGlzQ2h1bmtlZDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNzZXRUaWQobG9uZykKLQkgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUaWQobG9uZyB0aWQpIHsKLSAgICAgICAgZlRpZCA9IHRpZDsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjZ2V0VGlkKCkKLQkgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaWQoKSB7Ci0gICAgICAgIHJldHVybiBmVGlkOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoKLSAgICBwcml2YXRlIHZvaWQgREVCVUcoaW50IGNoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkJ1ZlsiICsgZklkeCArICJdPSIpOwotICAgICAgICBpZiAoY2ggPCAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIiICsgY2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGhpZ2ggPSBjaCA+Pj4gNDsKLSAgICAgICAgICAgIGludCBsb3cgPSAoY2ggJiAweDBmKTsKLSAgICAgICAgICAgIGlmIChoaWdoIDwgMTApIHsKLSAgICAgICAgICAgICAgICBoaWdoID0gJzAnICsgaGlnaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGlnaCA9ICdhJyArIGhpZ2ggLSAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb3cgPCAxMCkgewotICAgICAgICAgICAgICAgIGxvdyA9ICcwJyArIGxvdzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG93ID0gJ2EnICsgbG93IC0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KChjaGFyKSBoaWdoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoKGNoYXIpIGxvdyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoID4gMHgyMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICgiICsgKGNoYXIpIGNoICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICB9Ci0gICAgKi8KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUhlYWRlcnMoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVGaXJzdExpbmUob3V0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGZIZWFkZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBJSFRUUEhlYWRlciBoZWFkZXIgPSAoSUhUVFBIZWFkZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGhlYWRlci53cml0ZUxpbmUob3V0KTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoQ1IpOwotICAgICAgICBvdXQud3JpdGUoTEYpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlQm9keVdpdGhvdXRDb250ZW50TGVuZ3RoKGxvbmcgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWVzc2FnZUJvZHkgbXNnQm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSN3cml0ZUJvZHkobG9uZywgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGwuTWVzc2FnZUJvZHksIGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQm9keShsb25nIHRpbWVvdXQsIElNZXNzYWdlQm9keSBtc2dCb2R5LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAobXNnQm9keSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgSW5wdXRTdHJlYW0gYm9keSA9IG1zZ0JvZHkuZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpOwotICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IG1zZ0JvZHkuZ2V0Q29udGVudExlbmd0aCgpOwotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1Zygic3VwZXIud3JpdGVCb2R5OiBjb250ZW50TGVuZ3RoPSIgKyBjb250ZW50TGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBib2R5PSIgKyBib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpc0NodW5rZWRFbmNvZGluZz0iICsgbXNnQm9keS5pc0NodW5rZWRFbmNvZGluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm9ybWFsIGVuY29kaW5nCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBib2R5LnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWcoIlVuZXhwZWN0ZWQgY29ubmVjdGlvbiBzaHV0ZG93bi4uLjoiICsgaSArICI6IiArIGJvZHkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZ0JvZHkuaXNDaHVua2VkRW5jb2RpbmcoKSl7Ci0gICAgICAgICAgICAgICAgLy8gY2h1bmtlZCBlbmNvZGluZwotICAgICAgICAgICAgICAgIENodW5rZWRNZXNzYWdlQm9keVJlYWRlciBjaHVua1JlYWRlciA9IG5ldyBDaHVua2VkTWVzc2FnZUJvZHlSZWFkZXIoYm9keSk7Ci0gICAgICAgICAgICAgICAgY2h1bmtSZWFkZXIucmVhZENodW5rZWRNZXNzYWdlKHRpbWVvdXQsIG91dCwgdGhpcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdyaXRlQm9keVdpdGhvdXRDb250ZW50TGVuZ3RoKHRpbWVvdXQsIG1zZ0JvZHksIG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoInN1cGVyLndyaXRlQm9keTogZG9uZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElNZXNzYWdlQm9keSB0cmFuc2Zvcm1NZXNzYWdlQm9keShsb25nIHRpbWVvdXQsIElNZXNzYWdlQm9keSBzcmMpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI3dyaXRlKGxvbmcsIGphdmEuaW8uT3V0cHV0U3RyZWFtKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGxvbmcgdGltZW91dCwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ID0gdHJhbnNmb3JtTWVzc2FnZUJvZHkodGltZW91dCwgZk9yaWdpbmFsTWVzc2FnZUJvZHkpOwotICAgICAgICAgICAgaWYgKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb250ZW50TGVuZ3RoSGVhZGVyKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgd3JpdGVIZWFkZXJzKG91dCk7Ci0KLSAgICAgICAgd3JpdGVCb2R5KHRpbWVvdXQsIGdldE1lc3NhZ2VCb2R5KCksIG91dCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRyYWlsaW5nSGVhZGVycyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBib29sZWFuIG91dHB1dCA9IGZhbHNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZlRyYWlsaW5nSGVhZGVycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgSFRUUEhlYWRlciBoZWFkZXIgPSAoSFRUUEhlYWRlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgaGVhZGVyLndyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXRwdXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvdXRwdXQpIHsKLSAgICAgICAgICAgIG91dC53cml0ZShDUik7Ci0gICAgICAgICAgICBvdXQud3JpdGUoTEYpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2lzSFRUUFZlcnNpb24xXzEoKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSFRUUFZlcnNpb24xXzEoKSB7Ci0gICAgICAgIGlmIChBcnJheXMuZXF1YWxzKElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzFfQSwgZ2V0SFRUUFZlcnNpb25Bc0J5dGVzKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDTE9TRV9BID0gImNsb3NlIi5nZXRCeXRlcygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBLRUVQX0FMSVZFX0EgPSAiS2VlcC1BbGl2ZSIuZ2V0Qnl0ZXMoKTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2Ujc2V0Q29ubmVjdGlvbkhlYWRlcihib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25IZWFkZXIoYm9vbGVhbiBrZWVwYWxpdmUpIHsKLSAgICAgICAgaWYgKGtlZXBhbGl2ZSkgewotICAgICAgICAgICAgc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTk5FQ1RJT05fQSwgIktlZXAtQWxpdmUiLmdldEJ5dGVzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTk5FQ1RJT05fQSwgImNsb3NlIi5nZXRCeXRlcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpIHsKLSAgICAgICAgSUhUVFBIZWFkZXIgaCA9IGdldEhlYWRlcihJSFRUUEhlYWRlci5DT05ORUNUSU9OX0EpOwotICAgICAgICBpZiAoaXNIVFRQVmVyc2lvbjFfMSgpKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIEhUVFAgdmVyc2lvbiBpcyAxLjEsIHdlIGFzc3VtZSB0aGUgY29ubmVjdGlvbiBpcyByZXVzZWQgYnkgZGVmYXVsdC4KLSAgICAgICAgICAgIGlmIChoID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBoLmNvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoQ0xPU0VfQSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXaGVuIEhUVFAgdmVyc2lvbiBpcyAxLjAsIHdlIGFzc3VtZSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHNodXRkb3duIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICBpZiAoaCA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChoLmNvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoS0VFUF9BTElWRV9BKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiSFRUUE1lc3NhZ2UgIiArIGZTZXJpYWwgKyAiOiIgKyBmQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQTWVzc2FnZUJ1ZmZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQTWVzc2FnZUJ1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTc4ZjFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUE1lc3NhZ2VCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgSFRUUE1lc3NhZ2VCdWZmZXIgZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSA9IDEwMjQ7Ci0gICAgICAgIAotICAgIHB1YmxpYyBIVFRQTWVzc2FnZUJ1ZmZlcigpIHsKLSAgICAgICAgc3VwZXIoREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSFRUUE1lc3NhZ2VCdWZmZXIoaW50IGluaXRCdWZmZXJTaXplKSB7Ci0gICAgICAgIHN1cGVyKGluaXRCdWZmZXJTaXplKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSFRUUE1lc3NhZ2VCdWZmZXIoYnl0ZVtdIGJvZHkpIHsKLSAgICAgICAgc3VwZXIuYnVmID0gYm9keTsKLSAgICAgICAgc3VwZXIuY291bnQgPSBib2R5Lmxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmJ1ZjsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZyhCdWZmZXJSYW5nZSByYW5nZSkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzdXBlci5idWYsIHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEFzQnl0ZXMoQnVmZmVyUmFuZ2UgcmFuZ2UpIHsKLSAgICAgICAgaW50IGxlbiA9IHJhbmdlLmdldExlbmd0aCgpOwotICAgICAgICBpZiAobGVuIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKLSAgICAgICAgfQotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5dOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHN1cGVyLmJ1ZiwgcmFuZ2UuZ2V0U3RhcnQoKSwgYnl0ZXMsIDAsIGxlbik7Ci0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCwgQnVmZmVyUmFuZ2UgcmFuZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC53cml0ZShzdXBlci5idWYsIHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoQnVmZmVyUmFuZ2UgcmFuZ2UsIGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgIGludCBsZW4gPSBkYXRhLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbiAhPSByYW5nZS5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBvZmZzZXQgPSByYW5nZS5nZXRTdGFydCgpOwotICAgICAgICBieXRlW10gYnVmZmVyID0gc3VwZXIuYnVmOwotICAgICAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChkYXRhW2ldICE9IGJ1ZmZlcltvZmZzZXQgKyBpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKEJ1ZmZlclJhbmdlIHJhbmdlLCBieXRlW10gZGF0YSkgewotICAgICAgICBpbnQgbGVuID0gZGF0YS5sZW5ndGg7Ci0gICAgICAgIGlmIChsZW4gIT0gcmFuZ2UuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgb2Zmc2V0ID0gcmFuZ2UuZ2V0U3RhcnQoKTsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IHN1cGVyLmJ1ZjsKLSAgICAgICAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAoSFRUUEhlYWRlci50b1VwY2FzZShkYXRhW2ldKQotICAgICAgICAgICAgICAgICE9IEhUVFBIZWFkZXIudG9VcGNhc2UoYnVmZmVyW29mZnNldCArIGldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzdXBlci5idWYsIDAsIHN1cGVyLmNvdW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBNZXNzYWdlUmVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBNZXNzYWdlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1M2M3NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQTWVzc2FnZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklNZXNzYWdlQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5UaW1lb3V0RXhjZXB0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIVFRQTWVzc2FnZVJlYWRlciBleHRlbmRzIEhUVFBSZWFkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhUVFBNZXNzYWdlUmVhZGVyLmNsYXNzKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgSFRUUE1lc3NhZ2VSZWFkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVhZEZpcnN0TGluZShIVFRQTWVzc2FnZSBtc2csIGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0hlYWRlcihIVFRQTWVzc2FnZSBtc2csIElIVFRQSGVhZGVyIGhlYWRlcikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlKEhUVFBNZXNzYWdlIG1zZywgYm9vbGVhbiBpc0JvZHlFbXB0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRNZXNzYWdlKG1zZywgMCwgaXNCb2R5RW1wdHkpOwotICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPR0dFUi5mYXRhbCgiSW1wb3NzaWJsZSBleGNlcHRpb24iLCBlKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVhZE1lc3NhZ2UoSFRUUE1lc3NhZ2UgbXNnLCBsb25nIHRpbWVvdXQsIGJvb2xlYW4gaXNCb2R5RW1wdHkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJyZWFkOiBpc0JvZHlFbXB0eT0iICsgaXNCb2R5RW1wdHkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGxpbmUKLSAgICAgICAgcmVhZEZpcnN0TGluZShtc2csIHRpbWVvdXQpOwotCi0gICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gLTE7Ci0gICAgICAgIHdoaWxlIChmTGFzdEJ5dGUgPj0gMCkgewotICAgICAgICAgICAgSGVhZGVySW5CdWZmZXIgaGVhZGVyID0gcmVhZEhlYWRlcih0aW1lb3V0LCBtc2cuZ2V0QnVmZmVyKCkpOwotICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRU9GCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cuYWRkSGVhZGVyKGhlYWRlcik7Ci0gICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoaGVhZGVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV3IFN0cmluZyhoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKG5hbWUgKyAiOiAiICsgdmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGVhZGVyLmlzRmllbGROYW1lRXF1YWxzVG8oSUhUVFBIZWFkZXIuQ09OVEVOVF9MRU5HVEhfQSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdiA9IG5ldyBTdHJpbmcoaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KHYpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoIklsbGVnYWwgaGVhZGVyIGZpZWFsZCAoQ09OVEVOVF9MRU5HVEgpIGlnbm9yZWQ6ICIgKyB2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLmlzRmllbGROYW1lRXF1YWxzVG8oSUhUVFBIZWFkZXIuVFJBTlNGRVJfRU5DT0RJTkdfQSkgCi0gICAgICAgICAgICAgICAgICAgICAgICYmIGhlYWRlci5pc0ZpZWxkVmFsdWVFcXVhbHNUbyhJSFRUUEhlYWRlci5DSFVOS0VEX0EpKSB7Ci0gICAgICAgICAgICAgICAgbXNnLnNldENodW5rZWRFbmNvZGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NIZWFkZXIobXNnLCBoZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNCb2R5RW1wdHkgfD0gbXNnLmlzQm9keUVtcHR5KCk7Ci0KLSAgICAgICAgaWYgKGlzQm9keUVtcHR5KSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoIlRoZSBtZXNzYWdlIGJvZHkgaXMgZW1wdHkuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJTWVzc2FnZUJvZHkgbXNnQm9keTsKLSAgICAgICAgICAgIGlmIChtc2cuaXNDaHVua2VkRW5jb2RpbmcoKSkgewotICAgICAgICAgICAgICAgIG1zZ0JvZHkgPSBuZXcgTWVzc2FnZUJvZHkoZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1zZ0JvZHkgPSBuZXcgTWVzc2FnZUJvZHkoZ2V0SW5wdXRTdHJlYW0oKSwgY29udGVudExlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cuc2V0T3JpZ2luYWxNZXNzYWdlQm9keShtc2dCb2R5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjA5NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEhUVFBSZWFkZXIgewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQUmVhZGVyLmNsYXNzKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUX05VTV9IRUFERVJTID0gNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENSID0gMHgwZDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTEYgPSAweDBhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTUCA9IDB4MjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEhUID0gMHgwOTsKLSAgICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0gICAgICAgIAotICAgIHByaXZhdGUgUHVzaGJhY2tJbnB1dFN0cmVhbSBmSW47Ci0gICAgcHJpdmF0ZSBsb25nIGZMYXN0UmVhZFRpbWUgPSAwOwotICAgIHByb3RlY3RlZCBpbnQgZkxhc3RCeXRlID0gLTE7Ci0KLSAgICBwcm90ZWN0ZWQgSFRUUFJlYWRlcihJbnB1dFN0cmVhbSBpbikgewotICAgICAgICBpZiAoaW4gaW5zdGFuY2VvZiBQdXNoYmFja0lucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBmSW4gPSAoUHVzaGJhY2tJbnB1dFN0cmVhbSkgaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmSW4gPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpbiwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gZkluOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgZ2V0TGFzdFJlYWRUaW1lKCkgewotICAgICAgICByZXR1cm4gZkxhc3RSZWFkVGltZTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0TGFzdEJ5dGUoKSB7Ci0gICAgICAgIHJldHVybiBmTGFzdEJ5dGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0QXZhaWxhYmxlSW5wdXQobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpbnQgZGF0YTsKLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgYXZhaWxhYmxlOwotICAgICAgICAgICAgICAgIHdoaWxlICgoYXZhaWxhYmxlID0gZkluLmF2YWlsYWJsZSgpKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlID09IDAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZMYXN0UmVhZFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZkxhc3RSZWFkVGltZSA+IHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIkhUVFBSZWFkZXIuZ2V0QXZhaWxhYmxlSW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YSA9IGZJbi5yZWFkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmSW4ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZkxhc3RSZWFkVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZkxhc3RSZWFkVGltZSA+IHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIkhUVFBSZWFkZXIuZ2V0QXZhaWxhYmxlSW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIG5leHRCeXRlKGxvbmcgdGltZW91dCwgT3V0cHV0U3RyZWFtIHJlcGxpY2EpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZMYXN0Qnl0ZSA9IGdldEF2YWlsYWJsZUlucHV0KHRpbWVvdXQpOwotICAgICAgICBpZiAoZkxhc3RCeXRlICE9IC0xKSB7Ci0gICAgICAgICAgICByZXBsaWNhLndyaXRlKGZMYXN0Qnl0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0NvbnRpbnVlZExpbmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICAvLyBBc3NlcnRpb24KLSAgICAgICAgaWYgKGZMYXN0Qnl0ZSAhPSBMRikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXh0Q2hhciA9IGdldEF2YWlsYWJsZUlucHV0KHRpbWVvdXQpOwotICAgICAgICBmSW4udW5yZWFkKG5leHRDaGFyKTsKLSAgICAgICAgcmV0dXJuIChuZXh0Q2hhciA9PSBTUCB8fCBuZXh0Q2hhciA9PSBIVCk7Ci0gICAgfQotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHJlYWRCeXRlcyhsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSBvdXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBsZW4pIHsKLSAgICAgICAgICAgIGlmICghbmV4dEJ5dGUodGltZW91dCwgb3V0KSkgYnJlYWs7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVF9OVU1fVFJBSUxFUlMgPSAyOwotCi0gICAgcHJvdGVjdGVkIExpc3QgcmVhZENodW5rZWRNZXNzYWdlVHJhaWxlcnMobG9uZyB0aW1lb3V0LCBIVFRQTWVzc2FnZUJ1ZmZlciBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgdHJhaWxlcnMgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgSGVhZGVySW5CdWZmZXIgaGVhZGVyID0gcmVhZEhlYWRlcih0aW1lb3V0LCBidWYpOwotICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHJhaWxlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyYWlsZXJzID0gbmV3IEFycmF5TGlzdChJTklUX05VTV9UUkFJTEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFpbGVycy5hZGQoaGVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhaWxlcnM7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBIZWFkZXJJbkJ1ZmZlciByZWFkSGVhZGVyKGxvbmcgdGltZW91dCwgSFRUUE1lc3NhZ2VCdWZmZXIgYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICAvLyBSZWFkICdmaWVsZC1uYW1lJwotICAgICAgICBCdWZmZXJSYW5nZSBmaWVsZE5hbWUgPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIGZpZWxkTmFtZSwgJzonKTsKLSAgICAgICAgaWYgKGZMYXN0Qnl0ZSA9PSBFT0YgfHwgZkxhc3RCeXRlID09IExGKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkxhc3RCeXRlICE9ICc6JykgewotICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBsaW5lCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoIiArIGZMYXN0Qnl0ZSArICIuKSBFeHBlY3RlZCB3YXMgKCc6JykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNraXBTcGFjZXModGltZW91dCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBSZWFkICdmaWVsZC12YWx1ZScKLSAgICAgICAgQnVmZmVyUmFuZ2UgZmllbGRWYWx1ZSA9IG5ldyBCdWZmZXJSYW5nZSgpOwotICAgICAgICByZWFkTmV4dFRva2VuKHRpbWVvdXQsIGJ1ZiwgZmllbGRWYWx1ZSk7Ci0gICAgICAgIHdoaWxlIChoYXNDb250aW51ZWRMaW5lKHRpbWVvdXQpKSB7Ci0gICAgICAgICAgICByZWFkQ29udGludWVkTGluZSh0aW1lb3V0LCBidWYsIGZpZWxkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSGVhZGVySW5CdWZmZXIgaGVhZGVyID0gbmV3IEhlYWRlckluQnVmZmVyKCk7Ci0gICAgICAgIGhlYWRlci5pbml0KGJ1ZiwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGhlYWRlcjsKLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgZmluYWwgaW50IHJlYWRDb250aW51ZWRMaW5lKGxvbmcgdGltZW91dCwgSFRUUE1lc3NhZ2VCdWZmZXIgYnVmLCBCdWZmZXJSYW5nZSByYW5nZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUmVhZCB1bnRpbCBDUkxGCi0gICAgICAgIGludCBzdGFydCA9IGJ1Zi5nZXRMZW5ndGgoKTsKLSAgICAgICAgYm9vbGVhbiBjciA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNybGYgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGZMYXN0Qnl0ZSAhPSBFT0YpIHsKLSAgICAgICAgICAgIG5leHRCeXRlKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgICAgICBpZiAoZkxhc3RCeXRlID09IENSKSB7Ci0gICAgICAgICAgICAgICAgY3IgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmTGFzdEJ5dGUgPT0gTEYgJiYgY3IpIHsKLSAgICAgICAgICAgICAgICBjcmxmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3IgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgbGVuZ3RoID0gYnVmLmdldExlbmd0aCgpIC0gc3RhcnQ7Ci0gICAgICAgIGlmIChjcmxmKSB7Ci0gICAgICAgICAgICBsZW5ndGggLT0gMjsKLSAgICAgICAgfQotICAgICAgICByYW5nZS5zZXRMZW5ndGgocmFuZ2UuZ2V0TGVuZ3RoKCkgKyBsZW5ndGgpOwotICAgICAgICByZXR1cm4gZkxhc3RCeXRlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNraXBTcGFjZUNSQW5kTEZzKGxvbmcgdGltZW91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgZkxhc3RCeXRlID0gZ2V0QXZhaWxhYmxlSW5wdXQodGltZW91dCk7Ci0gICAgICAgIHdoaWxlICgoZkxhc3RCeXRlID09IFNQKQotICAgICAgICAgICAgICAgfHwgKGZMYXN0Qnl0ZSA9PSBDUikKLSAgICAgICAgICAgICAgIHx8IChmTGFzdEJ5dGUgPT0gTEYpKSB7Ci0gICAgICAgICAgICBmTGFzdEJ5dGUgPSBTb2NrZXRUaW1lb3V0UmV0cnlJbnB1dFN0cmVhbS5yZWFkKGZJbik7Ci0gICAgICAgIH0KLSAgICAgICAgZkluLnVucmVhZChmTGFzdEJ5dGUpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2tpcFNwYWNlcyhsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSByZXBsaWNhKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBmTGFzdEJ5dGUgPSBnZXRBdmFpbGFibGVJbnB1dCh0aW1lb3V0KTsKLSAgICAgICAgd2hpbGUgKGZMYXN0Qnl0ZSA9PSBTUCkgewotICAgICAgICAgICAgcmVwbGljYS53cml0ZShmTGFzdEJ5dGUpOwotICAgICAgICAgICAgZkxhc3RCeXRlID0gU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0ucmVhZChmSW4pOwotICAgICAgICB9Ci0gICAgICAgIGZJbi51bnJlYWQoZkxhc3RCeXRlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHJlYWROZXh0VG9rZW4obG9uZyB0aW1lb3V0LCBIVFRQTWVzc2FnZUJ1ZmZlciBidWYsIEJ1ZmZlclJhbmdlIG1hcmtlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCBtYXJrZXIsIChjaGFyKSAwKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZE5leHRUb2tlbihsb25nIHRpbWVvdXQsIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiwgQnVmZmVyUmFuZ2UgbWFya2VyLCBjaGFyIGRlbGltKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpbnQgc3RhcnQgPSBidWYuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIG5leHRCeXRlKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICBib29sZWFuIGNyID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChmTGFzdEJ5dGUgIT0gRU9GKSB7Ci0gICAgICAgICAgICBpZiAoZGVsaW0gIT0gMCAmJiBmTGFzdEJ5dGUgPT0gZGVsaW0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmTGFzdEJ5dGUgPT0gQ1IpIHsKLSAgICAgICAgICAgICAgICBjciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZMYXN0Qnl0ZSA9PSBMRiAmJiBjcikgewotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjciA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dEJ5dGUodGltZW91dCwgYnVmKTsKLSAgICAgICAgICAgIGxlbmd0aCArPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5ndGggPiAwKSB7IAotICAgICAgICAgICAgbWFya2VyLnNldFN0YXJ0KHN0YXJ0KTsKLSAgICAgICAgICAgIG1hcmtlci5zZXRMZW5ndGgobGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZkxhc3RCeXRlOwotICAgIH0KLQotICAgIC8qCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzVG9rZW5DaGFyKGludCBjaCkgewotICAgICAgICBpZiAoY2ggPCAwIHx8IGlzQ3RybENoYXIoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNTZXBlcmF0b3IoY2gpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQ3RybENoYXIoaW50IGNoKSB7Ci0gICAgICAgIHJldHVybiAoKGNoID49IDAgJiYgY2ggPD0gMHgxRikgfHwgY2ggPT0gMHg3Rik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzVGV4dENoYXIoaW50IGNoKSB7Ci0gICAgICAgIGlmIChjaCA9PSBTUCB8fCBjaCA9PSBIVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIWlzQ3RybENoYXIoY2gpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTZXBlcmF0b3IoaW50IGNoKSB7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgY2FzZSBIVDogLy8gMHgwOQotICAgICAgICBjYXNlIFNQOiAvLyAweDIwCi0gICAgICAgIGNhc2UgJyInOiAvLyAweDIyCi0gICAgICAgIGNhc2UgJygnOiAvLyAweDI4Ci0gICAgICAgIGNhc2UgJyknOiAvLyAweDI5Ci0gICAgICAgIGNhc2UgJywnOiAvLyAweDJjCi0gICAgICAgIGNhc2UgJy8nOiAvLyAweDJmCi0gICAgICAgIGNhc2UgJzonOiAvLyAweDNhCi0gICAgICAgIGNhc2UgJzsnOiAvLyAweDNiCi0gICAgICAgIGNhc2UgJzwnOiAvLyAweDNjCi0gICAgICAgIGNhc2UgJz0nOiAvLyAweDNkCi0gICAgICAgIGNhc2UgJz4nOiAvLyAweDNlCi0gICAgICAgIGNhc2UgJz8nOiAvLyAweDNmCi0gICAgICAgIGNhc2UgJ0AnOiAvLyAweDQwIAotICAgICAgICBjYXNlICdbJzogLy8gMHg1YgotICAgICAgICBjYXNlICdcXCc6IC8vIDB4NWMKLSAgICAgICAgY2FzZSAnXSc6IC8vIDB4NWQKLSAgICAgICAgY2FzZSAneyc6IC8vIDB4N2IKLSAgICAgICAgY2FzZSAnfSc6IC8vIDB4N2QKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICAqLwotICAgICAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZmllbGQtdmFsdWUgICAgPSAqKCBmaWVsZC1jb250ZW50IHwgTFdTICkKLSAgICAvLyBmaWVsZC1jb250ZW50ICA9IDx0aGUgT0NURVRzIG1ha2luZyB1cCB0aGUgZmllbGQtdmFsdWUKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY29uc2lzdGluZyBvZiBlaXRoZXIgKlRFWFQgb3IgY29tYmluYXRpb25zCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdG9rZW4sIHNlcGFyYXRvcnMsIGFuZCBxdW90ZWQtc3RyaW5nPgotICAgIC8vIFRFWFQgICAgICAgICAgID0gPGFueSBPQ1RFVCBleGNlcHQgQ1RMcywgYnV0IGluY2x1ZGluZyBMV1M+Ci0gICAgLy8gcXVvdGVkLXN0cmluZyAgPSAoIDwiPiAqKHFkdGV4dCB8IHF1b3RlZC1wYWlyICkgPCI+ICkKLSAgICAvLyBxZHRleHQgICAgICAgICA9IDxhbnkgVEVYVCBleGNlcHQgPCI+PgotICAgIC8vIHF1b3RlZC1wYWlyICAgID0gIlwiIENIQVIKLSAgICAvLyBDSEFSICAgICAgICAgICA9IDxhbnkgVVMtQVNDSUkgY2hhcmFjdGVyIChvY3RldHMgMCAtIDEyNyk+Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gQ1IgTEYKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkQ1JMRihsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5leHRCeXRlKHRpbWVvdXQsIG91dCk7Ci0gICAgICAgIGlmIChmTGFzdEJ5dGUgIT0gQ1IpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyICgiICsgZkxhc3RCeXRlICsiLikgRXhwZWN0ZWQgd2FzICgiICsgSW50ZWdlci50b1N0cmluZyhDUikgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIG5leHRCeXRlKHRpbWVvdXQsIG91dCk7Ci0gICAgICAgIGlmIChmTGFzdEJ5dGUgIT0gTEYpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyICgiICsgZkxhc3RCeXRlICsiLikgRXhwZWN0ZWQgd2FzICgiICsgSW50ZWdlci50b1N0cmluZyhMRikgKyAiKSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcmVhZE5leHRUb2tlbihsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkTmV4dFRva2VuKHRpbWVvdXQsIG91dCwgKGNoYXIpIDApOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHJlYWROZXh0VG9rZW4obG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gb3V0LCBjaGFyIGRlbGltKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBuZXh0Qnl0ZSh0aW1lb3V0LCBvdXQpOwotICAgICAgICBpZiAoZkxhc3RCeXRlID09IEVPRikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBjciA9IGZhbHNlOwotICAgICAgICBTdHJpbmdCdWZmZXIgdG9rZW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlIChmTGFzdEJ5dGUgIT0gRU9GKSB7Ci0gICAgICAgICAgICBpZiAoZGVsaW0gIT0gMCAmJiBmTGFzdEJ5dGUgPT0gZGVsaW0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmTGFzdEJ5dGUgPT0gQ1IpIHsKLSAgICAgICAgICAgICAgICBjciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZMYXN0Qnl0ZSA9PSBMRiAmJiBjcikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRva2VuLmFwcGVuZCgoY2hhcikgZkxhc3RCeXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRCeXRlKHRpbWVvdXQsIG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRva2VuLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgcmVhZENodW5rZWRNZXNzYWdlQm9keShsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIENodW5rRGVjb2RlciBkZWNvZGVyID0gbmV3IENodW5rRGVjb2RlcihmSW4pOwotICAgICAgICBmaW5hbCBDaHVua0VuY29kZXIgZW5jb2RlciA9IG5ldyBDaHVua0VuY29kZXIob3V0KTsKLSAgICAgICAgZGVjb2Rlci5zZXRDaHVua0xpc3RlbmVyKG5ldyBDaHVua0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbmV3Q2hhbmtSZWFkKGludCBuLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuc2V0TWF4Q2h1bmtTaXplKHNpemUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBiOwotICAgICAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAgICAgd2hpbGUgKChiID0gZGVjb2Rlci5yZWFkKHRpbWVvdXQpKSAhPSAtMSkgeyAKLSAgICAgICAgICAgICAgICBlbmNvZGVyLndyaXRlKGIpOwotICAgICAgICAgICAgICAgIG4gKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZW5jb2Rlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVxdWVzdE1lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlcXVlc3RNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NDM1ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVxdWVzdE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHk7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQUmVxdWVzdE1lc3NhZ2UgZXh0ZW5kcyBIVFRQTWVzc2FnZSBpbXBsZW1lbnRzIElIVFRQUmVxdWVzdE1lc3NhZ2V7Ci0gICAgLy8gUmVxdWVzdCA9IFJlcXVlc3QtTGluZQotICAgIC8vICAgICAgICAgICAgICAgICAgKigoIGdlbmVyYWwtaGVhZGVyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgIHwgcmVxdWVzdC1oZWFkZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgfCBlbnRpdHktaGVhZGVyICkgQ1JMRikKLSAgICAvLyAgICAgICAgICAgICAgICAgIENSTEYKLSAgICAvLyAgICAgICAgICAgICAgICAgIFsgbWVzc2FnZS1ib2R5IF0KLQotICAgIHByaXZhdGUgQnVmZmVyUmFuZ2UgZk1ldGhvZDsKLSAgICBwcml2YXRlIEJ1ZmZlclJhbmdlIGZSZXF1ZXN0VVJJOwotICAgIHByaXZhdGUgU3RyaW5nIG1vZGlmaWVkUmVxdWVzdFVSSTsKLSAgICBwcml2YXRlIEJ1ZmZlclJhbmdlIGZIVFRQVmVyc2lvbjsKLQotICAgIHB1YmxpYyBIVFRQUmVxdWVzdE1lc3NhZ2UobG9uZyBzZXJpYWwpIHsKLSAgICAgICAgc3VwZXIoc2VyaWFsKTsKLSAgICAgICAgZk1ldGhvZCA9IG5ldyBCdWZmZXJSYW5nZSgpOwotICAgICAgICBmUmVxdWVzdFVSSSA9IG5ldyBCdWZmZXJSYW5nZSgpOwotICAgICAgICBmSFRUUFZlcnNpb24gPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0TWV0aG9kKCkKLQkgKi8KLSAgICBwdWJsaWMgQnVmZmVyUmFuZ2UgZ2V0TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gZk1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZSNnZXRNZXRob2RBc0J5dGVzKCkKLQkgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldE1ldGhvZEFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXRBc0J5dGVzKGZNZXRob2QpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlI2dldE1ldGhvZEFzU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZEFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNTdHJpbmcoZk1ldGhvZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0UmVxdWVzdFVSSSgpCi0JICovCi0gICAgcHVibGljIEJ1ZmZlclJhbmdlIGdldFJlcXVlc3RVUkkoKSB7Ci0gICAgICAgIGlmIChtb2RpZmllZFJlcXVlc3RVUkkgIT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBmUmVxdWVzdFVSSTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZSNzZXRSZXF1ZXN0VVJJU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSVN0cmluZyhTdHJpbmcgbmV3UmVxdWVzdFVSSSkgewotICAgICAgICB0aGlzLm1vZGlmaWVkUmVxdWVzdFVSSSA9IG5ld1JlcXVlc3RVUkk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0T3JpZ2luYWxSZXF1ZXN0VVJJU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzU3RyaW5nKGZSZXF1ZXN0VVJJKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZSNnZXRSZXF1ZXN0VVJJU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUklTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChtb2RpZmllZFJlcXVlc3RVUkkgIT0gbnVsbCkgcmV0dXJuIG1vZGlmaWVkUmVxdWVzdFVSSTsKLSAgICAgICAgcmV0dXJuIGdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpOwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0SFRUUFZlcnNpb24oKQotCSAqLwotICAgIHB1YmxpYyBCdWZmZXJSYW5nZSBnZXRIVFRQVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGZIVFRQVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEhUVFBWZXJzaW9uQXNCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzQnl0ZXMoZkhUVFBWZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhUVFBWZXJzaW9uQXNTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXRBc1N0cmluZyhmSFRUUFZlcnNpb24pOwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjaXNNZXRob2RFcXVhbHNUbyhieXRlW10pCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RFcXVhbHNUbyhieXRlW10gbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5lcXVhbHMoZk1ldGhvZCwgbWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpcnN0TGluZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBIVFRQTWVzc2FnZUJ1ZmZlciBidWYgPSBnZXRCdWZmZXIoKTsKLSAgICAgICAgYnVmLndyaXRlVG8ob3V0LCBmTWV0aG9kKTsKLSAgICAgICAgb3V0LndyaXRlKFNQKTsKLSAgICAgICAgaWYgKG1vZGlmaWVkUmVxdWVzdFVSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBidWYud3JpdGVUbyhvdXQsIGZSZXF1ZXN0VVJJKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dC53cml0ZShtb2RpZmllZFJlcXVlc3RVUkkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKFNQKTsKLSAgICAgICAgYnVmLndyaXRlVG8ob3V0LCBmSFRUUFZlcnNpb24pOwotICAgICAgICBvdXQud3JpdGUoQ1IpOwotICAgICAgICBvdXQud3JpdGUoTEYpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQm9keUVtcHR5KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjaXNSZXNwb25zZUJvZHlFbXB0eSgpCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZUJvZHlFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChJSFRUUEhlYWRlci5NRVRIT0RfQ09OTkVDVC5lcXVhbHMoZ2V0TWV0aG9kQXNTdHJpbmcoKSkKLSAgICAgICAgICAgICAgICB8fCBJSFRUUEhlYWRlci5NRVRIT0RfSEVBRC5lcXVhbHMoZ2V0TWV0aG9kQXNTdHJpbmcoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250ZW50TGVuZ3RoSW52YWxpZE1lc3NhZ2U7Ci0gICAgZmluYWwgdm9pZCByZWNhbGN1bGF0ZUNvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIElNZXNzYWdlQm9keSBib2R5ID0gZ2V0TWVzc2FnZUJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHkuZ2V0Q29udGVudExlbmd0aCgpID09IC0xKSB7Ci0gICAgICAgICAgICBjb250ZW50TGVuZ3RoSW52YWxpZE1lc3NhZ2UgPSB0cnVlOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBib2R5LmdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpbnQgYjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGlzLnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJvZHlCeXRlQXJyYXkgPSBvcy50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIG5ld0lzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvZHlCeXRlQXJyYXkpOwotICAgICAgICAgICAgICAgIHNldE9yaWdpbmFsTWVzc2FnZUJvZHkobmV3IE1lc3NhZ2VCb2R5KG5ld0lzLCBib2R5Qnl0ZUFycmF5Lmxlbmd0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSByZWdhcmQgYm9keSBpcyBlbXB0eS4KLSAgICAgICAgICAgICAgICBzZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KG5ldyBNZXNzYWdlQm9keShpcywgMCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjaXNDb25uZWN0aW9uU2h1dGRvd25SZXF1aXJlZCgpCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW9uU2h1dGRvd25SZXF1aXJlZCgpIHsKLSAgICAgICAgaWYgKCFpc0Nvbm5lY3Rpb25Ub0JlQ2xvc2VkKCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgSU1lc3NhZ2VCb2R5IGJvZHkgPSBnZXRNZXNzYWdlQm9keSgpOwotICAgICAgICBpZiAoYm9keS5pc0NodW5rZWRFbmNvZGluZygpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghY29udGVudExlbmd0aEludmFsaWRNZXNzYWdlICYmIChib2R5LmdldENvbnRlbnRMZW5ndGgoKSA+PSAwKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUJvZHlXaXRob3V0Q29udGVudExlbmd0aChsb25nIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2VCb2R5IG1zZ0JvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICAvLyBkbyBub3RoaW5nLiAgV2UgcmVnYXJkIGJvZHkgaXMgZW1wdHkuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlcXVlc3RSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlcXVlc3RSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2YTM3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBSZXF1ZXN0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEhUVFBSZXF1ZXN0UmVhZGVyIGV4dGVuZHMgSFRUUE1lc3NhZ2VSZWFkZXIgewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQUmVxdWVzdFJlYWRlci5jbGFzcyk7Ci0KLSAgICAvLyBSZXF1ZXN0ID0gUmVxdWVzdC1MaW5lCi0gICAgLy8gICAgICAgICAgICAgICAgICAqKCggZ2VuZXJhbC1oZWFkZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgfCByZXF1ZXN0LWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IGVudGl0eS1oZWFkZXIgKSBDUkxGKQotICAgIC8vICAgICAgICAgICAgICAgICAgQ1JMRgotICAgIC8vICAgICAgICAgICAgICAgICAgWyBtZXNzYWdlLWJvZHkgXQotCi0gICAgcHVibGljIEhUVFBSZXF1ZXN0UmVhZGVyKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRmlyc3RMaW5lKEhUVFBNZXNzYWdlIG1zZywgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICAvLyBSZXF1ZXN0LUxpbmUgPSBNZXRob2QgU1AgUmVxdWVzdC1VUkkgU1AgSFRUUC1WZXJzaW9uIENSTEYKLSAgICAgICAgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEgPSAoSUhUVFBSZXF1ZXN0TWVzc2FnZSkgbXNnOwotICAgICAgICBIVFRQTWVzc2FnZUJ1ZmZlciBidWYgPSBtc2cuZ2V0QnVmZmVyKCk7Ci0KLSAgICAgICAgLy8gQWx0aG91Z2ggc2tpcHBpbmcgd2hpdGVzcGFjZXMgaXMgbm90IGFjdHVhbGx5IGNvcnJlY3QsIGEgbWVzc2FnZSBzb21ldGltZXMgc3RhcnRzIHdpdGggd2hpdGVzcGFjZXMuCi0gICAgICAgIHNraXBTcGFjZUNSQW5kTEZzKHRpbWVvdXQpOwotCi0gICAgICAgIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCByZXEuZ2V0TWV0aG9kKCksIFNQKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgPT0gLTEpIHsKLSAgICAgICAgCXRocm93IG5ldyBIVFRQQ29ubmVjdGlvbkV4Y2VwdGlvbigiUmVxdWVzdCBjb25uZWN0aW9uIGlzIGNsb3NlZC4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0TGFzdEJ5dGUoKSAhPSBTUCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXIgKGV4cGVjdGVkPVNQKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b1N0cmluZyhnZXRMYXN0Qnl0ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi8iICsgYnVmLmdldEFzU3RyaW5nKHJlcS5nZXRNZXRob2QoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHNraXBTcGFjZXModGltZW91dCwgYnVmKTsKLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIHJlcS5nZXRSZXF1ZXN0VVJJKCksIFNQKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgIT0gU1ApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyIChleHBlY3RlZD1TUCk6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBza2lwU3BhY2VzKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCByZXEuZ2V0SFRUUFZlcnNpb24oKSk7Ci0gICAgICAgIGlmIChnZXRMYXN0Qnl0ZSgpICE9IExGKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoZXhwZWN0ZWQ9TEYpOiAiICsgSW50ZWdlci50b1N0cmluZyhnZXRMYXN0Qnl0ZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2MTNlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklNZXNzYWdlQm9keTsKLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZSBleHRlbmRzIEhUVFBSZXNwb25zZU1lc3NhZ2UgaW1wbGVtZW50cyBJSFRUUFJlc3BvbnNlTWVzc2FnZXsKLSAgICAvLyBSZXF1ZXN0ID0gU3RhdHVzLUxpbmUKLSAgICAvLyAqKCggZ2VuZXJhbC1oZWFkZXIKLSAgICAvLyB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gfCBlbnRpdHktaGVhZGVyICkgQ1JMRikKLSAgICAvLyBDUkxGCi0gICAgLy8gWyBtZXNzYWdlLWJvZHkgXQotICAgIC8vIFN0YXR1cy1MaW5lID0gSFRUUC1WZXJzaW9uIFNQIFN0YXR1cy1Db2RlIFNQIFJlYXNvbi1QaHJhc2UgQ1JMRgotCi0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdmVyc2lvbjsKLQotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHN0YXR1c0NvZGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSByZWFzb25QaHJhc2U7Ci0KLSAgICBwcm90ZWN0ZWQgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKGxvbmcgc2VyaWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc3RhdHVzQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByZWFzb25QaHJhc2UpIHsKLSAgICAgICAgc3VwZXIoc2VyaWFsKTsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKLSAgICAgICAgdGhpcy5yZWFzb25QaHJhc2UgPSByZWFzb25QaHJhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShsb25nIHNlcmlhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHN0YXR1c0NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVhc29uUGhyYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJvZHkpIHsKLSAgICAgICAgdGhpcyhzZXJpYWwsIHZlcnNpb24sIHN0YXR1c0NvZGUsIHJlYXNvblBocmFzZSk7Ci0gICAgICAgIElNZXNzYWdlQm9keSBtc2dCb2R5ID0gbmV3IE1lc3NhZ2VCb2R5KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib2R5KSwgYm9keS5sZW5ndGgpOwotICAgICAgICBzdXBlci5zZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KG1zZ0JvZHkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEJhc2VIZWFkZXJzKElIVFRQTWVzc2FnZSBiYXNlKSB7Ci0gICAgICAgIExpc3QgbCA9IGJhc2UuZ2V0SGVhZGVycygpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGwuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgSUhUVFBIZWFkZXIgaCA9IChJSFRUUEhlYWRlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFoLmlzRmllbGROYW1lRXF1YWxzVG8oSUhUVFBIZWFkZXIuQ09OVEVOVF9MRU5HVEhfQSkpIHsKLSAgICAgICAgICAgICAgICBzZXRIZWFkZXIoaC5nZXROYW1lKCksIGguZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKElIVFRQUmVzcG9uc2VNZXNzYWdlIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYm9keSkgewotICAgICAgICB0aGlzKGJhc2UuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSwKLSAgICAgICAgICAgICBiYXNlLmdldFN0YXR1c0NvZGVBc0J5dGVzKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRSZWFzb25QaHJhc2VBc0J5dGVzKCksCi0gICAgICAgICAgICAgYm9keSk7Ci0gICAgICAgIHNldEJhc2VIZWFkZXJzKGJhc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29kZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzdGF0dXNDb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFN0YXR1c0NvZGVBc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvblBocmFzZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFzb25QaHJhc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0UmVhc29uUGhyYXNlQXNCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHJlYXNvblBocmFzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpcnN0TGluZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGUodmVyc2lvbik7Ci0gICAgICAgIG91dC53cml0ZShTUCk7Ci0gICAgICAgIG91dC53cml0ZShzdGF0dXNDb2RlKTsKLSAgICAgICAgb3V0LndyaXRlKFNQKTsKLSAgICAgICAgb3V0LndyaXRlKHJlYXNvblBocmFzZSk7Ci0gICAgICAgIG91dC53cml0ZShDUik7Ci0gICAgICAgIG91dC53cml0ZShMRik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVzcG9uc2VNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBSZXNwb25zZU1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmZTc1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBSZXNwb25zZU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklNZXNzYWdlQm9keTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEhUVFBSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBIVFRQTWVzc2FnZSBpbXBsZW1lbnRzIElIVFRQUmVzcG9uc2VNZXNzYWdlIHsKLSAgICAvLyBSZXF1ZXN0ID0gU3RhdHVzLUxpbmUKLSAgICAvLyAgICAgICAgICAgICAgICAgICooKCBnZW5lcmFsLWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgIHwgZW50aXR5LWhlYWRlciApIENSTEYpCi0gICAgLy8gICAgICAgICAgICAgICAgICBDUkxGCi0gICAgLy8gICAgICAgICAgICAgICAgICBbIG1lc3NhZ2UtYm9keSBdCi0gICAgLy8gU3RhdHVzLUxpbmUgPSBIVFRQLVZlcnNpb24gU1AgU3RhdHVzLUNvZGUgU1AgUmVhc29uLVBocmFzZSBDUkxGCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFNUQVRVU19OT19DT05URU5UX0EgPSAiMjA0Ii5nZXRCeXRlcygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVEFUVVNfTk9UX01PRElGSUVEX0EgPSAiMzA0Ii5nZXRCeXRlcygpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdSSVRFQk9EWV9ERUZBVUxUX1dBSVRfREVOT00gPSAxMDsKLQotICAgIHByb3RlY3RlZCBIVFRQUmVzcG9uc2VNZXNzYWdlKGxvbmcgc2VyaWFsKSB7Ci0gICAgICAgIHN1cGVyKHNlcmlhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCb2R5RW1wdHkoKSB7Ci0gICAgICAgIGJ5dGVbXSBzdGF0Q29kZSA9IGdldFN0YXR1c0NvZGVBc0J5dGVzKCk7Ci0gICAgICAgIHJldHVybiAoQXJyYXlzLmVxdWFscyhzdGF0Q29kZSwgU1RBVFVTX05PX0NPTlRFTlRfQSkKLSAgICAgICAgICAgICAgICB8fCBBcnJheXMuZXF1YWxzKHN0YXRDb2RlLCBTVEFUVVNfTk9UX01PRElGSUVEX0EpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2UjZ2V0U3RhdHVzQ29kZUFzU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvZGVBc1N0cmluZygpOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZSNnZXRTdGF0dXNDb2RlQXNCeXRlcygpCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRTdGF0dXNDb2RlQXNCeXRlcygpOwotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2UjZ2V0UmVhc29uUGhyYXNlQXNTdHJpbmcoKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlQXNTdHJpbmcoKTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2UjZ2V0UmVhc29uUGhyYXNlQXNCeXRlcygpCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRSZWFzb25QaHJhc2VBc0J5dGVzKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUJvZHlXaXRob3V0Q29udGVudExlbmd0aChsb25nIHRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2VCb2R5IG1zZ0JvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzQ29ubmVjdGlvblRvQmVDbG9zZWQoKSkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gYm9keSA9IG1zZ0JvZHkuZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgLy8gV3JpdGUgdW50aWwgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGludCBiID0gYm9keS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGIgPCAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBib2R5ID0gbXNnQm9keS5nZXRNZXNzYWdlQm9keVRpbWVvdXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlYWQgdGhlIGluY29taW5nIGRhdGEgYXMgbXVjaCBhcyB3ZSBjYW4uCi0gICAgICAgICAgICBsb25nIGtlZXBBbGl2ZVRpbWVvdXQgPSB0aW1lb3V0IC8gV1JJVEVCT0RZX0RFRkFVTFRfV0FJVF9ERU5PTTsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewkJCQkJCQkJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwkJCQkJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJrZWVwQWxpdmVUaW1lb3V0PSIgKyBrZWVwQWxpdmVUaW1lb3V0ICsgIiBtcyIpOyAJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwkJCQkJCQkJCQkJLy8gREVCVUcKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7IC8vIERFQlVHCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7ICAKLSAgICAgICAgICAgIGxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlKSA8IGtlZXBBbGl2ZVRpbWVvdXQpIHsKLSAgICAgICAgICAgIAlpbnQgYjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAliID0gYm9keS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIAljb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7CQkJCQkJCQkJCQkJLy8gREVCVUcKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CQkJCQkJCQkJLy8gREVCVUcKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoImVsYXBzZWQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICIgbXMiKTsgCQkvLyBERUJVRwotICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZyhzYi50b1N0cmluZygpKTsJCQkJCQkJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOyAvLyBERUJVRwotICAgICAgICAgICAgfQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBERUJVRwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODEwMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hpbiBTQUlUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklNZXNzYWdlQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSVB1c2hiYWNrTWVzc2FnZUJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZSBleHRlbmRzIEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZSBpbXBsZW1lbnRzIElIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2V7Ci0KLSAgICAgcHVibGljIEhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZShsb25nIHNlcmlhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc3RhdHVzQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVhc29uUGhyYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlQm9keSBib2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdXNoYmFja0J1ZmZlclNpemUpIHsKLSAgICAgICAgc3VwZXIoc2VyaWFsLCB2ZXJzaW9uLCBzdGF0dXNDb2RlLCByZWFzb25QaHJhc2UpOwotICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGJvZHkuZ2V0TWVzc2FnZUJvZHlUaW1lb3V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIElNZXNzYWdlQm9keSBtc2dCb2R5OwotICAgICAgICAgICAgaWYgKGJvZHkuaXNDaHVua2VkRW5jb2RpbmcoKSkgewotICAgICAgICAgICAgICAgIG1zZ0JvZHkgPSBuZXcgUHVzaGJhY2tNZXNzYWdlQm9keShpcywgcHVzaGJhY2tCdWZmZXJTaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbXNnQm9keSA9IG5ldyBQdXNoYmFja01lc3NhZ2VCb2R5KGlzLCBwdXNoYmFja0J1ZmZlclNpemUsIGJvZHkuZ2V0Q29udGVudExlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cGVyLnNldE9yaWdpbmFsTWVzc2FnZUJvZHkobXNnQm9keSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDYXV0aW9uISEhISBXaXRob3V0IHB1c2hiYWNrIG9wdGlvbiwgYm9keSB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlI3JlYWRCb2R5KGxvbmcsIGJvb2xlYW4pCi0JICovCi0gICAgcHVibGljIGJ5dGVbXSByZWFkQm9keShsb25nIHRpbWVvdXQsIGJvb2xlYW4gcHVzaGJhY2spCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIFB1c2hiYWNrTWVzc2FnZUJvZHkgbXNnQm9keSA9IChQdXNoYmFja01lc3NhZ2VCb2R5KSBnZXRNZXNzYWdlQm9keSgpOwotICAgICAgICBpZiAobXNnQm9keSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gYm9keSA9IG1zZ0JvZHkuZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpOwotICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IG1zZ0JvZHkuZ2V0Q29udGVudExlbmd0aCgpOwotICAgICAgICBpZiAoYm9keSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBpZiAoY29udGVudExlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBub3JtYWwgZW5jb2RpbmcKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb3Mud3JpdGUoYm9keS5yZWFkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY2h1bmtlZCBlbmNvZGluZwotICAgICAgICAgICAgQ2h1bmtlZE1lc3NhZ2VCb2R5UmVhZGVyIGNodW5rUmVhZGVyID0gbmV3IENodW5rZWRNZXNzYWdlQm9keVJlYWRlcihib2R5KTsKLSAgICAgICAgICAgIGNodW5rUmVhZGVyLnJlYWRDaHVua2VkTWVzc2FnZSh0aW1lb3V0LCBvcywgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIG91dEJ5dGVzID0gb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgaWYgKHB1c2hiYWNrKSB7Ci0gICAgICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIGlzID0gbXNnQm9keS5nZXRNZXNzYWdlQm9keVB1c2hCYWNrSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGlzLnVucmVhZChvdXRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dEJ5dGVzOwotICAgIH0KLQotCi0gICAgcHVibGljIEhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZShJSFRUUFJlc3BvbnNlTWVzc2FnZSBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB1c2hiYWNrQnVmZmVyU2l6ZSkgewotICAgICAgICB0aGlzKGJhc2UuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSwKLSAgICAgICAgICAgICBiYXNlLmdldFN0YXR1c0NvZGVBc0J5dGVzKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRSZWFzb25QaHJhc2VBc0J5dGVzKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRNZXNzYWdlQm9keSgpLAotICAgICAgICAgICAgIHB1c2hiYWNrQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHNldEJhc2VIZWFkZXJzKGJhc2UpOwotICAgIH0KLQotCXB1YmxpYyBJUHVzaGJhY2tNZXNzYWdlQm9keSBnZXRQdXNoYmFja01lc3NhZ2VCb2R5KCkgewotICAgICAgICByZXR1cm4gKFB1c2hiYWNrTWVzc2FnZUJvZHkpIGdldE1lc3NhZ2VCb2R5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVzcG9uc2VSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlc3BvbnNlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDU3YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IVFRQUmVzcG9uc2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZVJlYWRlciBleHRlbmRzIEhUVFBNZXNzYWdlUmVhZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQUmVzcG9uc2VSZWFkZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7Ci0KLSAgICAvLyBSZXF1ZXN0ID0gU3RhdHVzLUxpbmUKLSAgICAvLyAqKCggZ2VuZXJhbC1oZWFkZXIKLSAgICAvLyB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gfCBlbnRpdHktaGVhZGVyICkgQ1JMRikKLSAgICAvLyBDUkxGCi0gICAgLy8gWyBtZXNzYWdlLWJvZHkgXQotICAgIC8vIFN0YXR1cy1MaW5lID0gSFRUUC1WZXJzaW9uIFNQIFN0YXR1cy1Db2RlIFNQIFJlYXNvbi1QaHJhc2UgQ1JMRgotCi0gICAgcHVibGljIEhUVFBSZXNwb25zZVJlYWRlcihpbnQgaWQsIElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEZpcnN0TGluZShIVFRQTWVzc2FnZSBtc2csIGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUmVxdWVzdC1MaW5lID0gTWV0aG9kIFNQIFJlcXVlc3QtVVJJIFNQIEhUVFAtVmVyc2lvbiBDUkxGCi0gICAgICAgIEhUVFBSZXNwb25zZVN0cmVhbU1lc3NhZ2UgcmVzcG9uc2UgPSAoSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZSkgbXNnOwotICAgICAgICBIVFRQTWVzc2FnZUJ1ZmZlciBidWYgPSBtc2cuZ2V0QnVmZmVyKCk7Ci0KLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIHJlc3BvbnNlLmdldEhUVFBWZXJzaW9uKCksIFNQKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgIT0gU1ApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyIChleHBlY3RlZD1TUCk6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBza2lwU3BhY2VzKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksIFNQKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgIT0gU1ApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyIChleHBlY3RlZD1TUCk6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBza2lwU3BhY2VzKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCByZXNwb25zZS5nZXRSZWFzb25QaHJhc2UoKSk7Ci0gICAgICAgIGlmIChnZXRMYXN0Qnl0ZSgpICE9IExGKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoZXhwZWN0ZWQ9TEYpOiAiICsgSW50ZWdlci50b1N0cmluZyhnZXRMYXN0Qnl0ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoIlJlc3BvbnNlLVJGTDoiICsgcmVzcG9uc2UuZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyByZXNwb25zZS5nZXRTdGF0dXNDb2RlQXNTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgcmVzcG9uc2UuZ2V0UmVhc29uUGhyYXNlQXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIHByb3RlY3RlZCBIVFRQTWVzc2FnZSByZWFkTWVzc2FnZUJvZHkoSFRUUE1lc3NhZ2UgbXNnLCBpbnQgY29udGVudExlbmd0aCwgbG9uZyB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAobXNnLmlzQ2h1bmtlZEVuY29kaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIERFQlVHKCJDaGFua2VkRW5jb2Rpbmc6IiArIG1zZy5nZXRTZXJpYWwoKSArICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZENodW5rZWRNZXNzYWdlQm9keSgwLCBtc2cpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgewotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkNvbnRlbnQtTGVuZ3RoOiIgKyBjb250ZW50TGVuZ3RoICsgIiAiICsgbXNnLmdldFNlcmlhbCgpICsgIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcmVhZEJ5dGVzID0gcmVhZEJ5dGVzKDAsIG1zZywgY29udGVudExlbmd0aCk7Ci0gICAgICAgICAgICBtc2cubWFya01lc3NhZ2VCb2R5RW5kKCk7Ci0gICAgICAgICAgICBpZiAocmVhZEJ5dGVzICE9IGNvbnRlbnRMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBGQVRBTCgiSWxsZWdhbCBtZXNzYWdlIGJvZHk6IHJlYWQ9IiArIHJlYWRCeXRlcyArICIsIGNvbnRlbnRMZW5ndGg9IiArIGNvbnRlbnRMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkVuZCBpcyBtYXJrZWQgYnkgQ1MuIiArIG1zZy5nZXRTZXJpYWwoKSArICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZEJ5dGVzKDAsIG1zZyk7Ci0gICAgICAgICAgICBtc2cubWFya01lc3NhZ2VCb2R5RW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gICAgICovCi0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgV0FSTklORyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJbaWQ6IikuYXBwZW5kKGlkKS5hcHBlbmQoIl0gSFRUUFJlc3BvbnNlUmVhZGVyOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1zZyk7Ci0gICAgICAgIExPR0dFUi53YXJuaW5nKHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBERUJVRyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJbaWQ6IikuYXBwZW5kKGlkKS5hcHBlbmQoIl0gSFRUUFJlc3BvbnNlUmVhZGVyOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1zZyk7Ci0gICAgICAgIExPR0dFUi5kZWJ1ZyhzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgRkFUQUwoU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiW2lkOiIpLmFwcGVuZChpZCkuYXBwZW5kKCJdIEhUVFBSZXNwb25zZVJlYWRlcjogIik7Ci0gICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICBMT0dHRVIuZmF0YWwoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hUVFBSZXNwb25zZVN0cmVhbU1lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTAzNDNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBIVFRQUmVzcG9uc2VTdHJlYW1NZXNzYWdlIGV4dGVuZHMgSFRUUFJlc3BvbnNlTWVzc2FnZSB7Ci0gICAgLy8gUmVxdWVzdCA9IFN0YXR1cy1MaW5lCi0gICAgLy8gICAgICAgICAgICAgICAgICAqKCggZ2VuZXJhbC1oZWFkZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgfCByZXF1ZXN0LWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IGVudGl0eS1oZWFkZXIgKSBDUkxGKQotICAgIC8vICAgICAgICAgICAgICAgICAgQ1JMRgotICAgIC8vICAgICAgICAgICAgICAgICAgWyBtZXNzYWdlLWJvZHkgXQotICAgIC8vIFN0YXR1cy1MaW5lID0gSFRUUC1WZXJzaW9uIFNQIFN0YXR1cy1Db2RlIFNQIFJlYXNvbi1QaHJhc2UgQ1JMRgotCi0gICAgcHJpdmF0ZSBCdWZmZXJSYW5nZSBmSFRUUFZlcnNpb247Ci0gICAgcHJpdmF0ZSBCdWZmZXJSYW5nZSBmU3RhdHVzQ29kZTsKLSAgICBwcml2YXRlIEJ1ZmZlclJhbmdlIGZSZWFzb25QaHJhc2U7Ci0KLSAgICBwdWJsaWMgSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZShsb25nIHNlcmlhbCkgewotICAgICAgICBzdXBlcihzZXJpYWwpOwotICAgICAgICBmSFRUUFZlcnNpb24gPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgZlN0YXR1c0NvZGUgPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgZlJlYXNvblBocmFzZSA9IG5ldyBCdWZmZXJSYW5nZSgpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIEJ1ZmZlclJhbmdlIGdldEhUVFBWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZkhUVFBWZXJzaW9uOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRIVFRQVmVyc2lvbkFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNTdHJpbmcoZkhUVFBWZXJzaW9uKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBieXRlW10gZ2V0SFRUUFZlcnNpb25Bc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNCeXRlcyhmSFRUUFZlcnNpb24pOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIEJ1ZmZlclJhbmdlIGdldFN0YXR1c0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiBmU3RhdHVzQ29kZTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29kZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNTdHJpbmcoZlN0YXR1c0NvZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0U3RhdHVzQ29kZUFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXRBc0J5dGVzKGZTdGF0dXNDb2RlKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBCdWZmZXJSYW5nZSBnZXRSZWFzb25QaHJhc2UoKSB7Ci0gICAgICAgIHJldHVybiBmUmVhc29uUGhyYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlQXNTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXRBc1N0cmluZyhmUmVhc29uUGhyYXNlKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBieXRlW10gZ2V0UmVhc29uUGhyYXNlQXNCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzQnl0ZXMoZlJlYXNvblBocmFzZSk7Ci0gICAgfQotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpcnN0TGluZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBIVFRQTWVzc2FnZUJ1ZmZlciBidWYgPSBnZXRCdWZmZXIoKTsKLSAgICAgICAgYnVmLndyaXRlVG8ob3V0LCBmSFRUUFZlcnNpb24pOwotICAgICAgICBvdXQud3JpdGUoU1ApOwotICAgICAgICBidWYud3JpdGVUbyhvdXQsIGZTdGF0dXNDb2RlKTsKLSAgICAgICAgb3V0LndyaXRlKFNQKTsKLSAgICAgICAgYnVmLndyaXRlVG8ob3V0LCBmUmVhc29uUGhyYXNlKTsKLSAgICAgICAgb3V0LndyaXRlKENSKTsKLSAgICAgICAgb3V0LndyaXRlKExGKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hlYWRlckluQnVmZmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hlYWRlckluQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDZkNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9IZWFkZXJJbkJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBIZWFkZXJJbkJ1ZmZlciBleHRlbmRzIEhUVFBIZWFkZXIgewotICAgIHByaXZhdGUgSFRUUE1lc3NhZ2VCdWZmZXIgZkJ1ZmZlcjsKLSAgICBwcml2YXRlIEJ1ZmZlclJhbmdlIGZOYW1lOwotICAgIHByaXZhdGUgQnVmZmVyUmFuZ2UgZlZhbHVlOwotICAgIHByaXZhdGUgYnl0ZVtdIGZSZXBsYWNlZFZhbHVlOwotCQotICAgIHB1YmxpYyBIZWFkZXJJbkJ1ZmZlcigpIHsKLSAgICAgICAgZk5hbWUgPSBudWxsOwotICAgICAgICBmVmFsdWUgPSBudWxsOwotICAgICAgICBmUmVwbGFjZWRWYWx1ZSA9IG51bGw7Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIGluaXQoSFRUUE1lc3NhZ2VCdWZmZXIgYnVmZmVyLCBCdWZmZXJSYW5nZSBuYW1lLCBCdWZmZXJSYW5nZSB2YWx1ZSkgewotICAgICAgICBmQnVmZmVyID0gYnVmZmVyOwotICAgICAgICBmTmFtZSA9IG5hbWU7Ci0gICAgICAgIGZWYWx1ZSA9IHZhbHVlOwotICAgICAgICBmUmVwbGFjZWRWYWx1ZSA9IG51bGw7Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBmTmFtZSA9IG51bGw7Ci0gICAgICAgIGZWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGZSZXBsYWNlZFZhbHVlID0gbnVsbDsKLSAgICB9Ci0JCi0gICAgcHVibGljIEJ1ZmZlclJhbmdlIGdldE5hbWVBc0J1ZmZlclJhbmdlKCkgewotICAgICAgICByZXR1cm4gZk5hbWU7Ci0gICAgfQotCQotICAgIHB1YmxpYyBCdWZmZXJSYW5nZSBnZXRWYWx1ZUFzQnVmZmVyUmFuZ2UoKSB7Ci0gICAgICAgIHJldHVybiBmVmFsdWU7Ci0gICAgfQotCQotICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGROYW1lRXF1YWxzVG8oYnl0ZVtdIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZCdWZmZXIuZXF1YWxzSWdub3JlQ2FzZShmTmFtZSwgbmFtZSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGRWYWx1ZUVxdWFsc1RvKGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gZkJ1ZmZlci5lcXVhbHMoZlZhbHVlLCB2YWx1ZSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyBieXRlW10gZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZCdWZmZXIuZ2V0QXNCeXRlcyhmTmFtZSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyBieXRlW10gZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBmQnVmZmVyLmdldEFzQnl0ZXMoZlZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShieXRlW10gdmFsdWUpIHsKLSAgICAgICAgZlZhbHVlID0gbnVsbDsKLSAgICAgICAgZlJlcGxhY2VkVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0JCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZkJ1ZmZlci53cml0ZVRvKG91dCwgZk5hbWUpOwotICAgICAgICB3cml0ZUhlYWRlclNlcGFyYXRvcihvdXQpOwotICAgICAgICBpZiAoZlZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZCdWZmZXIud3JpdGVUbyhvdXQsIGZWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZlJlcGxhY2VkVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGZSZXBsYWNlZFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSGVhZGVyVG9BZGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvSGVhZGVyVG9BZGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0Yjk1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL0hlYWRlclRvQWRkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEhlYWRlclRvQWRkIGV4dGVuZHMgSFRUUEhlYWRlciB7Ci0gICAgcHJpdmF0ZSBieXRlW10gZk5hbWU7Ci0gICAgcHJpdmF0ZSBieXRlW10gZlZhbHVlOwotCQotICAgIHB1YmxpYyBIZWFkZXJUb0FkZCgpIHsKLSAgICAgICAgZk5hbWUgPSBudWxsOwotICAgICAgICBmVmFsdWUgPSBudWxsOwotICAgIH0KLQkKLSAgICBwdWJsaWMgdm9pZCBpbml0KGJ5dGVbXSBuYW1lLCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgZk5hbWUgPSBuYW1lOwotICAgICAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0JCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGZOYW1lID0gbnVsbDsKLSAgICAgICAgZlZhbHVlID0gbnVsbDsKLSAgICB9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaWVsZE5hbWVFcXVhbHNUbyhieXRlW10gbmFtZSkgewotICAgICAgICByZXR1cm4gY29tcGFyZUlnbm9yZUNhc2UobmFtZSwgZk5hbWUpOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkVmFsdWVFcXVhbHNUbyhieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmUodmFsdWUsIGZWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBieXRlW10gZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZOYW1lOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYnl0ZVtdIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gZlZhbHVlOwotICAgIH0KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShieXRlW10gdmFsdWUpIHsKLSAgICAgICAgZlZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKGZOYW1lKTsKLSAgICAgICAgd3JpdGVIZWFkZXJTZXBhcmF0b3Iob3V0KTsKLSAgICAgICAgb3V0LndyaXRlKGZWYWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9NZXNzYWdlQm9keS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9NZXNzYWdlQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTUyNWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvTWVzc2FnZUJvZHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHk7Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5IGltcGxlbWVudHMgSU1lc3NhZ2VCb2R5IHsKLSAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGZNZXNzYWdlQm9keTsKLSAgICBwcml2YXRlIGZpbmFsIFNvY2tldFRpbWVvdXRSZXRyeUlucHV0U3RyZWFtIGZNZXNzYWdlQm9keVNvY2tldFRpbWVvdXRSZXRyeTsKLQotICAgIHByaXZhdGUgaW50IGZDb250ZW50TGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbWVzc2FnZSBib2R5IG9mIGNvbnRlbnQgbGVuZ3RoIGVuY29kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dCb2R5Ci0gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGgKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUJvZHkoSW5wdXRTdHJlYW0gbXNnQm9keSwgaW50IGNvbnRlbnRMZW5ndGgpIHsKLSAgICAgICAgZk1lc3NhZ2VCb2R5ID0gbXNnQm9keTsKLSAgICAgICAgZk1lc3NhZ2VCb2R5U29ja2V0VGltZW91dFJldHJ5ID0gbmV3IFNvY2tldFRpbWVvdXRSZXRyeUlucHV0U3RyZWFtKG1zZ0JvZHkpOwotICAgICAgICBmQ29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7Ci0gICAgICAgIGlzQ2h1bmtlZEVuY29kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbWVzc2FnZSBib2R5IG9mIGNodW5rZWQgZW5jb2RpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0JvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUJvZHkoSW5wdXRTdHJlYW0gbXNnQm9keSkgewotICAgICAgICBmTWVzc2FnZUJvZHkgPSBtc2dCb2R5OwotICAgICAgICBmTWVzc2FnZUJvZHlTb2NrZXRUaW1lb3V0UmV0cnkgPSBuZXcgU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0obXNnQm9keSk7Ci0gICAgICAgIGZDb250ZW50TGVuZ3RoID0gLTE7Ci0gICAgICAgIGlzQ2h1bmtlZEVuY29kaW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSU1lc3NhZ2VCb2R5I2dldENvbnRlbnRMZW5ndGgoKQotCSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZDb250ZW50TGVuZ3RoOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHkjaXNDaHVua2VkRW5jb2RpbmcoKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gaXNDaHVua2VkRW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklNZXNzYWdlQm9keSNnZXRNZXNzYWdlQm9keVRpbWVvdXRJbnB1dFN0cmVhbSgpCi0JICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldE1lc3NhZ2VCb2R5VGltZW91dElucHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gZk1lc3NhZ2VCb2R5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHkjZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpCi0JICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBmTWVzc2FnZUJvZHlTb2NrZXRUaW1lb3V0UmV0cnk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIk1lc3NhZ2VCb2R5WyIpOwotICAgICAgICBpZiAoaXNDaHVua2VkRW5jb2RpbmcpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiY2h1bmtlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJDb250ZW50TGVuZ3RoPSIpLmFwcGVuZChmQ29udGVudExlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvUHVzaGJhY2tNZXNzYWdlQm9keS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9QdXNoYmFja01lc3NhZ2VCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDU3M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9QdXNoYmFja01lc3NhZ2VCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklQdXNoYmFja01lc3NhZ2VCb2R5OwotCi0KLQotcHVibGljIGNsYXNzIFB1c2hiYWNrTWVzc2FnZUJvZHkgZXh0ZW5kcyBNZXNzYWdlQm9keSBpbXBsZW1lbnRzIElQdXNoYmFja01lc3NhZ2VCb2R5IHsKLSAgICBwcml2YXRlIGZpbmFsIFB1c2hiYWNrSW5wdXRTdHJlYW0gcHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBvZiBjb250ZW50IGxlbmd0aCBlbmNvZGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnQm9keQotICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoCi0gICAgICovCi0gICAgUHVzaGJhY2tNZXNzYWdlQm9keShJbnB1dFN0cmVhbSBtc2dCb2R5SW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHVzaGJhY2tCdWZmZXJzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRlbnRMZW5ndGgpIHsKLSAgICAgICAgc3VwZXIobXNnQm9keUlucHV0U3RyZWFtLCBjb250ZW50TGVuZ3RoKTsKLSAgICAgICAgdGhpcy5wdXNoYmFja0lucHV0U3RyZWFtID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oc3VwZXIuZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoYmFja0J1ZmZlcnNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG1lc3NhZ2UgYm9keSBvZiBjaHVua2VkIGVuY29kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dCb2R5Ci0gICAgICovCi0gICAgUHVzaGJhY2tNZXNzYWdlQm9keShJbnB1dFN0cmVhbSBtc2dCb2R5SW5wdXRTdHJlYW0sIGludCBwdXNoYmFja0J1ZmZlcnNpemUpIHsKLSAgICAgICAgc3VwZXIobXNnQm9keUlucHV0U3RyZWFtKTsKLSAgICAgICAgdGhpcy5wdXNoYmFja0lucHV0U3RyZWFtID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oc3VwZXIuZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoYmFja0J1ZmZlcnNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRNZXNzYWdlQm9keUlucHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gcHVzaGJhY2tJbnB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSVB1c2hiYWNrTWVzc2FnZUJvZHkjZ2V0TWVzc2FnZUJvZHlQdXNoQmFja0lucHV0U3RyZWFtKCkKLQkgKi8KLSAgICBwdWJsaWMgUHVzaGJhY2tJbnB1dFN0cmVhbSBnZXRNZXNzYWdlQm9keVB1c2hCYWNrSW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBwdXNoYmFja0lucHV0U3RyZWFtOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvUmVxdWVzdERpc3BhdGNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvUmVxdWVzdERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MzUwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL1JlcXVlc3REaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5UaW1lb3V0RXhjZXB0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXF1ZXN0RGlzcGF0Y2hlciBleHRlbmRzIFRocmVhZCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVxdWVzdERpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZklkOwotCi0gICAgLyoqIE1lc3NhZ2Ugd2hpY2gganVzdCBhcnJpdmVkIGZyb20gYSBjbGllbnQgKi8KLSAgICBwcml2YXRlIEZpeGVkU2l6ZVF1ZXVlIGZBcnJpdmVkTXNnczsKLQotICAgIHByaXZhdGUgSUhUVFBSZXF1ZXN0TWVzc2FnZSBmTmV4dE1zZyA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU2Vzc2lvbiBmU2Vzc2lvbjsKLQotICAgIHByb3RlY3RlZCBSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgbmFtZSwgU2Vzc2lvbiBzZXNzaW9uLCBJQ2xpZW50Q29ubmVjdGlvbiBjbGllbnQsIFNvY2tldCBjbGllbnRTb2NrLCBpbnQgcXVldWVTaXplKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICB0aGlzLmZTZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgZklkID0gY2xpZW50U29jay5nZXRQb3J0KCk7Ci0gICAgICAgIGZBcnJpdmVkTXNncyA9IG5ldyBGaXhlZFNpemVRdWV1ZShxdWV1ZVNpemUpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGludCBnZXREaXNwYXRjaGVySWQoKSB7Ci0gICAgICAgIHJldHVybiBmSWQ7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXRSZXF1ZXN0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZBcnJpdmVkTXNncy5wdXQocmVxLCB0aW1lb3V0KTsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlJlcXVlc3QgcmVjZWl2ZWQgZnJvbSBhIGNsaWVudDogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInRpZD0iKS5hcHBlbmQocmVxLmdldFRpZCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtc2dTZXJpYWw9IikuYXBwZW5kKHJlcS5nZXRTZXJpYWwoKSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgc2IuYXBwZW5kKCJcbltbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tcbiIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgcmVxLndyaXRlKG8pOwotICAgICAgICAgICAgICAgIG8uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9ub3AKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXVxuIik7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQ2FsbGVkIGJ5IFNlcnZlckNvbm5lY3Rpb25zCi0gICAgc3luY2hyb25pemVkIGJvb2xlYW4gcmVzcG9uc2VBcnJpdmVkKFNlcnZlckNvbm5lY3Rpb24gY29ubiwgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJSZXNwb25zZSBhcnJpdmVkIGZyb20gYSBzZXJ2ZXIgKCIpLmFwcGVuZChjb25uKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKTogdGlkPSIpLmFwcGVuZChyZXNwb25zZS5nZXRUaWQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgbXNnU2VyaWFsPSIpLmFwcGVuZChyZXNwb25zZS5nZXRTZXJpYWwoKSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgc2IuYXBwZW5kKCJcbjw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGUobyk7Ci0gICAgICAgICAgICAgICAgby5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL25vcAotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCJcbj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5cbiIpOwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIERFQlVHKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gcmVjZWl2ZWQgPSBmU2Vzc2lvbi5yZWNlaXZlUmVzcG9uc2UocmVzcG9uc2UpOwotICAgICAgICBpZiAocmVjZWl2ZWQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG1zZ1RvU3RyaW5nKElIVFRQTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOyAKLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiKHNlcj0iKS5hcHBlbmQobXNnLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLHRpZD0iKS5hcHBlbmQobXNnLmdldFRpZCgpKS5hcHBlbmQoJyknKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGR1bXBNZXNzYWdlcygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIlNlbnQ9IikuYXBwZW5kKG1zZ1RvU3RyaW5nKGZTZXNzaW9uLmdldFJlcXVlc3RNZXNzYWdlKCkpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIE5leHQ9IikuYXBwZW5kKG1zZ1RvU3RyaW5nKGZOZXh0TXNnKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBBcnJpdmVkPSIpLmFwcGVuZChmQXJyaXZlZE1zZ3MuZ2V0U2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEhUVFBSZXF1ZXN0UmVhZGVyIGNyZWF0ZUhUVFBSZXF1ZXN0UmVhZGVyKElucHV0U3RyZWFtIGlzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSFRUUFJlcXVlc3RSZWFkZXIoaXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSFRUUFJlc3BvbnNlUmVhZGVyIGNyZWF0ZUhUVFBSZXNwb25zZVJlYWRlcihJbnB1dFN0cmVhbSBpcykgewotICAgICAgICByZXR1cm4gbmV3IEhUVFBSZXNwb25zZVJlYWRlcihnZXREaXNwYXRjaGVySWQoKSwgaXMpOwotICAgIH0KLSAgICAgICAgCi0gICAgLy8gQ2FsbGVkIG9ubHkgYnkgcnVuKCkKLSAgICBwcm90ZWN0ZWQgSUhUVFBSZXF1ZXN0TWVzc2FnZSBnZXROZXh0UmVxdWVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmTmV4dE1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBERUJVRygiUmV1c2UgdGhlIHNhbWUgcmVxdWVzdCIpOwotICAgICAgICAgICAgcmV0dXJuIGZOZXh0TXNnOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZk5leHRNc2cgPSAoSUhUVFBSZXF1ZXN0TWVzc2FnZSkgZkFycml2ZWRNc2dzLnJlbW92ZSgpOwotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkZpbGxlZCBhIG1lc3NhZ2U6IG1zZ1NlcmlhbD0iICsgZk5leHRNc2cuZ2V0U2VyaWFsKCkgKyAiLCB0aWQ9IiArIGZOZXh0TXNnLmdldFRpZCgpKTsKLSAgICAgICAgICAgICAgICBERUJVRyhkdW1wTWVzc2FnZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZk5leHRNc2c7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhck5leHRSZXF1ZXN0KCkgewotICAgICAgICBmTmV4dE1zZyA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0U2Vzc2lvbkFuZFNlbmRSZXF1ZXN0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwgU2VydmVyQ29ubmVjdGlvbiBjb25uLCBsb25nIHRpbWVvdXQpCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZTZXNzaW9uLnN0YXJ0KHJlcXVlc3QpOwotICAgICAgICBjb25uLnB1dFJlcXVlc3QocmVxdWVzdCwgdGltZW91dCk7Ci0gICAgfSAgICAgICAgICAgCi0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIERFQlVHKCJDbG9zaW5nIGEgUmVxdWVzdERpc3BhdGNoZXIiKTsKLSAgICAgICAgdGhpcy5pbnRlcnJ1cHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiUmVxdWVzdERpc3BhdGNoZXItIikuYXBwZW5kKGZJZCk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBERUJVRyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgV0FSTklORyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotICAgICAgICBMT0dHRVIud2FybmluZyhzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBJTkZPKFN0cmluZyBtc2cpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0gICAgICAgIExPR0dFUi5pbmZvKHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvU2VydmVyQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9TZXJ2ZXJDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmJjM2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9TZXJ2ZXJDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuVGltZW91dEV4Y2VwdGlvbjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJDb25uZWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNlcnZlckNvbm5lY3Rpb24uY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU29ja2V0T3BlbmVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIFNlcnZlckNvbm5lY3Rpb24gZlNvY2tldFJlY2VpdmVyOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZIb3N0OwotCi0gICAgICAgIHByaXZhdGUgaW50IGZQb3J0OwotCi0gICAgICAgIHByaXZhdGUgaW50IGZTT1RpbWVvdXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQ7Ci0KLSAgICAgICAgU29ja2V0T3BlbmVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHNvVGltZW91dCwgU2VydmVyQ29ubmVjdGlvbiBzb2NrZXRSZWNlaXZlcikgewotICAgICAgICAgICAgZkhvc3QgPSBob3N0OwotICAgICAgICAgICAgZlBvcnQgPSBwb3J0OwotICAgICAgICAgICAgZlNPVGltZW91dCA9IHNvVGltZW91dDsKLSAgICAgICAgICAgIGZTb2NrZXRSZWNlaXZlciA9IHNvY2tldFJlY2VpdmVyOwotICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWxpZChib29sZWFuIHYpIHsKLSAgICAgICAgICAgIGlzVmFsaWQgPSB2OwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZlNvY2tldFJlY2VpdmVyLkRFQlVHKCJTb2NrZXRPcGVuZXIgc3RhcnRlZCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTb2NrZXQgc29jayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIuREVCVUcoIlRyeWluZyB0byBjcmVhdGUgYSBTb2NrZXQ6ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzb2NrID0gbmV3IFNvY2tldChmSG9zdCwgZlBvcnQpOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2NrID0gbmV3IFNvY2tldCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2NrLnNldFNvVGltZW91dCgoaW50KSBmU09UaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc29jay5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBTb2NrZXRBZGRyZXNzIGRlc3QgPSBuZXcKLSAgICAgICAgICAgICAgICAgICAgLy8gSW5ldFNvY2tldEFkZHJlc3MoZkluZm8uZ2V0SG9zdCgpLCBmSW5mby5nZXRQb3J0KCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2NrLmNvbm5lY3QoZGVzdCwgKGludCkgZlNPVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2suc2V0U29UaW1lb3V0KDEpOwotICAgICAgICAgICAgICAgICAgICBvdXQgPSBzb2NrLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBpbiA9IHNvY2suZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIuREVCVUcoIkNyZWF0ZWQgYSBTb2NrZXQ6ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc29jayAhPSBudWxsICYmIG91dCAhPSBudWxsICYmIGluICE9IG51bGwgJiYgaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZlNvY2tldFJlY2VpdmVyLkRFQlVHKCJTZXQgYSBTb2NrZXQgdG8gdGhlIFNlcnZlckNvbm5lY3Rpb246ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIubm90aWZ5Q29ubmVjdGVkKHNvY2ssIG91dCwgaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIuREVCVUcoIkZhaWxlZCB0byBjcmVhdGUgYSBTb2NrZXQgKCIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIik6ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIubm90aWZ5Q29ubmVjdEZhaWxlZChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0dXMgewotICAgICAgICBwcml2YXRlIGludCBmU3RhdCA9IFNUQVRfSU5JVDsKLQotICAgICAgICBwcml2YXRlIGludCBmTnVtV2FpdGVycyA9IDA7Ci0KLSAgICAgICAgU3RhdHVzKCkgewotICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoaW50IHN0YXQpIHsKLSAgICAgICAgICAgIGZTdGF0ID0gc3RhdDsKLSAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgaW50IGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmU3RhdDsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhpbnQgc3RhdCkgewotICAgICAgICAgICAgcmV0dXJuIChmU3RhdCA9PSBzdGF0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCBib29sZWFuIHdhaXRGb3IoaW50IHN0YXQsIGxvbmcgdGltZW91dCkKLSAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoZlN0YXQgPT0gc3RhdCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoZlN0YXQgPT0gU1RBVF9DTE9TRUQpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZk51bVdhaXRlcnMgKz0gMTsKLSAgICAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0gICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgd2hpbGUgKHdhaXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53YWl0KHdhaXQpOwotICAgICAgICAgICAgICAgIGlmIChmU3RhdCA9PSBzdGF0KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoZlN0YXQgPT0gU1RBVF9DTE9TRUQpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB3YWl0ID0gZGVhZGxpbmUgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgc3dpdGNoIChmU3RhdCkgewotICAgICAgICAgICAgY2FzZSBTVEFUX0NMT1NFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkNMT1NFRCI7Ci0gICAgICAgICAgICBjYXNlIFNUQVRfSU5JVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIklOSVQiOwotICAgICAgICAgICAgY2FzZSBTVEFUX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUSU5HIjsKLSAgICAgICAgICAgIGNhc2UgU1RBVF9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNURUQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua293biI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUX0NMT1NFRCA9IC0yOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVF9GSU5BTElaSU5HID0gLTE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUX0lOSVQgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVF9DT05ORUNUSU5HID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRfQ09OTkVDVEVEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgU2VydmVyS2V5IGZLZXk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLSAgICAgICAgcmV0dXJuIGhvc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0RGlzcGF0Y2hlciBmRGlzcGF0Y2hlcjsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IGZSZXRyeVRpbWU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCB0aW1lb3V0OwotCi0gICAgcHJpdmF0ZSBsb25nIGZBY3RpdmF0ZWRUaW1lOwotCi0gICAgcHJpdmF0ZSBUaHJlYWQgZlRocmVhZDsKLQotICAgIHByaXZhdGUgU29ja2V0T3BlbmVyIGZTb2NrZXRPcGVuZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBUaHJlYWQgZlNvY2tldE9wZW5lclRocmVhZCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElIVFRQUmVxdWVzdE1lc3NhZ2UgZlJlcXVlc3Q7Ci0KLSAgICBwcml2YXRlIGxvbmcgZkZpcnN0VGltZW91dCA9IDA7Ci0KLSAgICBwcml2YXRlIFNvY2tldCBmU29ja2V0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZlNvY2tldEV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbSA9IG51bGw7Ci0KLSAgICBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIGZJbnB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGZPdXRwdXRTdHJlYW0gPSBudWxsOwotCi0gICAgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIGZPdXRwdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIVFRQUmVzcG9uc2VSZWFkZXIgZlJlYWRlciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGxvbmcgZk1lc3NhZ2VTZXJpYWw7Ci0KLSAgICBwcml2YXRlIFN0YXR1cyBmU3RhdCA9IG5ldyBTdGF0dXMoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXJ2ZXJDb25uZWN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCBncm91cCwgaW50IGluZGV4LCBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyLAotICAgICAgICAgICAgaW50IHJldHJ5VGltZSwgaW50IHRpbWVvdXQpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKLSAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICAgICAgZktleSA9IG5ldyBTZXJ2ZXJLZXkoZ3JvdXAsIGluZGV4KTsKLSAgICAgICAgZlJldHJ5VGltZSA9IHJldHJ5VGltZTsKLSAgICAgICAgZkRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyOwotICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICAgICAgICBmUmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIGZNZXNzYWdlU2VyaWFsID0gMDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSFRUUFJlc3BvbnNlTWVzc2FnZSBjcmVhdGVIVFRQUmVzcG9uc2VNZXNzYWdlKGxvbmcgbXNnU2VyaWFsKTsKLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICAgc2V0U3RhdChTVEFUX0lOSVQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2ZXJLZXkgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gZktleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0gICAgICAgIHJldHVybiAoZlRocmVhZCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLyBzeW5jaHJvbml6ZWQKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWN0aXZhdGUoKSB7Ci0gICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBERUJVRygiYWN0aXZhdGU6IGFscmVhZHkgYWN0aXZlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUcoImFjdGl2YXRlIik7Ci0gICAgICAgIHNldFN0YXQoU1RBVF9DT05ORUNUSU5HKTsKLSAgICAgICAgZkFjdGl2YXRlZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZk1lc3NhZ2VTZXJpYWwgPSAwOwotICAgICAgICBzZXRUaW1lb3V0KGZhbHNlKTsKLSAgICAgICAgZlRocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgIlNlcnZlckNvbm5lY3Rpb24tIiArIG5hbWUpOwotICAgICAgICBmVGhyZWFkLnN0YXJ0KCk7Ci0KLSAgICAgICAgZlNvY2tldCA9IG51bGw7Ci0gICAgICAgIGZTb2NrZXRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBmT3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgZlJlYWRlciA9IG51bGw7Ci0KLSAgICAgICAgZlNvY2tldE9wZW5lciA9IG5ldyBTb2NrZXRPcGVuZXIoaG9zdCwgcG9ydCwgKGludCkgdGltZW91dCAqIDIsIHRoaXMpOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkID0gbmV3IFRocmVhZChmU29ja2V0T3BlbmVyLCAiU29ja2V0T3BlbmVyLSIgKyB0aGlzLnRvU3RyaW5nKCkpOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGVBbmRDb25uZWN0KGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFjdGl2YXRlKCk7Ci0gICAgICAgIHdhaXRVbnRpbENvbm5lY3RlZCh0aW1lb3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxDb25uZWN0ZWQobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgREVCVUcoIndhaXRVbnRpbENvbm5lY3RlZCIpOwotICAgICAgICBpbnQgc3RhdDsKLSAgICAgICAgc3luY2hyb25pemVkIChmU3RhdCkgewotICAgICAgICAgICAgaWYgKGZTdGF0LmVxdWFscyhTVEFUX0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgICAgICAgZlN0YXQud2FpdEZvcihTVEFUX0NPTk5FQ1RFRCwgdGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ID0gZlN0YXQuZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXQgPT0gU1RBVF9DT05ORUNURUQpIHsKLSAgICAgICAgICAgIERFQlVHKCJjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ID09IFNUQVRfQ09OTkVDVElORykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlNlcnZlckNvbm5lY3Rpb24ud2FpdFVudGlsQ29ubmVjdGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdCA9PSBTVEFUX0lOSVQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhpcyBjb25uZWN0aW9uIGlzIG5vdCBhY3RpdmF0ZWQgeWV0Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdCA9PSBTVEFUX0NMT1NFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGlzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYWN0aXZhdGUgdGhpcyBjb25uZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWFjdGl2YXRlKCkgewotICAgICAgICBERUJVRygiZGVhY3RpdmF0ZSIpOwotICAgICAgICBpZiAoIWlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIERFQlVHKCJkZWFjdGl2YXRlOiBhbHJlYWR5IGRlYWN0aXZlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdG9wIHRoZSB0aHJlYWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmU29ja2V0ICE9IG51bGwgJiYgIWZTb2NrZXQuaXNPdXRwdXRTaHV0ZG93bigpKSB7Ci0gICAgICAgICAgICAgICAgZlNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIFdBUk5JTkcoIkZhaWxlZCB0byBzaHV0ZG93biBhIHNvY2tldCAoSU9FeGNlcHRpb24pOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZUaHJlYWQuaW50ZXJydXB0KCk7Ci0gICAgICAgIGZUaHJlYWQgPSBudWxsOwotCi0gICAgICAgIGZTb2NrZXRPcGVuZXIuc2V0VmFsaWQoZmFsc2UpOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkLmludGVycnVwdCgpOwotCi0gICAgICAgIGZTb2NrZXRPcGVuZXIgPSBudWxsOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkID0gbnVsbDsKLSAgICAgICAgZlNvY2tldCA9IG51bGw7Ci0gICAgICAgIGZPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBmUmVhZGVyID0gbnVsbDsKLQotICAgICAgICBmQWN0aXZhdGVkVGltZSA9IDA7Ci0gICAgICAgIGZNZXNzYWdlU2VyaWFsID0gMDsKLSAgICAgICAgc2V0VGltZW91dChmYWxzZSk7Ci0gICAgICAgIHNldFN0YXQoU1RBVF9DTE9TRUQpOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUNvbm5lY3RlZChTb2NrZXQgc29jaywgT3V0cHV0U3RyZWFtIG91dCwgSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgaWYgKHNvY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIERFQlVHKCJzZXRTb2NrZXQiKTsKLSAgICAgICAgZlNvY2tldCA9IHNvY2s7Ci0gICAgICAgIGZTb2NrZXRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBmT3V0cHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBTb2NrZXRUaW1lb3V0UmV0cnlPdXRwdXRTdHJlYW0ob3V0KSk7Ci0gICAgICAgIGZJbnB1dFN0cmVhbSA9IGluOwotICAgICAgICBmUmVhZGVyID0gZkRpc3BhdGNoZXIuY3JlYXRlSFRUUFJlc3BvbnNlUmVhZGVyKGluKTsKLSAgICAgICAgc2V0U3RhdChTVEFUX0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5Q29ubmVjdEZhaWxlZChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFdBUk5JTkcoInNldFNvY2tldEV4Y2VwdGlvbjogZmFpbGVkIHRvIGNyZWF0ZSBhIHNvY2tldCAoSU9FeGNlcHRpb24pOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICBmU29ja2V0ID0gbnVsbDsKLSAgICAgICAgZlNvY2tldEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIGZPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBmUmVhZGVyID0gbnVsbDsKLSAgICAgICAgZGVhY3RpdmF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lb3V0KGJvb2xlYW4gdGltZW91dCkgewotICAgICAgICBpZiAodGltZW91dCkgewotICAgICAgICAgICAgaWYgKGZGaXJzdFRpbWVvdXQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZGaXJzdFRpbWVvdXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZGaXJzdFRpbWVvdXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1RpbWVvdXQoKSB7Ci0gICAgICAgIHJldHVybiAoZkZpcnN0VGltZW91dCAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNJbnZhbGlkKCkgewotICAgICAgICBpZiAoZkZpcnN0VGltZW91dCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGZGaXJzdFRpbWVvdXQgPCBmUmV0cnlUaW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXQoKSB7Ci0gICAgICAgIHJldHVybiBmU3RhdC5nZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0U3RhdChpbnQgc3RhdCkgewotICAgICAgICBmU3RhdC5zZXQoc3RhdCk7Ci0gICAgfQotCi0gICAgLy8gc3luY2hyb25pemVkCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2Vzc2lvbihsb25nIG1zZ1NlcmlhbCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAoZk1lc3NhZ2VTZXJpYWwgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1zZ1NlcmlhbCA9PSBmTWVzc2FnZVNlcmlhbCkgewotICAgICAgICAgICAgICAgIC8vIEF2b2lkIHNlbmRpbmcgdGhlIHNhbWUgbWVzc2FnZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgbWVzc2FnZSB3aG9zZSByZXNwb25zZSBpcyBub3QgeWV0IGFycml2ZWQuCi0gICAgICAgICAgICAvLyBXYWl0IHVudGlsIGEgcmVzcG9uc2UgYXJyaXZlcywgb3IgdGltZW91dC4KLSAgICAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0gICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgd2hpbGUgKHdhaXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53YWl0KHdhaXQpOyAvLyA8LS0KLSAgICAgICAgICAgICAgICBpZiAoZk1lc3NhZ2VTZXJpYWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2FpdCA9IGRlYWRsaW5lIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZk1lc3NhZ2VTZXJpYWwgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJTZXJ2ZXJDb25uZWN0aW9uLnN0YXJ0U2Vzc2lvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIChmTWVzc2FnZVNlcmlhbCA9PSAwKSAmJiAoZk1lc3NhZ2VTZXJpYWwgIT0gbXNnU2VyaWFsKQotICAgICAgICBmTWVzc2FnZVNlcmlhbCA9IG1zZ1NlcmlhbDsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBERUJVRygiU2Vzc2lvbiBzdGFydGVkOiBtc2dTZXJpYWw9IiArIGZNZXNzYWdlU2VyaWFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGZpbmlzaFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIlNlc3Npb24gZmluaXNoZWQ6IG1zZ1NlcmlhbD0iICsgZk1lc3NhZ2VTZXJpYWwpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCAoZk1lc3NhZ2VTZXJpYWwgIT0gMCk7Ci0gICAgICAgIGZNZXNzYWdlU2VyaWFsID0gMDsgLy8gLS0+c3RhcnRTZXNzaW9uCi0gICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCBhIG1lc3NhZ2UgYXN5bmNocm9ub3VzbHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcQotICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXRSZXF1ZXN0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxLCBsb25nIHRpbWVvdXQpCi0gICAgICAgIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBERUJVRygicHV0UmVxdWVzdDogbXNnU2VyaWFsPSIgKyByZXEuZ2V0U2VyaWFsKCkgKyAiLCB0aWQ9IiArIHJlcS5nZXRUaWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZXNzaW9uU3RhcnRlZCA9IHN0YXJ0U2Vzc2lvbihyZXEuZ2V0U2VyaWFsKCksIHRpbWVvdXQpOwotICAgICAgICBhc3NlcnQgKHJlcS5nZXRTZXJpYWwoKSA9PSBmTWVzc2FnZVNlcmlhbCk7Ci0gICAgICAgIGlmIChzZXNzaW9uU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gZk1lc3NhZ2VTZXJpYWwgIT0gbnVsbAotICAgICAgICAgICAgZlJlcXVlc3QgPSByZXE7IC8vIC0tPm5leHRSZXF1ZXN0Ci0gICAgICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSFRUUFJlc3BvbnNlTWVzc2FnZSBnZXRSZXNwb25zZShsb25nIHRpbWVvdXQpIAotICAgICAgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIAotICAgICAgewotICAgICAgd2hpbGUgKGZSZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICB0aGlzLndhaXQoKTsKLSAgICAgIH0KLSAgICAgIEhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBmUmVzcG9uc2U7Ci0gICAgICBmUmVzcG9uc2UgPSBudWxsOwotICAgICAgZk1lc3NhZ2VTZXJpYWwgPSAwOyAgLy8tLT5zdGFydFNlc3Npb24gKHB1dFJlcXVlc3QpIAotICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgIH0KLSAgICAqLwotICAgICAgICAKLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBJSFRUUFJlcXVlc3RNZXNzYWdlIG5leHRSZXF1ZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKGZSZXF1ZXN0ID09IG51bGwgfHwgZk1lc3NhZ2VTZXJpYWwgPT0gMCkgewotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIm5leHRSZXF1ZXN0IHdhaXRpbmc6IHJlcXVlc3Q9IiArIGZSZXF1ZXN0ICsgIiwgbXNnU2VyaWFsPSIgKyBmTWVzc2FnZVNlcmlhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgICAvLyAoZlJlcXVlc3QgIT0gbnVsbCkgJiYgKGZNZXNzYWdlU2VyaWFsICE9IDApCi0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIm5leHRSZXF1ZXN0IHdhaXRpbmcgZG9uZTogcmVxdWVzdD0iICsgZlJlcXVlc3QgKyAiLCBtc2dTZXJpYWw9IiArIGZNZXNzYWdlU2VyaWFsKTsKLSAgICAgICAgfQotICAgICAgICBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSA9IGZSZXF1ZXN0OwotICAgICAgICBmUmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJldHVybiByZXE7Ci0gICAgfQotCi0gICAgLy8gcnVuKCkKLSAgICBwcml2YXRlIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlY2VpdmVSZXNwb25zZShsb25nIHRpbWVvdXQsIGJvb2xlYW4gaXNCb2R5RW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgSFRUUFJlc3BvbnNlUmVhZGVyIHJlYWRlcjsKLSAgICAgICAgbG9uZyBtc2dTZXJpYWw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgYXNzZXJ0IChmU3RhdC5lcXVhbHMoU1RBVF9DT05ORUNURUQpKSAmJiAoZlJlYWRlciAhPSBudWxsKSAmJiAoZk1lc3NhZ2VTZXJpYWwgIT0gMCk7Ci0gICAgICAgICAgICBpZiAoZlJlYWRlciA9PSBudWxsIHx8IGZNZXNzYWdlU2VyaWFsID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlYWN0aXZhdGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkZXIgPSBmUmVhZGVyOwotICAgICAgICAgICAgbXNnU2VyaWFsID0gZk1lc3NhZ2VTZXJpYWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiAoZk1lc3NhZ2VTZXJpYWwgPT0gMCkgewotICAgICAgICAvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIC8vIGxvbmcgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXQ7Ci0gICAgICAgIC8vIGxvbmcgd2FpdCA9IHRpbWVvdXQ7Ci0gICAgICAgIC8vIHdoaWxlICh3YWl0ID4gMCkgewotICAgICAgICAvLyB0aGlzLndhaXQod2FpdCk7Ci0gICAgICAgIC8vIGlmIChmTWVzc2FnZVNlcmlhbCAhPSAwKSB7Ci0gICAgICAgIC8vIGJyZWFrOwotICAgICAgICAvLyB9Ci0gICAgICAgIC8vIHdhaXQgPSBkZWFkbGluZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAvLyB9Ci0gICAgICAgIC8vIHRpbWVvdXQgLT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgLy8gfQotICAgICAgICAvLyBpZiAoZk1lc3NhZ2VTZXJpYWwgPT0gMCB8fCB0aW1lb3V0IDw9IDApIHsKLSAgICAgICAgLy8gdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlNlcnZlckNvbm5lY3Rpb24ucmVjZWl2ZVJlc3BvbnNlIik7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgLy8gKGZNZXNzYWdlU2VyaWFsICE9IDApICYmICh0aW1lb3V0ID4gMCkKLQotICAgICAgICBIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gY3JlYXRlSFRUUFJlc3BvbnNlTWVzc2FnZShtc2dTZXJpYWwpOwotICAgICAgICBERUJVRygiVHJ5IHRvIHJlYWQgcmVzcG9uc2UuLi4iKTsKLSAgICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHJlc3BvbnNlLCB0aW1lb3V0LCBpc0JvZHlFbXB0eSk7Ci0gICAgICAgIAotICAgICAgICAvLyAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJSZWNlaXZlZCBhIHJlc3BvbnNlOiBtc2dTZXJpYWw9IiArIHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjUmVzcG9uc2UgZnJvbSBzZXJ2ZXIgZ3JvdXAgIiArIGZHcm91cC5nZXRJbmRleCgpKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVzcG9uc2Uud3JpdGUoU3lzdGVtLm91dCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICAgICAgICBmSW5mby5kZWNyZW1lbnRQcm9jZXNzaW5nUmVxdWVzdCgpOwotICAgICAgICAvLyAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldEZGRlJlc3VsdENvZGUoKSA9PSBGRkZTZXJ2bGV0SGVhZGVyLlJDX1NVQ0NFU1MpIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgZkluZm8udXBkYXRlTGFzdEFjdGl2aXR5VGltZSgpOwotICAgICAgICAvLyAgICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNlbmRSZXF1ZXN0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoInNlbmRSZXF1ZXN0Li4uLiIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKHRpbWVvdXQpOwotICAgICAgICBhc3NlcnQgKGZPdXRwdXRTdHJlYW0gIT0gbnVsbCk7Ci0gICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgdGltZW91dCAtPSB0MSAtIHQwOwotICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigpOyAKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIlNlbnQgYSByZXF1ZXN0OiBtc2dTZXJpYWw9IiArIHJlcXVlc3QuZ2V0U2VyaWFsKCkgKyAiLCB0aWQ9IiArIHJlcXVlc3QuZ2V0VGlkKCkpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9iID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgQmlmdXJjYXRlZE91dHB1dFN0cmVhbSBvID0gbmV3IEJpZnVyY2F0ZWRPdXRwdXRTdHJlYW0oZk91dHB1dFN0cmVhbSwgb2IpOwotICAgICAgICAgICAgcmVxdWVzdC53cml0ZSh0aW1lb3V0LCBvKTsKLSAgICAgICAgICAgIG9iLmNsb3NlKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuPT09PT09PT09PT09PT09Pj09PT0+PT09PT49PT09Pj09PT09PT09PT09PT0+XG4iKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChvYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPT09PT09PT09PT09PT09PD09PT08PT09PTw9PT09PD09PT09PT09PT09PT08XG4iKTsKLSAgICAgICAgICAgIERFQlVHKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVxdWVzdC53cml0ZSh0aW1lb3V0LCBmT3V0cHV0U3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBmT3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0KLSAgICAgICAgZk1lc3NhZ2VTZXJpYWwgPSByZXF1ZXN0LmdldFNlcmlhbCgpOwotCi0gICAgICAgIC8vIGZJbmZvLmluY3JlbWVudFByb2Nlc3NpbmdSZXF1ZXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjaWV2ZXIgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIEtlZXAgdHJ5aW5nIHRvIHJlYWQgYSByZXNwb25zZSBhbmQKLSAgICAgKiBwYXNzIGl0IHRvIHRoZSBkaXNwYXRjaGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgREVCVUcoInJlY2VpdmVyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgIC8vIGxvbmcgbGFzdEFjdGl2aXR5VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiBzZXJ2ZXJFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSAmJiAhc2VydmVyRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBjb3VudGVyICs9IDE7Ci0gICAgICAgICAgICAgICAgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0ID0gbmV4dFJlcXVlc3QoKTsKLQotICAgICAgICAgICAgICAgIC8vIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5pc0Nvbm5lY3Rpb25TaHV0ZG93blJlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29ubmVjdGlvbkhlYWRlcihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVxdWVzdChyZXF1ZXN0LCB0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZTb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXQoU1RBVF9GSU5BTElaSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29ubmVjdGlvbkhlYWRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIHRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZJbmZvLm5vdGlmeVN1Y2Nlc3NmdWxTZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxhc3RBY3Rpdml0eVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoInNlbmRSZXF1ZXN0KCkgdGltZW91dCIpOwotICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgKGZTdGF0LmVxdWFscyhTVEFUX0NPTk5FQ1RFRCkgfHwgZlN0YXQuZXF1YWxzKFNUQVRfRklOQUxJWklORykpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVjaWV2ZSBhIHJlc3Bvc25lIGZyb20gdGhlIHNlcnZlcgotICAgICAgICAgICAgICAgIGludCBsb29wID0gMDsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSAmJiAhc2VydmVyRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJSZWNlaXZlUmVzcG9uc2UuLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gcmVjZWl2ZVJlc3BvbnNlKHRpbWVvdXQsIHJlcXVlc3QuaXNSZXNwb25zZUJvZHlFbXB0eSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudAotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIlJlc3BvbnNlQXJyaXZlZC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ29ubmVjdGlvblRvQmVDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJTaW5jZSB0aGUgcmVzcG9uc2UgaXMgbm90IGtlZXAtYWxpdmUsIHdlIGRvIG5vdCByZXVzZSB0aGlzIGNvbm5lY3Rpb24uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdChTVEFUX0ZJTkFMSVpJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZkRpc3BhdGNoZXIucmVzcG9uc2VBcnJpdmVkKHRoaXMsIHJlc3BvbnNlKTsgLy8gSW50ZXJydXB0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFNlc3Npb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoInJlc3BvbnNlIHJlY2VpdmluZyB0aW1lb3V0ICgiICsgdGltZW91dC5nZXRNZXNzYWdlKCkgKyAiKTogcmV0cnk9IiArIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZWxhcHNlZD0iICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb29wICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsYXkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXkgPiA2MCAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU2h1dGRvd24gdGhpcyBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEhUVFBDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCURFQlVHKCJUaGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgdGhlIHBlZXIuIik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERFQlVHKCJJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIEhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBuZXcgSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZShmTWVzc2FnZVNlcmlhbCwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZEaXNwYXRjaGVyLnJlc3BvbnNlQXJyaXZlZCh0aGlzLCByZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbnRlcnJ1cHRlZCkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluaXNoU2Vzc2lvbigpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBERUJVRygicmVhZGVyIHRocmVhZCBpbnRlcnJ1cHRlZCIpOwotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBERUJVRygicmVjZWl2ZXIgdGhyZWFkIHN0b3BwZWQiKTsKLSAgICAgICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKGhvc3QpLmFwcGVuZCgnOicpLmFwcGVuZChwb3J0KS5hcHBlbmQoJy4nKS5hcHBlbmQoZktleS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIERFQlVHKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmFtZSkuYXBwZW5kKCIgWyIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCJdICIpLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIFdBUk5JTkcoU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZChuYW1lKS5hcHBlbmQoIiBbIik7Ci0gICAgICAgIHNiLmFwcGVuZCh0aGlzLnRvU3RyaW5nKCkpLmFwcGVuZCgiXSAiKS5hcHBlbmQobXNnKTsKLSAgICAgICAgTE9HR0VSLndhcm5pbmcoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZHVtcCgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogc3RhdD0iKS5hcHBlbmQoZlN0YXQpOwotICAgICAgICBzYi5hcHBlbmQoIiwgdGhyZWFkPSIpOwotICAgICAgICBzYi5hcHBlbmQoKGZUaHJlYWQgPT0gbnVsbCkgPyAibnVsbCIgOiBCb29sZWFuLnRvU3RyaW5nKGZUaHJlYWQuaXNBbGl2ZSgpKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBzb2NrZXRPcGVuZXI9Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgoZlNvY2tldE9wZW5lciA9PSBudWxsKSA/ICJudWxsIiA6ICJleGlzdHMiKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIHNvY2tldE9wZW5lclRocmVhZD0iKTsKLSAgICAgICAgc2IuYXBwZW5kKChmU29ja2V0T3BlbmVyVGhyZWFkID09IG51bGwpID8gIm51bGwiIDogQm9vbGVhbi50b1N0cmluZyhmU29ja2V0T3BlbmVyVGhyZWFkLmlzQWxpdmUoKSkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgc29ja2V0PSIpOwotICAgICAgICBzYi5hcHBlbmQoKGZTb2NrZXQgPT0gbnVsbCkgPyAibnVsbCIgOiBCb29sZWFuLnRvU3RyaW5nKGZTb2NrZXQuaXNDb25uZWN0ZWQoKSkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgaW52YWxpZD0iKS5hcHBlbmQoaXNJbnZhbGlkKCkpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL1NlcnZlcktleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9TZXJ2ZXJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwMTAxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL1NlcnZlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJLZXkgewotCXByaXZhdGUgaW50IGZHcm91cElkOwotCXByaXZhdGUgaW50IGZTZXJ2ZXJJbmRleDsKLQkKLQlwdWJsaWMgU2VydmVyS2V5KGludCBncm91cCwgaW50IHNlcnZlcikgewotCQlmR3JvdXBJZCA9IGdyb3VwOwotCQlmU2VydmVySW5kZXggPSBzZXJ2ZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0R3JvdXBJZCgpIHsKLQkJcmV0dXJuIGZHcm91cElkOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNlcnZlckluZGV4KCkgewotCQlyZXR1cm4gZlNlcnZlckluZGV4OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIFNlcnZlcktleSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTZXJ2ZXJLZXkga2V5ID0gKFNlcnZlcktleSkgbzsKLQkJcmV0dXJuIChmR3JvdXBJZCA9PSBrZXkuZkdyb3VwSWQpIHx8IChmU2VydmVySW5kZXggPT0ga2V5LmZTZXJ2ZXJJbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChmR3JvdXBJZCA8PCAxNikgfCBmU2VydmVySW5kZXggfCAoZkdyb3VwSWQgPj4+IDE2KTsgCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmR3JvdXBJZCkpLmFwcGVuZCgnLicpLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZTZXJ2ZXJJbmRleCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL1Nlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ1Y2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvU2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuVGltZW91dEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbiB7Ci0gICAgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNlc3Npb24uY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgSUhUVFBSZXF1ZXN0TWVzc2FnZSBmUmVxdWVzdE1zZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSBmUmVzcG9uc2VNc2cgPSBudWxsOwotCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyBJSFRUUFJlcXVlc3RNZXNzYWdlIGdldFJlcXVlc3RNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gZlJlcXVlc3RNc2c7Ci0gICAgfQotICAgICAgICAKLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgc3RhcnQoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXEgPT0gZlJlcXVlc3RNc2cpIHsKLSAgICAgICAgICAgIC8vIFJlc3RhcnQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiQSBzZXNzaW9uIHN0YXJ0ZWQ6IHN0YXQ9IiArIGZSZXF1ZXN0TXNnICsgIiwgcmVxPSIgKyByZXEpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChmUmVxdWVzdE1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBmUmVxdWVzdE1zZyA9PSBudWxsCi0gICAgICAgIGZSZXF1ZXN0TXNnID0gcmVxOwotICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOyAvLyAtLT4gcmVjZWl2ZVJlc3BvbnNlKCkKLSAgICB9Ci0gICAgICAgIAotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBzdGFydChJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAocmVxID09IGZSZXF1ZXN0TXNnKSB7Ci0gICAgICAgICAgICAvLyBSZXN0YXJ0Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoIkEgc2Vzc2lvbiBzdGFydGVkOiBzdGF0PSIgKyBmUmVxdWVzdE1zZyArICIsIHJlcT0iICsgcmVxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZlJlcXVlc3RNc2cgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBkZWFkTGluZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLSAgICAgICAgICAgIGxvbmcgd2FpdCA9IHRpbWVvdXQ7Ci0gICAgICAgICAgICB3aGlsZSAod2FpdCA+IDApIHsKLSAgICAgICAgICAgICAgICB0aGlzLndhaXQod2FpdCk7ICAgIC8vIDwtLWdldEFuZFNlbmRSZXNwb25zZSgpCi0gICAgICAgICAgICAgICAgaWYgKGZSZXNwb25zZU1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3YWl0ID0gZGVhZExpbmUgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmUmVxdWVzdE1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlNlc3Npb24uc3RhcnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBmUmVxdWVzdE1zZyA9PSBudWxsCi0gICAgICAgIGZSZXF1ZXN0TXNnID0gcmVxOwotICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOyAvLyAtLT4gcmVjZWl2ZVJlc3BvbnNlKCkKLSAgICB9Ci0gICAgICAgIAotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgYm9vbGVhbiByZWNlaXZlUmVzcG9uc2UoSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmUmVxdWVzdE1zZyAhPSBudWxsICYmIGZSZXF1ZXN0TXNnLmdldFNlcmlhbCgpICE9IHJlc3BvbnNlLmdldFNlcmlhbCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGZSZXNwb25zZU1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgICBmUmVzcG9uc2VNc2cgPSByZXNwb25zZTsKLSAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsgLy8gLS0+IGdldEFuZFNlbmRSZXNwb25zZSgpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwcm90ZWN0ZWQgSUhUVFBSZXNwb25zZU1lc3NhZ2Ugd2FpdFJlc3BvbnNlKGxvbmcgdGltZW91dCkKLSAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZSZXNwb25zZU1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGRlYWRMaW5lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotICAgICAgICAgICAgbG9uZyB3YWl0ID0gdGltZW91dDsKLSAgICAgICAgICAgIHdoaWxlICh3YWl0ID4gMCkgewotICAgICAgICAgICAgICAgIHRoaXMud2FpdCh3YWl0KTsKLSAgICAgICAgICAgICAgICBpZiAoZlJlc3BvbnNlTXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdhaXQgPSBkZWFkTGluZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZSZXNwb25zZU1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlJlc3BvbnNlU3luYy5nZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBmUmVzcG9uc2VNc2cgIT0gbnVsbAotICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSA9IGZSZXNwb25zZU1zZzsKLSAgICAgICAgZlJlc3BvbnNlTXNnID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwcm90ZWN0ZWQgdm9pZCBub3RpZnlDb21wbGV0aW9uKCkgewotICAgICAgICBmUmVxdWVzdE1zZyA9IG51bGw7Ci0gICAgICAgIHRoaXMubm90aWZ5QWxsKCk7IC8vLS0+c3RhcnQoKQotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgZ2V0QW5kU2VuZFJlc3BvbnNlKElDbGllbnRDb25uZWN0aW9uIGNsaWVudCwgbG9uZyB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoImdldEFuZFNlbmRSZXNwb25zZTogZW50cmVyZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHQwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gd2FpdFJlc3BvbnNlKHRpbWVvdXQpOwotICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBIVFRQTWFsZm9ybWVkUmVzcG9uc2VNZXNzYWdlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoKEhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UpIHJlc3BvbnNlKS5nZXRJT0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgdGltZW91dCAtPSB0MSAtIHQwOwotICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7Ci0gICAgICAgICAgICB0aW1lb3V0ID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiZ2V0QW5kU2VuZFJlc3BvbnNlOiBnb3QgYSByZXNwb25zZSIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnQuc2VuZFJlc3BvbnNlKHRpbWVvdXQsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiZ2V0QW5kU2VuZFJlc3BvbnNlOiBzZW50IGEgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlDb21wbGV0aW9uKCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgZ2V0UmVzcG9uc2UobG9uZyB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSB3YWl0UmVzcG9uc2UodGltZW91dCk7Ci0gICAgICAgIG5vdGlmeUNvbXBsZXRpb24oKTsKLSAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZSkgewotICAgICAgICAgICAgdGhyb3cgKChIVFRQTWFsZm9ybWVkUmVzcG9uc2VNZXNzYWdlKSByZXNwb25zZSkuZ2V0SU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9Tb2NrZXRUaW1lb3V0UmV0cnlJbnB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvaW1wbC9Tb2NrZXRUaW1lb3V0UmV0cnlJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg0Zjc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzLnJlYWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZChJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzLnJlYWQoYnVmLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWQoSW5wdXRTdHJlYW0gaXMsIGJ5dGVbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBpcy5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW4uYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgICAgIGluLm1hcmsocmVhZGxpbWl0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gaW4ubWFya1N1cHBvcnRlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkKGluKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWQoaW4sIGJ1Zik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkKGluLCBidWYsIG9mZnNldCwgbGVuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW4uc2tpcChuKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgc3VwZXIoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvU29ja2V0VGltZW91dFJldHJ5T3V0cHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9pbXBsL1NvY2tldFRpbWVvdXRSZXRyeU91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmIzNWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL2ltcGwvU29ja2V0VGltZW91dFJldHJ5T3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTb2NrZXRUaW1lb3V0UmV0cnlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MsIGJ5dGVbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvcywgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmLCBvZmZzZXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvcywgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9zLndyaXRlKGIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2goU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZShvdXRwdXRTdHJlYW0sIGJ1Zik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlKG91dHB1dFN0cmVhbSwgYnVmLCBvZmZzZXQsIGxlbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlKG91dHB1dFN0cmVhbSwgYik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOwotIAotICAgIFNvY2tldFRpbWVvdXRSZXRyeU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JQ2xpZW50U3RhdGVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUNsaWVudFN0YXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RmMGQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JQ2xpZW50U3RhdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElDbGllbnRTdGF0ZU1hbmFnZXIgewotCi0JLy8gV2Ugc2hvdWxkIHVzZSByZWFkLXdyaXRlIGxvY2sgaW5zdGVhZCBvZiBtdXRleC4KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdXQoT2JqZWN0IHN0YXRlS2V5LCBPYmplY3Qgc3RhdGVWYWx1ZSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChPYmplY3Qgc3RhdGVLZXkpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQTG9jYWxTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUExvY2FsU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjA0MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQTG9jYWxTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBMb2NhbFNlcnZlciB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwcm9jZXNzUmVxdWVzdChpbnQgaWQsIElIVFRQUHJveHlDb25uZWN0aW9uIGZDbGllbnQsCi0JCQlJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QsIElIVFRQUHJveHlUcmFuc2NvZGVyIHRyYW5zY29kZXIpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNjQ5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IHsKLQlwdWJsaWMgSUhUVFBMb2NhbFNlcnZlciBuZXdJbnN0YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQUHJveHlDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBQcm94eUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyNzZmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBQcm94eUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJSFRUUFByb3h5Q29ubmVjdGlvbiBleHRlbmRzIElDbGllbnRDb25uZWN0aW9uIHsKLQotCXB1YmxpYyBhYnN0cmFjdCBJU2VjcmV0TWFuYWdlciBnZXRTZWNyZXRNYW5hZ2VyKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldExpc3RlblBvcnQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoSUNsaWVudFN0YXRlTWFuYWdlciBjbGllbnRTdGF0ZU1hbmFnZXIsCi0JCQlTb2NrZXQgY2xpZW50U29jaywgbG9uZyBrZWVwQWxpdmUsIGludCBpbml0U2VydmVyR3JvdXBJZHgpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBQcm94eVRyYW5zY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5VHJhbnNjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNhZDIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5VHJhbnNjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQUHJveHlUcmFuc2NvZGVyIHsKLQlwdWJsaWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgdHJhbnNjb2RlKGludCBpZCwgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBlZDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotcHVibGljIGludGVyZmFjZSBJSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkgewotCUlIVFRQUHJveHlUcmFuc2NvZGVyIG5ld0luc3RhbmNlKGludCBpZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWZkYTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQU2Vzc2lvbk92ZXJyaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyIHsKLQotCXB1YmxpYyBhYnN0cmFjdCBJSFRUUFJlcXVlc3RNZXNzYWdlIGdldFNlc3Npb25SZXF1ZXN0KCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUhUVFBSZXNwb25zZU1lc3NhZ2UgZ2V0U2Vzc2lvblJlc3BvbnNlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZXBsYWNlUmVxdWVzdChJQ2xpZW50U3RhdGVNYW5hZ2VyIGNzbSwKLQkJCUlIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVwbGFjZVJlc3BvbnNlKElDbGllbnRTdGF0ZU1hbmFnZXIgY3NtLAotCQkJSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LCBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSwKLQkJCWludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1ZjllYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkgewotCXB1YmxpYyBJSFRUUFNlc3Npb25PdmVycmlkZXIgbmV3SW5zdGFuY2UoaW50IGlkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JU2VjcmV0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lTZWNyZXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MjJjNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lTZWNyZXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZWNyZXRNYW5hZ2VyIHsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2VjcmV0KFN0cmluZyBpZCwgYm9vbGVhbiByZW1vdmUpOwotCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSByZXF1ZXN0U2VjcmV0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvaW1wbC9DbGllbnRTdGF0ZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9pbXBsL0NsaWVudFN0YXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmUzZDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9pbXBsL0NsaWVudFN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUNsaWVudFN0YXRlTWFuYWdlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRTdGF0ZU1hbmFnZXIgaW1wbGVtZW50cyBJQ2xpZW50U3RhdGVNYW5hZ2VyIHsKLSAgICBwcml2YXRlIE9iamVjdCBrZXk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBjbGllbnRTdGF0ZU1hbmFnZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBzdGF0ZU1hcDsKLQotICAgIC8vIFdlIHNob3VsZCB1c2UgcmVhZC13cml0ZSBsb2NrIGluc3RlYWQgb2YgbXV0ZXguCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JQ2xpZW50U3RhdGVNYW5hZ2VyI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXQoT2JqZWN0IHN0YXRlS2V5LCBPYmplY3Qgc3RhdGVWYWx1ZSkgewotICAgICAgICBzdGF0ZU1hcC5wdXQoc3RhdGVLZXksIHN0YXRlVmFsdWUpOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklDbGllbnRTdGF0ZU1hbmFnZXIjZ2V0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0KE9iamVjdCBzdGF0ZUtleSkgewotICAgICAgICByZXR1cm4gc3RhdGVNYXAuZ2V0KHN0YXRlS2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsaWVudFN0YXRlTWFuYWdlcihPYmplY3Qga2V5KSB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgICB0aGlzLnN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJQ2xpZW50U3RhdGVNYW5hZ2VyIGdldENsaWVudFN0YXRlTWFuYWdlcihPYmplY3Qga2V5KSB7Ci0gICAgICAgIElDbGllbnRTdGF0ZU1hbmFnZXIgY3NtID0gKElDbGllbnRTdGF0ZU1hbmFnZXIpIGNsaWVudFN0YXRlTWFuYWdlcnMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChjc20gPT0gbnVsbCkgewotICAgICAgICAgICAgY3NtID0gbmV3IENsaWVudFN0YXRlTWFuYWdlcihrZXkpOwotICAgICAgICAgICAgY2xpZW50U3RhdGVNYW5hZ2Vycy5wdXQoa2V5LCBjc20pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjc207Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvaW1wbC9IVFRQUHJveHlDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvaW1wbC9IVFRQUHJveHlDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjM1YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L2ltcGwvSFRUUFByb3h5Q29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LkV4dGVybmFsUHJveHlDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5IVFRQUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGwuQ2xpZW50Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbC5TZXJ2ZXJDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUNsaWVudFN0YXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSVNlY3JldE1hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIEhUVFBQcm94eUNvbm5lY3Rpb24gZXh0ZW5kcyBDbGllbnRDb25uZWN0aW9uIGltcGxlbWVudHMgSUhUVFBQcm94eUNvbm5lY3Rpb24gewotICAgIHByaXZhdGUgZmluYWwgSFRUUFByb3h5IGZQcm94eTsKLQotICAgIEhUVFBQcm94eSBnZXRQcm94eSgpIHsKLSAgICAgICAgcmV0dXJuIGZQcm94eTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlDb25uZWN0aW9uI2dldFNlY3JldE1hbmFnZXIoKQotCSAqLwotICAgIHB1YmxpYyBJU2VjcmV0TWFuYWdlciBnZXRTZWNyZXRNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gZlByb3h5LmdldFNlY3JldE1hbmFnZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgRXh0ZXJuYWxQcm94eUNvbmZpZyBnZXRFeHRlcm5hbFByb3h5Q29uZmlnKCl7Ci0gICAgCXJldHVybiBmUHJveHkuZ2V0RXh0ZXJuYWxQcm94eUNvbmZpZygpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlDb25uZWN0aW9uI2dldExpc3RlblBvcnQoKQotCSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGlzdGVuUG9ydCgpewotICAgIAlyZXR1cm4gZlByb3h5LmdldExpc3RlblBvcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCB0aW1lb3V0OwotCi0gICAgdm9pZCBub3RpZnlTdWNjZXNzZnVsU2VydmVyQ29ubmVjdGlvbihTZXJ2ZXJDb25uZWN0aW9uIGNvbm4pIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlDb25uZWN0aW9uI2luaXQob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5DbGllbnRTdGF0ZU1hbmFnZXIsIGphdmEubmV0LlNvY2tldCwgbG9uZywgaW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUNsaWVudFN0YXRlTWFuYWdlciBjbGllbnRTdGF0ZU1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICBTb2NrZXQgY2xpZW50U29jaywKLSAgICAgICAgICAgICAgICAgICAgIGxvbmcga2VlcEFsaXZlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRTZXJ2ZXJHcm91cElkeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2V0Q29ubmVjdGlvbk5hbWUoIkhUVFBQcm94eUNvbm5lY3Rpb24tIiArIGNsaWVudFNvY2suZ2V0UG9ydCgpKTsKLSAgICAgICAgc2V0Q29ubmVjdGlvbk5hbWUoIltpZDoiICsgY2xpZW50U29jay5nZXRQb3J0KCkgKyAiXSBIVFRQUHJveHlDb25uZWN0aW9uIik7Ci0gICAgICAgIEhUVFBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gbmV3IEhUVFBSZXF1ZXN0RGlzcGF0Y2hlcih0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U3RhdGVNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFF1ZXVlU2l6ZSgpLCB0aW1lb3V0KTsKLSAgICAgICAgSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5IGZhY3RvcnkgPSBmUHJveHkuZ2V0UHJveHlUcmFuc2NvZGVyRmFjdG9yeSgpOwotICAgICAgICBpZihmYWN0b3J5IT1udWxsKXsKLSAgICAgICAgCWRpc3BhdGNoZXIuc2V0VHJhbnNjb2RlcihmYWN0b3J5Lm5ld0luc3RhbmNlKGRpc3BhdGNoZXIuZ2V0RGlzcGF0Y2hlcklkKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpbml0SW50ZXJuYWwoY2xpZW50U29jaywga2VlcEFsaXZlLCB0aW1lb3V0LCBkaXNwYXRjaGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSFRUUFByb3h5Q29ubmVjdGlvbihIVFRQUHJveHkgZlByb3h5LCBpbnQgcXVldWVTaXplLCBpbnQgdGltZW91dCkgewotICAgICAgICBzdXBlcihmUHJveHksIHF1ZXVlU2l6ZSk7Ci0gICAgICAgIHRoaXMuZlByb3h5ID0gZlByb3h5OwotICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L2ltcGwvSFRUUFJlcXVlc3REaXNwYXRjaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvaW1wbC9IVFRQUmVxdWVzdERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0ZWI0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvaW1wbC9IVFRQUmVxdWVzdERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5FeHRlcm5hbFByb3h5Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGwuSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLkhlYWRlclRvQWRkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLlJlcXVlc3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLlNlcnZlckNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGwuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklDbGllbnRTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBMb2NhbFNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuUGFyc2VVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlRpbWVvdXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBIVFRQUmVxdWVzdERpc3BhdGNoZXIgZXh0ZW5kcyBSZXF1ZXN0RGlzcGF0Y2hlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlcgotCQkJLmdldExvZ2dlcihIVFRQUmVxdWVzdERpc3BhdGNoZXIuY2xhc3MpOwotCi0JcHJpdmF0ZSBmaW5hbCBJQ2xpZW50U3RhdGVNYW5hZ2VyIGNsaWVudFN0YXRlTWFuYWdlcjsKLQotCXByaXZhdGUgZmluYWwgSFRUUFByb3h5Q29ubmVjdGlvbiBmQ2xpZW50OwotCQotCXByaXZhdGUgZmluYWwgRXh0ZXJuYWxQcm94eUNvbmZpZyBmRXhQcm94eUNvbmY7Ci0KLQlwcml2YXRlIGZpbmFsIGludCB0aW1lb3V0OwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgaW50IEhUVFBfV0VMTF9LTk9XTl9QT1JUID0gODA7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgaW50IEhUVFBTX1dFTExfS05PV05fUE9SVCA9IDQ0MzsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENhY2hlQ29uZmlnIHsKLQkJcHVibGljIGZpbmFsIFN0cmluZyB1cmxQYXR0ZXJuOwotCQlwdWJsaWMgZmluYWwgYnl0ZVtdIGNvbnRyb2w7Ci0KLQkJcHVibGljIENhY2hlQ29uZmlnKFN0cmluZyB1cmxQYXR0ZXJuLCBTdHJpbmcgY29udHJvbCkgewotCQkJdGhpcy51cmxQYXR0ZXJuID0gdXJsUGF0dGVybjsKLQkJCXRoaXMuY29udHJvbCA9IGNvbnRyb2wuZ2V0Qnl0ZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENhY2hlQ29uZmlnW10gY2FjaGVDb25maWdzID0geyAvLyBuZXcKLQkJCQkJCQkJCQkJCQkvLyBDYWNoZUNvbmZpZygiaHR0cDovL2Rpc25leVxcLmdvXFwuY29tLy4qIiwKLQkJCQkJCQkJCQkJCQkvLyAibWF4LWFnZT0iICsgMjQgKiA2MCAqCi0JCQkJCQkJCQkJCQkJLy8gNjApLAotCW5ldyBDYWNoZUNvbmZpZygiaHR0cDovLy4qXFxhYmNuZXdzXFwuZ29cXC5jb20vVmlkZW8vLioiLCAibm8tY2FjaGUiKSB9OwotCi0JcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSBhZGRDYWNoZUNvbnRyb2woU3RyaW5nIHVyaVN0ciwKLQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlKSB7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiVToiICsgdXJpU3RyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZUNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh1cmlTdHIubWF0Y2hlcyhjYWNoZUNvbmZpZ3NbaV0udXJsUGF0dGVybikpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIm1hdGNoLXRvOiIgKyBjYWNoZUNvbmZpZ3NbaV0udXJsUGF0dGVybik7Ci0JCQkJcmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNBQ0hFX0NPTlRST0xfQSwKLQkJCQkJCWNhY2hlQ29uZmlnc1tpXS5jb250cm9sKTsKLQkJCQlyZXR1cm4gcmVzcG9uc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotCXByaXZhdGUgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyIG92ZXJyaWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJSFRUUExvY2FsU2VydmVyIGxvY2FsU2VydmVyID0gbnVsbDsKLQotCXB1YmxpYyBIVFRQUmVxdWVzdERpc3BhdGNoZXIoSFRUUFByb3h5Q29ubmVjdGlvbiBjbGllbnQsCi0JCQlJQ2xpZW50U3RhdGVNYW5hZ2VyIGNsaWVudFN0YXRlTWFuYWdlciwgU29ja2V0IGNsaWVudFNvY2ssCi0JCQlpbnQgcXVldWVTaXplLCBpbnQgdGltZW91dCkgewotCQlzdXBlcigiSFRUUFJlcXVlc3REaXNwYXRjaGVyLSIgKyBjbGllbnRTb2NrLmdldExvY2FsUG9ydCgpLAotCQkJCW5ldyBTZXNzaW9uKCksIGNsaWVudCwgY2xpZW50U29jaywgcXVldWVTaXplKTsKLQkJdGhpcy5mQ2xpZW50ID0gY2xpZW50OwotCQl0aGlzLmZFeFByb3h5Q29uZiA9IGNsaWVudC5nZXRFeHRlcm5hbFByb3h5Q29uZmlnKCk7Ci0JCXRoaXMuY2xpZW50U3RhdGVNYW5hZ2VyID0gY2xpZW50U3RhdGVNYW5hZ2VyOwotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQkKLQkJLy90aGlzLmxvY2FsU2VydmVyID0gbmV3IEhUVFBMb2NhbFNlcnZlclNXRihjbGllbnQuZ2V0U2VjcmV0TWFuYWdlcigpKTsKLQkJLy90aGlzLm92ZXJyaWRlciA9IG5ldyBTV0ZCb290bG9hZGVyKGdldERpc3BhdGNoZXJJZCgpKTsKLQotCQlJSFRUUExvY2FsU2VydmVyRmFjdG9yeSBsb2NhbFNlcnZlckZhY3RvcnkgPSBjbGllbnQuZ2V0UHJveHkoKS5nZXRMb2NhbFNlcnZlckZhY3RvcnkoKTsKLQkJSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBvdmVycmlkZXJGYWN0b3J5ID0gY2xpZW50LmdldFByb3h5KCkuZ2V0U2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkoKTsKLQkJCi0JCWlmKG51bGwhPWxvY2FsU2VydmVyRmFjdG9yeSl7Ci0JCQl0aGlzLmxvY2FsU2VydmVyID0gbG9jYWxTZXJ2ZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCX0KLQkJaWYobnVsbCE9b3ZlcnJpZGVyRmFjdG9yeSl7Ci0JCQl0aGlzLm92ZXJyaWRlciA9IG92ZXJyaWRlckZhY3RvcnkubmV3SW5zdGFuY2UoZ2V0RGlzcGF0Y2hlcklkKCkpOwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0xvY2FsU2VydmVyUmVxdWVzdChJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYobnVsbD09bG9jYWxTZXJ2ZXIpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBsb2NhbFNlcnZlci5wcm9jZXNzUmVxdWVzdChnZXREaXNwYXRjaGVySWQoKSwgZkNsaWVudCwgcmVxdWVzdCwKLQkJCQl0cmFuc2NvZGVyKTsKLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBzZXJ2ZXJDb25uZWN0aW9uQ2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEhUVFBTZXJ2ZXJDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0JCUhUVFBTZXJ2ZXJDb25uZWN0aW9uIHNjOwotCQlpbnQgbGVuID0gc2VydmVyQ29ubmVjdGlvbkNhY2hlLnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGxlbikgewotCQkJc2MgPSAoSFRUUFNlcnZlckNvbm5lY3Rpb24pIHNlcnZlckNvbm5lY3Rpb25DYWNoZS5nZXQoaSk7Ci0JCQlpZiAoaG9zdC5lcXVhbHMoc2MuZ2V0SG9zdCgpKSAmJiAocG9ydCA9PSBzYy5nZXRQb3J0KCkpKSB7Ci0JCQkJaWYgKHNjLmdldFN0YXQoKSA8IDApIHsKLQkJCQkJc2MuZGVhY3RpdmF0ZSgpOwotCQkJCQlzYyA9IEhUVFBTZXJ2ZXJDb25uZWN0aW9uLm5ld0Nvbm5lY3Rpb24odGhpcywgaG9zdCwgcG9ydCwKLQkJCQkJCQl0aW1lb3V0KTsKLQkJCQkJc2VydmVyQ29ubmVjdGlvbkNhY2hlLnNldChpLCBzYyk7Ci0JCQkJfQotCQkJCXJldHVybiBzYzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNjLmdldFN0YXQoKSA8IDApIHsKLQkJCQkJc2MuZGVhY3RpdmF0ZSgpOwotCQkJCQlzZXJ2ZXJDb25uZWN0aW9uQ2FjaGUucmVtb3ZlKGkpOwotCQkJCQlsZW4tLTsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNjID0gSFRUUFNlcnZlckNvbm5lY3Rpb24ubmV3Q29ubmVjdGlvbih0aGlzLCBob3N0LCBwb3J0LCB0aW1lb3V0KTsKLQkJc2VydmVyQ29ubmVjdGlvbkNhY2hlLmFkZChzYyk7Ci0JCXJldHVybiBzYzsKLQl9Ci0KLQlwcml2YXRlIEhUVFBTZXJ2ZXJDb25uZWN0aW9uIG5ld0Nvbm5lY3Rpb25Gb3JTZXJ2ZXIoCi0JCQlJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QsIGJvb2xlYW4gbW9kZUNvbm5lY3QpIHsKLQkJU3RyaW5nIGhvc3Q7Ci0JCWludCBwb3J0OwotCQlTdHJpbmcgdXJpU3RyID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJU3RyaW5nKCk7Ci0JCVN0cmluZyBhdXRob3JpdHkgPSBQYXJzZVVSSS5nZXRBdXRob3JpdHkodXJpU3RyKTsKLQkJSUhUVFBIZWFkZXIgaG9zdEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKElIVFRQSGVhZGVyLkhPU1RfQSk7Ci0JCWlmIChtb2RlQ29ubmVjdCkgewotCQkJaG9zdCA9IFBhcnNlVVJJLnBhcnNlSG9zdCh1cmlTdHIpOwotCQkJcG9ydCA9IFBhcnNlVVJJLnBhcnNlUG9ydCh1cmlTdHIsIEhUVFBTX1dFTExfS05PV05fUE9SVCk7Ci0JCX0gZWxzZSBpZiAoaG9zdEhlYWRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaG9zdFN0ciA9IG5ldyBTdHJpbmcoaG9zdEhlYWRlci5nZXRWYWx1ZSgpKTsKLQkJCWhvc3QgPSBQYXJzZVVSSS5wYXJzZUhvc3QoaG9zdFN0cik7Ci0JCQlwb3J0ID0gUGFyc2VVUkkucGFyc2VQb3J0KGhvc3RTdHIsIEhUVFBfV0VMTF9LTk9XTl9QT1JUKTsKLQkJfSBlbHNlIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIFVSSSB1cmkgPSBudWxsOyB0cnkgeyB1cmkgPSBuZXcgVVJJKHVyaVN0cik7IH0gY2F0Y2gKLQkJCSAqIChVUklTeW50YXhFeGNlcHRpb24gZSkgeyBXQVJOSU5HKCJVUkkgaXMgaW52YWxpZDoiICsgdXJpU3RyKTsKLQkJCSAqIHJldHVybiBudWxsOyB9IGhvc3QgPSB1cmkuZ2V0SG9zdCgpOyBwb3J0ID0gdXJpLmdldFBvcnQoKTsKLQkJCSAqLwotCQkJaG9zdCA9IFBhcnNlVVJJLnBhcnNlSG9zdChhdXRob3JpdHkpOwotCQkJcG9ydCA9IFBhcnNlVVJJLnBhcnNlUG9ydChhdXRob3JpdHksIEhUVFBfV0VMTF9LTk9XTl9QT1JUKTsKLQotCQkJSGVhZGVyVG9BZGQgaGVhZGVyID0gbmV3IEhlYWRlclRvQWRkKCk7Ci0JCQkvLyBoZWFkZXIuaW5pdChIVFRQSGVhZGVyLkhPU1QsIGhvc3QpOwotCQkJLy8gcmVxdWVzdC5hZGRIZWFkZXIoaGVhZGVyKTsKLQkJCXJlcXVlc3Quc2V0SGVhZGVyKElIVFRQSGVhZGVyLkhPU1RfQSwgaG9zdC5nZXRCeXRlcygpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChhdXRob3JpdHkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGFic1BhdGggPSBQYXJzZVVSSS5nZXRBYnNvbHV0ZVBhdGgodXJpU3RyKTsKLQkJCXJlcXVlc3Quc2V0UmVxdWVzdFVSSVN0cmluZyhhYnNQYXRoKTsKLQkJfQotCi0JCUlIVFRQSGVhZGVyIHBjSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoSUhUVFBIZWFkZXIuUFJPWFlfQ09OTkVDVElPTl9BKTsKLQkJaWYgKHBjSGVhZGVyICE9IG51bGwpIHsKLQkJCXBjSGVhZGVyLnNldFJlbW92ZWQodHJ1ZSk7Ci0JCQlyZXF1ZXN0LnNldEhlYWRlcihJSFRUUEhlYWRlci5DT05ORUNUSU9OX0EsIHBjSGVhZGVyLmdldFZhbHVlKCkpOwotCQl9Ci0KLQkJSUhUVFBIZWFkZXIgcHJhZ21hSGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoSUhUVFBIZWFkZXIuUFJBR01BX0EpOwotCQlpZiAocHJhZ21hSGVhZGVyICE9IG51bGwpCi0JCQlwcmFnbWFIZWFkZXIuc2V0UmVtb3ZlZCh0cnVlKTsKLQotCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbihob3N0LCBwb3J0KTsKLQl9Ci0KLQlwcml2YXRlIEhUVFBTZXJ2ZXJDb25uZWN0aW9uIG5ld0Nvbm5lY3Rpb25Gb3JQcm94eSgpIHsKLQkJcmV0dXJuIGdldENvbm5lY3Rpb24oZkV4UHJveHlDb25mLmdldEV4dGVybmFsUHJveHlIb3N0KCksIGZFeFByb3h5Q29uZgotCQkJCS5nZXRFeHRlcm5hbFByb3h5UG9ydCgpKTsKLQl9Ci0KLQlwcml2YXRlIElIVFRQUHJveHlUcmFuc2NvZGVyIHRyYW5zY29kZXIgPSBudWxsOwotCi0JcHVibGljIHZvaWQgc2V0VHJhbnNjb2RlcihJSFRUUFByb3h5VHJhbnNjb2RlciB0cmFuc2NvZGVyKSB7Ci0JCXRoaXMudHJhbnNjb2RlciA9IHRyYW5zY29kZXI7Ci0JfQotCi0JcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSB0cmFuc2NvZGUoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpIHsKLQkJaWYgKHRyYW5zY29kZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRyYW5zY29kZXIudHJhbnNjb2RlKGdldERpc3BhdGNoZXJJZCgpLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZW5kR2F0ZXdheVRpbWVvdXQoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KQotCQkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWZDbGllbnQuc2VuZFJlc3BvbnNlKG5ldyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxdWVzdAotCQkJCS5nZXRTZXJpYWwoKSwgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLCAiNTA0Ii5nZXRCeXRlcygpLAotCQkJCSJHYXRld2F5IFRpbWVvdXQiLmdldEJ5dGVzKCksCi0JCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UuRU1QVFlfQk9EWSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZW5kQmFkR2F0ZXdheShJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZkNsaWVudC5zZW5kUmVzcG9uc2UobmV3IEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0Ci0JCQkJLmdldFNlcmlhbCgpLCBJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsICI1MDIiLmdldEJ5dGVzKCksCi0JCQkJIkJhZCBHYXRld2F5Ii5nZXRCeXRlcygpLAotCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlLkVNUFRZX0JPRFkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VuZE5vdEZvdW5kKElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkKLQkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmQ2xpZW50Ci0JCQkJLnNlbmRSZXNwb25zZShuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcXVlc3QKLQkJCQkJCS5nZXRTZXJpYWwoKSwgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLCAiNDA0IgotCQkJCQkJLmdldEJ5dGVzKCksICJOb3QgRm91bmQiLmdldEJ5dGVzKCksCi0JCQkJCQlJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyBTZW5kZXIgdGhyZWFkLgotCQkvLyBQaWNrdXAgYSBtZXNzYWdlIChRdWV1ZWRNc2cgfCBSZXRyeU1zZykgYW5kCi0JCS8vIFRoZSBzZW50IHJlcXVlc3QgaXMgcHV0IGludG8gdGhlIHdhaXRpbmcgcXVldWUuCi0JCXRyeSB7Ci0JCQlJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QgPSBudWxsOwotCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBudWxsOwotCQkJU2VydmVyQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJLy8gR2V0IG5leHQgcmVxdWVzdAotCQkJCWlmIChyZXF1ZXN0ID09IG51bGwpIHsKLQkJCQkJREVCVUcoIlRyeWluZyB0byBnZXQgbmV4dCByZXF1ZXN0Iik7Ci0JCQkJCS8vIFdhaXQgd2hpbGUgKGZOZXh0TXNnID09IG51bGwgJiYgZlJldHJ5TXNnID09IG51bGwgJiYKLQkJCQkJLy8gZkFycml2ZWRNc2dzLmlzRW1wdHkoKSkKLQkJCQkJcmVxdWVzdCA9IGdldE5leHRSZXF1ZXN0KCk7Ci0JCQkJfQotCQkJCWFzc2VydCAocmVxdWVzdCAhPSBudWxsKTsKLQkJCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlzYi5hcHBlbmQoIm5leHRSZXF1ZXN0OiBtc2dTZXJpYWw9IikuYXBwZW5kKAotCQkJCQkJCXJlcXVlc3QuZ2V0U2VyaWFsKCkpOwotCQkJCQlzYi5hcHBlbmQoIiwgdGlkPSIpLmFwcGVuZChyZXF1ZXN0LmdldFRpZCgpKTsKLQkJCQkJREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCVN0cmluZyB1cmlTdHIgPSByZXF1ZXN0LmdldFJlcXVlc3RVUklTdHJpbmcoKTsKLQotCQkJCWJvb2xlYW4gbW9kZUNvbm5lY3Q7Ci0JCQkJaWYgKElIVFRQSGVhZGVyLk1FVEhPRF9DT05ORUNULmVxdWFscyhyZXF1ZXN0Ci0JCQkJCQkuZ2V0TWV0aG9kQXNTdHJpbmcoKSkpIHsKLQkJCQkJbW9kZUNvbm5lY3QgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vZGVDb25uZWN0ID0gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKG51bGwhPW92ZXJyaWRlciAmJiBvdmVycmlkZXIucmVwbGFjZVJlcXVlc3QoY2xpZW50U3RhdGVNYW5hZ2VyLCByZXF1ZXN0KSkgewotCQkJCQlyZXF1ZXN0ID0gb3ZlcnJpZGVyLmdldFNlc3Npb25SZXF1ZXN0KCk7Ci0JCQkJCXJlc3BvbnNlID0gb3ZlcnJpZGVyLmdldFNlc3Npb25SZXNwb25zZSgpOwotCQkJCQlpZiAocmVzcG9uc2UgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmQ2xpZW50LnNlbmRSZXNwb25zZSh0aW1lb3V0LCByZXNwb25zZSk7Ci0JCQkJCQkJZkNsaWVudC5ub3RpZnlTdWNjZXNzZnVsU2VydmVyQ29ubmVjdGlvbihjb25uKTsKLQkJCQkJCQlERUJVRygiU1VDQ0VTUyIpOwotCQkJCQkJfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJc2VuZEdhdGV3YXlUaW1lb3V0KHJlcXVlc3QpOwotCQkJCQkJCURFQlVHKCJUaW1lb3V0LiBGYWlsZWQgdG8gc2VuZCBhIFNXRiBib290bG9hZGVyIHRvIHRoZSBjbGllbnQuIik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXF1ZXN0ID0gbnVsbDsKLQkJCQkJCWNsZWFyTmV4dFJlcXVlc3QoKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwcm9jZXNzTG9jYWxTZXJ2ZXJSZXF1ZXN0KHJlcXVlc3QpKSB7Ci0JCQkJCXJlcXVlc3QgPSBudWxsOwotCQkJCQljbGVhck5leHRSZXF1ZXN0KCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIFNlbmQgYSByZXF1ZXN0IHRvIGEgc2VydmVyCi0JCQkJaWYgKGZFeFByb3h5Q29uZi5nZXRFeHRlcm5hbFByb3h5RmxhZygpKSB7Ci0JCQkJCWNvbm4gPSBuZXdDb25uZWN0aW9uRm9yUHJveHkoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb25uID0gbmV3Q29ubmVjdGlvbkZvclNlcnZlcihyZXF1ZXN0LCBtb2RlQ29ubmVjdCk7Ci0JCQkJfQotCQkJCWlmIChjb25uID09IG51bGwpIHsKLQkJCQkJcmVxdWVzdCA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQkJREVCVUcoIlRyeWluZyB0byBjb25uZWN0IHRvICIgKyBjb25uKTsKLQkJCQkJfQotCQkJCQljb25uLmFjdGl2YXRlQW5kQ29ubmVjdCh0aW1lb3V0KTsKLQkJCQkJaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJCQlERUJVRygiVHJ5aW5nIHRvIHNlbmQgYSByZXF1ZXN0IHRvICIgKyBjb25uKTsKLQkJCQkJfQotCQkJCQlpZiAoY29ubi5nZXRTdGF0KCkgPT0gU2VydmVyQ29ubmVjdGlvbi5TVEFUX0NPTk5FQ1RFRCkgewotCQkJCQkJaWYgKG1vZGVDb25uZWN0Ci0JCQkJCQkJCSYmICFmRXhQcm94eUNvbmYuZ2V0RXh0ZXJuYWxQcm94eUZsYWcoKSkgewotCQkJCQkJCWZDbGllbnQuYWxsb3dUdW5uZWwocmVxdWVzdCwgY29ubiwgdGltZW91dCk7Ci0JCQkJCQkJY2xlYXJOZXh0UmVxdWVzdCgpOwotCQkJCQkJCXJlcXVlc3QgPSBudWxsOwotCQkJCQkJCWNvbm4uZGVhY3RpdmF0ZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJc3RhcnRTZXNzaW9uQW5kU2VuZFJlcXVlc3QocmVxdWVzdCwgY29ubiwgdGltZW91dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmQ2xpZW50LnNlbmRSZXNwb25zZShuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJCQkJCQlyZXF1ZXN0LmdldFNlcmlhbCgpLAotCQkJCQkJCQlJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsCi0JCQkJCQkJCSI1MDMiLmdldEJ5dGVzKCksICJTZXJ2aWNlIFVuYXZhaWxhYmxlIgotCQkJCQkJCQkJCS5nZXRCeXRlcygpLAotCQkJCQkJCQlJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlERUJVRygiU2VudCBhIHJlcXVlc3QgdG8gIiArIGNvbm4pOwotCQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gdGltZW91dCkgewotCQkJCQlERUJVRygic2VuZFJlcXVlc3QoKSB0aW1lb3V0LCB0cnkgYWdhaW4iKTsKLQkJCQkJc2VuZEdhdGV3YXlUaW1lb3V0KHJlcXVlc3QpOwotCQkJCQljb25uLmRlYWN0aXZhdGUoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCURFQlVHKCJjb25uZWN0aW9uIGNsb3NlZCIpOwotCQkJCQlzZW5kTm90Rm91bmQocmVxdWVzdCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIEdldCBhIHJlc3BvbnNlIGZyb20gYSBzZXJ2ZXIsIGFuZCBzZW5kIGl0IGJhY2sgdG8gdGhlIGNsaWVudC4KLQkJCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJREVCVUcoIlRyeWluZyB0byByZWNlaXZlIGEgcmVzcG9uc2UgZnJvbSAiICsgY29ubik7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQkJCQkJcmVzcG9uc2UgPSBmU2Vzc2lvbi5nZXRSZXNwb25zZSh0aW1lb3V0KTsKLQkJCQkJcmVzcG9uc2UgPSBhZGRDYWNoZUNvbnRyb2wodXJpU3RyLCByZXNwb25zZSk7Ci0JCQkJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobW9kZUNvbm5lY3QpIHsKLQkJCQkJCQlpZiAoIjIwMCIuZXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1c0NvZGVBc1N0cmluZygpKSkgewotCQkJCQkJCQlmQ2xpZW50LmFsbG93VHVubmVsKHJlcXVlc3QsIGNvbm4sIHRpbWVvdXQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWZDbGllbnQuc2VuZFJlc3BvbnNlKDAsIHJlc3BvbnNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIG5ld1Jlc3BvbnNlID0gdHJhbnNjb2RlKAotCQkJCQkJCQkJcmVxdWVzdCwgcmVzcG9uc2UpOwotCQkJCQkJCWlmIChudWxsIT1vdmVycmlkZXIgJiYgb3ZlcnJpZGVyLnJlcGxhY2VSZXNwb25zZSgKLQkJCQkJCQkJCWNsaWVudFN0YXRlTWFuYWdlciwgcmVxdWVzdCwgcmVzcG9uc2UsCi0JCQkJCQkJCQl0aW1lb3V0KSkgewotCQkJCQkJCQluZXdSZXNwb25zZSA9IG92ZXJyaWRlcgotCQkJCQkJCQkJCS5nZXRTZXNzaW9uUmVzcG9uc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZkNsaWVudC5zZW5kUmVzcG9uc2UodGltZW91dCwgbmV3UmVzcG9uc2UpOwotCQkJCQkJfQotCi0JCQkJCQlyZXF1ZXN0ID0gbnVsbDsKLQkJCQkJCWNsZWFyTmV4dFJlcXVlc3QoKTsKLQkJCQkJCWZDbGllbnQubm90aWZ5U3VjY2Vzc2Z1bFNlcnZlckNvbm5lY3Rpb24oY29ubik7Ci0KLQkJCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNVQ0NFU1NcbiIpOwotCQkJCQkJCXNiLmFwcGVuZCgiUmVjZWl2ZWQgYSByZXNwb25zZSBmcm9tICIpLmFwcGVuZChjb25uKTsKLQkJCQkJCQlERUJVRyhzYi50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCQlzZW5kR2F0ZXdheVRpbWVvdXQocmVxdWVzdCk7Ci0JCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJc2IKLQkJCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJCQkiVGltZW91dC4gRmFpbGVkIHRvIHNlbmQvcmVjZWl2ZSBhIG1lc3NhZ2UgdG8gYSBzZXJ2ZXIgKCIpCi0JCQkJCQkJCS5hcHBlbmQoY29ubik7Ci0JCQkJCQlzYi5hcHBlbmQoIikgVHJ5IGFub3RoZXIgc2VydmVyLiIpOwotCQkJCQkJREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJLy8gVE9ETwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKGZDbGllbnQuaXNIYW5kbGluZ1JlcXVlc3QoKSkgewotCQkJCQkJc2VuZEJhZEdhdGV3YXkocmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJLy8gY29ubi5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGludGVycnVwdGVkKSB7Ci0JCQkvLyBub3AKLQkJCURFQlVHKCJJbnRlcnJ1cHRlZCIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlERUJVRygiUmVxdWVzdERpc3BhdGNoZXIgaXMgc3RvcHBlZCBieSBJT0V4Y2VwdGlvbi4iKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJLy8gZkNsaWVudC5yZXNldENvbm5lY3Rpb24oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWludCBsZW4gPSBzZXJ2ZXJDb25uZWN0aW9uQ2FjaGUuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCUhUVFBTZXJ2ZXJDb25uZWN0aW9uIGMgPSAoSFRUUFNlcnZlckNvbm5lY3Rpb24pIHNlcnZlckNvbm5lY3Rpb25DYWNoZQotCQkJCQkJLmdldChpKTsKLQkJCQljLmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCURFQlVHKCJSZXF1ZXN0RGlzcGF0Y2hlciBzdG9wcGVkIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIHNiLmFwcGVuZCgiSFRUUFJlcXVlc3REaXNwYXRjaGVyLSIpLmFwcGVuZChnZXREaXNwYXRjaGVySWQoKSk7Ci0JCXNiLmFwcGVuZCgiW2lkOiIpLmFwcGVuZChnZXREaXNwYXRjaGVySWQoKSkuYXBwZW5kKAotCQkJCSJdIEhUVFBSZXF1ZXN0RGlzcGF0Y2hlciIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBERUJVRyhTdHJpbmcgbXNnKSB7Ci0JCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotCQkJTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgV0FSTklORyhTdHJpbmcgbXNnKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotCQlMT0dHRVIud2FybmluZyhzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBJTkZPKFN0cmluZyBtc2cpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0JCUxPR0dFUi5pbmZvKHNiLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9pbXBsL0hUVFBTZXJ2ZXJDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvaW1wbC9IVFRQU2VydmVyQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhiODAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9pbXBsL0hUVFBTZXJ2ZXJDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbC5IVFRQUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLkhUVFBSZXNwb25zZVN0cmVhbU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLmltcGwuU2VydmVyQ29ubmVjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSFRUUFNlcnZlckNvbm5lY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJDb25uZWN0aW9uIHsKLSAgICBwcml2YXRlIEhUVFBTZXJ2ZXJDb25uZWN0aW9uKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgSFRUUFJlcXVlc3REaXNwYXRjaGVyIGRpc3BhdGNoZXIsIGludCByZXRyeVRpbWUsIGludCB0aW1lb3V0KSB7Ci0gICAgICAgIHN1cGVyKCJbaWQ6IiArIGRpc3BhdGNoZXIuZ2V0RGlzcGF0Y2hlcklkKCkgKyAiXSBIVFRQU2VydmVyQ29ubmVjdGlvbiIsIGhvc3QsIHBvcnQsIDAsIDAsIGRpc3BhdGNoZXIsCi0gICAgICAgICAgICAgICAgcmV0cnlUaW1lLCB0aW1lb3V0KTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgSFRUUFNlcnZlckNvbm5lY3Rpb24gbmV3Q29ubmVjdGlvbihIVFRQUmVxdWVzdERpc3BhdGNoZXIgZGlzcGF0Y2hlciwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgewotICAgICAgICByZXR1cm4gbmV3IEhUVFBTZXJ2ZXJDb25uZWN0aW9uKGhvc3QsIHBvcnQsIGRpc3BhdGNoZXIsIHRpbWVvdXQsIHRpbWVvdXQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIVFRQUmVzcG9uc2VNZXNzYWdlIGNyZWF0ZUhUVFBSZXNwb25zZU1lc3NhZ2UobG9uZyBtc2dTZXJpYWwpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIVFRQUmVzcG9uc2VTdHJlYW1NZXNzYWdlKG1zZ1NlcmlhbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvQ2FjaGVNYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0NhY2hlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMmM3MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvQ2FjaGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2FjaGVNYXAgZXh0ZW5kcyBUcmVlTWFwIGltcGxlbWVudHMgTWFwIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NjgxMTMxNjQ3OTMxODIxMDUyTDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1heFNpemU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXZpY3RTaXplOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBhY2Nlc3NMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsgCi0KLSAgICBwdWJsaWMgQ2FjaGVNYXAoaW50IG1heFNpemUsIGludCBldmljdFNpemUpIHsKLSAgICAgICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTsKLSAgICAgICAgdGhpcy5ldmljdFNpemUgPSBldmljdFNpemU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV2aWN0KCkgewotICAgICAgICBJdGVyYXRvciBpdCA9IGFjY2Vzc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmljdFNpemU7IGkrKykgewotICAgICAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHJldHVybjsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICB0aGlzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBzZWFyY2hBY2Nlc3NMaXN0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGFjY2Vzc0xpc3QuaW5kZXhPZihrZXkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY2Nlc3NFbnRyeShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGludCBpZHggPSBzZWFyY2hBY2Nlc3NMaXN0KGtleSk7Ci0gICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgYWNjZXNzTGlzdC5yZW1vdmUoaWR4KTsKLSAgICAgICAgfQotICAgICAgICBhY2Nlc3NMaXN0LmFkZChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWwpIHsKLSAgICAgICAgaWYgKHNpemUoKSA+PSBtYXhTaXplKSBldmljdCgpOwotICAgICAgICBhY2Nlc3NFbnRyeShrZXkpOwotICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIGFjY2Vzc0VudHJ5KGtleSk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1hdGNoU3RhcnRzV2l0aChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIFNvcnRlZE1hcCBzbWFwID0gc3VwZXIudGFpbE1hcChwcmVmaXgpOwotICAgICAgICBPYmplY3Qgb2tleTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9rZXkgPSBzbWFwLmZpcnN0S2V5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEob2tleSBpbnN0YW5jZW9mIFN0cmluZykpIHJldHVybiBudWxsOwotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgb2tleTsKLSAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJNU1c6IiArIGtleSArICIgLyAiICsgcHJlZml4KTsKLSAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldChrZXkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0hUVFBVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9IVFRQVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjZlNzkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0hUVFBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLkhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuaW1wbC5IVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbjsKLQotcHVibGljIGNsYXNzIEhUVFBVdGlsIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEZhaWxlZFRvQ2xpZW50KElIVFRQUHJveHlDb25uZWN0aW9uIGZDbGllbnQsCi0JCQlJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbixJT0V4Y2VwdGlvbiB7Ci0JCWZDbGllbnQuc2VuZFJlc3BvbnNlKG5ldyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxdWVzdAotCQkJCQkJLmdldFNlcmlhbCgpLCBJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsICI0MDQiCi0JCQkJCQkuZ2V0Qnl0ZXMoKSwgIk5vdCBmb3VuZCIuZ2V0Qnl0ZXMoKSwKLQkJCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlLkVNUFRZX0JPRFkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElIVFRQUmVzcG9uc2VNZXNzYWdlIGNyZWF0ZUhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZSgKLQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIGJhc2UsIGJ5dGVbXSBib2R5KSB7Ci0JCXJldHVybiBuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKGJhc2UsIGJvZHkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJbG9uZyBzZXJpYWwsIGJ5dGVbXSB2ZXJzaW9uLCBieXRlW10gc3RhdHVzQ29kZSwKLQkJCWJ5dGVbXSByZWFzb25QaHJhc2UsIGJ5dGVbXSBib2R5KSB7Ci0JCXJldHVybiBuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHNlcmlhbCwgdmVyc2lvbiwgc3RhdHVzQ29kZSwgcmVhc29uUGhyYXNlLCBib2R5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIGNyZWF0ZUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZShJSFRUUFJlc3BvbnNlTWVzc2FnZSBiYXNlLAotICAgICAgICAgICAgaW50IHB1c2hiYWNrQnVmZmVyU2l6ZSl7Ci0JCXJldHVybiBuZXcgSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlKGJhc2UsIHB1c2hiYWNrQnVmZmVyU2l6ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9JT2JqZWN0UG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvSU9iamVjdFBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NDVmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9JT2JqZWN0UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU9iamVjdFBvb2wgewotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0gICAgYm9vbGVhbiBhZGQoT2JqZWN0IG8pOwotICAgIE9iamVjdCB0YWtlKCk7Ci0gICAgT2JqZWN0IHRha2UoaW50IHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0lXb3JrcGlsZUNvbnRyb2xsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0lXb3JrcGlsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViMmM2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9JV29ya3BpbGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJV29ya3BpbGVDb250cm9sbGVyIHsKLSAgICB2b2lkIGlucHV0KFJ1bm5hYmxlIHdvcmspOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmMGI4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlnUHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFBST1BfTE9HR0lOR19DT05GSUdVUkFUSU9OID0gbmFtZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST1BfTE9HR0lOR19DT05GSUdVUkFUSU9OID0gImh0dHBwcm94eS5jb25mLmxvZ2dpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OID0gImxvZ2dpbmcuY29uZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc05hbWU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRMb2dnZXIoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXIoY2xhenopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmUoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzTmFtZSA9IG5hbWU7Ci0gICAgICAgIFN0cmluZyBjb25maWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9MT0dHSU5HX0NPTkZJR1VSQVRJT04sIERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWcpOwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLnJlYWRDb25maWd1cmF0aW9uKGluKTsKLQotICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWcpOwotICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBGaWxlIG5vdCBmb3VuZCAiICsgY29uZmlnKTsKLSAgICAgICAgICAgIAlleGNlcHRpb24gPSBlOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBDYW5ub3QgcmVhZCBmaWxlICIgKyBjb25maWcpOwotICAgICAgICAgICAgCWV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgbCA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoIiIpOwotICAgICAgICBsLnNldExldmVsKExldmVsLkFMTCk7Ci0KLSAgICAgICAgLy9TZXQgYSBGaWxlSGFuZGxlci4uLiBkaXNhYmxlZCBub3cuIFdlIGNhbiB1c2UgQ2hhaW5zYXcgb3Igc29tZSBvdGhlciBsb2cgdmlld2VycyB2aWEgbmV0d29yay4KLSAgICAgICAgLy9zZXRGaWxlSGFuZGxlcihsLCBuYW1lLCBwcm9wcyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgCXRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmUoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGNvbmZpZ0lTKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc05hbWUgPSBuYW1lOwotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbmZpZ0lTICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkucmVhZENvbmZpZ3VyYXRpb24oY29uZmlnSVMpOwotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBGaWxlIG5vdCBmb3VuZCAiICsgY29uZmlnKTsKLSAgICAgICAgICAgIAlleGNlcHRpb24gPSBlOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBDYW5ub3QgcmVhZCBmaWxlICIgKyBjb25maWcpOwotICAgICAgICAgICAgCWV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgbCA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoIiIpOwotICAgICAgICBsLnNldExldmVsKExldmVsLkFMTCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotLyoKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEZpbGVIYW5kbGVyKGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlciBsLCBTdHJpbmcgbmFtZSwgUHJvcGVydGllcyBwcm9wcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBwcm9wcy5nZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIucGF0dGVybiIsICJsb2dzLyVzXyV1LmxvZyIpOwotICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKCIlcyIsIG5hbWUpOwotICAgICAgICBIYW5kbGVyIGZpbGVIYW5kbGVyID0gbmV3IEZpbGVIYW5kbGVyKHBhdHRlcm4pOwotICAgICAgICBTdHJpbmcgZm9ybWF0dGVyTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIiKTsKLSAgICAgICAgaWYgKGZvcm1hdHRlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzcyBmb3JtYXR0ZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoZm9ybWF0dGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBmb3JtYXR0ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRm9ybWF0dGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVIYW5kbGVyLnNldEZvcm1hdHRlcigoRm9ybWF0dGVyKSBvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vZmlsZUhhbmRsZXIuc2V0TGV2ZWwoTGV2ZWwuQUxMKTsKLSAgICAgICAgLy9sLmFkZEhhbmRsZXIoZmlsZUhhbmRsZXIpOwotICAgICAgICBmaW5hbCBNZW1vcnlIYW5kbGVyIG1oID0gbmV3IE1lbW9yeUhhbmRsZXIoZmlsZUhhbmRsZXIsIDEwMDAsIExldmVsLkFMTCk7Ci0gICAgICAgIGwuYWRkSGFuZGxlcihtaCk7Ci0KLSAgICAgICAgVGltZXIgdGltZXIgPSBuZXcgVGltZXIodHJ1ZSk7Ci0gICAgICAgIHRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbWgucHVzaCgpOwotICAgICAgICAgICAgICAgIG1oLmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDAsIDEwMDBMKTsKLSAgICB9Ci0qLwotCi0gICAgcHJpdmF0ZSBmaW5hbCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgZkRlbGVnYXRlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZOYW1lOwotCi0gICAgcHJpdmF0ZSBMb2dnZXIoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgZk5hbWUgPSBzTmFtZTsKLSAgICAgICAgZkRlbGVnYXRlID0gamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyLmdldExvZ2dlcihjbGF6ei5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVidWdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZkRlbGVnYXRlLmlzTG9nZ2FibGUoTGV2ZWwuRklORSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNZXRob2RUcmFjaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZEZWxlZ2F0ZS5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjcmVhdGVNZXNzYWdlKFN0cmluZyBtc2cpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAvL3NiLmFwcGVuZCgnWycpOwotICAgICAgICAvL3NiLmFwcGVuZChmTmFtZSk7Ci0gICAgICAgIC8vc2IuYXBwZW5kKCJdICIpOwotICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW50ZXJpbmcoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLSAgICAgICAgZkRlbGVnYXRlLmVudGVyaW5nKGZEZWxlZ2F0ZS5nZXROYW1lKCksIG1ldGhvZE5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGFycmF5VG9TdHJpbmcoT2JqZWN0IG9iajEpIHsKLSAgICAgICAgaWYgKCFvYmoxLmdldENsYXNzKCkuaXNBcnJheSgpIHx8IG9iajEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG9iajE7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0W10gb2JqcyA9IChPYmplY3RbXSkgb2JqMTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChhcnJheVRvU3RyaW5nKG9ianNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW50ZXJpbmcoU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBvYmoxKSB7Ci0gICAgICAgIGlmIChvYmoxICE9IG51bGwgJiYgb2JqMS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgb2JqMSA9IGFycmF5VG9TdHJpbmcob2JqMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZkRlbGVnYXRlLmVudGVyaW5nKGZEZWxlZ2F0ZS5nZXROYW1lKCksIG1ldGhvZE5hbWUsIG9iajEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVudGVyaW5nKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgaWYgKG9iajEgIT0gbnVsbCAmJiBvYmoxLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmoxID0gYXJyYXlUb1N0cmluZyhvYmoxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajIgPSBhcnJheVRvU3RyaW5nKG9iajIpOwotICAgICAgICB9Ci0gICAgICAgIGZEZWxlZ2F0ZS5lbnRlcmluZyhmRGVsZWdhdGUuZ2V0TmFtZSgpLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10geyBvYmoxLCBvYmoyIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVudGVyaW5nKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIsIE9iamVjdCBvYmozKSB7Ci0gICAgICAgIGlmIChvYmoxICE9IG51bGwgJiYgb2JqMS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgb2JqMSA9IGFycmF5VG9TdHJpbmcob2JqMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmoyID0gYXJyYXlUb1N0cmluZyhvYmoyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqMyAhPSBudWxsICYmIG9iajMuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajMgPSBhcnJheVRvU3RyaW5nKG9iajMpOwotICAgICAgICB9Ci0gICAgICAgIGZEZWxlZ2F0ZS5lbnRlcmluZyhmRGVsZWdhdGUuZ2V0TmFtZSgpLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10geyBvYmoxLCBvYmoyLCBvYmozIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVudGVyaW5nKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIsIE9iamVjdCBvYmozLCBPYmplY3Qgb2JqNCkgewotICAgICAgICBpZiAob2JqMSAhPSBudWxsICYmIG9iajEuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajEgPSBhcnJheVRvU3RyaW5nKG9iajEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmoyICE9IG51bGwgJiYgb2JqMi5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgb2JqMiA9IGFycmF5VG9TdHJpbmcob2JqMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iajMgIT0gbnVsbCAmJiBvYmozLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmozID0gYXJyYXlUb1N0cmluZyhvYmozKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqNCAhPSBudWxsICYmIG9iajQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajQgPSBhcnJheVRvU3RyaW5nKG9iajQpOwotICAgICAgICB9Ci0gICAgICAgIGZEZWxlZ2F0ZS5lbnRlcmluZyhmRGVsZWdhdGUuZ2V0TmFtZSgpLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10geyBvYmoxLCBvYmoyLCBvYmozLCBvYmo0IH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4aXRpbmcoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLSAgICAgICAgZkRlbGVnYXRlLmV4aXRpbmcoZkRlbGVnYXRlLmdldE5hbWUoKSwgbWV0aG9kTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhpdGluZyhTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IG9iajEpIHsKLSAgICAgICAgaWYgKG9iajEgIT0gbnVsbCAmJiBvYmoxLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmoxID0gYXJyYXlUb1N0cmluZyhvYmoxKTsKLSAgICAgICAgfQotICAgICAgICBmRGVsZWdhdGUuZXhpdGluZyhmRGVsZWdhdGUuZ2V0TmFtZSgpLCBtZXRob2ROYW1lLCBvYmoxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGl0aW5nKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgaWYgKG9iajEgIT0gbnVsbCAmJiBvYmoxLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmoxID0gYXJyYXlUb1N0cmluZyhvYmoxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajIgPSBhcnJheVRvU3RyaW5nKG9iajIpOwotICAgICAgICB9Ci0gICAgICAgIGZEZWxlZ2F0ZS5leGl0aW5nKGZEZWxlZ2F0ZS5nZXROYW1lKCksIG1ldGhvZE5hbWUsIG5ldyBPYmplY3RbXSB7IG9iajEsIG9iajIgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhpdGluZyhTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyLCBPYmplY3Qgb2JqMykgewotICAgICAgICBpZiAob2JqMSAhPSBudWxsICYmIG9iajEuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajEgPSBhcnJheVRvU3RyaW5nKG9iajEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmoyICE9IG51bGwgJiYgb2JqMi5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgb2JqMiA9IGFycmF5VG9TdHJpbmcob2JqMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iajMgIT0gbnVsbCAmJiBvYmozLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmozID0gYXJyYXlUb1N0cmluZyhvYmozKTsKLSAgICAgICAgfQotICAgICAgICBmRGVsZWdhdGUuZXhpdGluZyhmRGVsZWdhdGUuZ2V0TmFtZSgpLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10geyBvYmoxLCBvYmoyLCBvYmozIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4aXRpbmcoU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMiwgT2JqZWN0IG9iajMsIE9iamVjdCBvYmo0KSB7Ci0gICAgICAgIGlmIChvYmoxICE9IG51bGwgJiYgb2JqMS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgb2JqMSA9IGFycmF5VG9TdHJpbmcob2JqMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBvYmoyID0gYXJyYXlUb1N0cmluZyhvYmoyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqMyAhPSBudWxsICYmIG9iajMuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIG9iajMgPSBhcnJheVRvU3RyaW5nKG9iajMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmo0ICE9IG51bGwgJiYgb2JqNC5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgb2JqNCA9IGFycmF5VG9TdHJpbmcob2JqNCk7Ci0gICAgICAgIH0KLSAgICAgICAgZkRlbGVnYXRlLmV4aXRpbmcoZkRlbGVnYXRlLmdldE5hbWUoKSwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHsgb2JqMSwgb2JqMiwgb2JqMywgb2JqNCB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGxvZyBtZXNzYWdlIGZvciBzZXJpb3VzIHNpdHVhdGlvbi4KLSAgICAgKiBAcGFyYW0gbXNnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWwoU3RyaW5nIG1zZykgewotICAgICAgICBmRGVsZWdhdGUuc2V2ZXJlKGNyZWF0ZU1lc3NhZ2UobXNnKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmF0YWwoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICBzYi5hcHBlbmQoZHVtcFN0YWNrVHJhY2UoZSkpOwotICAgICAgICBmRGVsZWdhdGUuc2V2ZXJlKHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGEgbG9nIG1lc3NhZ2Ugbm90aWZ5aW5nIGEgcG90ZW50aWFsIHByb2JsZW0uCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIG1zZykgewotICAgICAgICBmRGVsZWdhdGUud2FybmluZyhjcmVhdGVNZXNzYWdlKG1zZykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICBzYi5hcHBlbmQoZHVtcFN0YWNrVHJhY2UoZSkpOwotICAgICAgICBmRGVsZWdhdGUud2FybmluZyhzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGxvZyBtZXNzYWdlIGZvciBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmZvKFN0cmluZyBtc2cpIHsKLSAgICAgICAgZkRlbGVnYXRlLmluZm8oY3JlYXRlTWVzc2FnZShtc2cpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGxvZyBtZXNzYWdlIGZvciBkZWJ1Zy4KLSAgICAgKiBAcGFyYW0gbXNnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG1zZykgewotICAgICAgICBmRGVsZWdhdGUuZmluZShjcmVhdGVNZXNzYWdlKG1zZykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlYnVnKFN0cmluZyBtc2csIFRocm93YWJsZSBlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKG1zZyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgc2IuYXBwZW5kKGR1bXBTdGFja1RyYWNlKGUpKTsKLSAgICAgICAgZkRlbGVnYXRlLmZpbmUoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYSBsb2cgbWVzc2FnZSBmb3IgZGVidWcuCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYnVnMihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGZEZWxlZ2F0ZS5maW5lc3QoY3JlYXRlTWVzc2FnZShtc2cpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZzIoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICBzYi5hcHBlbmQoZHVtcFN0YWNrVHJhY2UoZSkpOwotICAgICAgICBmRGVsZWdhdGUuZmluZXN0KHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGR1bXBTdGFja1RyYWNlKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcih3KTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICBwdy5mbHVzaCgpOwotICAgICAgICByZXR1cm4gdy5nZXRCdWZmZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9QYXJzZVVSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvUGFyc2VVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkOGNlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9QYXJzZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsOwotCi0KLXB1YmxpYyBjbGFzcyBQYXJzZVVSSSB7Ci0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yaXR5KFN0cmluZyB1cmkpIHsKLSAgICAgICAgaW50IHBvcyA9IHVyaS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPD0gKHBvcyArIDMpKSB7Ci0gICAgICAgICAgICAvLyBBdXRob3JpdHkgbmVlZHMgIjovLyIKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cmkuY2hhckF0KHBvcyArIDEpICE9ICcvJykgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmICh1cmkuY2hhckF0KHBvcyArIDIpICE9ICcvJykgcmV0dXJuIG51bGw7Ci0gICAgICAgIHBvcyArPSAzOwotICAgICAgICBpbnQgcG9zRW5kID0gdXJpLmluZGV4T2YoJy8nLCBwb3MpOwotICAgICAgICBpZiAocG9zRW5kID49IDApIHsKLSAgICAgICAgICAgIC8vIHNjaGVtZSAiOi8vIiBhdXRob3JpdHkgYWJzLXBhdGgKLSAgICAgICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHBvcywgcG9zRW5kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNjaGVtZSAiOi8vIiBhdXRob3JpdHkKLSAgICAgICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHBvcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHVyaSkgewotICAgICAgICBpbnQgcG9zID0gdXJpLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA8PSAocG9zICsgMykpIHsKLSAgICAgICAgICAgIC8vIEF1dGhvcml0eSBuZWVkcyAiOi8vIgotICAgICAgICAgICAgcmV0dXJuIHVyaTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXJpLmNoYXJBdChwb3MgKyAxKSAhPSAnLycpIHJldHVybiB1cmk7Ci0gICAgICAgIGlmICh1cmkuY2hhckF0KHBvcyArIDIpICE9ICcvJykgcmV0dXJuIHVyaTsKLSAgICAgICAgcG9zICs9IDM7Ci0gICAgICAgIGludCBwb3NFbmQgPSB1cmkuaW5kZXhPZignLycsIHBvcyk7Ci0gICAgICAgIGlmIChwb3NFbmQgPj0gMCkgewotICAgICAgICAgICAgLy8gc2NoZW1lICI6Ly8iIGF1dGhvcml0eSBhYnMtcGF0aAotICAgICAgICAgICAgcmV0dXJuIHVyaS5zdWJzdHJpbmcocG9zRW5kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNjaGVtZSAiOi8vIiBhdXRob3JpdHkKLSAgICAgICAgICAgIHJldHVybiAiLyI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBwYXJzZUhvc3QoU3RyaW5nIGhvc3RTdHIpIHsKLSAgICAgICAgaW50IHNlcElkeCA9IGhvc3RTdHIuaW5kZXhPZignOicpOwotICAgICAgICBpZiAoc2VwSWR4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIGhvc3RTdHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gaG9zdFN0ci5zdWJzdHJpbmcoMCwgc2VwSWR4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgaW50IHBhcnNlUG9ydChTdHJpbmcgaG9zdFN0ciwgaW50IGRlZmF1bHRQb3J0KSB7Ci0gICAgICAgIGludCBzZXBJZHggPSBob3N0U3RyLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKHNlcElkeCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UG9ydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0U3RyID0gaG9zdFN0ci5zdWJzdHJpbmcoc2VwSWR4ICsgMSkudHJpbSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwb3J0U3RyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRQb3J0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZWxpbWluYXRlUXVlcnkoU3RyaW5nIHVyaSkgewotICAgICAgICBpbnQgaWR4ID0gdXJpLmluZGV4T2YoJz8nKTsKLSAgICAgICAgaWYgKGlkeCA8IDApIHJldHVybiB1cmk7Ci0gICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKDAsIGlkeCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9UaHJvd2FibGVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9UaHJvd2FibGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODU0Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvVGhyb3dhYmxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgVGhyb3dhYmxlVXRpbCB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhY2tUcmFjZVRvU3RyaW5nKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3MpOwotICAgICAgICB0LnByaW50U3RhY2tUcmFjZShwcyk7Ci0gICAgICAgIHJldHVybiBvcy50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL1RpbWVvdXRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL1RpbWVvdXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiYTJlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9UaW1lb3V0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBUaW1lb3V0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNjk3ODMyMDQ5NDk1MzI2MzkyTDsKLQotICAgIHB1YmxpYyBUaW1lb3V0RXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIFRpbWVvdXRFeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgICAgICBzdXBlcihtc2cpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL2ltcGwvT2JqZWN0UG9vbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL2ltcGwvT2JqZWN0UG9vbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0YWFmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9pbXBsL09iamVjdFBvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5JT2JqZWN0UG9vbDsKLQotCi0KLQotcHVibGljIGNsYXNzIE9iamVjdFBvb2xJbXBsIGltcGxlbWVudHMgSU9iamVjdFBvb2wgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcG9vbDsKLSAgICBwcml2YXRlIGludCB3YWl0SW5MaW5lOwotCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotICAgICAgICBib29sZWFuIGZsYWcgPSBwb29sLmFkZChvKTsKLSAgICAgICAgaWYgKGZsYWcgJiYgICh3YWl0SW5MaW5lID4gMCkpIG5vdGlmeSgpOwotICAgICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIE9iamVjdCB0YWtlKCkgewotICAgICAgICBpZiAocG9vbC5zaXplKCkgPT0gMCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBwb29sLnJlbW92ZSgwKTsKLSAgICB9Ci0KLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIE9iamVjdCB0YWtlKGludCB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIHdhaXRJbkxpbmUrKzsKLSAgICAgICAgd2hpbGUgKHBvb2wuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHdhaXQodGltZW91dCk7Ci0gICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSA+IHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdEluTGluZS0tOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2FpdEluTGluZS0tOwotICAgICAgICByZXR1cm4gcG9vbC5yZW1vdmUoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFBvb2xJbXBsKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMucG9vbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy53YWl0SW5MaW5lID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL2ltcGwvV29ya3BpbGVDb250cm9sbGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvaW1wbC9Xb3JrcGlsZUNvbnRyb2xsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYjdkMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvaW1wbC9Xb3JrcGlsZUNvbnRyb2xsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5JV29ya3BpbGVDb250cm9sbGVyOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgV29ya3BpbGVDb250cm9sbGVySW1wbCBpbXBsZW1lbnRzIElXb3JrcGlsZUNvbnRyb2xsZXIgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRHcm91cCB0aHJlYWRHcm91cDsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCB3b3JrcGlsZTsKLQotICAgIHB1YmxpYyB2b2lkIGlucHV0KFJ1bm5hYmxlIHdvcmspIHsKLSAgICAgICAgVGhyZWFkIHRoOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHRoID0gbmV3IFRocmVhZCh0aHJlYWRHcm91cCwgd29yaywgbmFtZSArICItIiArIHdvcmtwaWxlLnNpemUoKSk7Ci0gICAgICAgICAgICB3b3JrcGlsZS5hZGQodGgpOwotICAgICAgICB9Ci0gICAgICAgIHRoLnNldERhZW1vbih0cnVlKTsKLSAgICAgICAgdGguc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIldQQzpbIiArIG5hbWUgKyAiXToiICsgdGhyZWFkR3JvdXAudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV29ya3BpbGVDb250cm9sbGVySW1wbChTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnRocmVhZEdyb3VwID0gbmV3IFRocmVhZEdyb3VwKG5hbWUpOwotICAgICAgICB0aGlzLndvcmtwaWxlID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzU2NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSJsaWIvY29tbW9ucy1qeHBhdGgtMS4yLmphciIgc291cmNlcGF0aD0iQzovREwvY29tbW9ucy1qeHBhdGgtMS4yL3NyYy9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkNTliOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhZWYwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgSnhwYXRoIEZyYWdtZW50IChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjAuMQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuYWN0Zi5jb21tb24KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYi9jb21tb25zLWp4cGF0aC0xLjIuamFyLAotIC4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNjM2JmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDE+QWJvdXQgVGhpcyBDb250ZW50PC9oMT4KLQk8cD5KdW5lIDUsIDIwMDY8L3A+CQotCTxoMj5MaWNlbnNlPC9oMj4KLQotCTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotCWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLQk8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotCWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLQlhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi0JdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi0JaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLQlhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQkJCi0JPGgyPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gyPgotCTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLQlkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLQlmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi0JdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGgzPkpYUGF0aCAxLjI8L2gzPgotCi08cD5UaGUgcGx1Zy1pbiBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFzIHBhcnQgb2YgdGhlIENvbW1vbnMgcHJvamVjdC48L3A+Ci0KLTxwPlRoZSBKWFBhdGggYmluYXJ5IGNvZGUgaXMgY29udGFpbmVkIGluIHRoZSBmaWxlIGNvbW1vbnMtanhwYXRoMS4yLmphci4gVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAKLVRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvanhwYXRoLyI+QXBhY2hlIENvbW1vbnM8L2E+IFdlYiBzaXRlLjwvcD4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIEpYUGF0aCBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9hc2wtdjIwLnR4dCI+YXNsLXYyMC50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LgotCi08cD5UaGUgbmFtZXMgJnF1b3Q7SlhQYXRoJnF1b3Q7IGFuZCAgJnF1b3Q7QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24mcXVvdDsgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86YXBhY2hlQGFwYWNoZS5vcmciPmFwYWNoZUBhcGFjaGUub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9hYm91dF9maWxlcy9hc2wtdjIwLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9hYm91dF9maWxlcy9hc2wtdjIwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDhmYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgbGliLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gYWJvdXRfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9mcmFnbWVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGFiYjBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQ+Ci08IS0tICAgcGx1Z2luLWlkPSIiCi0gICBwbHVnaW4tdmVyc2lvbj0iIj4KLS0tPiAgIAotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9saWIvY29tbW9ucy1qeHBhdGgtMS4yLmphciBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9saWIvY29tbW9ucy1qeHBhdGgtMS4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNjk4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvbGliL2NvbW1vbnMtanhwYXRoLTEuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvRE9NRXhOb2RlSXRlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNlYzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkuY29tcGlsZXIuTm9kZVRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5Ob2RlUG9pbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLmRvbS5ET01Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5kb20uRE9NTm9kZVBvaW50ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRE9NRXhOb2RlSXRlcmF0b3IgZXh0ZW5kcyBET01Ob2RlSXRlcmF0b3IgewotICAgIERPTUV4Tm9kZUl0ZXJhdG9yKE5vZGVQb2ludGVyIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICBOb2RlVGVzdCB0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICBOb2RlUG9pbnRlciBzdGFydFdpdGgpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCB0ZXN0LCByZXZlcnNlLCBzdGFydFdpdGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlUG9pbnRlciBnZXROb2RlUG9pbnRlcigpIHsKLSAgICAgICAgRE9NTm9kZVBvaW50ZXIgcHRPcmcgPSAoRE9NTm9kZVBvaW50ZXIpIHN1cGVyLmdldE5vZGVQb2ludGVyKCk7Ci0gICAgICAgIHJldHVybiBuZXcgRE9NRXhOb2RlUG9pbnRlcihwdE9yZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL0RPTUV4Tm9kZVBvaW50ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVQb2ludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmJhNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL0RPTUV4Tm9kZVBvaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguSlhQYXRoQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLlBvaW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5Db21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLmNvbXBpbGVyLk5vZGVOYW1lVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLmNvbXBpbGVyLk5vZGVUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkuY29tcGlsZXIuTm9kZVR5cGVUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuTm9kZVBvaW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5iZWFucy5OdWxsUG9pbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLmRvbS5ET01Ob2RlUG9pbnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRE9NRXhOb2RlUG9pbnRlciBleHRlbmRzIERPTU5vZGVQb2ludGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MTA3MjI2NjA0NzQwMjQ4MjA5TDsKLQotICAgIHByaXZhdGUgTm9kZSBnZXRET01Ob2RlKCkgewotICAgICAgICByZXR1cm4gKE5vZGUpIGdldEltbWVkaWF0ZU5vZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRE9NRXhOb2RlUG9pbnRlcihOb2RlIG5vZGUsIExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgc3VwZXIobm9kZSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRE9NRXhOb2RlUG9pbnRlcihOb2RlIG5vZGUsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBpZCkgewotICAgICAgICBzdXBlcihub2RlLCBsb2NhbGUsIGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRE9NRXhOb2RlUG9pbnRlcihOb2RlUG9pbnRlciBwYXJlbnQsIE5vZGUgbm9kZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBET01FeE5vZGVQb2ludGVyKERPTU5vZGVQb2ludGVyIHB0T3JnKSB7Ci0gICAgICAgIHN1cGVyKHB0T3JnLmdldFBhcmVudCgpLCAoTm9kZSkgcHRPcmcuZ2V0SW1tZWRpYXRlTm9kZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICBPdmVycmlkaW5nIE1ldGhvZHMuCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0Tm9kZShOb2RlVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgTm9kZVR5cGVUZXN0KSB7Ci0gICAgICAgICAgICBOb2RlVHlwZVRlc3QgbnR0ID0gKE5vZGVUeXBlVGVzdCkgdGVzdDsKLSAgICAgICAgICAgIGlmIChudHQuZ2V0Tm9kZVR5cGUoKSAgPT0gQ29tcGlsZXIuTk9ERV9UWVBFX05PREUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodGVzdCBpbnN0YW5jZW9mIE5vZGVOYW1lVGVzdCkgewotICAgICAgICAgICAgTm9kZU5hbWVUZXN0IG5udCA9IChOb2RlTmFtZVRlc3QpIHRlc3Q7Ci0gICAgICAgICAgICBTdHJpbmcgbnNUZXN0ID0gbm50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5zVGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGVzdCA9IG5ldyBOb2RlTmFtZVRlc3Qobm50LmdldE5vZGVOYW1lKCksICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIudGVzdE5vZGUodGVzdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBvaW50ZXIgZ2V0UG9pbnRlckJ5SUQoSlhQYXRoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgaWQpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0RE9NTm9kZSgpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOdWxsUG9pbnRlcihnZXRMb2NhbGUoKSwgaWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRE9NRXhOb2RlUG9pbnRlcihlbGVtZW50LCBnZXRMb2NhbGUoKSwgaWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlUG9pbnRlciBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIE5vZGVQb2ludGVyIHBvaW50ZXIgPSBnZXRJbW1lZGlhdGVQYXJlbnRQb2ludGVyKCk7Ci0gICAgICAgIHdoaWxlIChwb2ludGVyICE9IG51bGwgJiYgcG9pbnRlci5pc0NvbnRhaW5lcigpKSB7Ci0gICAgICAgICAgICBwb2ludGVyID0gcG9pbnRlci5nZXRJbW1lZGlhdGVQYXJlbnRQb2ludGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvaW50ZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGVQb2ludGVyIGdldEltbWVkaWF0ZVBhcmVudFBvaW50ZXIoKSB7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgcmV0dXJuIHBhcmVudDsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0RE9NTm9kZSgpOwotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgRE9NRXhOb2RlUG9pbnRlcihwYXJlbnROb2RlLCBnZXRMb2NhbGUoKSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Um9vdE5vZGUoKSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGdldERPTU5vZGUoKTsKLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IoTm9kZVRlc3QgdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlUG9pbnRlciBzdGFydFdpdGgpIHsKLSAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBOb2RlTmFtZVRlc3QpIHsKLSAgICAgICAgICAgIE5vZGVOYW1lVGVzdCBubnQgPSAoTm9kZU5hbWVUZXN0KSB0ZXN0OwotICAgICAgICAgICAgU3RyaW5nIG5zVGVzdCA9IG5udC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuc1Rlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRlc3QgPSBuZXcgTm9kZU5hbWVUZXN0KG5udC5nZXROb2RlTmFtZSgpLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBET01FeE5vZGVJdGVyYXRvcih0aGlzLCB0ZXN0LCByZXZlcnNlLCBzdGFydFdpdGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBOb2RlIG5vZGUgPSBnZXRET01Ob2RlKCk7Ci0gICAgICAgIFN0cmluZyBucyA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIC8vIFRyZWF0IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgIiIsIGFzIG51bGwuCi0gICAgICAgIGlmIChucy5sZW5ndGgoKSA9PSAwKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVQb2ludGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL0RPTUV4Tm9kZVBvaW50ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTUzYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL0RPTUV4Tm9kZVBvaW50ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkuSlhQYXRoQ29udGV4dFJlZmVyZW5jZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLk5vZGVQb2ludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuTm9kZVBvaW50ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRE9NRXhOb2RlUG9pbnRlckZhY3RvcnkgaW1wbGVtZW50cyBOb2RlUG9pbnRlckZhY3RvcnkgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBKWFBhdGhDb250ZXh0UmVmZXJlbmNlSW1wbC5hZGROb2RlUG9pbnRlckZhY3RvcnkobmV3IERPTUV4Tm9kZVBvaW50ZXJGYWN0b3J5KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUNUT1JZX09SREVSID0gMDsKLSAgICBwdWJsaWMgaW50IGdldE9yZGVyKCkgewotICAgICAgICByZXR1cm4gRkFDVE9SWV9PUkRFUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZVBvaW50ZXIgY3JlYXRlTm9kZVBvaW50ZXIoUU5hbWUgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5vZGVPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgaWYgKCEobm9kZU9iaiBpbnN0YW5jZW9mIE5vZGUpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIG5vZGVPYmo7Ci0gICAgICAgIHJldHVybiBuZXcgRE9NRXhOb2RlUG9pbnRlcihub2RlLCBsb2NhbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlUG9pbnRlciBjcmVhdGVOb2RlUG9pbnRlcihOb2RlUG9pbnRlciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBub2RlT2JqKSB7Ci0gICAgICAgIGlmICghKG5vZGVPYmogaW5zdGFuY2VvZiBOb2RlKSkgcmV0dXJuIG51bGw7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlT2JqOwotICAgICAgICByZXR1cm4gbmV3IERPTUV4Tm9kZVBvaW50ZXIocGFyZW50LCBub2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBET01FeE5vZGVQb2ludGVyRmFjdG9yeSgpIHsKLSAgICB9Ci19Ci0gICAgCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9YUGF0aFNlcnZpY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL1hQYXRoU2VydmljZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxM2NjMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL1hQYXRoU2VydmljZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBYUGF0aFNlcnZpY2VGYWN0b3J5SW1wbCBleHRlbmRzIFhQYXRoU2VydmljZUZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIFhQYXRoU2VydmljZSB4cGF0aFNlcnZpY2VJbnN0YW5jZTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYUGF0aFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHhwYXRoU2VydmljZUluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWFBhdGhTZXJ2aWNlRmFjdG9yeSBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKHhwYXRoU2VydmljZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHhwYXRoU2VydmljZUluc3RhbmNlID0gWFBhdGhTZXJ2aWNlSW1wbC5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgaWYgKHhwYXRoU2VydmljZUluc3RhbmNlID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgWFBhdGhTZXJ2aWNlRmFjdG9yeUltcGwoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBYUGF0aFNlcnZpY2VGYWN0b3J5SW1wbCgpIHsKLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL1hQYXRoU2VydmljZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9YUGF0aFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZmNkZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL1hQYXRoU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguQ29tcGlsZWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguSlhQYXRoQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLlBvaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotCi1jbGFzcyBYUGF0aFNlcnZpY2VJbXBsIGV4dGVuZHMgWFBhdGhTZXJ2aWNlIHsKLSAgICBzdGF0aWMgewotICAgICAgICBET01FeE5vZGVQb2ludGVyRmFjdG9yeS5pbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBjb21waWxlKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBKWFBhdGhDb250ZXh0LmNvbXBpbGUocGF0aCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgTm9kZUxpc3QgewotICAgICAgICBwcml2YXRlIExpc3Q8Tm9kZT4gbm9kZUxpc3Q7Ci0KLSAgICAgICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gbm9kZUxpc3Quc2l6ZSgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBub2RlTGlzdC5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZUxpc3Quc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZUxpc3RJbXBsKExpc3Q8Tm9kZT4gbm9kZUxpc3QpIHsKLSAgICAgICAgICAgIGlmIChub2RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ub2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMubm9kZUxpc3QgPSBub2RlTGlzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlTGlzdCBldmFsRm9yTm9kZUxpc3QoT2JqZWN0IGNvbXBpbGVkLCBOb2RlIGJhc2UpIHsKLSAgICAgICAgQ29tcGlsZWRFeHByZXNzaW9uIGNlID0gKENvbXBpbGVkRXhwcmVzc2lvbikgY29tcGlsZWQ7Ci0gICAgICAgIEpYUGF0aENvbnRleHQgYmN0eCA9IEpYUGF0aENvbnRleHQubmV3Q29udGV4dChiYXNlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIFBvaW50ZXIgcHRyID0gbmV3IERPTUV4Tm9kZVBvaW50ZXIoYmFzZSwgbnVsbCk7Ci0gICAgICAgIEpYUGF0aENvbnRleHQgY3R4ID0gYmN0eC5nZXRSZWxhdGl2ZUNvbnRleHQocHRyKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjZS5pdGVyYXRlUG9pbnRlcnMoY3R4KTsKLSAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHJldHVybiBudWxsOwotICAgICAgICBMaXN0PE5vZGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgUG9pbnRlciBwdCA9IChQb2ludGVyKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IHB0LmdldE5vZGUoKTsKLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBOb2RlKSkgY29udGludWU7Ci0gICAgICAgICAgICBOb2RlIG4gPSAoTm9kZSkgbzsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobik7Ci0gICAgICAgIH0gd2hpbGUgKGl0Lmhhc05leHQoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RJbXBsKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBldmFsRm9yU3RyaW5nKE9iamVjdCBjb21waWxlZCwgTm9kZSBiYXNlKSB7Ci0gICAgICAgIENvbXBpbGVkRXhwcmVzc2lvbiBjZSA9IChDb21waWxlZEV4cHJlc3Npb24pIGNvbXBpbGVkOwotICAgICAgICBKWFBhdGhDb250ZXh0IGJjdHggPSBKWFBhdGhDb250ZXh0Lm5ld0NvbnRleHQoYmFzZS5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBQb2ludGVyIHB0ciA9IG5ldyBET01FeE5vZGVQb2ludGVyKGJhc2UsIG51bGwpOwotICAgICAgICBKWFBhdGhDb250ZXh0IGN0eCA9IGJjdHguZ2V0UmVsYXRpdmVDb250ZXh0KHB0cik7Ci0gICAgICAgIHJldHVybiBjZS5nZXRWYWx1ZShjdHgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYUGF0aFNlcnZpY2UgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWFBhdGhTZXJ2aWNlSW1wbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgWFBhdGhTZXJ2aWNlSW1wbCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmNWFhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFjYWIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIFZvY2FiIFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC4wLjEKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5Wb2NhYlBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjczOWJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLQkJCSAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5ZjEwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8IS0tZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLnByZWZlcmVuY2VzLlZvY2FiUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLnByZWZlcmVuY2VzLlZvY2FiUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBuYW1lPSJET00gVm9jYWJ1bGFyeSIvPgotICAgPC9leHRlbnNpb24tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIucHJlZmVyZW5jZXMuVm9jYWJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvQWJzdHJhY3RUZXJtcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9BYnN0cmFjdFRlcm1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDcwZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9BYnN0cmFjdFRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXJtcyB7Ci0gIC8qCi0gICAqIENsYXNzIGltcGxlbWVudGluZyBJVGVybXMgc2hvdWxkIGltcGxlbWVudCBmdW5jdGlvbnMgd2hpY2ggdXNlZCBpbiBpdHNlbGYuCi0gICAqCi0gICAqIEZ1bmN0aW9uIHR5cGUgc2hvdWxkIGJlIGFzIGZvbGxvd3MKLSAgICogYm9vbGVhbiAqKioqKioqKioqKElFdmFsVGFyZ2V0IHRhcmdldCkKLSAgICogYm9vbGVhbiAqKioqKioqKioqKElFdmFsVGFyZ2V0IHRhcmdldCwgU3RyaW5nIC4uLikKLSAgICovCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDbGlja2FibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KXsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KElFdmFsVGFyZ2V0IHRhcmdldCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSUV2YWxUYXJnZXQgdGFyZ2V0KXsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1dHRvbihJRXZhbFRhcmdldCB0YXJnZXQpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2JveChJRXZhbFRhcmdldCB0YXJnZXQpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbChJRXZhbFRhcmdldCB0YXJnZXQpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5rKElFdmFsVGFyZ2V0IHRhcmdldCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhZGlvKElFdmFsVGFyZ2V0IHRhcmdldCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21ib2JveChJRXZhbFRhcmdldCB0YXJnZXQpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdWJtaXQoSUV2YWxUYXJnZXQgdGFyZ2V0KXsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dGFyZWEoSUV2YWxUYXJnZXQgdGFyZ2V0KXsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dGJveChJRXZhbFRhcmdldCB0YXJnZXQpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXNzd29yZChJRXZhbFRhcmdldCB0YXJnZXQpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZE5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZE9iamVjdChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW1hZ2UoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpbGluZUVkaXQoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWR1Y2libGUoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0YWJsZShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmaW5kKFN0cmluZyBzdHIsIGJvb2xlYW4gZXhhY3QsIElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoU3RyaW5nIHN0ciwgYm9vbGVhbiBleGFjdCwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nKGludCBsZXZlbCwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbm9kZUxvY2F0aW9uKE5vZGUgcmVmTm9kZSwgYm9vbGVhbiBiYWNrd2FyZCwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nSnVtcFBvaW50KElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1JlYWRpbmdDb250ZW50KElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdEl0ZW1KdW1wUG9pbnQoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEYoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEIoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaWxlRWRpdChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0SXRlbShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RUb3AoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RPcHRpb24oSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpdGVkTGluayhJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpU2VsZWN0YWJsZShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0tleShjaGFyIGtleSwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZWRpYShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZsYXNoVG9wTm9kZShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbGFzaExhc3ROb2RlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTVNBQUZsYXNoKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKElFdmFsVGFyZ2V0IG5vZGUsIE5vZGUgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHRlcmFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvRGVsZWdhdGlvblRlcm1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0RlbGVnYXRpb25UZXJtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRiNTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvRGVsZWdhdGlvblRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW9uVGVybXMgZXh0ZW5kcyBBYnN0cmFjdFRlcm1zIHsKLQotICAgIC8qIFRoaXMgY2xhc3MgZGVsZWdhdGVzIHRoZSBldmFsdWF0aW9uIHRvIHRoZSB0YXJnZXQgYmVsb3cuICAqLwotICAgIHByaXZhdGUgZmluYWwgSUV2YWxUYXJnZXQgZGVsZWdhdGlvblRhcmdldDsKLQotICAgIHByaXZhdGUgQWJzdHJhY3RUZXJtcyBuZXh0Q2FuZGlkYXRlOwotCi0gICAgcHVibGljIERlbGVnYXRpb25UZXJtcyhJRXZhbFRhcmdldCBkZWxlZ2F0aW9uVGFyZ2V0KSB7Ci0gICAgICAgIHRoaXMuZGVsZWdhdGlvblRhcmdldCA9IGRlbGVnYXRpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDbGlja2FibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNDbGlja2FibGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0VkaXRhYmxlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaGFzQ29udGVudChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZWFkaW5nQ29udGVudChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5oYXNSZWFkaW5nQ29udGVudChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNFbmFibGVkKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzSW5wdXRhYmxlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1NlbGVjdGFibGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVNlbGVjdGFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNNdWx0aVNlbGVjdGFibGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdXR0b24oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNCdXR0b24oZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0SXRlbShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0xpc3RJdGVtKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdFRvcChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0xpc3RUb3AoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0NoZWNrYm94KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0NoZWNrZWQoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWwoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNMYWJlbChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmsoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNMaW5rKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaXRlZExpbmsoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNWaXNpdGVkTGluayhkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhZGlvKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzUmFkaW8oZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21ib2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0NvbWJvYm94KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VibWl0KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzU3VibWl0KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZUVkaXQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNGaWxlRWRpdChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RleHRhcmVhKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzVGV4dGFyZWEoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZXh0Ym94KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzVGV4dGJveChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzUGFzc3dvcmQoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZE5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNWYWxpZE5vZGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1Zpc2libGVOb2RlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNFbWJlZGRlZE9iamVjdChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ltYWdlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzSW1hZ2UoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aWxpbmVFZGl0KElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc011bHRpbGluZUVkaXQoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RPcHRpb24oSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzU2VsZWN0T3B0aW9uKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVkdWNpYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1JlZHVjaWJsZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RhYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0Nvbm5lY3RhYmxlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGZpbmQoU3RyaW5nIHN0ciwgYm9vbGVhbiBleGFjdCwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmZpbmQoc3RyLCBleGFjdCwgZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmcgc3RyLCBib29sZWFuIGV4YWN0LCBJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuc3RhcnRzV2l0aChzdHIsIGV4YWN0LCBkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmcoaW50IGxldmVsLCBJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNIZWFkaW5nKGxldmVsLCBkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmdKdW1wUG9pbnQoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzSGVhZGluZ0p1bXBQb2ludChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBub2RlTG9jYXRpb24oTm9kZSByZWZOb2RlLCBib29sZWFuIGJhY2t3YXJkLCBJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkubm9kZUxvY2F0aW9uKHJlZk5vZGUsIGJhY2t3YXJkLCBkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0tleShjaGFyIGtleSwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQWNjZXNzS2V5KGtleSwgZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0SXRlbUp1bXBQb2ludChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNMaXN0SXRlbUp1bXBQb2ludChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50RihJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNCbG9ja0p1bXBQb2ludEYoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEIoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQmxvY2tKdW1wUG9pbnRCKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTWVkaWEoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzTWVkaWEoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbGFzaFRvcE5vZGUoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzRmxhc2hUb3BOb2RlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRmxhc2hMYXN0Tm9kZShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNGbGFzaExhc3ROb2RlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTVNBQUZsYXNoKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc01TQUFGbGFzaChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoSUV2YWxUYXJnZXQgbm9kZSwgTm9kZSB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1JlYWNoYWJsZShkZWxlZ2F0aW9uVGFyZ2V0LCB0YXJnZXQpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsdGVyYWJsZShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0FsdGVyYWJsZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSUV2YWxUYXJnZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSUV2YWxUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwYWM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lFdmFsVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUV2YWxUYXJnZXQgewotICAgIEFic3RyYWN0VGVybXMgZ2V0VGVybXMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSU9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc0MzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSU9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdG9yIGV4dGVuZHMgSVByb3Bvc2l0aW9uewotICAgIGludCBzaXplKCk7Ci0gICAgSVByb3Bvc2l0aW9uIGdldChpbnQgaW5kZXgpOwotICAgIHZvaWQgYWRkKElQcm9wb3NpdGlvbiBwcm9wKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSU9wZXJhdG9yMS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JT3BlcmF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjJhZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JT3BlcmF0b3IxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdG9yMSBleHRlbmRzIElQcm9wb3NpdGlvbnsKLSAgICBJUHJvcG9zaXRpb24gZ2V0UHJvcG9zaXRpb24oKTsKLSAgICB2b2lkIHNldFByb3Bvc2l0aW9uKElQcm9wb3NpdGlvbiBwcm9wKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSVByb3Bvc2l0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lQcm9wb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IzM2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSVByb3Bvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wb3NpdGlvbiB7Ci0gICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1ZvY2FiUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1ZvY2FiUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDk2MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9Wb2NhYlBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFZvY2FiUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFZvY2FiUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVm9jYWJQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBWb2NhYlBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9Wb2NhYnVsYXJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1ZvY2FidWxhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkNDMxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1ZvY2FidWxhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuaW1wbC5BbmRPcGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuaW1wbC5GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuaW1wbC5Pck9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5wcmVmZXJlbmNlcy5Wb2NhYlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLQotcHVibGljIGNsYXNzIFZvY2FidWxhcnkgewotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJUHJvcG9zaXRpb24+IHByb3BNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElQcm9wb3NpdGlvbj4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzQ2xpY2thYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzQ2xpY2thYmxlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNDbGlja2FibGUiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNJbnB1dGFibGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNJbnB1dGFibGUobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0lucHV0YWJsZSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1NlbGVjdGFibGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNTZWxlY3RhYmxlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNTZWxlY3RhYmxlIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzTXVsdGlTZWxlY3RhYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzTXVsdGlTZWxlY3RhYmxlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNNdWx0aVNlbGVjdGFibGUiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNWYWxpZE5vZGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNWYWxpZE5vZGUobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc1ZhbGlkTm9kZSI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzQ29udGVudCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5oYXNDb250ZW50KG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaGFzQ29udGVudCI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIYXNSZWFkaW5nQ29udGVudCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5oYXNSZWFkaW5nQ29udGVudChub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImhhc1JlYWRpbmdDb250ZW50IjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1Zpc2libGVOb2RlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzVmlzaWJsZU5vZGUobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc1Zpc2libGVOb2RlIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0VtYmVkZGVkT2JqZWN0IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzRW1iZWRkZWRPYmplY3Qobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0VtYmVkZGVkT2JqZWN0IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzUmVkdWNpYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzUmVkdWNpYmxlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNSZWR1Y2libGUiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNCbG9ja0p1bXBQb2ludEYgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNCbG9ja0p1bXBQb2ludEYobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0Jsb2NrSnVtcFBvaW50RiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0Jsb2NrSnVtcFBvaW50QiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0Jsb2NrSnVtcFBvaW50Qihub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzQmxvY2tKdW1wUG9pbnRCIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzTWVkaWEgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNNZWRpYShub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzTWVkaWEiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzUmVhY2hhYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBOb2RlIHRhcmdldDsKLSAgICAgICAgcHVibGljIElzUmVhY2hhYmxlKE5vZGUgdGFyZ2V0KSB7Ci0gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNSZWFjaGFibGUobm9kZSwgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzUmVhY2hhYmxlIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0Nvbm5lY3RhYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzQ29ubmVjdGFibGUobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0Nvbm5lY3RhYmxlIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzQWx0ZXJhYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsgLy8gVE9ETyBhd2Vzb21lIG1ldGhvZCBuYW1lLi4uIDooCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0FsdGVyYWJsZShub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzQWx0ZXJhYmxlIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFdpZGdldHNWb2NhYnVsYXJ5LmluaXRpYWxpemUoKTsKLQotICAgICAgICBhZGQoIkNsaWNrYWJsZSIsIG5ldyBJc0NsaWNrYWJsZSgpKTsKLSAgICAgICAgYWRkKCJDbGlja2FibGUiLCBvcigiQnV0dG9uIiwgIkNoZWNrYm94IiwgIlN1Ym1pdCIsICJMaW5rIikpOwotICAgICAgICBhZGQoIklucHV0YWJsZSIsIG5ldyBJc0lucHV0YWJsZSgpKTsKLSAgICAgICAgYWRkKCJJbnB1dGFibGUiLCBvcigiVGV4dGJveCIsICJUZXh0YXJlYSIsICJQYXNzd29yZCIpKTsKLSAgICAgICAgYWRkKCJTZWxlY3RhYmxlIiwgbmV3IElzU2VsZWN0YWJsZSgpKTsKLSAgICAgICAgYWRkKCJNdWx0aVNlbGVjdGFibGUiLCBuZXcgSXNNdWx0aVNlbGVjdGFibGUoKSk7Ci0gICAgICAgIGFkZCgiU2VsZWN0YWJsZSIsIG9yKCJDb21ib2JveCIsICJSYWRpbyIpKTsKLSAgICAgICAgYWRkKCJWYWxpZE5vZGUiLCBuZXcgSXNWYWxpZE5vZGUoKSk7Ci0gICAgICAgIGFkZCgiSGFzQ29udGVudCIsIG5ldyBIYXNDb250ZW50KCkpOwotICAgICAgICBhZGQoIkhhc1JlYWRpbmdDb250ZW50IiwgbmV3IEhhc1JlYWRpbmdDb250ZW50KCkpOwotICAgICAgICBhZGQoIlZpc2libGVOb2RlIiwgbmV3IElzVmlzaWJsZU5vZGUoKSk7Ci0gICAgICAgIGFkZCgiRW1iZWRkZWRPYmplY3QiLCBuZXcgSXNFbWJlZGRlZE9iamVjdCgpKTsKLSAgICAgICAgYWRkKCJSZWR1Y2libGUiLCBuZXcgSXNSZWR1Y2libGUoKSk7Ci0gICAgICAgIGFkZCgiQmxvY2tKdW1wUG9pbnRGIiwgbmV3IElzQmxvY2tKdW1wUG9pbnRGKCkpOwotICAgICAgICBhZGQoIkJsb2NrSnVtcFBvaW50QiIsIG5ldyBJc0Jsb2NrSnVtcFBvaW50QigpKTsKLSAgICAgICAgYWRkKCJNZWRpYSIsIG5ldyBJc01lZGlhKCkpOwotICAgICAgICBhZGQoIkNvbm5lY3RhYmxlIiwgbmV3IElzQ29ubmVjdGFibGUoKSk7Ci0gICAgICAgIGFkZCgiQWx0ZXJhYmxlIiwgbmV3IElzQWx0ZXJhYmxlKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFkZEZ1bmMoU3RyaW5nIG5hbWUsIFN0cmluZyBmdW5jTmFtZSwgU3RyaW5nLi4uIGFyZ3MpIHsKLSAgICAgICAgYWRkKG5hbWUsIG5ldyBGdW5jdGlvbihmdW5jTmFtZSwgYXJncykpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFkZChTdHJpbmcgbmFtZSwgSVByb3Bvc2l0aW9uIHByb3ApIHsKLSAgICAgICAgSVByb3Bvc2l0aW9uIGV4aXN0UHJvcCA9IHByb3BNYXAuZ2V0KG5hbWUpOwotICAgICAgICBpZiAoZXhpc3RQcm9wID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BNYXAucHV0KG5hbWUsIHByb3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSVByb3Bvc2l0aW9uIG5ld1Byb3AgPSBuZXcgT3JPcGVyYXRvcihleGlzdFByb3AsIHByb3ApOwotICAgICAgICAgICAgcHJvcE1hcC5wdXQobmFtZSwgbmV3UHJvcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUHJvcG9zaXRpb24gb3IoU3RyaW5nLi4uIGFyZ3MpIHsKLSAgICAgICAgT3JPcGVyYXRvciByZXQgPSBuZXcgT3JPcGVyYXRvcigpOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogYXJncykgewotICAgICAgICAgICAgcmV0LmFkZChnZXQocykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy9wcml2YXRlIHN0YXRpYyBJUHJvcG9zaXRpb24gYW5kKFN0cmluZy4uLiBhcmdzKSB7Ci0gICAgLy8gICAgQW5kT3BlcmF0b3IgcmV0ID0gbmV3IEFuZE9wZXJhdG9yKCk7Ci0gICAgLy8gICAgZm9yIChTdHJpbmcgcyA6IGFyZ3MpIHsKLSAgICAvLyAgICAgICAgcmV0LmFkZChnZXQocykpOwotICAgIC8vICAgIH0KLSAgICAvLyAgICByZXR1cm4gcmV0OwotICAgIC8vfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gb3IoSVByb3Bvc2l0aW9uLi4uIGFyZ3MpIHsKLSAgICAgICAgT3JPcGVyYXRvciByZXQgPSBuZXcgT3JPcGVyYXRvcigpOwotICAgICAgICBmb3IgKElQcm9wb3NpdGlvbiBpcCA6IGFyZ3MpIHsKLSAgICAgICAgICAgIHJldC5hZGQoaXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gYW5kKElQcm9wb3NpdGlvbi4uLiBhcmdzKSB7Ci0gICAgICAgIEFuZE9wZXJhdG9yIHJldCA9IG5ldyBBbmRPcGVyYXRvcigpOwotICAgICAgICBmb3IgKElQcm9wb3NpdGlvbiBpcCA6IGFyZ3MpIHsKLSAgICAgICAgICAgIHJldC5hZGQoaXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmluZFByb3Bvc2l0aW9uIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RyOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBleGFjdDsKLQotICAgICAgICBwdWJsaWMgRmluZFByb3Bvc2l0aW9uKFN0cmluZyBzdHIsIGJvb2xlYW4gZXhhY3QpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOwotICAgICAgICAgICAgdGhpcy5leGFjdCA9IGV4YWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmZpbmQoc3RyLCBleGFjdCwgbm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImZpbmQoIiArIHN0ciArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXJ0c1dpdGhQcm9wb3NpdGlvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN0cjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZXhhY3Q7Ci0KLSAgICAgICAgcHVibGljIFN0YXJ0c1dpdGhQcm9wb3NpdGlvbihTdHJpbmcgc3RyLCBib29sZWFuIGV4YWN0KSB7Ci0gICAgICAgICAgICB0aGlzLnN0ciA9IHN0cjsKLSAgICAgICAgICAgIHRoaXMuZXhhY3QgPSBleGFjdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5zdGFydHNXaXRoKHN0ciwgZXhhY3QsIG5vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJzdGFydHNXaXRoKCIgKyBzdHIgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlTG9jYXRpb25Qcm9wb3NpdGlvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTm9kZSByZWZOb2RlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYmFja3dhcmQ7Ci0gICAgICAgIHB1YmxpYyBOb2RlTG9jYXRpb25Qcm9wb3NpdGlvbihOb2RlIHJlZk5vZGUsIGJvb2xlYW4gYmFja3dhcmQpIHsKLSAgICAgICAgICAgIHRoaXMucmVmTm9kZSA9IHJlZk5vZGU7Ci0gICAgICAgICAgICB0aGlzLmJhY2t3YXJkID0gYmFja3dhcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkubm9kZUxvY2F0aW9uKHJlZk5vZGUsIGJhY2t3YXJkLCBub2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAibm9kZUxvY2F0aW9uKCIgKyByZWZOb2RlICsgIjoiICsgYmFja3dhcmQgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0FjY2Vzc0tleSBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgY2hhciBrZXk7Ci0gICAgICAgIHB1YmxpYyBJc0FjY2Vzc0tleShjaGFyIGtleSl7Ci0gICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0FjY2Vzc0tleShrZXksIG5vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJhY2Nlc3NLZXkoIiArIGtleSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHB1YmxpYyBpbnRlcmZhY2UKLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGdldChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcHJvcE1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNDbGlja2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkNsaWNrYWJsZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGhhc0NvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkhhc0NvbnRlbnQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0VkaXRhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJFZGl0YWJsZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzU2VsZWN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiU2VsZWN0YWJsZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzRW1iZWRkZWRPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkVtYmVkZGVkT2JqZWN0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNWYWxpZE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIlZhbGlkTm9kZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzVmlzaWJsZU5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIlZpc2libGVOb2RlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNJbnB1dGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIklucHV0YWJsZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJCdXR0b24iKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNMaXN0SXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiTGlzdEl0ZW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0xpc3RUb3AoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkxpc3RUb3AiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0NoZWNrYm94KCkgewotICAgICAgICByZXR1cm4gZ2V0KCJDaGVja2JveCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0NoZWNrZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkNoZWNrZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0xhYmVsKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJMYWJlbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzTGluaygpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiTGluayIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc1Zpc2l0ZWRMaW5rKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJWaXNpdGVkTGluayIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzUmFkaW8oKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIlJhZGlvIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNTdWJtaXQoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIlN1Ym1pdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzRmlsZUVkaXQoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkZpbGVFZGl0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNDb21ib2JveCgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiQ29tYm9ib3giKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc1RleHRhcmVhKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJUZXh0YXJlYSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzVGV4dGJveCgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiVGV4dGJveCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzUGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIlBhc3N3b3JkIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzU2VsZWN0T3B0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJTZWxlY3RPcHRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0ltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJJbWFnZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzTXVsdGlsaW5lRWRpdCgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiTXVsdGlsaW5lRWRpdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzUmVkdWNpYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJSZWR1Y2libGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0hlYWRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkhlYWRpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0hlYWRpbmcxKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJIZWFkaW5nMSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzSGVhZGluZzIoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkhlYWRpbmcyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNIZWFkaW5nMygpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiSGVhZGluZzMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0hlYWRpbmc0KCkgewotICAgICAgICByZXR1cm4gZ2V0KCJIZWFkaW5nNCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzSGVhZGluZzUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkhlYWRpbmc1Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNIZWFkaW5nNigpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiSGVhZGluZzYiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBmaW5kKFN0cmluZyBzdHIsIGJvb2xlYW4gZXhhY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaW5kUHJvcG9zaXRpb24oc3RyLCBleGFjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gc3RhcnRzV2l0aChTdHJpbmcgc3RyLCBib29sZWFuIGV4YWN0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhcnRzV2l0aFByb3Bvc2l0aW9uKHN0ciwgZXhhY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIG5vZGVMb2NhdGlvbihOb2RlIHJlZk5vZGUsIGJvb2xlYW4gYmFja3dhcmQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRpb25Qcm9wb3NpdGlvbihyZWZOb2RlLCBiYWNrd2FyZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzQWNjZXNzS2V5KGNoYXIga2V5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgSXNBY2Nlc3NLZXkoa2V5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNDb25uZWN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiQ29ubmVjdGFibGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBoYXNSZWFkaW5nQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiSGFzUmVhZGluZ0NvbnRlbnQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0Jsb2NrSnVtcFBvaW50RigpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiQmxvY2tKdW1wUG9pbnRGIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNCbG9ja0p1bXBQb2ludEIoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkJsb2NrSnVtcFBvaW50QiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzTXVsdGlTZWxlY3RhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJNdWx0aVNlbGVjdGFibGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc01lZGlhKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJNZWRpYSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzRmxhc2hUb3BOb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0KCJGbGFzaFRvcE5vZGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0ZsYXNoTGFzdE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkZsYXNoTGFzdE5vZGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc01TQUFGbGFzaCgpIHsKLSAgICAgICAgcmV0dXJuIGdldCgiTVNBQUZsYXNoIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNSZWFjaGFibGUoTm9kZSBiYXNlTm9kZSkgewotICAgICAgICByZXR1cm4gbmV3IElzUmVhY2hhYmxlKGJhc2VOb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNBbHRlcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQoIkFsdGVyYWJsZSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZW51bSBGbGFzaE1vZGUgewotICAgICAgICBNU0FBLCBGTEFTSF9ET00sIE5PX0ZMQVNICi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGbGFzaE1vZGUgZ2V0Tm9ybWFsRmxhc2hNb2RlKCkgewotICAgICAgICBTdHJpbmcgbW9kZSA9IFZvY2FiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLk5PUk1BTF9GTEFTSCk7Ci0gICAgICAgIGlmIChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfTVNBQV9GTEFTSC5lcXVhbHMobW9kZSkpCi0gICAgICAgICAgICByZXR1cm4gRmxhc2hNb2RlLk1TQUE7Ci0gICAgICAgIGlmIChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfRkxBU0hfRE9NLmVxdWFscyhtb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBGbGFzaE1vZGUuRkxBU0hfRE9NOwotICAgICAgICBpZiAoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX05PX0ZMQVNILmVxdWFscyhtb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBGbGFzaE1vZGUuTk9fRkxBU0g7Ci0gICAgICAgIHJldHVybiBGbGFzaE1vZGUuTk9fRkxBU0g7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGbGFzaE1vZGUgZ2V0V2luZG93bGVzc0ZsYXNoTW9kZSgpIHsKLSAgICAgICAgU3RyaW5nIG1vZGUgPSBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5XTkRMRVNTX0ZMQVNIKTsKLSAgICAgICAgaWYgKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9GTEFTSF9ET00uZXF1YWxzKG1vZGUpKQotICAgICAgICAgICAgcmV0dXJuIEZsYXNoTW9kZS5GTEFTSF9ET007Ci0gICAgICAgIGlmIChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfTk9fRkxBU0guZXF1YWxzKG1vZGUpKQotICAgICAgICAgICAgcmV0dXJuIEZsYXNoTW9kZS5OT19GTEFTSDsKLSAgICAgICAgcmV0dXJuIEZsYXNoTW9kZS5OT19GTEFTSDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE5vQWx0SW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFQpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkTnVsbEFsdEltYWdlKCkgewotICAgICAgICByZXR1cm4gVm9jYWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTlVMTF9BTFQpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkTm9BbHRJbWFnZUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFRfTElOSyk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWROdWxsQWx0SW1hZ2VMaW5rKCkgewotICAgICAgICByZXR1cm4gVm9jYWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTlVMTF9BTFRfTElOSyk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NraXBJY29uTGluaygpIHsKLSAgICAgICAgcmV0dXJuIFZvY2FiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5TS0lQX0lDT05fTElOSyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9XaWRnZXRzVm9jYWJ1bGFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9XaWRnZXRzVm9jYWJ1bGFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE5ZGNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvV2lkZ2V0c1ZvY2FidWxhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi0KLQotcHVibGljIGNsYXNzIFdpZGdldHNWb2NhYnVsYXJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0J1dHRvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0J1dHRvbihub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzQnV0dG9uIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzTGlzdEl0ZW0gaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNMaXN0SXRlbShub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzTGlzdEl0ZW0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNMaXN0VG9wIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzTGlzdFRvcChub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzTGlzdFRvcCI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0NoZWNrYm94IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzQ2hlY2tib3gobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0NoZWNrYm94IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzQ2hlY2tlZCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0NoZWNrZWQobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0NoZWNrZWQiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNSYWRpbyBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1JhZGlvKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNSYWRpbyI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0NvbWJvYm94IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzQ29tYm9ib3gobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0NvbWJvYm94IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzU3VibWl0IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzU3VibWl0KG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNTdWJtaXQiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzRmlsZUVkaXQgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNGaWxlRWRpdChub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzRmlsZUVkaXQiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNMYWJlbCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0xhYmVsKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNMYWJlbCI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0xpbmsgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNMaW5rKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNMaW5rIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1Zpc2l0ZWRMaW5rIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzVmlzaXRlZExpbmsobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc1Zpc2l0ZWRMaW5rIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1RleHRhcmVhIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzVGV4dGFyZWEobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc1RleHRhcmVhIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzVGV4dGJveCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1RleHRib3gobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc1RleHRib3giOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNQYXNzd29yZCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1Bhc3N3b3JkKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNQYXNzd29yZCI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc011bHRpbGluZUVkaXQgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNNdWx0aWxpbmVFZGl0KG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNNdWx0aSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1NlbGVjdE9wdGlvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1NlbGVjdE9wdGlvbihub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzU2VsZWN0T3B0aW9uIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0ltYWdlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzSW1hZ2Uobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJpc0ltYWdlIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzRmxhc2hUb3BOb2RlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzRmxhc2hUb3BOb2RlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaXNGbGFzaFRvcE5vZGUiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNGbGFzaExhc3ROb2RlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzRmxhc2hMYXN0Tm9kZShub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzRmxhc2hMYXN0Tm9kZSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJc01TQUFGbGFzaCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc01TQUFGbGFzaChub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImlzTVNBQUZsYXNoIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElzSGVhZGluZyBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgICAgIHByaXZhdGUgaW50IGxldmVsID0gMDsKLSAgICAgICAgcHVibGljIElzSGVhZGluZygpewotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJc0hlYWRpbmcoaW50IGxldmVsKXsKLSAgICAgICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRlcm1zKCkuaXNIZWFkaW5nKGxldmVsLCBub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICBpZihsZXZlbCAhPSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAiaXNIZWFkaW5nIitsZXZlbDsKLSAgICAgICAgICAgIHJldHVybiAiaXNIZWFkaW5nIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiQnV0dG9uIiwgbmV3IElzQnV0dG9uKCkpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiTGlzdEl0ZW0iLCBuZXcgSXNMaXN0SXRlbSgpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkxpc3RUb3AiLCBuZXcgSXNMaXN0VG9wKCkpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiQ2hlY2tib3giLCBuZXcgSXNDaGVja2JveCgpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkNoZWNrZWQiLCBuZXcgSXNDaGVja2VkKCkpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiUmFkaW8iLCBuZXcgSXNSYWRpbygpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkNvbWJvYm94IiwgbmV3IElzQ29tYm9ib3goKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJTdWJtaXQiLCBuZXcgSXNTdWJtaXQoKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJGaWxlRWRpdCIsIG5ldyBJc0ZpbGVFZGl0KCkpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiTGFiZWwiLCBuZXcgSXNMYWJlbCgpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkxpbmsiLCBuZXcgSXNMaW5rKCkpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiVmlzaXRlZExpbmsiLCBuZXcgSXNWaXNpdGVkTGluaygpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIlRleHRhcmVhIiwgbmV3IElzVGV4dGFyZWEoKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJUZXh0Ym94IiwgbmV3IElzVGV4dGJveCgpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIlBhc3N3b3JkIiwgbmV3IElzUGFzc3dvcmQoKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJNdWx0aWxpbmVFZGl0IiwgbmV3IElzTXVsdGlsaW5lRWRpdCgpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIlNlbGVjdE9wdGlvbiIsIG5ldyBJc1NlbGVjdE9wdGlvbigpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkltYWdlIiwgbmV3IElzSW1hZ2UoKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJIZWFkaW5nIiwgbmV3IElzSGVhZGluZygpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkhlYWRpbmcxIiwgbmV3IElzSGVhZGluZygxKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJIZWFkaW5nMiIsIG5ldyBJc0hlYWRpbmcoMikpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiSGVhZGluZzMiLCBuZXcgSXNIZWFkaW5nKDMpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIkhlYWRpbmc0IiwgbmV3IElzSGVhZGluZyg0KSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJIZWFkaW5nNSIsIG5ldyBJc0hlYWRpbmcoNSkpOwotICAgICAgICBWb2NhYnVsYXJ5LmFkZCgiSGVhZGluZzYiLCBuZXcgSXNIZWFkaW5nKDYpKTsKLSAgICAgICAgCi0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJGbGFzaFRvcE5vZGUiLCBuZXcgSXNGbGFzaFRvcE5vZGUoKSk7Ci0gICAgICAgIFZvY2FidWxhcnkuYWRkKCJGbGFzaExhc3ROb2RlIiwgbmV3IElzRmxhc2hMYXN0Tm9kZSgpKTsKLSAgICAgICAgVm9jYWJ1bGFyeS5hZGQoIk1TQUFGbGFzaCIsIG5ldyBJc01TQUFGbGFzaCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvQWJzdHJhY3RPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9pbXBsL0Fic3RyYWN0T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3MWI0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvQWJzdHJhY3RPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklQcm9wb3NpdGlvbjsKLQotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3BlcmF0b3IgaW1wbGVtZW50cyBJT3BlcmF0b3IgewotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SVByb3Bvc2l0aW9uPiBwcm9wcyA9IG5ldyBBcnJheUxpc3Q8SVByb3Bvc2l0aW9uPigpOwotICAgIAotICAgIHB1YmxpYyBBYnN0cmFjdE9wZXJhdG9yKElQcm9wb3NpdGlvbi4uLiBhcmdzKXsKLSAgICAgICAgZm9yKElQcm9wb3NpdGlvbiBwOiBhcmdzKXsKLSAgICAgICAgICAgIHByb3BzLmFkZChwKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGQoSVByb3Bvc2l0aW9uIHByb3ApewotICAgICAgICBwcm9wcy5hZGQocHJvcCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgc2l6ZSgpewotICAgICAgICByZXR1cm4gcHJvcHMuc2l6ZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb3Bvc2l0aW9uIGdldChpbnQgaW5kZXgpewotICAgICAgICByZXR1cm4gcHJvcHMuZ2V0KGluZGV4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvQWJzdHJhY3RPcGVyYXRvcjEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9BYnN0cmFjdE9wZXJhdG9yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDAyNDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9BYnN0cmFjdE9wZXJhdG9yMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklPcGVyYXRvcjE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklQcm9wb3NpdGlvbjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9wZXJhdG9yMSBpbXBsZW1lbnRzIElPcGVyYXRvcjEgewotCi0gICAgcHJpdmF0ZSBJUHJvcG9zaXRpb24gcHJvcG9zaXRpb247Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0T3BlcmF0b3IxKElQcm9wb3NpdGlvbiBwcm9wb3NpdGlvbil7Ci0gICAgICAgIHRoaXMucHJvcG9zaXRpb24gPSBwcm9wb3NpdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQcm9wb3NpdGlvbiBnZXRQcm9wb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHByb3Bvc2l0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wb3NpdGlvbihJUHJvcG9zaXRpb24gcHJvcG9zaXRpb24pewotICAgICAgICB0aGlzLnByb3Bvc2l0aW9uID0gcHJvcG9zaXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9pbXBsL0FuZE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvQW5kT3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNThkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvQW5kT3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSVByb3Bvc2l0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIEFuZE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRvciB7Ci0KLSAgICBwdWJsaWMgQW5kT3BlcmF0b3IoSVByb3Bvc2l0aW9uLi4uIGFyZ3MpewotICAgICAgICBzdXBlcihhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpewotICAgICAgICBmb3IoaW50IGk9MDsgaTxzaXplKCk7IGkrKyl7Ci0gICAgICAgICAgICBJUHJvcG9zaXRpb24gcCA9IGdldChpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gcC5ldmFsKG5vZGUpOwotICAgICAgICAgICAgaWYocmVzdWx0ID09IGZhbHNlKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gImFuZCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvRmFsc2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvRmFsc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZGM5Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9pbXBsL0ZhbHNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JUHJvcG9zaXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgRmFsc2VJbXBsIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBGYWxzZUltcGwgaW5zdGFuY2UgPSBuZXcgRmFsc2VJbXBsKCk7Ci0KLSAgICBwcml2YXRlIEZhbHNlSW1wbCgpewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gImZhbHNlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZhbHNlSW1wbCBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOyAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9GdW5jdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9pbXBsL0Z1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWVhOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9pbXBsL0Z1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSVByb3Bvc2l0aW9uOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb24gaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwcml2YXRlIE9iamVjdFtdIGFyZ3M7Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb24oU3RyaW5nIG5hbWUsIFN0cmluZy4uLiBhcmdzKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMuYXJncyA9IG5ldyBPYmplY3RbYXJncy5sZW5ndGgrMV07Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspewotICAgICAgICAgICAgdGhpcy5hcmdzW2krMV0gPSBhcmdzW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKXsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbYXJncy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlc1tpXSA9IGFyZ3NbaV0uZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbm9kZS5nZXRUZXJtcygpLmdldENsYXNzKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZChnZXROYW1lKCksIGNsYXNzZXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobWV0aG9kICE9IG51bGwpewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGlzLmFyZ3NbMF0gPSBub2RlOwotICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbiltZXRob2QuaW52b2tlKG5vZGUuZ2V0VGVybXMoKSwgKE9iamVjdFtdKWFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy90aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbHMgdG8gaW52b2tlIG1ldGhvZCBcIiIrZ2V0TmFtZSgpKyJcIiBmb3IgIitub2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvSW1wbHlPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9pbXBsL0ltcGx5T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1YmQ2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvSW1wbHlPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklQcm9wb3NpdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBJbXBseU9wZXJhdG9yIGV4dGVuZHMgT3JPcGVyYXRvciB7Ci0KLSAgICBwdWJsaWMgSW1wbHlPcGVyYXRvcihJUHJvcG9zaXRpb24gbGVmdCwgSVByb3Bvc2l0aW9uIHJpZ2h0KSB7Ci0gICAgICAgIHN1cGVyKG5ldyBOb3RPcGVyYXRvcihsZWZ0KSwgcmlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJpbXBsaWVzIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvTm90T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9Ob3RPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc2ZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9Ob3RPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JUHJvcG9zaXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgTm90T3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdG9yMSB7Ci0KLQotICAgIHB1YmxpYyBOb3RPcGVyYXRvcihJUHJvcG9zaXRpb24gcHJvcG9zaXRpb24pIHsKLSAgICAgICAgc3VwZXIocHJvcG9zaXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSl7Ci0gICAgICAgIHJldHVybiAhZ2V0UHJvcG9zaXRpb24oKS5ldmFsKG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJub3QiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9Pck9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL2ltcGwvT3JPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZiYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvaW1wbC9Pck9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklQcm9wb3NpdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBPck9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRvciB7Ci0KLSAgICBwdWJsaWMgT3JPcGVyYXRvcihJUHJvcG9zaXRpb24uLi4gYXJncyl7Ci0gICAgICAgIHN1cGVyKGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSl7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHNpemUoKTsgaSsrKXsKLSAgICAgICAgICAgIElQcm9wb3NpdGlvbiBwID0gZ2V0KGkpOwotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBwLmV2YWwobm9kZSk7Ci0gICAgICAgICAgICBpZihyZXN1bHQgPT0gdHJ1ZSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJvciI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL3ByZWZlcmVuY2VzL1ZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiODY1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL3ByZWZlcmVuY2VzL1ZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHBsdWctaW4gcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMX0ZMQVNIID0gIm5vcm1hbF9mbGFzaCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV05ETEVTU19GTEFTSCA9ICJ3bmRsZXNzX2ZsYXNoIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0ZMQVNIX0RPTSA9ICJmbGFzaF9kb20iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfTVNBQV9GTEFTSCA9ICJtc2FhX2ZsYXNoIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05PX0ZMQVNIID0gIm5vX2ZsYXNoIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfTk9fQUxUID0gInJlYWRfbm9fYWx0IjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX05VTExfQUxUID0gInJlYWRfbnVsbF9hbHQiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfTk9fQUxUX0xJTksgPSAicmVhZF9ub19hbHRfbGluayI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9OVUxMX0FMVF9MSU5LID0gInJlYWRfbnVsbF9hbHRfbGluayI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9JQ09OX0xJTksgPSAic2tpcF9pY29uX2xpbmsiOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk3N2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLlZvY2FiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqLwotcHVibGljIGNsYXNzIFZvY2FiUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFZvY2FiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuTk9STUFMX0ZMQVNILCBWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfTVNBQV9GTEFTSCk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLldORExFU1NfRkxBU0gsIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9GTEFTSF9ET00pOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05PX0FMVCwgdHJ1ZSk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTlVMTF9BTFQsIGZhbHNlKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFRfTElOSywgdHJ1ZSk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTlVMTF9BTFRfTElOSywgdHJ1ZSk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlNLSVBfSUNPTl9MSU5LLCB0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTk0YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5Wb2NhYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdAotICogaXMgY29udHJpYnV0ZWQgdG8gdGhlIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgCi0gKiBzdWJjbGFzc2luZyA8c2FtcD5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlPC9zYW1wPiwgd2UKLSAqIGNhbiB1c2UgdGhlIGZpZWxkIHN1cHBvcnQgYnVpbHQgaW50byBKRmFjZSB0aGF0IGFsbG93cwotICogdXMgdG8gY3JlYXRlIGEgcGFnZSB0aGF0IGlzIHNtYWxsIGFuZCBrbm93cyBob3cgdG8gCi0gKiBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCi0gKiA8cD4KLSAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5Ci0gKiBhcmUgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0bwotICogdGhlIG1haW4gcGx1Zy1pbiBjbGFzcy4gVGhhdCB3YXksIHByZWZlcmVuY2VzIGNhbgotICogYmUgYWNjZXNzZWQgZGlyZWN0bHkgdmlhIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICovCi0KLXB1YmxpYyBjbGFzcyBWb2NhYlByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIFZvY2FiUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoVm9jYWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0RGVzY3JpcHRpb24oIkRPTSBWb2NhYnVsYXJ5IFByZWZlcmVuY2VzIik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGZpZWxkIGVkaXRvcnMuIEZpZWxkIGVkaXRvcnMgYXJlIGFic3RyYWN0aW9ucyBvZgotCSAqIHRoZSBjb21tb24gR1VJIGJsb2NrcyBuZWVkZWQgdG8gbWFuaXB1bGF0ZSB2YXJpb3VzIHR5cGVzCi0JICogb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQgZWRpdG9yIGtub3dzIGhvdyB0byBzYXZlIGFuZAotCSAqIHJlc3RvcmUgaXRzZWxmLgotCSAqLwotCUBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLSAgICAgICAgCi0gICAgICAgIGFkZEZpZWxkKG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLk5PUk1BTF9GTEFTSCwgCi0gICAgICAgICAgICAgICAgIkV4dHJhY3Qgbm9ybWFsIEZsYXNoIGNvbnRlbnQgaW5mb3JtYXRpb24gYnkiLCAxLCAKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXXsKLSAgICAgICAgICAgICAgICAgICAgeyJNU0FBIiwgVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX01TQUFfRkxBU0h9LAotICAgICAgICAgICAgICAgICAgICB7IkZsYXNoIERPTSIsIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9GTEFTSF9ET019LCAKLSAgICAgICAgICAgICAgICAgICAgeyJOb25lIiwgVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX05PX0ZMQVNIfX0sIAotICAgICAgICAgICAgICAgIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLSAgICAgICAgCi0gICAgICAgIGFkZEZpZWxkKG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLldORExFU1NfRkxBU0gsIAotICAgICAgICAgICAgICAgICJFeHRyYWN0IHdpbmRvd2xlc3MgRmxhc2ggY29udGVudCBpbmZvcm1hdGlvbiBieSIsIDEsIAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXVtdewotICAgICAgICAgICAgICAgICAgICB7IkZsYXNoIERPTSIsIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9GTEFTSF9ET019LCAKLSAgICAgICAgICAgICAgICAgICAgeyJOb25lIiwgVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX05PX0ZMQVNIfX0sIAotICAgICAgICAgICAgICAgIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQotICAgICAgICBhZGRGaWVsZChuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05PX0FMVCwKLSAgICAgICAgICAgICAgICAiUmVhZCBpbWFnZSB3aXRoIG5vIGFsdCB0ZXh0IiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotICAgICAgICBhZGRGaWVsZChuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05VTExfQUxULAotICAgICAgICAgICAgICAgICJSZWFkIGltYWdlIHdpdGggbnVsbCBhbHQgdGV4dCIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLSAgICAgICAgYWRkRmllbGQobmV3IEJvb2xlYW5GaWVsZEVkaXRvcihWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFRfTElOSywKLSAgICAgICAgICAgICAgICAiUmVhZCBpbWFnZSBsaW5rIHdpdGggbm8gYWx0IHRleHQiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0gICAgICAgIGFkZEZpZWxkKG5ldyBCb29sZWFuRmllbGRFZGl0b3IoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTlVMTF9BTFRfTElOSywKLSAgICAgICAgICAgICAgICAiUmVhZCBpbWFnZSBsaW5rIHdpdGggbnVsbCBhbHQgdGV4dCIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLSAgICAgICAgYWRkRmllbGQobmV3IEJvb2xlYW5GaWVsZEVkaXRvcihWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuU0tJUF9JQ09OX0xJTkssCi0gICAgICAgICAgICAgICAgIlNraXAgaW1hZ2UgbGluayBmb2xsb3dpbmcgdGV4dCBsaW5rIHdpdGggdGhlIHNhbWUgbGluayIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyZDA0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuZGxsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LmRsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2ZjFlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuZGxsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkMWYyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBXaW4zMiBUb29sa2l0IChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyCi1CdW5kbGUtVmVyc2lvbjogMC4wLjEKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5XaW4zMlBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTUwNGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLQkJCSAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuZGxsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc2ZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1EZWJ1ZwotUmVsZWFzZQotKi5uY2IKLSouc3VvCi0qLnVzZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjE2ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuY3BwIDogRGVmaW5lcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBETEwgYXBwbGljYXRpb24uCi0vLwotCi0jaW5jbHVkZSAic3RkYWZ4LmgiCi0KLQotI2lmZGVmIF9NQU5BR0VECi0jcHJhZ21hIG1hbmFnZWQocHVzaCwgb2ZmKQotI2VuZGlmCi0KLUJPT0wgQVBJRU5UUlkgRGxsTWFpbiggSE1PRFVMRSBoTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAgdWxfcmVhc29uX2Zvcl9jYWxsLAotICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBSZXNlcnZlZAotCQkJCQkgKQotewotICAgIHJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgX01BTkFHRUQKLSNwcmFnbWEgbWFuYWdlZChwb3ApCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5zbG4gYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3MGQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnNsbgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLe+7vw0KLU1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDkuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAwNQ0KLVByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5IiwgIkFjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS52Y3Byb2oiLCAiezQzNUI5N0MwLUQyMDItNDg0Mi1BRDkzLUJERTAzMzRDMEQxRH0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KLQkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezQzNUI5N0MwLUQyMDItNDg0Mi1BRDkzLUJERTAzMzRDMEQxRH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXs0MzVCOTdDMC1EMjAyLTQ4NDItQUQ5My1CREUwMzM0QzBEMUR9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezQzNUI5N0MwLUQyMDItNDg0Mi1BRDkzLUJERTAzMzRDMEQxRH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7NDM1Qjk3QzAtRDIwMi00ODQyLUFEOTMtQkRFMDMzNEMwRDFEfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS52Y3Byb2ogYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyZGQxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJzaGlmdF9qaXMiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iOC4wMCINCi0JTmFtZT0iQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5Ig0KLQlQcm9qZWN0R1VJRD0iezQzNUI5N0MwLUQyMDItNDg0Mi1BRDkzLUJERTAzMzRDMEQxRH0iDQotCVJvb3ROYW1lc3BhY2U9IkFjY2Vzc2liaWx0eVdpbjMyTGlicmFyeSINCi0JS2V5d29yZD0iV2luMzJQcm9qIg0KLQk+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiINCi0JCS8+DQotCTwvUGxhdGZvcm1zPg0KLQk8VG9vbEZpbGVzPg0KLQk8L1Rvb2xGaWxlcz4NCi0JPENvbmZpZ3VyYXRpb25zPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCi0JCQlDaGFyYWN0ZXJTZXQ9IjEiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkKEpBVkFfSE9NRSlcaW5jbHVkZTskKEpBVkFfSE9NRSlcaW5jbHVkZVx3aW4zMiINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMO0FDQ0VTU0lCSUxUWVdJTjMyTElCUkFSWV9FWFBPUlRTIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KLQkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQotCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCi0JCQkJU3ViU3lzdGVtPSIyIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KLQkJCUNoYXJhY3RlclNldD0iMSINCi0JCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iJChKQVZBX0hPTUUpXGluY2x1ZGU7JChKQVZBX0hPTUUpXGluY2x1ZGVcd2luMzIiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtBQ0NFU1NJQklMVFlXSU4zMkxJQlJBUllfRVhQT1JUUyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjMiDQotCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIg0KLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQotCQkJCVN1YlN5c3RlbT0iMiINCi0JCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KLQkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQk8L0NvbmZpZ3VyYXRpb25zPg0KLQk8UmVmZXJlbmNlcz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLlxBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuY3BwIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLlxvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbC5jcHAiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuXG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsLmNwcCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3RkYWZ4LmNwcCINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQotCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLlxzdGRhZnguaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSINCi0JCQk+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWxlDQotCQkJUmVsYXRpdmVQYXRoPSIuXFJlYWRNZS50eHQiDQotCQkJPg0KLQkJPC9GaWxlPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0YmM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJzdGRhZnguaCIKLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbC5oIgotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyKTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczKTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0KQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1KQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2KQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2KTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUlJCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNiwgamludCBhcmc3KQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3KTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUlJSQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNywgamludCBhcmc4KQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4KTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUlJSUkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcsIGppbnQgYXJnOCwgamludCBhcmc5KQotewotCWppbnQgcmMgPSAwOwotCXRyeSB7Ci0JCXJjID0gKGppbnQpKChqaW50IChTVERNRVRIT0RDQUxMVFlQRSAqKShqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KSkoKihqaW50ICoqKWFyZzEpW2FyZzBdKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4LCBhcmc5KTsKLQl9Ci0JY2F0Y2goLi4uKSB7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsLmggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlMjdjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERPIE5PVCBFRElUIFRISVMgRklMRSAtIGl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkICovCi0jaW5jbHVkZSA8am5pLmg+Ci0vKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsICovCi0KLSNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSAqIE1ldGhvZDogICAgVnRibENhbGwKLSAqIFNpZ25hdHVyZTogKElJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSAqIE1ldGhvZDogICAgVnRibENhbGwKLSAqIFNpZ25hdHVyZTogKElJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSAqIE1ldGhvZDogICAgVnRibENhbGwKLSAqIFNpZ25hdHVyZTogKElJSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSAqIE1ldGhvZDogICAgVnRibENhbGwKLSAqIFNpZ25hdHVyZTogKElJSUlJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSUlJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUlJCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSAqIE1ldGhvZDogICAgVnRibENhbGwKLSAqIFNpZ25hdHVyZTogKElJSUlJSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSUlJCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSAqIE1ldGhvZDogICAgVnRibENhbGwKLSAqIFNpZ25hdHVyZTogKElJSUlJSUlJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWxfVnRibENhbGxfX0lJSUlJSUlJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwNGE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgInN0ZGFmeC5oIgotI2luY2x1ZGUgIm9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsLmgiCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbF9TZXRMYXllcmVkV2luZG93QXR0cmlidXRlcwotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGh3bmQsIGppbnQgY3JLZXksIGpjaGFyIGJBbHBoYSwgamludCBkd0ZsYWdzKQotewotCXJldHVybiBTZXRMYXllcmVkV2luZG93QXR0cmlidXRlcygoSFdORClod25kLCBjcktleSwgYkFscGhhLCBkd0ZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbC5oIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzI1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBpdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCAqLwotI2luY2x1ZGUgPGpuaS5oPgotLyogSGVhZGVyIGZvciBjbGFzcyBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbCAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbAotI2RlZmluZSBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsCi0gKiBNZXRob2Q6ICAgIFNldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzCi0gKiBTaWduYXR1cmU6IChJSUNJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsX1NldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqY2hhciwgamludCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9zdGRhZnguY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L3N0ZGFmeC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjI1OGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L3N0ZGFmeC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBzdGRhZnguY3BwIDogc291cmNlIGZpbGUgdGhhdCBpbmNsdWRlcyBqdXN0IHRoZSBzdGFuZGFyZCBpbmNsdWRlcwotLy8gQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnBjaCB3aWxsIGJlIHRoZSBwcmUtY29tcGlsZWQgaGVhZGVyCi0vLyBzdGRhZngub2JqIHdpbGwgY29udGFpbiB0aGUgcHJlLWNvbXBpbGVkIHR5cGUgaW5mb3JtYXRpb24KLQotI2luY2x1ZGUgInN0ZGFmeC5oIgotCi0vLyBUT0RPOiByZWZlcmVuY2UgYW55IGFkZGl0aW9uYWwgaGVhZGVycyB5b3UgbmVlZCBpbiBTVERBRlguSAotLy8gYW5kIG5vdCBpbiB0aGlzIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9zdGRhZnguaCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9zdGRhZnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzOTFjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvc3RkYWZ4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBzdGRhZnguaCA6IGluY2x1ZGUgZmlsZSBmb3Igc3RhbmRhcmQgc3lzdGVtIGluY2x1ZGUgZmlsZXMsCi0vLyBvciBwcm9qZWN0IHNwZWNpZmljIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBmcmVxdWVudGx5LCBidXQKLS8vIGFyZSBjaGFuZ2VkIGluZnJlcXVlbnRseQotLy8KLQotI3ByYWdtYSBvbmNlCi0KLS8vIE1vZGlmeSB0aGUgZm9sbG93aW5nIGRlZmluZXMgaWYgeW91IGhhdmUgdG8gdGFyZ2V0IGEgcGxhdGZvcm0gcHJpb3IgdG8gdGhlIG9uZXMgc3BlY2lmaWVkIGJlbG93LgotLy8gUmVmZXIgdG8gTVNETiBmb3IgdGhlIGxhdGVzdCBpbmZvIG9uIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zLgotI2lmbmRlZiBXSU5WRVIJCQkJLy8gQWxsb3cgdXNlIG9mIGZlYXR1cmVzIHNwZWNpZmljIHRvIFdpbmRvd3MgWFAgb3IgbGF0ZXIuCi0jZGVmaW5lIFdJTlZFUiAweDA1MDEJCS8vIENoYW5nZSB0aGlzIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byB0YXJnZXQgb3RoZXIgdmVyc2lvbnMgb2YgV2luZG93cy4KLSNlbmRpZgotCi0jaWZuZGVmIF9XSU4zMl9XSU5OVAkJLy8gQWxsb3cgdXNlIG9mIGZlYXR1cmVzIHNwZWNpZmljIHRvIFdpbmRvd3MgWFAgb3IgbGF0ZXIuICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNTAxCS8vIENoYW5nZSB0aGlzIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byB0YXJnZXQgb3RoZXIgdmVyc2lvbnMgb2YgV2luZG93cy4KLSNlbmRpZgkJCQkJCQotCi0jaWZuZGVmIF9XSU4zMl9XSU5ET1dTCQkvLyBBbGxvdyB1c2Ugb2YgZmVhdHVyZXMgc3BlY2lmaWMgdG8gV2luZG93cyA5OCBvciBsYXRlci4KLSNkZWZpbmUgX1dJTjMyX1dJTkRPV1MgMHgwNDEwIC8vIENoYW5nZSB0aGlzIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSB0byB0YXJnZXQgV2luZG93cyBNZSBvciBsYXRlci4KLSNlbmRpZgotCi0jaWZuZGVmIF9XSU4zMl9JRQkJCS8vIEFsbG93IHVzZSBvZiBmZWF0dXJlcyBzcGVjaWZpYyB0byBJRSA2LjAgb3IgbGF0ZXIuCi0jZGVmaW5lIF9XSU4zMl9JRSAweDA2MDAJLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBvdGhlciB2ZXJzaW9ucyBvZiBJRS4KLSNlbmRpZgotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4JCS8vIEV4Y2x1ZGUgcmFyZWx5LXVzZWQgc3R1ZmYgZnJvbSBXaW5kb3dzIGhlYWRlcnMKLS8vIFdpbmRvd3MgSGVhZGVyIEZpbGVzOgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotCi0KLS8vIFRPRE86IHJlZmVyZW5jZSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91ciBwcm9ncmFtIHJlcXVpcmVzIGhlcmUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvQWNjZXNzaWJsZUhpbGlnaHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9BY2Nlc3NpYmxlSGlsaWdodGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOGEwMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9BY2Nlc3NpYmxlSGlsaWdodGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmxlSGlsaWdodGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZCBsYXN0VGhyZWFkID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfWUVMTE9XID0gMHgwMEZGRkY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMHgwMEZGMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBGTEFTSElOR19DT0xPUlMgPSB7IAotICAgICAgICB7IENPTE9SX1lFTExPVywgMjUwIH0sIHsgQ09MT1JfR1JFRU4sIDI1MCB9LAotICAgICAgICB7IENPTE9SX1lFTExPVywgMjUwIH0sIHsgQ09MT1JfR1JFRU4sIDI1MCB9LCAKLSAgICAgICAgeyBDT0xPUl9ZRUxMT1csIDI1MCB9LCB7IENPTE9SX0dSRUVOLCAyNTAgfSwKLSAgICAgICAgeyBDT0xPUl9ZRUxMT1csIDEwMDAgfSAKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogRmxhc2ggcmVjdGFuZ2xlIHdpdGhvdXQgdXNpbmcgT3ZlcmxheVdpbmRvdy4KLSAgICAgKgotICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGxlYXZlIGdhcmJhZ2VzIG9uIHRoZSBzY3JlZW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxhc2hSZWN0YW5nbGUoZmluYWwgUmVjdGFuZ2xlIHJlY3QpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbGFzdFRocmVhZCkgewotICAgICAgICAgICAgbGFzdFRocmVhZC5pbnRlcnJ1cHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiggbnVsbCAhPSByZWN0ICkgewotICAgICAgICAgICAgbGFzdFRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGh3bmREcmF3ID0gV2luZG93VXRpbC5HZXREZXNrdG9wV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpPTA7IGk8RkxBU0hJTkdfQ09MT1JTLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdVdGlsLmRyYXdSZWN0YW5nbGUoaHduZERyYXcsIHJlY3QsIEZMQVNISU5HX0NPTE9SU1tpXVswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKEZMQVNISU5HX0NPTE9SU1tpXVsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBEcmF3VXRpbC5yZWRyYXdSZWN0YW5nbGUoaHduZERyYXcsIHJlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRocmVhZCA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbGFzdFRocmVhZC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9DT01VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0NPTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyNDJjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0NPTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkdVSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ09NVXRpbCB7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlRGlzcGF0Y2goR1VJRCByY2xzaWQpIHsKLSAgICAgICAgaW50W10gcHB2ID0gbmV3IGludFsxXTsKLSAgICAgICAgaW50IHJlc3VsdCA9IENPTS5Db0NyZWF0ZUluc3RhbmNlKHJjbHNpZCwgMCwgQ09NLkNMU0NUWF9JTlBST0NfSEFORExFUiB8IENPTS5DTFNDVFhfSU5QUk9DX1NFUlZFUgotICAgICAgICAgICAgICAgIHwgQ09NLkNMU0NUWF9MT0NBTF9TRVJWRVIgfCBDT00uQ0xTQ1RYX1JFTU9URV9TRVJWRVIsIENPTS5JSURJRGlzcGF0Y2gsIHBwdik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0xFLlNfT0spCi0gICAgICAgICAgICBPTEUuZXJyb3IoT0xFLkVSUk9SX0NBTk5PVF9DUkVBVEVfT0JKRUNULCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcHB2WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgcHBWdGJsLCBpbnQgYXJnMCwgaW50IGFyZzEpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgcHBWdGJsLCBpbnQgYXJnMCwgaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCwgaW50IGFyZzUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCwgaW50IGFyZzUsIGludCBhcmc2KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgcHBWdGJsLCBpbnQgYXJnMCwgaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQsIGludCBhcmc1LCBpbnQgYXJnNiwgaW50IGFyZzcpOwotCi0gICAgcHVibGljIHN0YXRpYyBHVUlEIElJREZyb21TdHJpbmcoU3RyaW5nIGxwc3opIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IGxwc3oubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltsZW5ndGggKyAxXTsKLSAgICAgICAgbHBzei5nZXRDaGFycygwLCBsZW5ndGgsIGJ1ZmZlciwgMCk7Ci0gICAgICAgIEdVSUQgbHBpaWQgPSBuZXcgR1VJRCgpOwotICAgICAgICBpZiAoQ09NLklJREZyb21TdHJpbmcoYnVmZmVyLCBscGlpZCkgPT0gT0xFLlNfT0spCi0gICAgICAgICAgICByZXR1cm4gbHBpaWQ7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvQ09QWURBVEFTVFJVQ1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvQ09QWURBVEFTVFJVQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4MTFiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0NPUFlEQVRBU1RSVUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLXB1YmxpYyBjbGFzcyBDT1BZREFUQVNUUlVDVCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXTV9DT1BZREFUQSA9IDB4NGE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2l6ZW9mID0gMTI7Ci0JCi0JcHVibGljIGludCBkd0RhdGE7Ci0JcHVibGljIGludCBjYkRhdGE7Ci0JcHVibGljIGludCBscERhdGE7Ci0JcHVibGljIGJ5dGVbXSBkYXRhOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIENPUFlEQVRBU1RSVUNUIG9iamVjdCB1c2luZyBTdHJpbmcgZGF0YQotCSAqIAotCSAqIEBwYXJhbSBkd0RhdGEKLQkgKiBAcGFyYW0gc3RyRGF0YQotCSAqLwotCXB1YmxpYyBDT1BZREFUQVNUUlVDVChpbnQgZHdEYXRhLCBTdHJpbmcgc3RyRGF0YSApIHsKLQkJdGhpcyhkd0RhdGEsc3RyRGF0YS5nZXRCeXRlcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgQ09QWURBVEFTVFJVQ1Qgb2JqZWN0IHVzaW5nIGJpbmFyeSBkYXRhCi0JICogCi0JICogQHBhcmFtIGR3RGF0YQotCSAqIEBwYXJhbSBkYXRhCi0JICovCi0JcHVibGljIENPUFlEQVRBU1RSVUNUKGludCBkd0RhdGEsIGJ5dGVbXSBkYXRhICkgewotCQl0aGlzLmR3RGF0YSA9IGR3RGF0YTsKLQkJaWYoIG51bGwgIT0gZGF0YSApIHsKLQkJCXRoaXMuY2JEYXRhID0gZGF0YS5sZW5ndGg7Ci0JCQl0aGlzLmRhdGEgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHRoaXMuZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIENPUFlEQVRBU1RSVUNUIG9iamVjdCB1c2luZyBsUGFyYW0KLQkgKiAKLQkgKiBAcGFyYW0gbFBhcmFtCi0JICovCi0JcHVibGljIENPUFlEQVRBU1RSVUNUKGludCBsUGFyYW0pIHsKLSAgICAgICAgaW50W10gcEVudHJpZXMgPSBuZXcgaW50WzNdOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBFbnRyaWVzLCBsUGFyYW0sIHNpemVvZik7Ci0gICAgICAgIGR3RGF0YSA9IHBFbnRyaWVzWzBdOwotICAgICAgICBjYkRhdGEgPSBwRW50cmllc1sxXTsKLSAgICAgICAgbHBEYXRhID0gcEVudHJpZXNbMl07Ci0gICAgICAgIGlmKCAwICE9IGxwRGF0YSAmJiBjYkRhdGEgPiAwICkgewotICAgICAgICAJZGF0YSA9IG5ldyBieXRlW2NiRGF0YV07Ci0gICAgICAgIAlPUy5Nb3ZlTWVtb3J5KGRhdGEsIGxwRGF0YSwgY2JEYXRhKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCWRhdGEgPSBuZXcgYnl0ZVswXTsKLSAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiBDb3B5IGEgQ09QWURBVEFTVFJVQ1Qgb2JqZWN0IHRvIG1lbW9yeQotCSAqIAotCSAqIEBwYXJhbSBwRGF0YQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoaW50IHBEYXRhKXsKLQkJaW50IHAgPSAwOwotCQlpZiggbnVsbCAhPSBkYXRhICkgewotCQkJcCA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBjYkRhdGEpOwotCQkJT1MuTW92ZU1lbW9yeShwLCBkYXRhLCBjYkRhdGEpOwotCQl9Ci0JCU9TLk1vdmVNZW1vcnkocERhdGEsIG5ldyBpbnRbXSB7ZHdEYXRhLCBjYkRhdGEsIHB9LCBzaXplb2YpOwotCX0KLQkKLQkvKioKLQkgKiBTZW5kIGEgQ09QWURBVEFTVFJVQ1Qgb2JqZWN0IHRvIGFub3RoZXIgd2luZG93IHVzaW5nIFdNX0NPUFlEQVRBCi0JICogCi0JICogQHBhcmFtIGh3bmRUbwotCSAqIEBwYXJhbSBod25kRnJvbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IHNlbmRNZXNzYWdlKGludCBod25kVG8sIGludCBod25kRnJvbSkgewotCQlpbnQgbHBEYXRhID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIHNpemVvZik7Ci0JCXRyeSB7Ci0JCQlzZXREYXRhKGxwRGF0YSk7Ci0JCQlyZXR1cm4gT1MuU2VuZE1lc3NhZ2UoaHduZFRvLCBXTV9DT1BZREFUQSwgaHduZEZyb20sIGxwRGF0YSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlPUy5HbG9iYWxGcmVlKGxwRGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSBhIFN0cmluZyBkYXRhIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0RhdGEoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyhkYXRhKTsKLQkJfQotCQljYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gImR3RGF0YT0iK2R3RGF0YSsiLCBjYkRhdGE9IitjYkRhdGErIiwgbHBEYXRhPTB4IitJbnRlZ2VyLnRvSGV4U3RyaW5nKGxwRGF0YSkrIiwgZGF0YT1cIiIrbmV3IFN0cmluZyhkYXRhKSsiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0RyYXdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0RyYXdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2ZiZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9EcmF3VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5SRUNUOwotCi0KLQotcHVibGljIGNsYXNzIERyYXdVdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYW5kV2lkdGggPSAzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRyYXdSZWN0YW5nbGUoaW50IGh3bmREcmF3LCBSZWN0YW5nbGUgcmVjdCwgaW50IGNvbG9yKSB7Ci0gICAgICAgIGludCBoREMgPSBPUy5HZXREQ0V4KGh3bmREcmF3LCAwLCBPUy5EQ1hfQ0FDSEUpOwotICAgICAgICBpbnQgb2xkQnJ1c2ggPSBPUy5TZWxlY3RPYmplY3QoaERDLCBPUy5DcmVhdGVTb2xpZEJydXNoKGNvbG9yKSk7Ci0gICAgICAgIE9TLlBhdEJsdChoREMsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCBiYW5kV2lkdGgsIE9TLlBBVENPUFkpOwotICAgICAgICBPUy5QYXRCbHQoaERDLCByZWN0LngsIHJlY3QueSArIGJhbmRXaWR0aCwgYmFuZFdpZHRoLCByZWN0LmhlaWdodCAtIChiYW5kV2lkdGggKiAyKSwgT1MuUEFUQ09QWSk7Ci0gICAgICAgIE9TLlBhdEJsdChoREMsIHJlY3QueCArIHJlY3Qud2lkdGggLSBiYW5kV2lkdGgsIHJlY3QueSArIGJhbmRXaWR0aCwgYmFuZFdpZHRoLCByZWN0LmhlaWdodCAtIChiYW5kV2lkdGggKiAyKSwKLSAgICAgICAgICAgICAgICBPUy5QQVRDT1BZKTsKLSAgICAgICAgT1MuUGF0Qmx0KGhEQywgcmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCAtIGJhbmRXaWR0aCwgcmVjdC53aWR0aCwgYmFuZFdpZHRoLCBPUy5QQVRDT1BZKTsKLSAgICAgICAgT1MuRGVsZXRlT2JqZWN0KE9TLlNlbGVjdE9iamVjdChoREMsIG9sZEJydXNoKSk7Ci0gICAgICAgIE9TLlJlbGVhc2VEQyhod25kRHJhdywgaERDKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVkcmF3UmVjdGFuZ2xlKGludCBod25kRHJhdywgUmVjdGFuZ2xlIHJlY3QpIHsKLSAgICAgICAgUkVDVCBvc1JlY3QgPSBuZXcgUkVDVCgpOwotICAgICAgICBvc1JlY3QubGVmdCA9IHJlY3QueCAtIGJhbmRXaWR0aDsKLSAgICAgICAgb3NSZWN0LnRvcCA9IHJlY3QueSAtIGJhbmRXaWR0aDsKLSAgICAgICAgb3NSZWN0LnJpZ2h0ID0gcmVjdC54ICsgcmVjdC53aWR0aCArIGJhbmRXaWR0aDsKLSAgICAgICAgb3NSZWN0LmJvdHRvbSA9IHJlY3QueSArIHJlY3QuaGVpZ2h0ICsgYmFuZFdpZHRoOwotICAgICAgICBPUy5SZWRyYXdXaW5kb3coaHduZERyYXcsIG9zUmVjdCwgMCwgT1MuUkRXX0lOVkFMSURBVEUgfCBPUy5SRFdfQUxMQ0hJTERSRU4pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9IaWdobGlnaHRDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvSGlnaGxpZ2h0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYjc3ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9IaWdobGlnaHRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSUludGVydmFsRXhlYyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX1dJRFRIID0gMzsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBIaWdobGlnaHRDb21wb3NpdGUgaW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIFN0eWxlZFRleHQgdGV4dDsKLSAgICAKLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLQotICAgIHByaXZhdGUgaW50IGZsYXNoaW5nSW5kZXggPSAtMTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3VwcHJlc3NSZWZDb3VudCA9IDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5lZWRSZWRyYXcgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBGTEFTSElOR19DT0xPUlMgPSB7IAotICAgICAgICB7IFNXVC5DT0xPUl9ZRUxMT1csIDI1MCB9LCB7IFNXVC5DT0xPUl9HUkVFTiwgMjUwIH0sCi0gICAgICAgIHsgU1dULkNPTE9SX1lFTExPVywgMjUwIH0sIHsgU1dULkNPTE9SX0dSRUVOLCAyNTAgfSwgCi0gICAgICAgIHsgU1dULkNPTE9SX1lFTExPVywgMjUwIH0sIHsgU1dULkNPTE9SX0dSRUVOLCAyNTAgfSwKLSAgICAgICAgeyBTV1QuQ09MT1JfWUVMTE9XLCAxMDAwIH0gCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NPTE9SID0gU1dULkNPTE9SX0lORk9fRk9SRUdST1VORDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0JBQ0sgPSBTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EOwotCi0gICAgcHVibGljIEhpZ2hsaWdodENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IEJPUkRFUl9XSURUSDsKLSAgICAgICAgc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHRleHQgPSBuZXcgU3R5bGVkVGV4dCh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIHRleHQuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvdyhSZWN0YW5nbGUgcmVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAJaWYoIC0xICE9IGZsYXNoaW5nSW5kZXggKSB7Ci0gICAgCQluZWVkUmVkcmF3ID0gdHJ1ZTsKLSAgICAJfQotICAgICAgICBmbGFzaGluZ0luZGV4ID0gMDsKLSAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotICAgICAgICAgICAgdGV4dC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICAgICAgU3R5bGVSYW5nZSByYW5nZSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0gICAgICAgICAgICByYW5nZS5zdGFydCA9IDA7Ci0gICAgICAgICAgICByYW5nZS5sZW5ndGggPSB0ZXh0LmdldENoYXJDb3VudCgpOwotICAgICAgICAgICAgcmFuZ2UuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoTUVTU0FHRV9DT0xPUik7Ci0gICAgICAgICAgICByYW5nZS5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihNRVNTQUdFX0JBQ0spOwotICAgICAgICAgICAgdGV4dC5zZXRTdHlsZVJhbmdlKHJhbmdlKTsKLSAgICAgICAgfQotICAgICAgICBnZXRPdmVybGF5V2luZG93KCkuZ2V0Q29tcG9zaXRlKCkubW92ZUFib3ZlKG51bGwpOwotICAgICAgICBtb3ZlQWJvdmUobnVsbCk7Ci0gICAgICAgIHNldEJvdW5kcyhyZWN0LngsIHJlY3QueSwgTWF0aC5tYXgoQk9SREVSX1dJRFRILCByZWN0LndpZHRoKSwgTWF0aC5tYXgoQk9SREVSX1dJRFRILCByZWN0LmhlaWdodCkpOwotICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZXhlYygpIHsKLSAgICAJaWYoIC0xICE9IGZsYXNoaW5nSW5kZXggKSB7Ci0gICAgICAgICAgICBpZiAoZmxhc2hpbmdJbmRleCA8IEZMQVNISU5HX0NPTE9SUy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoRkxBU0hJTkdfQ09MT1JTW2ZsYXNoaW5nSW5kZXhdWzBdKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZMQVNISU5HX0NPTE9SU1tmbGFzaGluZ0luZGV4KytdWzFdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIAlmbGFzaGluZ0luZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYoIG5lZWRSZWRyYXcgKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRSZWRyYXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0T3ZlcmxheVdpbmRvdygpLmdldENvbXBvc2l0ZSgpLnJlZHJhdygpOyAvLyBDbGVhciBibGFjayBibG9jawotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAJfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxhc2hSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gcmVjdCAmJiAwID09IHN1cHByZXNzUmVmQ291bnQgKSB7Ci0gICAgICAgICAgICBpZiggT3ZlcmxheVdpbmRvdy5nZXRWaXNpYmxlKCkgKSB7Ci0gICAgICAgICAgICAgICAgT3ZlcmxheVdpbmRvdyB3aW5kb3cgPSBnZXRPdmVybGF5V2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYoIG51bGwgPT0gaW5zdGFuY2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IEhpZ2hsaWdodENvbXBvc2l0ZSh3aW5kb3cuZ2V0Q29tcG9zaXRlKCksIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2hvdyhyZWN0LCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHdpbmRvdy5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEFjY2Vzc2libGVIaWxpZ2h0ZXIuZmxhc2hSZWN0YW5nbGUocmVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdXBkYXRlU3VwcHJlc3NDb3VudChpbnQgaW5jcmVtZW50KSB7Ci0gICAgICAgIHN1cHByZXNzUmVmQ291bnQgKz0gaW5jcmVtZW50OwotICAgICAgICByZXR1cm4gc3VwcHJlc3NSZWZDb3VudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3coYm9vbGVhbiBzaG93KSB7Ci0gICAgICAgIGlmKCBudWxsICE9IGluc3RhbmNlICkgewotICAgICAgICAgICAgaW5zdGFuY2Uuc2V0VmlzaWJsZShzaG93KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIE92ZXJsYXlXaW5kb3cgZ2V0T3ZlcmxheVdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlXaW5kb3cuZ2V0SW5zdGFuY2UoT3ZlcmxheVdpbmRvdy5JTkRFWF9ISUdITElHSFQsdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGlnaGxpZ2h0Q29tcG9zaXRlIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0lJbnRlcnZhbEV4ZWMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvSUludGVydmFsRXhlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdkNDA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvSUludGVydmFsRXhlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnRlcnZhbEV4ZWMgewotCi0gICAgcHVibGljIGludCBleGVjKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0tleWJvYXJkVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9LZXlib2FyZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYjFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0tleWJvYXJkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotCi0KLXB1YmxpYyBjbGFzcyBLZXlib2FyZFV0aWwgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVktfQ09OVFJPTCA9IE9TLlZLX0NPTlRST0w7IC8vIDB4MTEKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBJc0tleURvd24oaW50IG5WaXJ0S2V5KSB7Ci0gICAgICAgIHJldHVybiBPUy5HZXRLZXlTdGF0ZShuVmlydEtleSkgPCAwOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9NZW1vcnlVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL01lbW9yeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhOTViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL01lbW9yeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTWVtb3J5VXRpbCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBHbG9iYWxBbGxvYyhpbnQgZHdCeXRlcykgewotICAgICAgICByZXR1cm4gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIGR3Qnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IEdsb2JhbEZyZWUoaW50IGhNZW0pIHsKLSAgICAgICAgcmV0dXJuIE9TLkdsb2JhbEZyZWUoaE1lbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgU3lzQWxsb2NTdHJpbmcoY2hhciBbXSBzeikgewotICAgICAgICByZXR1cm4gQ09NLlN5c0FsbG9jU3RyaW5nKHN6KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgU3lzRnJlZVN0cmluZyhpbnQgYnN0cikgewotICAgICAgICBDT00uU3lzRnJlZVN0cmluZyhic3RyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgTW92ZU1lbW9yeShpbnRbXSBEZXN0aW5hdGlvbiwgaW50IFNvdXJjZSwgaW50IExlbmd0aCkgewotICAgICAgICBPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIE1vdmVNZW1vcnkoc2hvcnRbXSBEZXN0aW5hdGlvbiwgaW50IFNvdXJjZVB0ciwgaW50IExlbmd0aCkgewotICAgICAgICBPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2VQdHIsIExlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIE1vdmVNZW1vcnkoY2hhcltdIERlc3RpbmF0aW9uLCBpbnQgU291cmNlUHRyLCBpbnQgTGVuZ3RoKSB7Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZVB0ciwgTGVuZ3RoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIE1vdmVNZW1vcnkoaW50IERlc3RpbmF0aW9uUHRyLCBzaG9ydFtdIFNvdXJjZSwgaW50IExlbmd0aCkgewotICAgICAgICBPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uUHRyLCBTb3VyY2UsIExlbmd0aCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNb3ZlTWVtb3J5IChpbnQgRGVzdGluYXRpb25QdHIsIGludCBbXSBTb3VyY2UsIGludCBMZW5ndGgpIHsKLSAgICAgICAgT1MuTW92ZU1lbW9yeShEZXN0aW5hdGlvblB0ciwgU291cmNlLCBMZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgTW92ZU1lbW9yeSAoaW50IERlc3RpbmF0aW9uUHRyLCBjaGFyIFtdIFNvdXJjZSwgaW50IExlbmd0aCkgewotICAgICAgICBPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uUHRyLCBTb3VyY2UsIExlbmd0aCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZUludEFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVJbnRBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2YmU1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZUludEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotCi0KLXB1YmxpYyBjbGFzcyBOYXRpdmVJbnRBY2Nlc3MgewotICAgIHByaXZhdGUgaW50IHBJbnRBZGRyZXNzID0gMDsKLQotICAgIHB1YmxpYyBOYXRpdmVJbnRBY2Nlc3MoKSB7Ci0gICAgICAgIHRoaXMoMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBOYXRpdmVJbnRBY2Nlc3MoaW50IHNpemUpIHsKLSAgICAgICAgcEludEFkZHJlc3MgPSBNZW1vcnlVdGlsLkdsb2JhbEFsbG9jKDQgKiBzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBNZW1vcnlVdGlsLkdsb2JhbEZyZWUocEludEFkZHJlc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEFkZHJlc3MoMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0QWRkcmVzcyhpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHBJbnRBZGRyZXNzICsgaW5kZXggKiA0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkgewotICAgICAgICByZXR1cm4gZ2V0SW50KDApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEludChpbnQgaW5kZXgpIHsKLSAgICAgICAgaW50W10gcEludCA9IG5ldyBpbnRbMV07Ci0gICAgICAgIE1lbW9yeVV0aWwuTW92ZU1lbW9yeShwSW50LCBnZXRBZGRyZXNzKGluZGV4KSwgNCk7Ci0gICAgICAgIHJldHVybiBwSW50WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEludChpbnQgdmFsdWUpIHsKLSAgICAgICAgc2V0SW50KDAsdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgaW50W10gcEludCA9IG5ldyBpbnRbMV07Ci0gICAgICAgIHBJbnRbMF0gPSB2YWx1ZTsKLSAgICAgICAgTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KGdldEFkZHJlc3MoaW5kZXgpLCBwSW50LCA0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZVN0cmluZ0FjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVTdHJpbmdBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiZWYwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZVN0cmluZ0FjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotCi0KLQotcHVibGljIGNsYXNzIE5hdGl2ZVN0cmluZ0FjY2VzcyB7Ci0gICAgcHJpdmF0ZSBpbnQgcEJTVFJBZGRyZXNzID0gMDsKLQotICAgIHByaXZhdGUgaW50W10gaE1lbSA9IG5ldyBpbnRbMV07Ci0KLSAgICBwdWJsaWMgTmF0aXZlU3RyaW5nQWNjZXNzKCkgewotICAgICAgICBwQlNUUkFkZHJlc3MgPSBNZW1vcnlVdGlsLkdsb2JhbEFsbG9jKDQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmICgwICE9IGhNZW1bMF0pIHsKLSAgICAgICAgICAgIENPTS5TeXNGcmVlU3RyaW5nKGhNZW1bMF0pOwotICAgICAgICB9Ci0gICAgICAgIE1lbW9yeVV0aWwuR2xvYmFsRnJlZShwQlNUUkFkZHJlc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIHBCU1RSQWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLSAgICAgICAgTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KGhNZW0sIHBCU1RSQWRkcmVzcywgNCk7Ci0gICAgICAgIGlmICgwICE9IGhNZW1bMF0pIHsKLSAgICAgICAgICAgIGludCBzaXplID0gQ09NLlN5c1N0cmluZ0J5dGVMZW4oaE1lbVswXSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbKHNpemUgKyAxKSAvIDJdOwotICAgICAgICAgICAgICAgIE1lbW9yeVV0aWwuTW92ZU1lbW9yeShidWZmZXIsIGhNZW1bMF0sIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ly8iIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgdGV4dCkgewotICAgICAgICBNZW1vcnlVdGlsLk1vdmVNZW1vcnkoaE1lbSwgcEJTVFJBZGRyZXNzLCA0KTsKLSAgICAgICAgaWYgKDAgIT0gaE1lbVswXSkgewotICAgICAgICAgICAgQ09NLlN5c0ZyZWVTdHJpbmcoaE1lbVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhcltdIGRhdGEgPSAodGV4dCArICJcMCIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHB0ciA9IENPTS5TeXNBbGxvY1N0cmluZyhkYXRhKTsKLSAgICAgICAgQ09NLk1vdmVNZW1vcnkocEJTVFJBZGRyZXNzLCBuZXcgaW50W10geyBwdHIgfSwgNCk7Ci0gICAgICAgIE1lbW9yeVV0aWwuTW92ZU1lbW9yeShoTWVtLCBwQlNUUkFkZHJlc3MsIDQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvTmF0aXZlVmFyaWFudEFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVWYXJpYW50QWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzQ0MDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVWYXJpYW50QWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBOYXRpdmVWYXJpYW50QWNjZXNzIHsKLSAgICBwcml2YXRlIGludCBzaXplOwotCi0gICAgcHJpdmF0ZSBpbnQgcFZhcmlhbnRBZGRyZXNzOwotCi0gICAgcHVibGljIE5hdGl2ZVZhcmlhbnRBY2Nlc3MoKSB7Ci0gICAgICAgIHRoaXMoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5hdGl2ZVZhcmlhbnRBY2Nlc3MoaW50IHNpemUpIHsKLSAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgICAgICAgdGhpcy5wVmFyaWFudEFkZHJlc3MgPSBNZW1vcnlVdGlsLkdsb2JhbEFsbG9jKFZhcmlhbnQuc2l6ZW9mICogc2l6ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDT00uVmFyaWFudEluaXQoZ2V0QWRkcmVzcyhpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ09NLlZhcmlhbnRDbGVhcihnZXRBZGRyZXNzKGkpKTsKLSAgICAgICAgfQotICAgICAgICBNZW1vcnlVdGlsLkdsb2JhbEZyZWUocFZhcmlhbnRBZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBZGRyZXNzKDApOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QWRkcmVzcyhpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHBWYXJpYW50QWRkcmVzcyArIFZhcmlhbnQuc2l6ZW9mICogaW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUeXBlKDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXRUeXBlKGludCBpbmRleCkgewotICAgICAgICBzaG9ydFtdIHBUeXBlID0gbmV3IHNob3J0WzFdOwotICAgICAgICBNZW1vcnlVdGlsLk1vdmVNZW1vcnkocFR5cGUsIGdldEFkZHJlc3MoaW5kZXgpLCAyKTsKLSAgICAgICAgcmV0dXJuIHBUeXBlWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkgewotICAgICAgICByZXR1cm4gZ2V0SW50KDApOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBpbmRleCkgewotICAgICAgICBpZiAoT0xFLlZUX0k0ID09IGdldFR5cGUoaW5kZXgpKSB7Ci0gICAgICAgICAgICBpbnRbXSBwSW50ID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIE1lbW9yeVV0aWwuTW92ZU1lbW9yeShwSW50LCBnZXRBZGRyZXNzKGluZGV4KSArIDgsIDQpOwotICAgICAgICAgICAgcmV0dXJuIHBJbnRbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGlzcGF0Y2ggZ2V0RGlzcGF0Y2goKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwYXRjaCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURpc3BhdGNoIGdldERpc3BhdGNoKGludCBpbmRleCkgewotICAgICAgICBpZiAoT0xFLlZUX0RJU1BBVENIID09IGdldFR5cGUoaW5kZXgpKSB7Ci0gICAgICAgICAgICBpbnRbXSBwSW50ID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIE1lbW9yeVV0aWwuTW92ZU1lbW9yeShwSW50LCBnZXRBZGRyZXNzKGluZGV4KSArIDgsIDQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBJRGlzcGF0Y2gocEludFswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChPTEUuVlRfQlNUUiA9PSBnZXRUeXBlKGluZGV4KSkgewotICAgICAgICAgICAgaW50W10gaE1lbSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBNZW1vcnlVdGlsLk1vdmVNZW1vcnkoaE1lbSwgZ2V0QWRkcmVzcyhpbmRleCkgKyA4LCA0KTsKLSAgICAgICAgICAgIGlmICgwICE9IGhNZW1bMF0pIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IENPTS5TeXNTdHJpbmdCeXRlTGVuKGhNZW1bMF0pOwotICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbKHNpemUgKyAxKSAvIDJdOwotICAgICAgICAgICAgICAgICAgICBNZW1vcnlVdGlsLk1vdmVNZW1vcnkoYnVmZmVyLCBoTWVtWzBdLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBWYXJpYW50IGdldFZhcmlhbnQoKSB7Ci0gICAgCXJldHVybiBnZXRWYXJpYW50KDApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgVmFyaWFudCBnZXRWYXJpYW50KGludCBpbmRleCkgewotICAgICAgICBzd2l0Y2goIGdldFR5cGUoaW5kZXgpICkgewotICAgICAgICAgICAgY2FzZSBPTEUuVlRfSTQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYW50KGdldEludChpbmRleCkpOwotICAgICAgICAgICAgY2FzZSBPTEUuVlRfQlNUUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhbnQoZ2V0U3RyaW5nKGluZGV4KSk7Ci0gICAgICAgICAgICBjYXNlIE9MRS5WVF9FTVBUWToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvT3ZlcmxheUxhYmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhlMGEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvT3ZlcmxheUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci0KLQotcHVibGljIGNsYXNzIE92ZXJsYXlMYWJlbCBleHRlbmRzIENMYWJlbCB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGFzc29jaWF0ZWRPYmplY3Q7Ci0gICAgCi0gICAgcHJpdmF0ZSBNZW51IHBvcHVwTWVudTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3duZXJJZCA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIE92ZXJsYXlMYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIHNldEZvcmVncm91bmQoZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgc2V0QmFja2dyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotICAgICAgICBzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgICAgYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgcmVjdCA9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBldmVudC5nYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCxyZWN0LnkscmVjdC53aWR0aC0xLHJlY3QuaGVpZ2h0LTEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLSAgICAgICAgcmVtb3ZlQWxsKHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsKGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldE92ZXJsYXlDb21wb3NpdGUoZmFsc2UpOwotICAgICAgICBpZiggbnVsbCAhPSBjb21wb3NpdGUgKSB7Ci0gICAgICAgICAgICBpZiggZm9yY2UgKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRyZW4oY29tcG9zaXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggIWNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkgJiYgbnVsbCA9PSBjb21wb3NpdGUuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRyZW4oY29tcG9zaXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hpbGRyZW4oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBDb250cm9sW10gY29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgaWYoIGNvbnRyb2xzW2ldIGluc3RhbmNlb2YgT3ZlcmxheUxhYmVsICkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xzW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIE92ZXJsYXlMYWJlbCBjcmVhdGUoT2JqZWN0IGFzc29jaWF0ZWRPYmplY3QpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldE92ZXJsYXlDb21wb3NpdGUodHJ1ZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5tb3ZlQWJvdmUobnVsbCk7Ci0gICAgICAgIENvbnRyb2xbXSBjb250cm9scyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IoIGludCBpPTA7IGk8Y29udHJvbHMubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBpZiggY29udHJvbHNbaV0gaW5zdGFuY2VvZiBPdmVybGF5TGFiZWwgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIGFzc29jaWF0ZWRPYmplY3QuZXF1YWxzKCgoT3ZlcmxheUxhYmVsKWNvbnRyb2xzW2ldKS5hc3NvY2lhdGVkT2JqZWN0KSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE92ZXJsYXlMYWJlbCBsYWJlbCA9IG5ldyBPdmVybGF5TGFiZWwoY29tcG9zaXRlLFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuYXNzb2NpYXRlZE9iamVjdCA9IGFzc29jaWF0ZWRPYmplY3Q7Ci0gICAgICAgIHJldHVybiBsYWJlbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBPdmVybGF5TGFiZWxbXSBnZXRMYWJlbHNBdFBvc2l0aW9uKFBvaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIExpc3QgbGFiZWxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0T3ZlcmxheUNvbXBvc2l0ZShmYWxzZSk7Ci0gICAgICAgIGlmKCBudWxsICE9IGNvbXBvc2l0ZSApIHsKLSAgICAgICAgICAgIENvbnRyb2xbXSBjb250cm9scyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPGNvbnRyb2xzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgIGlmKCBjb250cm9sc1tpXSBpbnN0YW5jZW9mIE92ZXJsYXlMYWJlbCApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvbnRyb2xzW2ldLmdldEJvdW5kcygpLmNvbnRhaW5zKHBvc2l0aW9uKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsTGlzdC5hZGQoY29udHJvbHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoT3ZlcmxheUxhYmVsW10pbGFiZWxMaXN0LnRvQXJyYXkobmV3IE92ZXJsYXlMYWJlbFtsYWJlbExpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21wb3NpdGUgZ2V0T3ZlcmxheUNvbXBvc2l0ZShib29sZWFuIGNyZWF0ZSkgewotICAgICAgICBPdmVybGF5V2luZG93IHdpbmRvdyA9IE92ZXJsYXlXaW5kb3cuZ2V0SW5zdGFuY2UoT3ZlcmxheVdpbmRvdy5JTkRFWF9MQUJFTFMsY3JlYXRlKTsKLSAgICAgICAgaWYoIG51bGwgIT0gd2luZG93ICkgewotICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wb3NpdGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVudSBjcmVhdGVQb3B1cE1lbnUoKSB7Ci0gICAgICAgIGlmKCBudWxsICE9IHBvcHVwTWVudSAmJiAhcG9wdXBNZW51LmlzRGlzcG9zZWQoKSApIHsKLSAgICAgICAgICAgIHBvcHVwTWVudS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcG9wdXBNZW51ID0gbmV3IE1lbnUodGhpcyk7Ci0gICAgICAgIHJldHVybiBwb3B1cE1lbnU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmKCBudWxsICE9IHBvcHVwTWVudSAmJiAhcG9wdXBNZW51LmlzRGlzcG9zZWQoKSApIHsKLSAgICAgICAgICAgIHBvcHVwTWVudS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE93bmVySWQoKSB7Ci0gICAgICAgIHJldHVybiBvd25lcklkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPd25lcklkKFN0cmluZyBpZCkgewotICAgICAgICBvd25lcklkID0gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfU0VQQVJBVE9SID0gIlxuLS0tLS0tLS0tLS0tLS0tLSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyB2b2lkIHNldFRvb2x0b3AoU3RyaW5nIHRleHQsIFN0cmluZ1tdW10gcHJvcGVydGllcykgewotICAgIAl0ZXh0ICs9IE1FTlVfU0VQQVJBVE9SOwotICAgIAlmb3IoIGludCBpPTA7IGk8cHJvcGVydGllcy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgIGlmKCBwcm9wZXJ0aWVzW2ldWzFdLmxlbmd0aCgpPjAgKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCArPSAiXG4iK3Byb3BlcnRpZXNbaV1bMF0rIjogIitwcm9wZXJ0aWVzW2ldWzFdOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0KLSAgICAJfQotICAgICAgICBzZXRUb29sVGlwVGV4dCh0ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNZW51VGV4dCgpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUb29sVGlwVGV4dCgpOwotICAgICAgICBpbnQgc2VwID0gdGV4dC5pbmRleE9mKE1FTlVfU0VQQVJBVE9SKTsKLSAgICAgICAgaWYoIHNlcCA+IDAgKSB7Ci0gICAgICAgIAl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCxzZXApOwotICAgICAgICB9Ci0gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoIlxuIiwiIHwgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAJCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9PdmVybGF5V2luZG93LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlXaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ZDlmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlXaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLQotcHVibGljIGNsYXNzIE92ZXJsYXlXaW5kb3cgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfVEVYVCA9ICJbT3ZlcmxheSBXaW5kb3ddIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOREVYX0hJR0hMSUdIVCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfTEFCRUxTID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgIAotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLSAgICBwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLQotICAgIHByaXZhdGUgc3RhdGljIE92ZXJsYXlXaW5kb3dbXSBpbnN0YW5jZSA9IG5ldyBPdmVybGF5V2luZG93WzJdOwotCi0gICAgcHVibGljIE92ZXJsYXlXaW5kb3coaW50IGluZGV4KSB7Ci0gICAgICAgIC8vIENyZWF0ZSBPdmVybGF5V2luZG93IHNoZWxsCi0gICAgICAgIHNoZWxsID0gbmV3IFNoZWxsKFNXVC5NT0RFTEVTUyB8IFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoV0lORE9XX1RFWFQpOwotICAgICAgICBzaGVsbC5zZXRCYWNrZ3JvdW5kKHNoZWxsLmdldEJhY2tncm91bmQoKSk7IC8vIEZpeCBmb3IgY29sb3IgY2hhbmdlCi0gICAgICAgIGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIFNoZWxsIGFjdGl2ZVNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgICBpZiggbnVsbCAhPSBhY3RpdmVTaGVsbCApIHsKLSAgICAgICAgICAgIGFjdGl2ZVNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1ha2Ugc2hlbGwgd2luZG93IHRyYW5zcGFyZW50Ci0gICAgICAgIFdpbmRvd1V0aWwuc2V0TGF5ZXJlZChzaGVsbCwgSU5ERVhfSElHSExJR0hUPT1pbmRleCk7Ci0KLSAgICAgICAgLy8gSW5pdCB0aGUgc2hlbGwKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBzaGVsbC5zZXRCb3VuZHMoMCwgMCwgT1MuR2V0U3lzdGVtTWV0cmljcyhPUy5TTV9DWFNDUkVFTiksIE9TLkdldFN5c3RlbU1ldHJpY3MoT1MuU01fQ1lTQ1JFRU4pKTsKLSAgICAgICAgc2hlbGwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotICAgICAgICAvLwotICAgICAgICBpZiggSU5ERVhfTEFCRUxTID09IGluZGV4ICkgewotICAgICAgICAgICAgc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCl7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2hlbGxEZWFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgT3ZlcmxheUxhYmVsLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgT3ZlcmxheVdpbmRvdyBnZXRJbnN0YW5jZShpbnQgaW5kZXgsIGJvb2xlYW4gY3JlYXRlKSB7Ci0gICAgICAgIGlmKCBpbmRleCA8IGluc3RhbmNlLmxlbmd0aCApIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGUgJiYgbnVsbCA9PSBpbnN0YW5jZVtpbmRleF0pIHsKLSAgICAgICAgICAgICAgICBpbnN0YW5jZVtpbmRleF0gPSBuZXcgT3ZlcmxheVdpbmRvdyhpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbaW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0VmlzaWJsZSgpIHsKLSAgICAJcmV0dXJuIHZpc2libGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gbmV3VmlzaWJsZSkgewotICAgIAlpZiggdmlzaWJsZSAhPSBuZXdWaXNpYmxlICkgewotICAgIAkJdmlzaWJsZSA9IG5ld1Zpc2libGU7Ci0gICAgCQlmb3IoIGludCBpPTA7IGk8aW5zdGFuY2UubGVuZ3RoOyBpKysgKSB7Ci0gICAgCQkJaWYoIG51bGwgIT0gaW5zdGFuY2VbaV0gKSB7Ci0gICAgICAgIAkJCWluc3RhbmNlW2ldLnNoZWxsLnNldFZpc2libGUodmlzaWJsZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBvc2l0ZSBnZXRDb21wb3NpdGUoKSB7Ci0gICAgICAgIHJldHVybiBzaGVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gc2hlbGwuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBpZiggY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJSW50ZXJ2YWxFeGVjICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dEludGVydmFsID0gKChJSW50ZXJ2YWxFeGVjKWNoaWxkcmVuW2ldKS5leGVjKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBuZXh0SW50ZXJ2YWwgPiAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS50aW1lckV4ZWMobmV4dEludGVydmFsLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV01DTW9uaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9XTUNNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMmViYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9XTUNNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5DYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdNQ01vbml0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb2R1Y3ROYW1lID0gIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLSAgICAJaWYoIG51bGwgIT0gcHJvZHVjdCkgewotICAgIAkJcHJvZHVjdE5hbWUgPSBwcm9kdWN0LmdldE5hbWUoKTsKLSAgICAJfQotCX0KLQlwcml2YXRlIGludCBvbGRTaGVsbFByb2MgPSAwOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIFdNQ01vbml0b3Igd2l0aCBkZWZhdWx0IHRpdGxlCi0JICovCi0JcHVibGljIFdNQ01vbml0b3IoKSB7Ci0JCXRoaXMoIldNQ1dpbmRvdzoiK3Byb2R1Y3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBXTUNNb25pdG9yCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICovCi0JcHVibGljIFdNQ01vbml0b3IoU3RyaW5nIHRpdGxlKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiggbnVsbCAhPSBkaXNwbGF5ICkgewotCQkJU2hlbGwgYWN0aXZlU2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlpZiggbnVsbCAhPSBhY3RpdmVTaGVsbCApIHsKLQkJCQlDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0aGlzLCAic2hlbGxXaW5kb3dQcm9jIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgYWRkcmVzcyA9IGNhbGxiYWNrLmdldEFkZHJlc3MoKTsKLQkJCQlpZiggYWRkcmVzcyAhPSAwICkgewotCQkJCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOyAKLQkJCSAgICAgICAgc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkgICAgICAgIHNoZWxsLnNldEJvdW5kcygwLCAwLCAwLCAwKTsKLQkJCSAgICAgICAgc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JCQkJCW9sZFNoZWxsUHJvYyA9IE9TLkdldFdpbmRvd0xvbmcgKHNoZWxsLmhhbmRsZSwgT1MuR1dMX1dORFBST0MpOwotCQkJCQlPUy5TZXRXaW5kb3dMb25nIChzaGVsbC5oYW5kbGUsIE9TLkdXTF9XTkRQUk9DLCBhZGRyZXNzKTsKLQkJICAgICAgICAgICAgYWN0aXZlU2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkgICAgICAgICAgICAgICAgICAgIHNoZWxsLmRpc3Bvc2UoKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgfSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljYWxsYmFjay5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdpbmRvdyBwcm9jZWR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gaHduZAotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gd1BhcmFtCi0JICogQHBhcmFtIGxQYXJhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgc2hlbGxXaW5kb3dQcm9jKGludCBod25kLCBpbnQgbXNnLCBpbnQgd1BhcmFtLCBpbnQgbFBhcmFtKSB7Ci0JCXRyeSB7Ci0JCQlpZiggQ09QWURBVEFTVFJVQ1QuV01fQ09QWURBVEEgPT0gbXNnICkgewotCQkJCXJldHVybiBvbkNvcHlEYXRhKGh3bmQsd1BhcmFtLG5ldyBDT1BZREFUQVNUUlVDVChsUGFyYW0pKTsKLQkJCX0KLQkJCXJldHVybiBPUy5DYWxsV2luZG93UHJvYyAob2xkU2hlbGxQcm9jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQkJfQotCQljYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBXTV9DT1BZREFUQSBoYW5kbGVyCi0JICogCi0JICogQHBhcmFtIGh3bmQKLQkgKiBAcGFyYW0gaHduZEZyb20KLQkgKiBAcGFyYW0gY2RzCi0JICogQHJldHVybiAxIGlmIHByb2Nlc3NlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgb25Db3B5RGF0YShpbnQgaHduZCwgaW50IGh3bmRGcm9tLCBDT1BZREFUQVNUUlVDVCBjZHMpOwotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9XaW4zMlBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9XaW4zMlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjllMDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV2luMzJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV2luMzJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBXaW4zMlBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXaW4zMlBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdpbjMyUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL1dpbmRvd1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV2luZG93VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk1Yjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV2luZG93VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuUkVDVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuVENIQVI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotCi0KLXB1YmxpYyBjbGFzcyBXaW5kb3dVdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdldFdpbmRvd1RleHQoaW50IGhXbmQpIHsKLSAgICAgICAgaW50IHNpemUgPSBPUy5HZXRXaW5kb3dUZXh0TGVuZ3RoKGhXbmQpOwotICAgICAgICBpZiAoMCA9PSBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBUQ0hBUiBidWZmZXIgPSBuZXcgVENIQVIoMCwgc2l6ZSArIDEpOwotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKDAsIE9TLkdldFdpbmRvd1RleHQoaFduZCwgYnVmZmVyLCBidWZmZXIubGVuZ3RoKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBHZXRXaW5kb3dDbGFzc05hbWUoaW50IGhXbmQpIHsKLSAgICAgICAgVENIQVIgYnVmZmVyID0gbmV3IFRDSEFSKDAsIDI1Nik7Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoMCwgT1MuR2V0Q2xhc3NOYW1lKGhXbmQsIGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgR2V0V2luZG93UmVjdGFuZ2xlKGludCBoV25kKSB7Ci0gICAgICAgIFJFQ1QgcmVjdCA9IG5ldyBSRUNUKCk7Ci0gICAgICAgIE9TLkdldFdpbmRvd1JlY3QoaFduZCwgcmVjdCk7Ci0gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBJc1dpbmRvd1Zpc2libGUoaW50IGhXbmQpIHsKLSAgICAgICAgcmV0dXJuIE9TLklzV2luZG93VmlzaWJsZShoV25kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBHZXREZXNrdG9wV2luZG93KCkgewotICAgICAgICByZXR1cm4gT1MuR2V0RGVza3RvcFdpbmRvdygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldENoaWxkV2luZG93KGludCBoV25kKSB7Ci0gICAgICAgIHJldHVybiBPUy5HZXRXaW5kb3coaFduZCwgT1MuR1dfQ0hJTEQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldE5leHRXaW5kb3coaW50IGhXbmQpIHsKLSAgICAgICAgcmV0dXJuIE9TLkdldFdpbmRvdyhoV25kLCBPUy5HV19IV05ETkVYVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgR2V0T3duZXJXaW5kb3coaW50IGhXbmQpIHsKLSAgICAgICAgcmV0dXJuIE9TLkdldFdpbmRvdyhoV25kLCBPUy5HV19PV05FUik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldFBhcmVudFdpbmRvdyhpbnQgaFduZCkgewotICAgICAgICByZXR1cm4gT1MuR2V0UGFyZW50KGhXbmQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3B1cE1lbnUoaW50IGh3bmQpIHsKLSAgICAgICAgaWYoICIjMzI3NjgiLmVxdWFscyhHZXRXaW5kb3dDbGFzc05hbWUoaHduZCkpICkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gMCA9PSBHZXRPd25lcldpbmRvdyhod25kKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExheWVyZWQoQ29udHJvbCBjb250cm9sLCBib29sZWFuIHRyYW5zcGFyZW50KSB7Ci0gICAgICAgIGludCB3cyA9IE9TLkdldFdpbmRvd0xvbmdXKGNvbnRyb2wuaGFuZGxlLCBPUy5HV0xfRVhTVFlMRSk7Ci0gICAgICAgIHdzIHw9IFdpbmRvd1V0aWwuV1NfRVhfTEFZRVJFRDsKLSAgICAgICAgaWYgKHRyYW5zcGFyZW50KSB7Ci0gICAgICAgICAgICB3cyB8PSBPUy5XU19FWF9UUkFOU1BBUkVOVDsKLSAgICAgICAgfQotICAgICAgICBPUy5TZXRXaW5kb3dMb25nKGNvbnRyb2wuaGFuZGxlLCBPUy5HV0xfRVhTVFlMRSwgd3MpOwotICAgICAgICBXaW5kb3dVdGlsLlNldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzKGNvbnRyb2wuaGFuZGxlLCBjb250cm9sLmdldEJhY2tncm91bmQoKS5oYW5kbGUsIChjaGFyKSAwLAotICAgICAgICAgICAgICAgIFdpbmRvd1V0aWwuTFdBX0NPTE9SS0VZKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX0VYX0xBWUVSRUQgPSAweDgwMDAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTFdBX0NPTE9SS0VZID0gMHgwMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExXQV9BTFBIQSA9IDB4MDI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgU2V0TGF5ZXJlZFdpbmRvd0F0dHJpYnV0ZXMoaW50IGh3bmQsIGludCBjcktleSwgY2hhciBiQWxwaGEsIGludCBkd0ZsYWdzKTsKLQotfQo=