ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDdhNmU0MzUuLjI2OGJhZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxMyArNCwxMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDQwNDg4OGQuLjRiZmJjOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzk3MjM1Ni4uNmRmMzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTEgKzMsMTEgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYW50Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIgorICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50LnRhc2tzO3ZlcnNpb249IjQuMTEuMyI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNS4wLjQiOwogIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcyxvcmcuYXBhY2hlLnRvb2xzLmFudCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IGZkOGRlMzkuLmEyODgzNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMWE0MDJkOC4uMzI4NWVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOApAQCAtMTMsMTUgKzEzLDE1IEBACiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmJ6aXAyO3ZlcnNpb249IlsxLjQsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmd6aXA7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMueHo7dmVyc2lvbj0iWzEuNCwyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5Gb3JtYXRBY3RpdmF0b3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNC4xMS4zIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCBlNWE3NTAyLi5mODU1NTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI0LjExLjMucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKaW5kZXggZGRkNGI5MC4uNGJmYTE3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGFyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQppbmRleCA3NTU5YWRhLi45ZWQ2MGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTgyLDIyICs4NCwxNCBAQAogCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRhckFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFRhckFyY2hpdmVPdXRwdXRTdHJlYW0ocywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJVGFyQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgVGFyQXJjaGl2ZU91dHB1dFN0cmVhbShzLAorCQkJCUNIQVJBQ1RFUl9FTkNPRElORyk7CiAJCW91dC5zZXRMb25nRmlsZU1vZGUoVGFyQXJjaGl2ZU91dHB1dFN0cmVhbS5MT05HRklMRV9QT1NJWCk7CiAJCW91dC5zZXRCaWdOdW1iZXJNb2RlKFRhckFyY2hpdmVPdXRwdXRTdHJlYW0uQklHTlVNQkVSX1BPU0lYKTsKIAkJcmV0dXJuIGFwcGx5Rm9ybWF0T3B0aW9ucyhvdXQsIG8pOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpAQCAtMTA2LDcgKzEwMCw3IEBACiAJCQlmaW5hbCBUYXJBcmNoaXZlRW50cnkgZW50cnkgPSBuZXcgVGFyQXJjaGl2ZUVudHJ5KAogCQkJCQlwYXRoLCBUYXJDb25zdGFudHMuTEZfU1lNTElOSyk7CiAJCQllbnRyeS5zZXRMaW5rTmFtZShuZXcgU3RyaW5nKAotCQkJCQlsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoMTAwKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisJCQkJCWxvYWRlci5nZXRDYWNoZWRCeXRlcygxMDApLCBDSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCW91dC5wdXRBcmNoaXZlRW50cnkoZW50cnkpOwogCQkJb3V0LmNsb3NlQXJjaGl2ZUVudHJ5KCk7CiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEKaW5kZXggMmY5NWY2ZC4uZmE2YTdiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RiejJGb3JtYXQuamF2YQpAQCAtODMsMTUgKzgzLDYgQEAKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKaW5kZXggYjIyYTYyZC4uMzY4YjRmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKQEAgLTgzLDE1ICs4Myw2IEBACiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCmluZGV4IGQyM2QyYjYuLjM2NjE2ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCkBAIC04MywxNSArODMsNiBAQAogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQppbmRleCBkYzhmYjQ0Li44NDgzODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQpAQCAtODQsMTUgKzg0LDYgQEAKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDIxYzNiN2YuLjY5ZmI0N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZQotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVQcm92aWRlci1OYW1lCkBAIC0yMywxMCArMjMsMTAgQEAKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQ7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubjt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNC4xMS4zIjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5hcGFjaGUuaHR0cC5jbGllbnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLAogICAgb3JnLmFwYWNoZS5odHRwLmVudGl0eSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbAppbmRleCBhMTU0M2NjLi5iYzcxZmFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCkBAIC00OCw3ICs0OCw3IEBACiAJPHBhcmVudD4KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAKIAk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEKaW5kZXggMjgxOTMwMC4uN2YxZmVjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9odHRwL2FwYWNoZS9IdHRwQ2xpZW50Q29ubmVjdGlvbi5qYXZhCkBAIC00MjEsNyArNDIxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SG9zdG5hbWVWZXJpZmllcihmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1ldmVyaWZpZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKEhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWV2ZXJpZmllcikgewogCQl0aGlzLmhvc3RuYW1ldmVyaWZpZXIgPSBob3N0bmFtZXZlcmlmaWVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDNjODEyMy4uYzk3YjkyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEzICszLDEzIEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjMiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI0LjExLjMiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LApAQCAtMTgsMTIgKzE4LDEyIEBACiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCiAgamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249IlsyLjUuMCwzLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIgorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCmluZGV4IDExMTAwNzguLjZmNzAwODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKQEAgLTUyLDcgKzUyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YQppbmRleCA3ZjgyNmQ0Li45ZTlmMjVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0FzSXNGaWxlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiBjbGFzcyBBc0lzRmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CiAJcHJpdmF0ZSBmaW5hbCBBc0lzRmlsZVNlcnZpY2UgYXNJczsKIAotCUFzSXNGaWxlRmlsdGVyKGZpbmFsIEFzSXNGaWxlU2VydmljZSBnZXRBbnlGaWxlKSB7CisJQXNJc0ZpbGVGaWx0ZXIoQXNJc0ZpbGVTZXJ2aWNlIGdldEFueUZpbGUpIHsKIAkJdGhpcy5hc0lzID0gZ2V0QW55RmlsZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvRmlsZVNlbmRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKaW5kZXggMGQ5MzVmYy4uMDU1MTBhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogCXByaXZhdGUgbG9uZyBlbmQ7CiAKLQlGaWxlU2VuZGVyKGZpbmFsIEZpbGUgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJRmlsZVNlbmRlcihGaWxlIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQl0aGlzLnNvdXJjZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGgsICJyIik7CiAKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJcmV0dXJuIHJlcS5nZXRIZWFkZXJzKEhEUl9SQU5HRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQppbmRleCBlZTIzNjc3Li5kMGVhN2I2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CiAJCWdpdEZpbHRlci5pbml0KG5ldyBGaWx0ZXJDb25maWcoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1BhY2tzU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKaW5kZXggODMwZTA2MS4uNTJhYWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKQEAgLTY3LDcgKzY3LDcgQEAKIAkJc2VuZFBsYWluVGV4dChwYWNrTGlzdChyZXEpLCByZXEsIHJzcCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhY2tMaXN0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFja0xpc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZpbmFsIE9iamVjdERhdGFiYXNlIGRiID0gZ2V0UmVwb3NpdG9yeShyZXEpLmdldE9iamVjdERhdGFiYXNlKCk7CiAJCWlmIChkYiBpbnN0YW5jZW9mIE9iamVjdERpcmVjdG9yeSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1JlZnNTZXJ2bGV0LmphdmEKaW5kZXggNGY3MGNmNy4uMGY0NjMzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhCkBAIC00NCwxOCArNDQsMTUgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZBZHZlcnRpc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKQEAgLTc5LDcgKzc2LDcgQEAKIAkJCQlDb25zdGFudHMuQ0hBUlNFVCkpIHsKIAkJCWZpbmFsIFJlZkFkdmVydGlzZXIgYWR2ID0gbmV3IFJlZkFkdmVydGlzZXIoKSB7CiAJCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoZmluYWwgQ2hhclNlcXVlbmNlIGxpbmUpCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoQ2hhclNlcXVlbmNlIGxpbmUpCiAJCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkvLyBXaG9ldmVyIGRlY2lkZWQgdGhhdCBpbmZvL3JlZnMgc2hvdWxkIHVzZSBhIGRpZmZlcmVudAogCQkJCQkvLyBkZWxpbWl0ZXIgdGhhbiB0aGUgbmF0aXZlIGdpdDovLyBwcm90b2NvbCBzaG91bGRuJ3QKQEAgLTk0LDEwICs5MSw3IEBACiAJCQl9OwogCQkJYWR2LmluaXQoZGIpOwogCQkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKLQotCQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlyZWZzLnJlbW92ZShDb25zdGFudHMuSEVBRCk7Ci0JCQlhZHYuc2VuZChyZWZzKTsKKwkJCWFkdi5zZW5kKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1JFRlMpKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKaW5kZXggYjBiODMxZi4uYjM3OTk4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCSgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldE9iamVjdERhdGFiYXNlKCkgaW5zdGFuY2VvZiBPYmplY3REaXJlY3Rvcnk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhCmluZGV4IDUwZGM2OGYuLjYyZjA3NWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvT2JqZWN0RmlsZVNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL09iamVjdEZpbGVTZXJ2bGV0LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlTdHJpbmcgZXRhZyhmaW5hbCBGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGV0YWcoRmlsZVNlbmRlciBzZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gTG9uZy50b0hleFN0cmluZyhzZW5kZXIuZ2V0TGFzdE1vZGlmaWVkKCkpOwogCQl9CiAJfQpAQCAtODgsNyArODgsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBzZW5kZXIuZ2V0VGFpbENoZWNrc3VtKCk7CiAJCX0KIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlOwogCi0JT2JqZWN0RmlsZVNlcnZsZXQoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJT2JqZWN0RmlsZVNlcnZsZXQoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CiAJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKIAl9CiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBvYmplY3RzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBGaWxlIG9iamVjdHMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBSZXBvc2l0b3J5IGRiID0gZ2V0UmVwb3NpdG9yeShyZXEpOwogCQlyZXR1cm4gKChPYmplY3REaXJlY3RvcnkpIGRiLmdldE9iamVjdERhdGFiYXNlKCkpLmdldERpcmVjdG9yeSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvUmVwb3NpdG9yeUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKaW5kZXggYzg5YTVkNy4uMDIwYmU0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gaW5zdGFuY2UgZm9yIHRoZQogCSAqICAgICAgICAgICAgY3VycmVudCB3ZWIgcmVxdWVzdC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeUZpbHRlcihmaW5hbCBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikgeworCXB1YmxpYyBSZXBvc2l0b3J5RmlsdGVyKFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyKSB7CiAJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewogCQljb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CiAJfQogCkBAIC0xNDAsOSArMTQwLDkgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCWZpbmFsIFJlcG9zaXRvcnkgZGI7Ci0JCXRyeSB7Ci0JCQlkYiA9IHJlc29sdmVyLm9wZW4ocmVxLCBuYW1lKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGRiID0gcmVzb2x2ZXIub3BlbihyZXEsIG5hbWUpKSB7CisJCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUkVQT1NJVE9SWSwgZGIpOworCQkJY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogCQl9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgewogCQkJc2VuZEVycm9yKHJlcSwgcmVzLCBTQ19OT1RfRk9VTkQpOwogCQkJcmV0dXJuOwpAQCAtMTU1LDEzICsxNTUsOCBAQAogCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZSkgewogCQkJc2VuZEVycm9yKHJlcSwgcmVzLCBlLmdldFN0YXR1c0NvZGUoKSwgZS5nZXRNZXNzYWdlKCkpOwogCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUkVQT1NJVE9SWSwgZGIpOwotCQkJY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogCQl9IGZpbmFsbHkgewogCQkJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlkpOwotCQkJZGIuY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhCmluZGV4IGYxZmY1NDcuLjk2MDFjOGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TZXJ2bGV0VXRpbHMuamF2YQpAQCAtOTAsNyArOTAsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBmaWx0ZXIgcnVucyBiZWZvcmUgdGhlIHNlcnZsZXQuCiAJICogQHNlZSAjQVRUUklCVVRFX1JFUE9TSVRPUlkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJUmVwb3NpdG9yeSBkYiA9IChSZXBvc2l0b3J5KSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9SRVBPU0lUT1JZKTsKIAkJaWYgKGRiID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEh0dHBTZXJ2ZXJUZXh0LmdldCgpLmV4cGVjdGVkUmVwb3NpdG9yeUF0dHJpYnV0ZSk7CkBAIC0xMTAsNyArMTEwLDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCisJcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShIdHRwU2VydmxldFJlcXVlc3QgcmVxKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gaW4gPSByZXEuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJZmluYWwgU3RyaW5nIGVuYyA9IHJlcS5nZXRIZWFkZXIoSERSX0NPTlRFTlRfRU5DT0RJTkcpOwpAQCAtMjIwLDEyICsyMjAsOSBAQAogCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kKGJ5dGVbXSBjb250ZW50LCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQkJZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbnRlbnQgPSBzZW5kSW5pdChjb250ZW50LCByZXEsIHJzcCk7Ci0JCWZpbmFsIE91dHB1dFN0cmVhbSBvdXQgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKSkgewogCQkJb3V0LndyaXRlKGNvbnRlbnQpOwogCQkJb3V0LmZsdXNoKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXQuY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMjQxLDcgKzIzOCw3IEBACiAJCXJldHVybiBjb250ZW50OwogCX0KIAotCXN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlyZXR1cm4gYWNjZXB0c0d6aXBFbmNvZGluZyhyZXEuZ2V0SGVhZGVyKEhEUl9BQ0NFUFRfRU5DT0RJTkcpKTsKIAl9CiAKQEAgLTI2MSw3ICsyNTgsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGZpbmFsIGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBtYXhMZW4gPSByYXcubGVuZ3RoICsgMzI7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heExlbik7CiAJCWZpbmFsIEdaSVBPdXRwdXRTdHJlYW0gZ3ogPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXQpOwpAQCAtMjcxLDcgKzI2OCw3IEBACiAJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXRhZyhmaW5hbCBieXRlW10gY29udGVudCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBldGFnKGJ5dGVbXSBjb250ZW50KSB7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwogCQltZC51cGRhdGUoY29udGVudCk7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KG1kLmRpZ2VzdCgpKS5nZXROYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNGViOTRhMy4uYWQ1ZThkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEwLDExICsxMTAsOCBAQAogCQkJaWYgKDI1NiA8IG91dC5sZW5ndGgoKSAmJiBhY2NlcHRzR3ppcEVuY29kaW5nKHJlcSkpIHsKIAkJCQlUZW1wb3JhcnlCdWZmZXIgZ3pidWYgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoTElNSVQpOwogCQkJCXRyeSB7Ci0JCQkJCUdaSVBPdXRwdXRTdHJlYW0gZ3ppcCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGd6YnVmKTsKLQkJCQkJdHJ5IHsKKwkJCQkJdHJ5IChHWklQT3V0cHV0U3RyZWFtIGd6aXAgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShnemJ1ZikpIHsKIAkJCQkJCW91dC53cml0ZVRvKGd6aXAsIG51bGwpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJZ3ppcC5jbG9zZSgpOwogCQkJCQl9CiAJCQkJCWlmIChnemJ1Zi5sZW5ndGgoKSA8IG91dC5sZW5ndGgoKSkgewogCQkJCQkJb3V0ID0gZ3pidWY7CkBAIC0xMzEsMTIgKzEyOCw5IEBACiAJCQkvLyBoYXJkY29kZWQgTElNSVQgY29uc3RhbnQgYWJvdmUgYXNzdXJlcyB1cyB3ZSB3b3VsZG4ndCBzdG9yZQogCQkJLy8gbW9yZSB0aGFuIDIgR2lCIG9mIGNvbnRlbnQgaW4gbWVtb3J5LgogCQkJcnNwLnNldENvbnRlbnRMZW5ndGgoKGludCkgb3V0Lmxlbmd0aCgpKTsKLQkJCWZpbmFsIE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKSkgewogCQkJCW91dC53cml0ZVRvKG9zLCBudWxsKTsKIAkJCQlvcy5mbHVzaCgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhCmluZGV4IDY0MTc4NzcuLjE5NWRmZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0U2VydmljZUluZm9SZWZzLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAogCXByaXZhdGUgZmluYWwgRmlsdGVyW10gZmlsdGVyczsKIAotCVNtYXJ0U2VydmljZUluZm9SZWZzKGZpbmFsIFN0cmluZyBzZXJ2aWNlLCBmaW5hbCBMaXN0PEZpbHRlcj4gZmlsdGVycykgeworCVNtYXJ0U2VydmljZUluZm9SZWZzKFN0cmluZyBzZXJ2aWNlLCBMaXN0PEZpbHRlcj4gZmlsdGVycykgewogCQl0aGlzLnN2YyA9IHNlcnZpY2U7CiAJCXRoaXMuZmlsdGVycyA9IGZpbHRlcnMudG9BcnJheShuZXcgRmlsdGVyW2ZpbHRlcnMuc2l6ZSgpXSk7CiAJfQpAQCAtMTMzLDkgKzEzMyw3IEBACiAJCQlyZXMuc2V0Q29udGVudFR5cGUoaW5mb1JlZnNSZXN1bHRUeXBlKHN2YykpOwogCiAJCQlmaW5hbCBQYWNrZXRMaW5lT3V0IG91dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7Ci0JCQlvdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgIlxuIik7Ci0JCQlvdXQuZW5kKCk7Ci0JCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIob3V0KSk7CisJCQlyZXNwb25kKHJlcSwgb3V0LCBzdmMpOwogCQkJYnVmLmNsb3NlKCk7CiAJCX0gY2F0Y2ggKFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIGUpIHsKIAkJCXJlcy5zZW5kRXJyb3IoU0NfVU5BVVRIT1JJWkVELCBlLmdldE1lc3NhZ2UoKSk7CkBAIC0xNzgsNiArMTc2LDM3IEBACiAJCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBwY2spIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIAorCS8qKgorCSAqIFdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgdG8gYW4gaW5mby9yZWZzIHJlcXVlc3QgcmVjZWl2ZWQgYnkKKwkgKiBhIHNtYXJ0IHNlcnZpY2UuIEluIHByb3RvY29sIHYwLCB0aGlzIHN0YXJ0cyB3aXRoICIjCisJICogc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYSBmbHVzaCBwYWNrZXQsIGJ1dCB0aGlzIGlzIG5vdAorCSAqIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIGluIG90aGVyIHByb3RvY29sIHZlcnNpb25zLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdyaXRlcyAiIyBzZXJ2aWNlPXNlcnZpY2VOYW1lIiBhbmQgYQorCSAqIGZsdXNoIHBhY2tldCwgdGhlbiBjYWxscyB7QGxpbmsgI2FkdmVydGlzZX0uIFN1YmNsYXNzZXMgc2hvdWxkCisJICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBzdXBwb3J0IHByb3RvY29sIHZlcnNpb25zIG90aGVyIHRoYW4KKwkgKiBwcm90b2NvbCB2MC4KKwkgKgorCSAqIEBwYXJhbSByZXEKKwkgKiAgICAgICAgICAgIHJlcXVlc3QKKwkgKiBAcGFyYW0gcGNrT3V0CisJICogICAgICAgICAgICBkZXN0aW5hdGlvbiBvZiByZXNwb25zZQorCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorCSAqICAgICAgICAgICAgc2VydmljZSBuYW1lIHRvIGJlIHdyaXR0ZW4gb3V0IGluIHByb3RvY29sIHYwOyBtYXkgb3IgbWF5CisJICogICAgICAgICAgICBub3QgYmUgdXNlZCBpbiBvdGhlciB2ZXJzaW9ucworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uCisJICogQHRocm93cyBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc3BvbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKwkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQlwY2tPdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJcGNrT3V0LmVuZCgpOworCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSk7CisJfQorCiAJcHJpdmF0ZSBjbGFzcyBDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9UZXh0RmlsZVNlcnZsZXQuamF2YQppbmRleCAwMDg1MWNmLi5iMjQ2NmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVGV4dEZpbGVTZXJ2bGV0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwogCi0JVGV4dEZpbGVTZXJ2bGV0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJVGV4dEZpbGVTZXJ2bGV0KFN0cmluZyBuYW1lKSB7CiAJCXRoaXMuZmlsZU5hbWUgPSBuYW1lOwogCX0KIApAQCAtODAsNyArODAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gcmVhZChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYnl0ZVtdIHJlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBnaXRkaXIgPSBnZXRSZXBvc2l0b3J5KHJlcSkuZ2V0RGlyZWN0b3J5KCk7CiAJCWlmIChnaXRkaXIgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZmlsZU5hbWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCmluZGV4IDNlOWMxZmUuLmNhNmI3NDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKQEAgLTc2LDYgKzc2LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSW50ZXJuYWxIdHRwU2VydmVyR2x1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrZXRMaW5lT3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXIuUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2s7CkBAIC0xMTcsNiArMTE4LDI1IEBACiAJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOwogCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhwY2spOwogCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCisJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcmVzcG9uZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorCQkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJVXBsb2FkUGFjayB1cCA9IChVcGxvYWRQYWNrKSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9IQU5ETEVSKTsKKwkJCXRyeSB7CisJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOworCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSwgc2VydmljZU5hbWUpOworCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCiAJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YQppbmRleCA1N2ZkZGRhLi42ZjI3YjI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvRXJyb3JTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL0Vycm9yU2VydmxldC5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogQHBhcmFtIHN0YXR1cwogCSAqICAgICAgICAgICAgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYWx3YXlzIHNlbmQuCiAJICovCi0JcHVibGljIEVycm9yU2VydmxldChmaW5hbCBpbnQgc3RhdHVzKSB7CisJcHVibGljIEVycm9yU2VydmxldChpbnQgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleEdyb3VwRmlsdGVyLmphdmEKaW5kZXggYTNkYzZjMy4uZjI2ZWJjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhHcm91cEZpbHRlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAJICogQHBhcmFtIGdyb3VwSWR4CiAJICogICAgICAgICAgICBjYXB0dXJlIGdyb3VwIG51bWJlciwgMSB0aHJvdWdoIHRoZSBudW1iZXIgb2YgZ3JvdXBzLgogCSAqLwotCXB1YmxpYyBSZWdleEdyb3VwRmlsdGVyKGZpbmFsIGludCBncm91cElkeCkgeworCXB1YmxpYyBSZWdleEdyb3VwRmlsdGVyKGludCBncm91cElkeCkgewogCQlpZiAoZ3JvdXBJZHggPCAxKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSHR0cFNlcnZlclRleHQuZ2V0KCkuaW52YWxpZEluZGV4LCB2YWx1ZU9mKGdyb3VwSWR4KSkpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQkJCXZhbHVlT2YoZ3JvdXBJZHggKyAxKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFdyYXBwZWRSZXF1ZXN0W10gZ3JvdXBzRm9yKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHIpIHsKKwlwcml2YXRlIHN0YXRpYyBXcmFwcGVkUmVxdWVzdFtdIGdyb3Vwc0ZvcihTZXJ2bGV0UmVxdWVzdCByKSB7CiAJCXJldHVybiAoV3JhcHBlZFJlcXVlc3RbXSkgci5nZXRBdHRyaWJ1dGUoTWV0YUZpbHRlci5SRUdFWF9HUk9VUFMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhQaXBlbGluZS5qYXZhCmluZGV4IGJmMmQ2ZGIuLjAxMDgxMDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YQpAQCAtODcsMTEgKzg3LDExIEBACiAJc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIFNlcnZsZXRCaW5kZXJJbXBsIHsKIAkJcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIHBhdHRlcm47CiAKLQkJQmluZGVyKGZpbmFsIFN0cmluZyBwKSB7CisJCUJpbmRlcihTdHJpbmcgcCkgewogCQkJcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwKTsKIAkJfQogCi0JCUJpbmRlcihmaW5hbCBQYXR0ZXJuIHApIHsKKwkJQmluZGVyKFBhdHRlcm4gcCkgewogCQkJcGF0dGVybiA9IHA7CiAJCX0KIApAQCAtMTEwLDcgKzExMCw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJYm9vbGVhbiBtYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwogCQlyZXR1cm4gcGF0aEluZm8gIT0gbnVsbCAmJiBwYXR0ZXJuLm1hdGNoZXIocGF0aEluZm8pLm1hdGNoZXMoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCmluZGV4IDY3NDJjOWYuLjRmZDk5YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIFNlcnZsZXRCaW5kZXJJbXBsIHsKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3VmZml4OwogCi0JCUJpbmRlcihmaW5hbCBTdHJpbmcgc3VmZml4KSB7CisJCUJpbmRlcihTdHJpbmcgc3VmZml4KSB7CiAJCQl0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKIAkJfQogCkBAIC04OSw3ICs4OSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJYm9vbGVhbiBtYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwogCQlyZXR1cm4gcGF0aEluZm8gIT0gbnVsbCAmJiBwYXRoSW5mby5lbmRzV2l0aChzdWZmaXgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKaW5kZXggNTZlNGUyMi4uYzAyMzk5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAkvKiogSW5zdGFuY2UgdGhhdCBtdXN0IGdlbmVyYXRlIHRoZSByZXNwb25zZTsgbmV2ZXIgbnVsbC4gKi8KIAlwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7CiAKLQlVcmxQaXBlbGluZShmaW5hbCBGaWx0ZXJbXSBmaWx0ZXJzLCBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0KSB7CisJVXJsUGlwZWxpbmUoRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQl0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzOwogCQl0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OwogCX0KQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGZpbHRlciBvciBzZXJ2bGV0IGlzIHVuYWJsZSB0byBpbml0aWFsaXplLgogCSAqLwotCXZvaWQgaW5pdChmaW5hbCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBTZXQ8T2JqZWN0PiBpbml0ZWQpCisJdm9pZCBpbml0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFNldDxPYmplY3Q+IGluaXRlZCkKIAkJCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJZm9yIChGaWx0ZXIgcmVmIDogZmlsdGVycykKIAkJCWluaXRGaWx0ZXIocmVmLCBjb250ZXh0LCBpbml0ZWQpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJICogICAgICAgICAgICBkZXN0cm95ZWQgYSBzZWNvbmQgdGltZS4gRmlsdGVycyBhbmQgc2VydmxldHMgdGhhdCBhcmUgZmlyc3QKIAkgKiAgICAgICAgICAgIGRlc3Ryb3llZCBieSB0aGlzIHBpcGVsaW5lIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBzZXQuCiAJICovCi0Jdm9pZCBkZXN0cm95KGZpbmFsIFNldDxPYmplY3Q+IGRlc3Ryb3llZCkgeworCXZvaWQgZGVzdHJveShTZXQ8T2JqZWN0PiBkZXN0cm95ZWQpIHsKIAkJZm9yIChGaWx0ZXIgcmVmIDogZmlsdGVycykKIAkJCWRlc3Ryb3lGaWx0ZXIocmVmLCBkZXN0cm95ZWQpOwogCQlkZXN0cm95U2VydmxldChzZXJ2bGV0LCBkZXN0cm95ZWQpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCi0JCUNoYWluKGZpbmFsIEZpbHRlcltdIGZpbHRlcnMsIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKKwkJQ2hhaW4oRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQkJdGhpcy5maWx0ZXJzID0gZmlsdGVyczsKIAkJCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0FzSXNGaWxlU2VydmljZS5qYXZhCmluZGV4IDExYWQ1ZTAuLjlhOTI4YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9Bc0lzRmlsZVNlcnZpY2UuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VDb25maWcgewogCQlmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAKLQkJU2VydmljZUNvbmZpZyhmaW5hbCBDb25maWcgY2ZnKSB7CisJCVNlcnZpY2VDb25maWcoQ29uZmlnIGNmZykgewogCQkJZW5hYmxlZCA9IGNmZy5nZXRCb29sZWFuKCJodHRwIiwgImdldGFueWZpbGUiLCB0cnVlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKaW5kZXggOTVlYjhkNS4uMDZhOGY1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAogCQlmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAKLQkJU2VydmljZUNvbmZpZyhmaW5hbCBDb25maWcgY2ZnKSB7CisJCVNlcnZpY2VDb25maWcoQ29uZmlnIGNmZykgewogCQkJc2V0ID0gY2ZnLmdldFN0cmluZygiaHR0cCIsIG51bGwsICJyZWNlaXZlcGFjayIpICE9IG51bGw7CiAJCQllbmFibGVkID0gY2ZnLmdldEJvb2xlYW4oImh0dHAiLCAicmVjZWl2ZXBhY2siLCBmYWxzZSk7CiAJCX0KQEAgLTgyLDcgKzgyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTZXJ2aWNlQ29uZmlnIGNmZyA9IGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpOwogCQlTdHJpbmcgdXNlciA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnkuamF2YQppbmRleCBmNWFmYTFlLi5hNjlmYWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5LmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CkBAIC02NCwxOCArNjYsMjUgQEAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAkJZmluYWwgYm9vbGVhbiBlbmFibGVkOwogCi0JCVNlcnZpY2VDb25maWcoZmluYWwgQ29uZmlnIGNmZykgeworCQlTZXJ2aWNlQ29uZmlnKENvbmZpZyBjZmcpIHsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJ1cGxvYWRwYWNrIiwgdHJ1ZSk7CiAJCX0KIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7Ci0JCWlmIChkYi5nZXRDb25maWcoKS5nZXQoU2VydmljZUNvbmZpZzo6bmV3KS5lbmFibGVkKQotCQkJcmV0dXJuIG5ldyBVcGxvYWRQYWNrKGRiKTsKLQkJZWxzZQorCQlpZiAoZGIuZ2V0Q29uZmlnKCkuZ2V0KFNlcnZpY2VDb25maWc6Om5ldykuZW5hYmxlZCkgeworCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCVN0cmluZyBoZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJHaXQtUHJvdG9jb2wiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7CisJCQkJU3RyaW5nW10gcGFyYW1zID0gaGVhZGVyLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoQXJyYXlzLmFzTGlzdChwYXJhbXMpKTsKKwkJCX0KKwkJCXJldHVybiB1cDsKKwkJfSBlbHNlIHsKIAkJCXRocm93IG5ldyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbigpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBjNzkzZmRhLi44YmIyODJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxNCArMywxNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCiAgamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249IlsyLjUuMCwzLjIuMCkiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzt2ZXJzaW9uPSJbMS42LjAsIDIuMC4wKSIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeTt2ZXJzaW9uPSJbMS42LjAsIDIuMC4wKSIsCisgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjO3ZlcnNpb249IlsxLjYuMCwyLjAuMCkiLAorIG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnk7dmVyc2lvbj0iWzEuNi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkuY29udGludWF0aW9uO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS5odHRwO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS5pbzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCkBAIC0yNSwyNSArMjUsMjYgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbAppbmRleCA0ZjMzNmRhLi43YjgzMjQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKQEAgLTUxLDcgKzUxLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3Q8L2FydGlmYWN0SWQ+CkBAIC04NCw2ICs4NCwxMyBAQAogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDx2ZXJzaW9uPlsxLjEuMCwyLjAuMCk8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGU5NGE3OTIuLjI5OGJmMjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvQXNJc1NlcnZpY2VUZXN0LmphdmEKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggYjI0ZTJkZi4uYWRlMWUxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5VGVzdC5qYXZhCmluZGV4IGNlMjRkNjQuLjI2OGMyODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YQpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKIAotCQlSKGZpbmFsIFN0cmluZyB1c2VyLCBmaW5hbCBTdHJpbmcgaG9zdCkgeworCQlSKFN0cmluZyB1c2VyLCBTdHJpbmcgaG9zdCkgewogCQkJc3VwZXIobmV3IFJlcXVlc3QobnVsbCwgbnVsbCkgLyogY2FuJ3QgcGFzcyBudWxsLCBzaWdoICovKTsKIAkJCXRoaXMudXNlciA9IHVzZXI7CiAJCQl0aGlzLmhvc3QgPSBob3N0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCmluZGV4IDZkYmUwZTMuLmVmMDU5YmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKQEAgLTQzLDE1ICs0MywyMCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnRoZUluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CkBAIC03NSw5ICs4MCwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkZldGNoQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrZXRMaW5lSW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUGFja2V0TGluZU91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5UcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5KREtIdHRwQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuUmVwb3NpdG9yeVJlc29sdmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xMTgsNyArMTI3LDcgQEAKIAkJc21hcnRBdXRoQmFzaWNVUkkgPSB0b1VSSWlzaChzQmFzaWMsIHNyY05hbWUpOwogCX0KIAotCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIGR1bWIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBkdW1iKFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIEZpbGUgc3JjR2l0ID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCk7CiAJCWZpbmFsIFVSSSBiYXNlID0gc3JjR2l0LmdldFBhcmVudEZpbGUoKS50b1VSSSgpOwogCkBAIC0xMzAsNyArMTM5LDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTEsNyArMTYwLDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKQEAgLTM0NSw0ICszNTQsODIgQEAKIAkJCWFzc2VydE5vdE51bGwoaGVhZCk7CiAJCX0KIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIdHRwQ2xpZW50V2FudHNWMkJ1dFNlcnZlck5vdENvbmZpZ3VyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiR2l0LVByb3RvY29sIiwgInZlcnNpb249MiIpOworCQljLmNvbm5lY3QoKTsKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisKKwkJLy8gQ2hlY2sgdGhhdCB3ZSBnZXQgYSB2MCByZXNwb25zZS4KKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCIjIHNlcnZpY2U9Z2l0LXVwbG9hZC1wYWNrIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKS5tYXRjaGVzKCJbMC05YS1mXXs0MH0gSEVBRC4qIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYySHR0cEZpcnN0UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuc2V0SW50KAorCQkJCSJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIiwgMik7CisKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiR2l0LVByb3RvY29sIiwgInZlcnNpb249MiIpOworCQljLmNvbm5lY3QoKTsKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygidmVyc2lvbiAyIikpOworCisJCS8vIFdoYXQgcmVtYWlucyBhcmUgY2FwYWJpbGl0aWVzIC0gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZW0gYXJlCisJCS8vIG5vbi1lbXB0eSBzdHJpbmdzLCBhbmQgdGhhdCB3ZSBzZWUgRU5EIGF0IHRoZSBlbmQuCisJCVN0cmluZyBzOworCQl3aGlsZSAoKHMgPSBwY2tJbi5yZWFkU3RyaW5nKCkpICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCWFzc2VydFRydWUoIXMuaXNFbXB0eSgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYySHR0cFN1YnNlcXVlbnRSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZW1vdGVSZXBvc2l0b3J5LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKS5zZXRJbnQoCisJCQkJInByb3RvY29sIiwgbnVsbCwgInZlcnNpb24iLCAyKTsKKworCQlKREtIdHRwQ29ubmVjdGlvbkZhY3RvcnkgZiA9IG5ldyBKREtIdHRwQ29ubmVjdGlvbkZhY3RvcnkoKTsKKwkJU3RyaW5nIHVybCA9IHNtYXJ0QXV0aE5vbmVVUkkudG9TdHJpbmcoKSArICIvZ2l0LXVwbG9hZC1wYWNrIjsKKwkJSHR0cENvbm5lY3Rpb24gYyA9IGYuY3JlYXRlKG5ldyBVUkwodXJsKSk7CisJCWMuc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtZ2l0LXVwbG9hZC1wYWNrLXJlcXVlc3QiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5zZXREb091dHB1dCh0cnVlKTsKKwkJYy5jb25uZWN0KCk7CisKKwkJLy8gVGVzdCBscy1yZWZzIHRvIHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgY29ubmVjdGVkCisJCS8vIHByb3Blcmx5LiBUZXN0cyBmb3Igb3RoZXIgY29tbWFuZHMgZ28gaW4KKwkJLy8gVXBsb2FkUGFja1Rlc3QuamF2YS4KKworCQlPdXRwdXRTdHJlYW0gb3MgPSBjLmdldE91dHB1dFN0cmVhbSgpOworCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KG9zKTsKKwkJcGNrT3V0LndyaXRlU3RyaW5nKCJjb21tYW5kPWxzLXJlZnMiKTsKKwkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJcGNrT3V0LmVuZCgpOworCQlvcy5jbG9zZSgpOworCisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4oYy5nZXRJbnB1dFN0cmVhbSgpKTsKKworCQkvLyBKdXN0IGNoZWNrIHRoYXQgd2UgZ2V0IHdoYXQgbG9va3MgbGlrZSBhIHJlZiBhZHZlcnRpc2VtZW50LgorCQlTdHJpbmcgczsKKwkJd2hpbGUgKChzID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlhc3NlcnRUcnVlKHMubWF0Y2hlcygiWzAtOWEtZl17NDB9IFtBLVphLXovXSoiKSk7CisJCX0KKworCQlhc3NlcnRUaGF0KGMuZ2V0UmVzcG9uc2VDb2RlKCksIGlzKDIwMCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKaW5kZXggODdkMGJhZC4uYTFiYWFlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKQEAgLTE0OSwxOSArMTQ5LDE1IEBACiAJCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwKIAkJCQkJR2l0U21hcnRIdHRwVG9vbHMuUkVDRUlWRV9QQUNLX1JFUVVFU1RfVFlQRSk7CiAJCQljLnNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShyZXFiaW4ubGVuZ3RoKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBjLmdldE91dHB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGMuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGUocmVxYmluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3V0LmNsb3NlKCk7CiAJCQl9CiAKIAkJCWFzc2VydEVxdWFscygyMDAsIGMuZ2V0UmVzcG9uc2VDb2RlKCkpOwogCQkJYXNzZXJ0RXF1YWxzKEdpdFNtYXJ0SHR0cFRvb2xzLlJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwKIAkJCQkJYy5nZXRDb250ZW50VHlwZSgpKTsKIAotCQkJSW5wdXRTdHJlYW0gcmF3aW4gPSBjLmdldElucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSByYXdpbiA9IGMuZ2V0SW5wdXRTdHJlYW0oKSkgewogCQkJCVBhY2tldExpbmVJbiBwY2tpbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3aW4pOwogCQkJCWFzc2VydEVxdWFscygidW5wYWNrIGVycm9yICIKIAkJCQkJCSsgSkdpdFRleHQuZ2V0KCkucGFja2ZpbGVJc1RydW5jYXRlZE5vUGFyYW0sCkBAIC0xNjksOCArMTY1LDYgQEAKIAkJCQlhc3NlcnRFcXVhbHMoIm5nIHJlZnMvb2JqZWN0cy9BIG4vYSAodW5wYWNrZXIgZXJyb3IpIiwKIAkJCQkJCXBja2luLnJlYWRTdHJpbmcoKSk7CiAJCQkJYXNzZXJ0U2FtZShQYWNrZXRMaW5lSW4uRU5ELCBwY2tpbi5yZWFkU3RyaW5nKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyYXdpbi5jbG9zZSgpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJYy5kaXNjb25uZWN0KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEKaW5kZXggZWY4ZGFlYy4uZmJjNTRmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NldEFkZGl0aW9uYWxIZWFkZXJzVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YQpAQCAtMTA3LDggKzEwNyw3IEBACiAKIAkJYXNzZXJ0RXF1YWxzKCJodHRwIiwgcmVtb3RlVVJJLmdldFNjaGVtZSgpKTsKIAotCQlUcmFuc3BvcnQgdCA9IFRyYW5zcG9ydC5vcGVuKGRzdCwgcmVtb3RlVVJJKTsKLQkJdHJ5IHsKKwkJdHJ5IChUcmFuc3BvcnQgdCA9IFRyYW5zcG9ydC5vcGVuKGRzdCwgcmVtb3RlVVJJKSkgewogCQkJYXNzZXJ0VHJ1ZSgiaXNhIFRyYW5zcG9ydEh0dHAiLCB0IGluc3RhbmNlb2YgVHJhbnNwb3J0SHR0cCk7CiAJCQlhc3NlcnRUcnVlKCJpc2EgSHR0cFRyYW5zcG9ydCIsIHQgaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0KTsKIApAQCAtMTE3LDggKzExNiw2IEBACiAJCQloZWFkZXJzLnB1dCgiQW5vdGhlcktleSIsICJzb21lVmFsdWUiKTsKIAkJCSgoVHJhbnNwb3J0SHR0cCkgdCkuc2V0QWRkaXRpb25hbEhlYWRlcnMoaGVhZGVycyk7CiAJCQl0Lm9wZW5GZXRjaCgpOwotCQl9IGZpbmFsbHkgewotCQkJdC5jbG9zZSgpOwogCQl9CiAKIAkJTGlzdDxBY2Nlc3NFdmVudD4gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQppbmRleCA1ZjQwYmU0Li40MmRiMGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQ09OVEVOVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CkBAIC0yNjYsMTAgKzI2NiwxMCBAQAogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewogCQkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgciA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKIAkJCQlyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0JCQkJci5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLQkJCQlQcmludFdyaXRlciB3ID0gci5nZXRXcml0ZXIoKTsKLQkJCQl3LnByaW50KCJPSyIpOwotCQkJCXcuY2xvc2UoKTsKKwkJCQlyLnNldENoYXJhY3RlckVuY29kaW5nKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpOworCQkJCXRyeSAoUHJpbnRXcml0ZXIgdyA9IHIuZ2V0V3JpdGVyKCkpIHsKKwkJCQkJdy5wcmludCgiT0siKTsKKwkJCQl9CiAJCQl9CiAKIAkJCUBPdmVycmlkZQpAQCAtMzk3LDExICszOTcsOCBAQAogCQkJYXNzZXJ0VHJ1ZSgiaXNhIFRyYW5zcG9ydEh0dHAiLCB0IGluc3RhbmNlb2YgVHJhbnNwb3J0SHR0cCk7CiAJCQlhc3NlcnRUcnVlKCJpc2EgSHR0cFRyYW5zcG9ydCIsIHQgaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0KTsKIAotCQkJRmV0Y2hDb25uZWN0aW9uIGMgPSB0Lm9wZW5GZXRjaCgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmV0Y2hDb25uZWN0aW9uIGMgPSB0Lm9wZW5GZXRjaCgpKSB7CiAJCQkJbWFwID0gYy5nZXRSZWZzTWFwKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWMuY2xvc2UoKTsKIAkJCX0KIAkJfQogCkBAIC0xMDg0LDcgKzEwODEsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkV2FudCgpIHRocm93cyBFeGNlcHRpb24gewogCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQlPYmplY3RJZCBpZCA9IG5ldyBPYmplY3RJbnNlcnRlci5Gb3JtYXR0ZXIoKS5pZEZvcihDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJInRlc3RJbnZhbGlkV2FudCIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkidGVzdEludmFsaWRXYW50Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmVwb3NpdG9yeSBkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQl0cnkgKFRyYW5zcG9ydCB0ID0gVHJhbnNwb3J0Lm9wZW4oZHN0LCByZW1vdGVVUkkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDFlY2UyNDQuLmE2OGQxNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCi1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKQEAgLTIyLDE2ICsyMiwxNiBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNlY3VyaXR5O3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNzbDt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI0LjExLjMiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBqYXZheC5zZXJ2bGV0Lmh0dHAsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCmluZGV4IDFlOTM0Y2MuLmViN2QwMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9BY2Nlc3NFdmVudC5qYXZhCmluZGV4IDAxYzQzNjAuLjgyNDc2ZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3BvbnNlSGVhZGVyczsKIAotCUFjY2Vzc0V2ZW50KGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBSZXNwb25zZSByc3ApIHsKKwlBY2Nlc3NFdmVudChSZXF1ZXN0IHJlcSwgUmVzcG9uc2UgcnNwKSB7CiAJCW1ldGhvZCA9IHJlcS5nZXRNZXRob2QoKTsKIAkJdXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKIAkJcmVxdWVzdEhlYWRlcnMgPSBjbG9uZUhlYWRlcnMocmVxKTsKQEAgLTc3LDcgKzc3LDcgQEAKIAkJcmVzcG9uc2VIZWFkZXJzID0gY2xvbmVIZWFkZXJzKHJzcCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoZmluYWwgUmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsb25lSGVhZGVycyhSZXF1ZXN0IHJlcSkgewogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgVHJlZU1hcDw+KCk7CiAJCUVudW1lcmF0aW9uIGhuID0gcmVxLmdldEhlYWRlck5hbWVzKCk7CiAJCXdoaWxlIChobi5oYXNNb3JlRWxlbWVudHMoKSkgewpAQCAtODksNyArODksNyBAQAogCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKGZpbmFsIFJlc3BvbnNlIHJzcCkgeworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKFJlc3BvbnNlIHJzcCkgewogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgVHJlZU1hcDw+KCk7CiAJCUVudW1lcmF0aW9uPFN0cmluZz4gaG4gPSByc3AuZ2V0SHR0cEZpZWxkcygpLmdldEZpZWxkTmFtZXMoKTsKIAkJd2hpbGUgKGhuLmhhc01vcmVFbGVtZW50cygpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9SZWNvcmRpbmdMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCmluZGV4IGZlZDA2M2EuLmE3MTRlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lCiAJICovCi0JcHVibGljIFJlY29yZGluZ0xvZ2dlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZWNvcmRpbmdMb2dnZXIoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5uYW1lID0gbmFtZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQppbmRleCBjNTU3NmY5Li4yNDViNTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9TaW1wbGVIdHRwU2VydmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhCkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJcmV0dXJuIHNlY3VyZVVyaTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iRG9uJ3QgY2FyZSBhYm91dCBub24tQVBJIGluIHRlc3RzLiIgaWQ9IjY0Mzg0MjA2NCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkZpbGVSZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjcmVhdGVCYXJlUmVwb3NpdG9yeSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjQzODQyMDY0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZVJlcG9zaXRvcnkoYm9vbGVhbiwgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkRvbid0IGNhcmUgYWJvdXQgbm9uLUFQSSBpbiB0ZXN0cy4iIGlkPSI2NDM4NDIwNjQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJGaWxlUmVwb3NpdG9yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlV29ya1JlcG9zaXRvcnkoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjI3MDYwNzUxIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImRiIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA3M2QxYWIxLi43NDlmOGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzEgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjQuMTEuMyI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0zNiw0ICszNiw0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNC4xMS4zIgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI1LjAuNCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbAppbmRleCA0ZTA5NzBmLi4zMGNlMGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9KR2l0VGVzdFV0aWwuamF2YQppbmRleCBjZWY4MWEwLi5hMTAyZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvSkdpdFRlc3RVdGlsLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNDIsNyArMTQyLDcgQEAKIAkgKiBAcGFyYW0gZmlsZU5hbWUKIAkgKiBAcmV0dXJuIHRoZSB0ZXN0IHJlc291cmNlIGZpbGUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKIAkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUubGVuZ3RoKCkgPD0gMCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KQEAgLTI0MiwxMSArMjQyLDExIEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZVV0aWxzLm1rZGlycyhmLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSk7CiAJCXRyeSAoV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQl3LndyaXRlKGJvZHkpOwogCQl9CiAJfQpAQCAtMjYxLDkgKzI2MSw5IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGJvZHkgPSBJTy5yZWFkRnVsbHkoZmlsZSk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJvZHksIDAsIGJvZHkubGVuZ3RoLCBVVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKGJvZHksIDAsIGJvZHkubGVuZ3RoLCBDSEFSU0VUKTsKIAl9CiAKIAkvKioKQEAgLTI3NCw3ICsyNzQsNyBAQAogCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgbmFtZSkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CiAJCXJldHVybiByZWFkKGZpbGUpOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmaWxlCiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGZpbGUgZXhpc3RzCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBuYW1lKSB7CiAJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIG5hbWUpOwogCQlyZXR1cm4gZmlsZS5leGlzdHMoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCA1NjhiYzNiLi42Y2RkMGViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMjI1LDcgKzIyNSw3IEBACiAJICogQHBhcmFtIGRpcgogCSAqICAgICAgICAgICAgdGhlIHJlY3Vyc2l2ZWx5IGRpcmVjdG9yeSB0byBkZWxldGUsIGlmIHByZXNlbnQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRGVsZXRlKGZpbmFsIEZpbGUgZGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRGVsZXRlKEZpbGUgZGlyKSB7CiAJCXJlY3Vyc2l2ZURlbGV0ZShkaXIsIGZhbHNlLCB0cnVlKTsKIAl9CiAKQEAgLTM1Miw3ICszNTIsNyBAQAogCQkJaWYgKDAgIT0gKGluY2x1ZGVkT3B0aW9ucyAmIENPTlRFTlQpKSB7CiAJCQkJc2IuYXBwZW5kKCIsIGNvbnRlbnQ6IgogCQkJCQkJKyBuZXcgU3RyaW5nKHJlcG8ub3BlbihlbnRyeS5nZXRPYmplY3RJZCgpLAotCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBVVEZfOCkpOworCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCQlpZiAoMCAhPSAoaW5jbHVkZWRPcHRpb25zICYgQVNTVU1FX1VOQ0hBTkdFRCkpCiAJCQkJc2IuYXBwZW5kKCIsIGFzc3VtZS11bmNoYW5nZWQ6IgpAQCAtNTQwLDcgKzU0MCw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlKGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBGaWxlIHdyaXRlKFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwgInR4dCIsIHRtcCk7CiAJCXRyeSB7CiAJCQl3cml0ZShmLCBib2R5KTsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHdyaXRlKEZpbGUgZiwgU3RyaW5nIGJvZHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShmLCBib2R5KTsKIAl9CiAKQEAgLTU4MywxMSArNTgzLDExIEBACiAJICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZmlsZQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwucmVhZChmKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b0VudkFycmF5KGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52KSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdG9FbnZBcnJheShNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikgewogCQlmaW5hbCBTdHJpbmdbXSBlbnZwID0gbmV3IFN0cmluZ1tlbnYuc2l6ZSgpXTsKIAkJaW50IGkgPSAwOwogCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGVudi5lbnRyeVNldCgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQppbmRleCAwNWQxNTIyLi5kM2Q3ZDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCXNldEN1cnJlbnRQbGF0Zm9ybSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbml0KGZpbmFsIFN0cmluZyBuKSB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG4pIHsKIAkJc2V0UHJvcGVydHkobiwgbik7CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCB0aWNrKGZpbmFsIGludCBzZWNEZWx0YSkgeworCXB1YmxpYyB2b2lkIHRpY2soaW50IHNlY0RlbHRhKSB7CiAJCW5vdyArPSBzZWNEZWx0YSAqIDEwMDBMOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggYWZjMmM0NC4uZTk4M2U1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTkyLDIyICs5MiwxNSBAQAogCSAqIEBwYXJhbSBkc3QKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY29weUZpbGUoRmlsZSBzcmMsIEZpbGUgZHN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJdHJ5IHsKLQkJCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotCQkJCWludCByOwotCQkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID4gMCkgewotCQkJCQlmb3Mud3JpdGUoYnVmLCAwLCByKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOworCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7CisJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpKSB7CisJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisJCQlpbnQgcjsKKwkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID4gMCkgeworCQkJCWZvcy53cml0ZShidWYsIDAsIHIpOwogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTExOSw3ICsxMTIsNyBAQAogCSAqIEByZXR1cm4gdGhlIHRyYXNoIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwud3JpdGVUcmFzaEZpbGUoZGIsIG5hbWUsIGRhdGEpOwogCX0KQEAgLTEzNSw3ICsxMjgsNyBAQAogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBQYXRoIHdyaXRlTGluayhmaW5hbCBTdHJpbmcgbGluaywgZmluYWwgU3RyaW5nIHRhcmdldCkKKwlwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQpAQCAtMTYyLDcgKzE1NSw3IEBACiAJICogQHJldHVybiB0aGUgZmlsZSdzIGNvbnRlbnQKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC5yZWFkKGRiLCBuYW1lKTsKIAl9CiAKQEAgLTE3Myw3ICsxNjYsNyBAQAogCSAqICAgICAgICAgICAgZmlsZSBuYW1lCiAJICogQHJldHVybiBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuY2hlY2soZGIsIG5hbWUpOwogCX0KIApAQCAtMTg0LDcgKzE3Nyw3IEBACiAJICogICAgICAgICAgICBmaWxlIG5hbWUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCkBAIC0xOTYsMTAgKzE4OSwxMCBAQAogCSAqICAgICAgICAgICAgZXhwZWN0ZWQgY29udGVudAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tGaWxlKEZpbGUgZiwgZmluYWwgU3RyaW5nIGNoZWNrRGF0YSkKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tGaWxlKEZpbGUgZiwgU3RyaW5nIGNoZWNrRGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmKSwKLQkJCQlVVEZfOCkpIHsKKwkJCQlDSEFSU0VUKSkgewogCQkJaWYgKGNoZWNrRGF0YS5sZW5ndGgoKSA+IDApIHsKIAkJCQljaGFyW10gZGF0YSA9IG5ldyBjaGFyW2NoZWNrRGF0YS5sZW5ndGgoKV07CiAJCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCByLnJlYWQoZGF0YSkpOwpAQCAtMjkzLDEwICsyODYsMTEgQEAKIAkJCQlkY2Uuc2V0RmlsZU1vZGUodHJlZUl0ci5nZXRFbnRyeUZpbGVNb2RlKCkpOwogCQkJCWRjZS5zZXRMYXN0TW9kaWZpZWQodHJlZUl0ci5nZXRFbnRyeUxhc3RNb2RpZmllZCgpKTsKIAkJCQlkY2Uuc2V0TGVuZ3RoKChpbnQpIGxlbik7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCXRyZWVJdHIuZ2V0RW50cnlGaWxlKCkpOwotCQkJCWRjZS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBsZW4sIGluKSk7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCisJCQkJCQl0cmVlSXRyLmdldEVudHJ5RmlsZSgpKSkgeworCQkJCQlkY2Uuc2V0T2JqZWN0SWQoCisJCQkJCQkJaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgbGVuLCBpbikpOworCQkJCX0KIAkJCQlidWlsZGVyLmFkZChkY2UpOwogCQkJCXRyZWVJdHIubmV4dCgxKTsKIAkJCX0KQEAgLTM4MCw4ICszNzQsOSBAQAogCQkJd2hpbGUgKGFjdFRpbWUgPD0gc3RhcnRUaW1lKSB7CiAJCQkJVGhyZWFkLnNsZWVwKHNsZWVwVGltZSk7CiAJCQkJc2xlZXBUaW1lICo9IDI7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApOwotCQkJCWZvcy5jbG9zZSgpOworCQkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApKSB7CisJCQkJCS8vIERvIG5vdGhpbmcKKwkJCQl9CiAJCQkJYWN0VGltZSA9IGZzLmxhc3RNb2RpZmllZCh0bXApOwogCQkJfQogCQkJcmV0dXJuIGFjdFRpbWU7CkBAIC01MDUsNyArNTAwLDcgQEAKIAkgKiBAcGFyYW0gbW9kZQogCSAqIEByZXR1cm4gdGhlIERpckNhY2hlRW50cnkKIAkgKi8KLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBjcmVhdGVFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgRmlsZU1vZGUgbW9kZSkgeworCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGNyZWF0ZUVudHJ5KFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlKSB7CiAJCXJldHVybiBjcmVhdGVFbnRyeShwYXRoLCBtb2RlLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzAsIHBhdGgpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhCmluZGV4IDQxNjM0ZTcuLmQyM2MwZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCSAqIEBwYXJhbSBzZWNEZWx0YQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIHNlY29uZHMgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRpbWUuCiAJICovCi0JcHVibGljIHZvaWQgdGljayhmaW5hbCBpbnQgc2VjRGVsdGEpIHsKKwlwdWJsaWMgdm9pZCB0aWNrKGludCBzZWNEZWx0YSkgewogCQltb2NrU3lzdGVtUmVhZGVyLnRpY2soc2VjRGVsdGEpOwogCX0KIApAQCAtMjY3LDggKzI2Nyw4IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2IuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJsb2IoY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCXB1YmxpYyBSZXZCbG9iIGJsb2IoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYmxvYihjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAkvKioKQEAgLTI3OSw3ICsyNzksNyBAQAogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBibG9iLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkJsb2IgYmxvYihmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkJsb2IgYmxvYihieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdElkIGlkOwogCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IGluc2VydGVyKSB7CiAJCQlpZCA9IGlucy5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBjb250ZW50KTsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCSAqIEByZXR1cm4gdGhlIGVudHJ5LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBibG9iKQorCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGZpbGUoU3RyaW5nIHBhdGgsIFJldkJsb2IgYmxvYikKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGUgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoKTsKIAkJZS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOwpAQCAtMzE1LDEwICszMTUsMTAgQEAKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgdHJlZSBzcGVjaWZpZWQgYnkgdGhlIGVudHJ5IGxpc3QuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2VHJlZSB0cmVlKGZpbmFsIERpckNhY2hlRW50cnkuLi4gZW50cmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldlRyZWUgdHJlZShEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlmaW5hbCBEaXJDYWNoZUJ1aWxkZXIgYiA9IGRjLmJ1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBEaXJDYWNoZUVudHJ5IGUgOiBlbnRyaWVzKQorCQlmb3IgKERpckNhY2hlRW50cnkgZSA6IGVudHJpZXMpCiAJCQliLmFkZChlKTsKIAkJYi5maW5pc2goKTsKIAkJT2JqZWN0SWQgcm9vdDsKQEAgLTMzOSw3ICszMzksNyBAQAogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBvYmplY3QgZW50cnkgYXQgdGhpcyBwYXRoLCBuZXZlciBudWxsLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldk9iamVjdCBnZXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlwdWJsaWMgUmV2T2JqZWN0IGdldChSZXZUcmVlIHRyZWUsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocG9vbC5nZXRPYmplY3RSZWFkZXIoKSkpIHsKIAkJCXR3LnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMKQEAgLTM3MCw3ICszNzAsNyBAQAogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkNvbW1pdCBjb21taXQoUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KDEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQogCkBAIC0zODYsNyArMzg2LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBuZXcgY29tbWl0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChSZXZUcmVlIHRyZWUsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjb21taXQoMSwgdHJlZSwgcGFyZW50cyk7CiAJfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAJICogQHJldHVybiB0aGUgbmV3IGNvbW1pdC4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZDb21taXQgY29tbWl0KGZpbmFsIGludCBzZWNEZWx0YSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHVibGljIFJldkNvbW1pdCBjb21taXQoaW50IHNlY0RlbHRhLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KHNlY0RlbHRhLCB0cmVlKCksIHBhcmVudHMpOwogCX0KQEAgLTQ3MCw3ICs0NzAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGFubm90YXRlZCB0YWcgb2JqZWN0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldlRhZyB0YWcoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldk9iamVjdCBkc3QpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZUYWcgdGFnKFN0cmluZyBuYW1lLCBSZXZPYmplY3QgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgVGFnQnVpbGRlciB0ID0gbmV3IFRhZ0J1aWxkZXIoKTsKIAkJdC5zZXRPYmplY3RJZChkc3QpOwogCQl0LnNldFRhZyhuYW1lKTsKQEAgLTc1OSw3ICs3NTksNyBAQAogCQkJZmluYWwgRmlsZVJlcG9zaXRvcnkgZnIgPSAoRmlsZVJlcG9zaXRvcnkpIGRiOwogCQkJUmVmV3JpdGVyIHJ3ID0gbmV3IFJlZldyaXRlcihmci5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJ5dGVbXSBiaW4pCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKFN0cmluZyBuYW1lLCBieXRlW10gYmluKQogCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZnIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCQlUZXN0UmVwb3NpdG9yeS50aGlzLndyaXRlRmlsZShwYXRoLCBiaW4pOwpAQCAtNzkxLDcgKzc5MSw3IEBACiAJICogQHJldHVybiB7QGNvZGUgb2JqZWN0fQogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShmaW5hbCBUIG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShUIG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXBvb2wucGFyc2VCb2R5KG9iamVjdCk7CiAJCXJldHVybiBvYmplY3Q7CiAJfQpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJCXJldHVybiBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgbmFtZS5uYW1lKCkgKyB0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVGaWxlKGZpbmFsIEZpbGUgcCwgZmluYWwgYnl0ZVtdIGJpbikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRmlsZSBwLCBieXRlW10gYmluKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlPYmplY3RXcml0aW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgTG9ja0ZpbGUgbGNrID0gbmV3IExvY2tGaWxlKHApOwogCQlpZiAoIWxjay5sb2NrKCkpCkBAIC05NjIsNyArOTYyLDcgQEAKIAlwdWJsaWMgY2xhc3MgQnJhbmNoQnVpbGRlciB7CiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlZjsKIAotCQlCcmFuY2hCdWlsZGVyKGZpbmFsIFN0cmluZyByZWYpIHsKKwkJQnJhbmNoQnVpbGRlcihTdHJpbmcgcmVmKSB7CiAJCQl0aGlzLnJlZiA9IHJlZjsKIAkJfQogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCQkJcmV0dXJuIGFkZChwYXRoLCBibG9iKGNvbnRlbnQpKTsKIAkJfQogCi0JCXB1YmxpYyBDb21taXRCdWlsZGVyIGFkZChTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBpZCkKKwkJcHVibGljIENvbW1pdEJ1aWxkZXIgYWRkKFN0cmluZyBwYXRoLCBSZXZCbG9iIGlkKQogCQkJCXRocm93cyBFeGNlcHRpb24gewogCQkJcmV0dXJuIGVkaXQobmV3IFBhdGhFZGl0KHBhdGgpIHsKIAkJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKaW5kZXggNTRjODFmMi4uZjdhZjM2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkgKiBAcGFyYW0gc2VlZAogCSAqICAgICAgICAgICAgc2VlZCB0byBib290c3RyYXAsIHVzdWFsbHkgdGhpcyBpcyB0aGUgdGVzdCBtZXRob2QgbmFtZS4KIAkgKi8KLQlwdWJsaWMgVGVzdFJuZyhmaW5hbCBTdHJpbmcgc2VlZCkgeworCXB1YmxpYyBUZXN0Um5nKFN0cmluZyBzZWVkKSB7CiAJCW5leHQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoKCk7IGkrKykKIAkJCW5leHQgPSBuZXh0ICogMTEgKyBzZWVkLmNoYXJBdChpKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gcHJvZHVjZS4KIAkgKiBAcmV0dXJuIGFycmF5IG9mIHtAY29kZSBjbnR9IHJhbmRvbWx5IGdlbmVyYXRlZCBieXRlcy4KIAkgKi8KLQlwdWJsaWMgYnl0ZVtdIG5leHRCeXRlcyhmaW5hbCBpbnQgY250KSB7CisJcHVibGljIGJ5dGVbXSBuZXh0Qnl0ZXMoaW50IGNudCkgewogCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2NudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspCiAJCQlyW2ldID0gKGJ5dGUpIG5leHRJbnQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDZkODg3Yi4uYzgwNWY3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yOCwyNCArMjgsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IGQwODkwMzIuLmRlZTMxOTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvTGZzU2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKaW5kZXggOTBmZTExNi4uNTBhMDZmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC0xMzEsMTIgKzEzMSw2IEBACiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIExhcmdlRmlsZVJlcG9zaXRvcnkgZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeSgKLQkJCQkJTGZzUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGF0aCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoCiAJCQkJCUxmc1JlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHBhdGgsIFN0cmluZyBhdXRoKQogCQkJCQl0aHJvd3MgTGZzRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKQEAgLTIxNywxMSArMjExLDExIEBACiAJCQkJaWYgKGJ1Zi5oYXNBcnJheSgpKSB7CiAJCQkJCWVycm9yID0gbmV3IFN0cmluZyhidWYuYXJyYXkoKSwKIAkJCQkJCQlidWYuYXJyYXlPZmZzZXQoKSArIGJ1Zi5wb3NpdGlvbigpLCBidWYucmVtYWluaW5nKCksCi0JCQkJCQkJVVRGXzgpOworCQkJCQkJCUNIQVJTRVQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWZpbmFsIGJ5dGVbXSBiID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKIAkJCQkJYnVmLmR1cGxpY2F0ZSgpLmdldChiKTsKLQkJCQkJZXJyb3IgPSBuZXcgU3RyaW5nKGIsIFVURl84KTsKKwkJCQkJZXJyb3IgPSBuZXcgU3RyaW5nKGIsIENIQVJTRVQpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQllcnJvciA9IHN0YXR1c0xpbmUuZ2V0UmVhc29uUGhyYXNlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCmluZGV4IDhhOGY0OWMuLjA5ZjhkMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKIAogCQlFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woY291bnQpOwogCQl0cnkgewotCQkJZm9yIChmaW5hbCBQYXRoIHAgOiBwYXRocykgeworCQkJZm9yIChQYXRoIHAgOiBwYXRocykgewogCQkJCWUuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA4YzY2NWQ4Li4xNGQzYWI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjMiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS4zIjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKQEAgLTI1LDE0ICsyNSwxNSBAQAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHA7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmNsaWVudDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCA1OWI2ZGMxLi43YzgxYzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9MZnNQcm90b2NvbFNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCmluZGV4IDY5NjhkNzUuLmQyMmQ0NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXMuU0NfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKQEAgLTExMiw0OCArMTEyLDYgQEAKIAkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgbGFyZ2UgZmlsZSByZXBvc2l0b3J5IHN0b3JpbmcgbGFyZ2UgZmlsZXMuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCB0aHJvdyBtb3JlIHNwZWNpZmljIGV4Y2VwdGlvbnMgdG8KLQkgKiAgICAgICAgICAgICBzaWduYWwgd2hpY2ggdHlwZSBvZiBlcnJvciBvY2N1cnJlZDoKLQkgKiAgICAgICAgICAgICA8ZGw+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzVmFsaWRhdGlvbkVycm9yfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlCi0JICogICAgICAgICAgICAgb2JqZWN0cyBpbiB0aGUgcmVxdWVzdDwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmVwb3NpdG9yeU5vdEZvdW5kfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSB1c2VyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNSZXBvc2l0b3J5UmVhZE9ubHl9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgcmVhZCwgYnV0IG5vdCB3cml0ZSBhY2Nlc3MuIE9ubHkKLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgcmVxdWVzdCBpcyAidXBsb2FkIjwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmF0ZUxpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgaGl0IGEgcmF0ZSBsaW1pdCB3aXRoIHRoZSBzZXJ2ZXI8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0JhbmR3aWR0aExpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgYmFuZHdpZHRoIGxpbWl0IGZvciB0aGUgdXNlciBvciByZXBvc2l0b3J5IGhhcwotCSAqICAgICAgICAgICAgIGJlZW4gZXhjZWVkZWQ8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0luc3VmZmljaWVudFN0b3JhZ2V9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBvbiB0aGUgc2VydmVyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNVbmF2YWlsYWJsZX08L2R0PgotCSAqICAgICAgICAgICAgIDxkZD53aGVuIExGUyBpcyBub3QgYXZhaWxhYmxlPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNFeGNlcHRpb259PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiBhbiB1bmV4cGVjdGVkIGludGVybmFsIHNlcnZlciBlcnJvciBvY2N1cnJlZDwvZGQ+Ci0JICogICAgICAgICAgICAgPC9kbD4KLQkgKiBAc2luY2UgNC41Ci0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rICNnZXRMYXJnZUZpbGVSZXBvc2l0b3J5KExmc1JlcXVlc3QsIFN0cmluZywgU3RyaW5nKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoTGZzUmVxdWVzdCByZXF1ZXN0LAotCQkJU3RyaW5nIHBhdGgpIHRocm93cyBMZnNFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeShyZXF1ZXN0LCBwYXRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhcmdlIGZpbGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKIAkgKiBAcGFyYW0gYXV0aAogCSAqICAgICAgICAgICAgdGhlIEF1dGhvcml6YXRpb24gSFRUUCBoZWFkZXIKIAkgKiBAcmV0dXJuIHRoZSBsYXJnZSBmaWxlIHJlcG9zaXRvcnkgc3RvcmluZyBsYXJnZSBmaWxlcy4KQEAgLTI0NCwxMCArMjAyLDEwIEBACiAJcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQogCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJV3JpdGVyIHcgPSBuZXcgQnVmZmVyZWRXcml0ZXIoCi0JCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIENIQVJTRVQpKTsKIAogCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVxLmdldElucHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlcS5nZXRJbnB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAJCUxmc1JlcXVlc3QgcmVxdWVzdCA9IExmc0dzb24uZnJvbUpzb24ociwgTGZzUmVxdWVzdC5jbGFzcyk7CiAJCVN0cmluZyBwYXRoID0gcmVxLmdldFBhdGhJbmZvKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhCmluZGV4IDY4OGFlZjIuLjU1ZDkwOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvRmlsZUxmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGNoYXIgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoY2hhcltdIGRzdCwgaW50IHAsIGludCBiKSB7CiAJCWludCBvID0gcCArIDE7CiAJCXdoaWxlIChvID49IHAgJiYgYiAhPSAwKSB7CiAJCQlkc3Rbby0tXSA9IGhleGNoYXJbYiAmIDB4Zl07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvczMvU2lnbmVyVjQuamF2YQppbmRleCBiMjFjOTRlLi4zNzRhNTYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9BVVRIT1JJWkFUSU9OOwogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtMzU5LDEzICszNTksMTMgQEAKIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBoYXNoKFN0cmluZyBzKSB7CiAJCU1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwotCQltZC51cGRhdGUocy5nZXRCeXRlcyhVVEZfOCkpOworCQltZC51cGRhdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBtZC5kaWdlc3QoKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBieXRlW10gc2lnbihTdHJpbmcgc3RyaW5nRGF0YSwgYnl0ZVtdIGtleSkgewogCQl0cnkgewotCQkJYnl0ZVtdIGRhdGEgPSBzdHJpbmdEYXRhLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBkYXRhID0gc3RyaW5nRGF0YS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJCU1hYyBtYWMgPSBNYWMuZ2V0SW5zdGFuY2UoSE1BQ1NIQTI1Nik7CiAJCQltYWMuaW5pdChuZXcgU2VjcmV0S2V5U3BlYyhrZXksIEhNQUNTSEEyNTYpKTsKIAkJCXJldHVybiBtYWMuZG9GaW5hbChkYXRhKTsKQEAgLTM5NSw3ICszOTUsNyBAQAogCXByaXZhdGUgc3RhdGljIFN0cmluZyB1cmxFbmNvZGUoU3RyaW5nIHVybCwgYm9vbGVhbiBrZWVwUGF0aFNsYXNoKSB7CiAJCVN0cmluZyBlbmNvZGVkOwogCQl0cnkgewotCQkJZW5jb2RlZCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCwgVVRGXzgubmFtZSgpKTsKKwkJCWVuY29kZWQgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwsIENIQVJTRVQubmFtZSgpKTsKIAkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihMZnNTZXJ2ZXJUZXh0LmdldCgpLnVuc3VwcG9ydGVkVXRmOCwgZSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDYyZjAzNTZmLi5kODM3NmNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjMgKzMsMjMgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO3ZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXI7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyczt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSI0LjExLjMiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKaW5kZXggOGRmZDI2MS4uYTU1Y2VjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3Rlc3QvTG9uZ09iamVjdElkVGVzdFV0aWxzLmphdmEKaW5kZXggYzNjMzg1OS4uZTNjNmVmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNjYsNyArNjYsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGhhc2goU3RyaW5nIHMpIHsKIAkJTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7Ci0JCW1kLnVwZGF0ZShzLmdldEJ5dGVzKFVURl84KSk7CisJCW1kLnVwZGF0ZShzLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIExvbmdPYmplY3RJZC5mcm9tUmF3KG1kLmRpZ2VzdCgpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xGU1BvaW50ZXJUZXN0LmphdmEKaW5kZXggMTQ2YTI1ZS4uYTEyODNkZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xGU1BvaW50ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xGU1BvaW50ZXJUZXN0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtNjYsNyArNjYsNyBAQAogCQkJYXNzZXJ0RXF1YWxzKAogCQkJCQkidmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxXG5vaWQgc2hhMjU2OiIKIAkJCQkJCQkrIHMgKyAiXG5zaXplIDRcbiIsCi0JCQkJCWJhb3MudG9TdHJpbmcoVVRGXzgubmFtZSgpKSk7CisJCQkJCWJhb3MudG9TdHJpbmcoQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGNjYjk5YmIuLjNlMWUyMjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDMzICszLDM0IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmxmcwotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSI0LjExLjMiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSI0LjExLjMiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsO3ZlcnNpb249IjQuMTEuMyI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnMsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iNC4xMS4zIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mcyxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSI1LjAuNCIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogY29tLmdvb2dsZS5nc29uO3ZlcnNpb249IlsyLjguMiwzLjAuMCkiLAogIGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW07dmVyc2lvbj0iWzIuOC4yLDMuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50O3ZlcnNpb249Ils0LjIuNiw1LjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm47dmVyc2lvbj0iWzQuMi42LDUuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIgorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbAppbmRleCA4MjA5YzE4Li5jMjMxNjkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnM8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzLmphdmEKaW5kZXggNDBkODM0Mi4uNGM0NmJiZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YQpAQCAtNjUsMTkgKzY1LDYgQEAKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgTGZzLgogCSAqCi0JICogQHBhcmFtIHJvb3QKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBMRlMgbWVkaWEgZGlyZWN0b3J5LiBXaWxsIGJlCi0JICogICAgICAgICAgICB7QGNvZGUgIjxyZXBvPi8uZ2l0L2xmcyJ9Ci0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjTGZzKFJlcG9zaXRvcnkpfSBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIExmcyhQYXRoIHJvb3QpIHsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTGZzLgotCSAqCiAJICogQHBhcmFtIGRiCiAJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCByZXBvCiAJICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQb2ludGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUG9pbnRlci5qYXZhCmluZGV4IDBlMzgzMGMuLjRmOTU5NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQb2ludGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xMzQsNyArMTM0LDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmNvZGUoT3V0cHV0U3RyZWFtIG91dCkgewogCQl0cnkgKFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKG91dCwgZmFsc2UsCi0JCQkJVVRGXzgubmFtZSgpKSkgeworCQkJCUNIQVJTRVQubmFtZSgpKSkgewogCQkJcHMucHJpbnQoInZlcnNpb24gIik7IC8vJE5PTi1OTFMtMSQKIAkJCXBzLnByaW50KFZFUlNJT04gKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJcHMucHJpbnQoIm9pZCAiICsgSEFTSF9GVU5DVElPTl9OQU1FICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJCXBzLnByaW50KHNpemUgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKIAkJCS8vIHNob3VsZCBub3QgaGFwcGVuLCB3ZSBhcmUgdXNpbmcgYSBzdGFuZGFyZCBjaGFyc2V0Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uKFVURl84Lm5hbWUoKSk7CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uKENIQVJTRVQubmFtZSgpKTsKIAkJfQogCX0KIApAQCAtMTY1LDcgKzE2NSw3IEBACiAJCWxvbmcgc3ogPSAtMTsKIAogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgQ0hBUlNFVCkpKSB7CiAJCQlmb3IgKFN0cmluZyBzID0gYnIucmVhZExpbmUoKTsgcyAhPSBudWxsOyBzID0gYnIucmVhZExpbmUoKSkgewogCQkJCWlmIChzLnN0YXJ0c1dpdGgoIiMiKSB8fCBzLmxlbmd0aCgpID09IDApIHsgLy8kTk9OLU5MUy0xJAogCQkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEKaW5kZXggNjExNWUzOS4uZGU0NDQ5ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxmczsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5Qcm90b2NvbC5PUEVSQVRJT05fVVBMT0FEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbC5MZnNDb25uZWN0aW9uRmFjdG9yeS50b1JlcXVlc3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb24uSFRUUF9PSzsKQEAgLTE3NCw4ICsxNzQsOCBAQAogCiAJcHJpdmF0ZSB2b2lkIGV4Y2x1ZGVSZW1vdGVSZWZzKE9iamVjdFdhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmRGF0YWJhc2UgcmVmRGF0YWJhc2UgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZW1vdGVSZWZzID0gcmVmRGF0YWJhc2UuZ2V0UmVmcyhyZW1vdGUoKSk7Ci0JCWZvciAoUmVmIHIgOiByZW1vdGVSZWZzLnZhbHVlcygpKSB7CisJCUxpc3Q8UmVmPiByZW1vdGVSZWZzID0gcmVmRGF0YWJhc2UuZ2V0UmVmc0J5UHJlZml4KHJlbW90ZSgpKTsKKwkJZm9yIChSZWYgciA6IHJlbW90ZVJlZnMpIHsKIAkJCU9iamVjdElkIG9pZCA9IHIuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCWlmIChvaWQgPT0gbnVsbCkgewogCQkJCW9pZCA9IHIuZ2V0T2JqZWN0SWQoKTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogCQl9CiAJCUdzb24gZ3NvbiA9IFByb3RvY29sLmdzb24oKTsKIAkJYXBpLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKAotCQkJCWdzb24udG9Kc29uKHRvUmVxdWVzdChPUEVSQVRJT05fVVBMT0FELCByZXMpKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCWdzb24udG9Kc29uKHRvUmVxdWVzdChPUEVSQVRJT05fVVBMT0FELCByZXMpKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWludCByZXNwb25zZUNvZGUgPSBhcGkuZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCWlmIChyZXNwb25zZUNvZGUgIT0gSFRUUF9PSykgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCmluZGV4IGUyYWIzMDkuLjZiZmYxMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKQEAgLTQyLDExICs0MiwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtMTY5LDcgKzE3MCw3IEBACiAJCQkJLndyaXRlKGdzb24KIAkJCQkJCS50b0pzb24oTGZzQ29ubmVjdGlvbkZhY3RvcnkKIAkJCQkJCQkJLnRvUmVxdWVzdChQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQsIHJlcykpCi0JCQkJCQkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworCQkJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJaW50IHJlc3BvbnNlQ29kZSA9IGxmc1NlcnZlckNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCWlmIChyZXNwb25zZUNvZGUgIT0gSHR0cENvbm5lY3Rpb24uSFRUUF9PSykgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCA1MzIwYWYwLi5mOTBhMDAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNjMsNCArNjMsMTcgQEAKIAkJc3VwZXIobXNnKTsKIAl9CiAKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBtc2cKKwkgKiAgICAgICAgICAgIHRoZSBlcnJvciBkZXNjcmlwdGlvbgorCSAqIEBwYXJhbSBlCisJICogICAgICAgICAgICBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSkgeworCQlzdXBlcihtc2csIGUpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQppbmRleCA1ZDgyNjhiLi45NTVlY2EwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQpAQCAtNDcsMTAgKzQ3LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9BQ0NFUFRfRU5DT0RJTkc7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQ09OVEVOVF9UWVBFOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuUHJveHlTZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwpAQCAtNTgsNiArNTcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbW1hbmRGYWlsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuTGZzUG9pbnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5Qcm90b2NvbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKQEAgLTY2LDIwICs2NiwxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5IdHRwQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVtb3RlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hTZXNzaW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5NZXNzYWdlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TdHJlYW1Db3B5VGhyZWFkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5Tc2hTdXBwb3J0OwogCiAvKioKICAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCBhIHZhbGlkIExGUyBjb25uZWN0aW9uIGZvciBhIGdpdmVuIHJlcG9zaXRvcnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBMZnNDb25uZWN0aW9uRmFjdG9yeSB7CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1NIX0FVVEhfVElNRU9VVF9TRUNPTkRTID0gMzA7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9IVFRQUyA9ICJodHRwcyI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX1NTSCA9ICJzc2giOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQXV0aENhY2hlPiBzc2hBdXRoQ2FjaGUgPSBuZXcgVHJlZU1hcDw+KCk7CkBAIC0xMzMsNiArMTMwLDcgQEAKIAkJU3RyaW5nIGxmc1VybCA9IGNvbmZpZy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywKIAkJCQludWxsLAogCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCk7CisJCUV4Y2VwdGlvbiBleCA9IG51bGw7CiAJCWlmIChsZnNVcmwgPT0gbnVsbCkgewogCQkJU3RyaW5nIHJlbW90ZVVybCA9IG51bGw7CiAJCQlmb3IgKFN0cmluZyByZW1vdGUgOiBkYi5nZXRSZW1vdGVOYW1lcygpKSB7CkBAIC0xNTEsMzggKzE0OSw0NCBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKGxmc1VybCA9PSBudWxsICYmIHJlbW90ZVVybCAhPSBudWxsKSB7Ci0JCQkJbGZzVXJsID0gZGlzY292ZXJMZnNVcmwoZGIsIHB1cnBvc2UsIGFkZGl0aW9uYWxIZWFkZXJzLAotCQkJCQkJcmVtb3RlVXJsKTsKKwkJCQl0cnkgeworCQkJCQlsZnNVcmwgPSBkaXNjb3Zlckxmc1VybChkYiwgcHVycG9zZSwgYWRkaXRpb25hbEhlYWRlcnMsCisJCQkJCQkJcmVtb3RlVXJsKTsKKwkJCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbgorCQkJCQkJfCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJZXggPSBlOworCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJbGZzVXJsID0gbGZzVXJsICsgUHJvdG9jb2wuSU5GT19MRlNfRU5EUE9JTlQ7CiAJCQl9CiAJCX0KIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CisJCQlpZiAoZXggIT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKAorCQkJCQkJTGZzVGV4dC5nZXQoKS5sZnNOb0Rvd25sb2FkVXJsLCBleCk7CisJCQl9CiAJCQl0aHJvdyBuZXcgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihMZnNUZXh0LmdldCgpLmxmc05vRG93bmxvYWRVcmwpOwogCQl9CiAJCXJldHVybiBsZnNVcmw7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRpc2NvdmVyTGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycywgU3RyaW5nIHJlbW90ZVVybCkgewotCQl0cnkgewotCQkJVVJJaXNoIHUgPSBuZXcgVVJJaXNoKHJlbW90ZVVybCk7Ci0JCQlpZiAoU0NIRU1FX1NTSC5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKLQkJCQlQcm90b2NvbC5FeHBpcmluZ0FjdGlvbiBhY3Rpb24gPSBnZXRTc2hBdXRoZW50aWNhdGlvbigKLQkJCQkJCWRiLCBwdXJwb3NlLCByZW1vdGVVcmwsIHUpOwotCQkJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dEFsbChhY3Rpb24uaGVhZGVyKTsKLQkJCQlyZXR1cm4gYWN0aW9uLmhyZWY7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiByZW1vdGVVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOyAvLyBjb3VsZCBub3QgZGlzY292ZXIKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gYWRkaXRpb25hbEhlYWRlcnMsIFN0cmluZyByZW1vdGVVcmwpCisJCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiB7CisJCVVSSWlzaCB1ID0gbmV3IFVSSWlzaChyZW1vdGVVcmwpOworCQlpZiAodS5nZXRTY2hlbWUoKSA9PSBudWxsIHx8IFNDSEVNRV9TU0guZXF1YWxzKHUuZ2V0U2NoZW1lKCkpKSB7CisJCQlQcm90b2NvbC5FeHBpcmluZ0FjdGlvbiBhY3Rpb24gPSBnZXRTc2hBdXRoZW50aWNhdGlvbihkYiwgcHVycG9zZSwKKwkJCQkJcmVtb3RlVXJsLCB1KTsKKwkJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dEFsbChhY3Rpb24uaGVhZGVyKTsKKwkJCXJldHVybiBhY3Rpb24uaHJlZjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiByZW1vdGVVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAkJfQogCX0KIAogCXByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKAogCQkJUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsIFN0cmluZyByZW1vdGVVcmwsIFVSSWlzaCB1KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiB7CiAJCUF1dGhDYWNoZSBjYWNoZWQgPSBzc2hBdXRoQ2FjaGUuZ2V0KHJlbW90ZVVybCk7CiAJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IG51bGw7CiAJCWlmIChjYWNoZWQgIT0gbnVsbCAmJiBjYWNoZWQudmFsaWRVbnRpbCA+IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSB7CkBAIC0xOTMsMTAgKzE5NywxMSBAQAogCQkJLy8gZGlzY292ZXIgYW5kIGF1dGhlbnRpY2F0ZTsgZ2l0LWxmcyBkb2VzICJzc2gKIAkJCS8vIC1wIDxwb3J0PiAtLSA8aG9zdD4gZ2l0LWxmcy1hdXRoZW50aWNhdGUKIAkJCS8vIDxwcm9qZWN0PiA8dXBsb2FkL2Rvd25sb2FkPiIKLQkJCVN0cmluZyBqc29uID0gcnVuU3NoQ29tbWFuZCh1LnNldFBhdGgoIiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWRiLmdldEZTKCksCisJCQlTdHJpbmcganNvbiA9IFNzaFN1cHBvcnQucnVuU3NoQ29tbWFuZCh1LnNldFBhdGgoIiIpLCAvLyROT04tTkxTLTEkCisJCQkJCW51bGwsIGRiLmdldEZTKCksCiAJCQkJCSJnaXQtbGZzLWF1dGhlbnRpY2F0ZSAiICsgZXh0cmFjdFByb2plY3ROYW1lKHUpICsgIiAiIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBwdXJwb3NlKTsKKwkJCQkJCQkrIHB1cnBvc2UsCisJCQkJCVNTSF9BVVRIX1RJTUVPVVRfU0VDT05EUyk7CiAKIAkJCWFjdGlvbiA9IFByb3RvY29sLmdzb24oKS5mcm9tSnNvbihqc29uLAogCQkJCQlQcm90b2NvbC5FeHBpcmluZ0FjdGlvbi5jbGFzcyk7CkBAIC0yMzAsOCArMjM1LDEwIEBACiAJCQkJLmNyZWF0ZShjb250ZW50VXJsLCBIdHRwU3VwcG9ydAogCQkJCQkJLnByb3h5Rm9yKFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpLCBjb250ZW50VXJsKSk7CiAJCWNvbnRlbnRTZXJ2ZXJDb25uLnNldFJlcXVlc3RNZXRob2QobWV0aG9kKTsKLQkJYWN0aW9uLmhlYWRlcgotCQkJCS5mb3JFYWNoKChrLCB2KSAtPiBjb250ZW50U2VydmVyQ29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoaywgdikpOworCQlpZiAoYWN0aW9uLmhlYWRlciAhPSBudWxsKSB7CisJCQlhY3Rpb24uaGVhZGVyLmZvckVhY2goCisJCQkJCShrLCB2KSAtPiBjb250ZW50U2VydmVyQ29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoaywgdikpOworCQl9CiAJCWlmIChjb250ZW50VXJsLmdldFByb3RvY29sKCkuZXF1YWxzKFNDSEVNRV9IVFRQUykKIAkJCQkmJiAhcmVwby5nZXRDb25maWcoKS5nZXRCb29sZWFuKEh0dHBDb25maWcuSFRUUCwKIAkJCQkJCUh0dHBDb25maWcuU1NMX1ZFUklGWV9LRVksIHRydWUpKSB7CkBAIC0yNDUsNyArMjUyLDEzIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RQcm9qZWN0TmFtZShVUklpc2ggdSkgewotCQlTdHJpbmcgcGF0aCA9IHUuZ2V0UGF0aCgpLnN1YnN0cmluZygxKTsKKwkJU3RyaW5nIHBhdGggPSB1LmdldFBhdGgoKTsKKworCQkvLyBiZWdpbnMgd2l0aCBhIHNsYXNoIGlmIHRoZSB1cmwgY29udGFpbnMgYSBwb3J0IChnZXJyaXQgdnMuIGdpdGh1YikuCisJCWlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7CisJCX0KKwogCQlpZiAocGF0aC5lbmRzV2l0aChvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuRE9UX0dJVCkpIHsKIAkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CiAJCX0gZWxzZSB7CkBAIC0yNTMsNDIgKzI2Niw2IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcnVuU3NoQ29tbWFuZChVUklpc2ggc3NoVXJpLCBGUyBmcywgU3RyaW5nIGNvbW1hbmQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZW1vdGVTZXNzaW9uIHNlc3Npb24gPSBudWxsOwotCQlQcm9jZXNzIHByb2Nlc3MgPSBudWxsOwotCQlTdHJlYW1Db3B5VGhyZWFkIGVycm9yVGhyZWFkID0gbnVsbDsKLQkJdHJ5IChNZXNzYWdlV3JpdGVyIHN0ZGVyciA9IG5ldyBNZXNzYWdlV3JpdGVyKCkpIHsKLQkJCXNlc3Npb24gPSBTc2hTZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNlc3Npb24oc3NoVXJpLCBudWxsLAotCQkJCQlmcywgNV8wMDApOwotCQkJcHJvY2VzcyA9IHNlc3Npb24uZXhlYyhjb21tYW5kLCAwKTsKLQkJCWVycm9yVGhyZWFkID0gbmV3IFN0cmVhbUNvcHlUaHJlYWQocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpLAotCQkJCQlzdGRlcnIuZ2V0UmF3U3RyZWFtKCkpOwotCQkJZXJyb3JUaHJlYWQuc3RhcnQoKTsKLQkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLAotCQkJCQkJCW9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUKSkpIHsKLQkJCQlyZXR1cm4gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzcy5kZXN0cm95KCk7Ci0JCQl9Ci0JCQlpZiAoZXJyb3JUaHJlYWQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWVycm9yVGhyZWFkLmhhbHQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFN0b3Agd2FpdGluZyBhbmQgcmV0dXJuIGFueXdheS4KLQkJCQl9IGZpbmFsbHkgewotCQkJCQllcnJvclRocmVhZCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgewotCQkJCVNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkucmVsZWFzZVNlc3Npb24oc2Vzc2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KIAkvKioKIAkgKiBAcGFyYW0gb3BlcmF0aW9uCiAJICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0sIGUuZy4gUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FECkBAIC0zMTMsNyArMjkwLDcgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBdXRoQ2FjaGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVCA9IDEwMDsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBVVRIX0NBQ0hFX0VBR0VSX1RJTUVPVVQgPSA1MDA7CiAKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBJU09fRk9STUFUID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCiAJCQkJInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NYIik7IC8vJE5PTi1OTFMtMSQKQEAgLTMzMCw4ICszMDcsOSBAQAogCQkJdGhpcy5jYWNoZWRBY3Rpb24gPSBhY3Rpb247CiAJCQl0cnkgewogCQkJCWlmIChhY3Rpb24uZXhwaXJlc0luICE9IG51bGwgJiYgIWFjdGlvbi5leHBpcmVzSW4uaXNFbXB0eSgpKSB7Ci0JCQkJCXRoaXMudmFsaWRVbnRpbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCi0JCQkJCQkJKyBMb25nLnBhcnNlTG9uZyhhY3Rpb24uZXhwaXJlc0luKTsKKwkJCQkJdGhpcy52YWxpZFVudGlsID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisJCQkJCQkJKyBMb25nLnBhcnNlTG9uZyhhY3Rpb24uZXhwaXJlc0luKSkKKwkJCQkJCQktIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVDsKIAkJCQl9IGVsc2UgaWYgKGFjdGlvbi5leHBpcmVzQXQgIT0gbnVsbAogCQkJCQkJJiYgIWFjdGlvbi5leHBpcmVzQXQuaXNFbXB0eSgpKSB7CiAJCQkJCXRoaXMudmFsaWRVbnRpbCA9IElTT19GT1JNQVQucGFyc2UoYWN0aW9uLmV4cGlyZXNBdCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YQppbmRleCA0NTI5YTI1Li5iZGQxYjM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FiYnJldmlhdGVkTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhCkBAIC03OCw3ICs3OCw3IEBACiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGNvbnZlcnRlZCBpbnRvIGFuIEFiYnJldmlhdGVkT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSA8IDIKIAkJCQl8fCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA8IGlkLmxlbmd0aCgpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSAmbHQ7PSA2NCBjaGFyYWN0ZXJzLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpID4gQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChMZnNUZXh0LmdldCgpLmludmFsaWRMb25nSWQsIHN0cikpOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCXJldHVybiByIDw8ICgxNiAtIG4pICogNDsKIAl9CiAKLQlzdGF0aWMgbG9uZyBtYXNrKGZpbmFsIGludCBuaWJibGVzLCBmaW5hbCBsb25nIHdvcmQsIGZpbmFsIGxvbmcgdikgeworCXN0YXRpYyBsb25nIG1hc2soaW50IG5pYmJsZXMsIGxvbmcgd29yZCwgbG9uZyB2KSB7CiAJCWZpbmFsIGxvbmcgYiA9ICh3b3JkIC0gMSkgKiAxNjsKIAkJaWYgKGIgKyAxNiA8PSBuaWJibGVzKSB7CiAJCQkvLyBXZSBoYXZlIGFsbCBvZiB0aGUgYml0cyByZXF1aXJlZCBmb3IgdGhpcyB3b3JkLgpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQ2NCh3MSwgbWFzaygxLCBvdGhlci53MSkpOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIE5CLmRlY29kZUludDY0KGJzLCBwKSkpOwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGxvbmdbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIGJzW3BdKSk7CkBAIC0zNDAsNyArMzQwLDcgQEAKIAkJcmV0dXJuIChpbnQpICh3MSA+Pj4gNTYpOwogCX0KIAotCXByaXZhdGUgbG9uZyBtYXNrKGZpbmFsIGxvbmcgd29yZCwgZmluYWwgbG9uZyB2KSB7CisJcHJpdmF0ZSBsb25nIG1hc2sobG9uZyB3b3JkLCBsb25nIHYpIHsKIAkJcmV0dXJuIG1hc2sobmliYmxlcywgd29yZCwgdik7CiAJfQogCkBAIC0zNTIsNyArMzUyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQpIHsKIAkJCWZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGIgPSAoQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQpIG87CiAJCQlyZXR1cm4gbmliYmxlcyA9PSBiLm5pYmJsZXMgJiYgdzEgPT0gYi53MSAmJiB3MiA9PSBiLncyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FueUxvbmdPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YQppbmRleCA5NmQ2OTM4Li4wNzg4OTIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FueUxvbmdPYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEKQEAgLTE3MCw3ICsxNzAsNyBAQAogCSAqIENvbXBhcmUgdGhpcyBMb25nT2JqZWN0SWQgdG8gYW5vdGhlciBhbmQgb2J0YWluIGEgc29ydCBvcmRlcmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKIAkJaWYgKHRoaXMgPT0gb3RoZXIpCiAJCQlyZXR1cm4gMDsKIApAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGlzIG9iamVjdCBpcwogCSAqICAgICAgICAgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhieXRlW10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQ2NCh3MSwgTkIuZGVjb2RlSW50NjQoYnMsIHApKTsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8obG9uZ1tdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIGJzW3BdKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIExvbmdPYmplY3RJZCBiZWdpbnMgd2l0aCB0aGUgYWJicmV2aWF0aW9uOyBlbHNlCiAJICogICAgICAgICBmYWxzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKGZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGFiYnIpIHsKKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGFiYnIpIHsKIAkJcmV0dXJuIGFiYnIucHJlZml4Q29tcGFyZSh0aGlzKSA9PSAwOwogCX0KIApAQCAtMjc0LDEzICsyNzQsMTMgQEAKIAkgKiAgICAgICAgICAgIHRoZSBvdGhlciBpZCB0byBjb21wYXJlIHRvLiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgb25seSBpZiBib3RoIExvbmdPYmplY3RJZHMgaGF2ZSBpZGVudGljYWwgYml0cy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoZmluYWwgQW55TG9uZ09iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCQlyZXR1cm4gb3RoZXIgIT0gbnVsbCA/IGVxdWFscyh0aGlzLCBvdGhlcikgOiBmYWxzZTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFueUxvbmdPYmplY3RJZCkKIAkJCXJldHVybiBlcXVhbHMoKEFueUxvbmdPYmplY3RJZCkgbyk7CiAJCWVsc2UKQEAgLTI5Myw3ICsyOTMsNyBAQAogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGNvcHkgdG8uIE11c3QgYmUgaW4gYmlnIGVuZGlhbiBvcmRlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgQnl0ZUJ1ZmZlciB3KSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKEJ5dGVCdWZmZXIgdykgewogCQl3LnB1dExvbmcodzEpOwogCQl3LnB1dExvbmcodzIpOwogCQl3LnB1dExvbmcodzMpOwpAQCAtMzA4LDcgKzMwOCw3IEBACiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhieXRlW10gYiwgaW50IG8pIHsKIAkJTkIuZW5jb2RlSW50NjQoYiwgbywgdzEpOwogCQlOQi5lbmNvZGVJbnQ2NChiLCBvICsgOCwgdzIpOwogCQlOQi5lbmNvZGVJbnQ2NChiLCBvICsgMTYsIHczKTsKQEAgLTMyMyw3ICszMjMsNyBAQAogCSAqIEBwYXJhbSBvCiAJICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiBiIHRvIHdyaXRlIGF0LgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBsb25nW10gYiwgZmluYWwgaW50IG8pIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8obG9uZ1tdIGIsIGludCBvKSB7CiAJCWJbb10gPSB3MTsKIAkJYltvICsgMV0gPSB3MjsKIAkJYltvICsgMl0gPSB3MzsKQEAgLTMzOCwxNCArMzM4LDE0IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZVJhd0xvbmcodywgdzEpOwogCQl3cml0ZVJhd0xvbmcodywgdzIpOwogCQl3cml0ZVJhd0xvbmcodywgdzMpOwogCQl3cml0ZVJhd0xvbmcodywgdzQpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSYXdMb25nKGZpbmFsIE91dHB1dFN0cmVhbSB3LCBsb25nIHYpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUoKGludCkgKHYgPj4+IDU2KSk7CiAJCXcud3JpdGUoKGludCkgKHYgPj4+IDQ4KSk7CkBAIC0zNjUsNyArMzY1LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhCeXRlQXJyYXkoKSk7CiAJfQogCkBAIC00MDYsNyArNDA2LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gaGV4Ynl0ZSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhCeXRlKGZpbmFsIGJ5dGVbXSBkc3QsIGZpbmFsIGludCBwLCBsb25nIHcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoYnl0ZVtdIGRzdCwgaW50IHAsIGxvbmcgdykgewogCQlpbnQgbyA9IHAgKyAxNTsKIAkJd2hpbGUgKG8gPj0gcCAmJiB3ICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Ynl0ZVsoaW50KSAodyAmIDB4ZildOwpAQCAtNDI0LDcgKzQyNCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVRvKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3LndyaXRlKHRvSGV4Q2hhckFycmF5KCkpOwogCX0KIApAQCAtNDQwLDcgKzQ0MCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgY2hhcltdIHRtcCwgZmluYWwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVRvKGNoYXJbXSB0bXAsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0b0hleENoYXJBcnJheSh0bXApOwogCQl3LndyaXRlKHRtcCwgMCwgQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ1NSw3ICs0NTUsNyBAQAogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGFwcGVuZCBvbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBTdHJpbmdCdWlsZGVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcuYXBwZW5kKHRtcCwgMCwgQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ2Niw3ICs0NjYsNyBAQAogCQlyZXR1cm4gZHN0OwogCX0KIAotCXByaXZhdGUgdm9pZCB0b0hleENoYXJBcnJheShmaW5hbCBjaGFyW10gZHN0KSB7CisJcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGNoYXJbXSBkc3QpIHsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDAsIHcxKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDE2LCB3Mik7CiAJCWZvcm1hdEhleENoYXIoZHN0LCAzMiwgdzMpOwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGNoYXIgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoZmluYWwgY2hhcltdIGRzdCwgZmluYWwgaW50IHAsIGxvbmcgdykgeworCXN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoY2hhcltdIGRzdCwgaW50IHAsIGxvbmcgdykgewogCQlpbnQgbyA9IHAgKyAxNTsKIAkJd2hpbGUgKG8gPj0gcCAmJiB3ICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Y2hhclsoaW50KSAodyAmIDB4ZildOwpAQCAtNTI0LDcgKzUyNCw3IEBACiAJICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGVkIHN0cmluZy4KIAkgKiBAcmV0dXJuIFNIQS0yNTYgYWJicmV2aWF0aW9uLgogCSAqLwotCXB1YmxpYyBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBhYmJyZXZpYXRlKGZpbmFsIGludCBsZW4pIHsKKwlwdWJsaWMgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicmV2aWF0ZShpbnQgbGVuKSB7CiAJCWZpbmFsIGxvbmcgYSA9IEFiYnJldmlhdGVkTG9uZ09iamVjdElkLm1hc2sobGVuLCAxLCB3MSk7CiAJCWZpbmFsIGxvbmcgYiA9IEFiYnJldmlhdGVkTG9uZ09iamVjdElkLm1hc2sobGVuLCAyLCB3Mik7CiAJCWZpbmFsIGxvbmcgYyA9IEFiYnJldmlhdGVkTG9uZ09iamVjdElkLm1hc2sobGVuLCAzLCB3Myk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xvbmdPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YQppbmRleCBlYzFlMTc5Li44MTU5NTc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xvbmdPYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEKQEAgLTkwLDcgKzkwLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gTG9uZ09iamVjdElkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKGZpbmFsIFN0cmluZyBpZCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKFN0cmluZyBpZCkgewogCQlpZiAoaWQubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXRyeSB7CkBAIC0xMTAsNyArMTEwLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBpZCB0byBjb252ZXJ0LiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRoZSBoZXggc3RyaW5nIGNvbnZlcnNpb24gb2YgdGhpcyBpZCdzIGNvbnRlbnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoZmluYWwgTG9uZ09iamVjdElkIGkpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhMb25nT2JqZWN0SWQgaSkgewogCQlyZXR1cm4gaSAhPSBudWxsID8gaS5uYW1lKCkgOiBaRVJPSURfU1RSOwogCX0KIApAQCAtMTczLDcgKzE3Myw3IEBACiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgYnl0ZSBhcnJheS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhieXRlW10gYnMpIHsKIAkJcmV0dXJuIGZyb21SYXcoYnMsIDApOwogCX0KIApAQCAtMTg3LDcgKzE4Nyw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlmaW5hbCBsb25nIGEgPSBOQi5kZWNvZGVJbnQ2NChicywgcCk7CiAJCWZpbmFsIGxvbmcgYiA9IE5CLmRlY29kZUludDY0KGJzLCBwICsgOCk7CiAJCWZpbmFsIGxvbmcgYyA9IE5CLmRlY29kZUludDY0KGJzLCBwICsgMTYpOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgbG9uZyBhcnJheS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoZmluYWwgbG9uZ1tdIGlzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhsb25nW10gaXMpIHsKIAkJcmV0dXJuIGZyb21SYXcoaXMsIDApOwogCX0KIApAQCAtMjE3LDcgKzIxNyw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBsb25nIG9mIGRhdGEgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoZmluYWwgbG9uZ1tdIGlzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcobG9uZ1tdIGlzLCBpbnQgcCkgewogCQlyZXR1cm4gbmV3IExvbmdPYmplY3RJZChpc1twXSwgaXNbcCArIDFdLCBpc1twICsgMl0sIGlzW3AgKyAzXSk7CiAJfQogCkBAIC0yMzEsNyArMjMxLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTI0MiwxNCArMjQyLDE0IEBACiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA2NCBjaGFyYWN0ZXJzIGxvbmcuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgc3RhdGljIExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKIAkJaWYgKHN0ci5sZW5ndGgoKSAhPSBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbnZhbGlkTG9uZ09iamVjdElkRXhjZXB0aW9uKHN0cik7CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpLAogCQkJCTApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGZpbmFsIGJ5dGVbXSBicywgaW50IHApIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbUhleFN0cmluZyhieXRlW10gYnMsIGludCBwKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBsb25nIGEgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHApOwogCQkJZmluYWwgbG9uZyBiID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDY0KGJzLCBwICsgMTYpOwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJICogQHBhcmFtIHNyYwogCSAqICAgICAgICAgICAgYW5vdGhlciBhbHJlYWR5IHBhcnNlZCBMb25nT2JqZWN0SWQgdG8gY29weSB0aGUgdmFsdWUgb3V0IG9mLgogCSAqLwotCXByb3RlY3RlZCBMb25nT2JqZWN0SWQoZmluYWwgQW55TG9uZ09iamVjdElkIHNyYykgeworCXByb3RlY3RlZCBMb25nT2JqZWN0SWQoQW55TG9uZ09iamVjdElkIHNyYykgewogCQl3MSA9IHNyYy53MTsKIAkJdzIgPSBzcmMudzI7CiAJCXczID0gc3JjLnczOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL011dGFibGVMb25nT2JqZWN0SWQuamF2YQppbmRleCA3YjBjNDk0Li4zZDYyNDkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL011dGFibGVMb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL011dGFibGVMb25nT2JqZWN0SWQuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJICogICAgICAgICAgICB0aGUgcmF3IGJ5dGUgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgMzIgYnl0ZXMgbXVzdCBiZQogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJdzEgPSBOQi5kZWNvZGVJbnQ2NChicywgcCk7CiAJCXcyID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyA4KTsKIAkJdzMgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDE2KTsKQEAgLTE5NCw3ICsxOTQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJhdyBsb25nIGJ1ZmZlciB0byByZWFkIGZyb20uIEF0IGxlYXN0IDQgbG9uZ3MgbXVzdCBiZQogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGxvbmdzIGFycmF5LgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgbG9uZ1tdIGxvbmdzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhsb25nW10gbG9uZ3MpIHsKIAkJZnJvbVJhdyhsb25ncywgMCk7CiAJfQogCkBAIC0yMDcsNyArMjA3LDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgaW50ZWdlciBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBsb25nW10gbG9uZ3MsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhsb25nW10gbG9uZ3MsIGludCBwKSB7CiAJCXcxID0gbG9uZ3NbcF07CiAJCXcyID0gbG9uZ3NbcCArIDFdOwogCQl3MyA9IGxvbmdzW3AgKyAyXTsKQEAgLTIyMyw3ICsyMjMsNyBAQAogCSAqIEBwYXJhbSBvZmZzZXQKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgeworCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogCQlmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTIzMywxNCArMjMzLDE0IEBACiAJICogQHBhcmFtIHN0cgogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3QgYmUgNjQgY2hhcmFjdGVycyBsb25nLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGZzVGV4dC5nZXQoKS5pbnZhbGlkTG9uZ0lkLCBzdHIpKTsKIAkJZnJvbUhleFN0cmluZyhvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuZW5jb2RlQVNDSUkoc3RyKSwgMCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCXcxID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDY0KGJzLCBwKTsKIAkJCXcyID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDY0KGJzLCBwICsgMTYpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggMzY5ZTMwNy4uMTY5ZWY3ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCA1YjUyZjMzLi5kMDk4NTJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0IgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuMy5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sCmluZGV4IDBkNTAwZTUuLmE5YTU4YWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IGI5YjVjY2UuLjQ4MGU5YzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzUsMTI1ICszNSwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggNTE2ZWFlNy4uNDg1ZmQ2YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjMucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbAppbmRleCBhNzBhOWYzLi5kMTQ4YWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCA0NDUwYmJiLi4yOTFiMjllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM2LDEyNSArMzYsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGEwNWZjYmIuLjY1NTEzMzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS4zLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwKaW5kZXggZjFmMDMyMy4uZjY1MzI2ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCBjNWJmZmE4Li44Mzg3NTg1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzUsMTI1ICszNSwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgogIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBkNWVmMjk0Li43MmUxNWRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQubGZzIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuMy5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCmluZGV4IDA2MTIwOWIuLjM1YTRmZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCA4OTkyYWQzLi5lZjkwMzFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzUsMTI1ICszNSwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCAwNDIwOTk3Li4xOGE3ZDFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQucGdtIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuMy5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0zMSw4ICszMSw4IEBACiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjQuMTEuMyIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjQuMTEuMyIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNS4wLjQiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQubGZzIiB2ZXJzaW9uPSI1LjAuNCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KICAgIDwvcmVxdWlyZXM+CiAKICAgIDxwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKaW5kZXggZGQ3ZDZhNC4uNzNhN2QzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggMDEyYzIxNy4uNzM3MDFiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMTYsNyArMTYsNyBAQAogIyBkZXNjcmlwdGlvbiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIERlc2NyaXB0aW9uIgogZGVzY3JpcHRpb249XAogRG8gbm90IGluc3RhbGwgaW4geW91ciBJREU6IHRoaXMgZmVhdHVyZSBpcyBtZWFudCB0byBwcm92aXNpb24gVGFyZ2V0IFBsYXRmb3Jtcy5cblwKLVNvdXJjZSBjb2RlIGZvciB0aGUgc3VwcG9ydCBmb3IgUERFJ3MgSlVuaXQgcnVubmVyIGZvciBhIFRhcmdldCBQbGF0Zm9ybVxuXAorU291cmNlIGNvZGUgZm9yIHRoZSBzdXBwb3J0IGZvciBQREUncyBKVW5pdCBydW5uZXIgZm9yIGEgVGFyZ2V0IFBsYXRmb3JtXG4KICMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGRlc2NyaXB0aW9uIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCkBAIC0zNiwxMjUgKzM2LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggMjFlZTViYi4uODEwZDAxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjMucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbAppbmRleCAxZTc4M2I2Li44OGI4Y2U5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbAppbmRleCA4ZWYwZmMzLi5jOGMzYjUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDk4NDNlMjMuLmMwNGRjNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNiwxMjUgKzM2LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDFkYWMyMjAuLjEyZDZmZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5zb3VyY2UiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS4zLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggNzcwYWRmOC4uN2M4MzI0MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDUwODFhOWUuLmZjN2RmYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDQgKzIsNCBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6IEpHaXQgVGFyZ2V0IFBsYXRmb3JtIEJ1bmRsZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC50YXJnZXQKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNS50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNS50YXJnZXQKaW5kZXggMGMxZDViYi4uZGZiNWE4ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vbWJhcmJlcm8vZnIub2Jlby5yZWxlbmcudGFyZ2V0cGxhdGZvcm0gLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC41IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3NjM0NyI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC41IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3OTI1NCI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuY2xpZW50IiB2ZXJzaW9uPSI5LjQuOC52MjAxNzExMjEiLz4KQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMS4xLjAudjIwMDkwNTAxMDcxMDAwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjYudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjYudGFyZ2V0CmluZGV4IGUwNWM0MTAuLmRiZmQ2OTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuNiIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzMzUiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuNiIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyNDEiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC43LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC43LnRhcmdldAppbmRleCAyMGIwYTI5Li5iZTc3MTlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjciIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzE0Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjciIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjIxIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuOC50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuOC50YXJnZXQKaW5kZXggYjg0ZmMyMC4uM2RlMTcyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vbWJhcmJlcm8vZnIub2Jlby5yZWxlbmcudGFyZ2V0cGxhdGZvcm0gLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC44IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3NjMwMSI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC44IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3OTIwNSI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuY2xpZW50IiB2ZXJzaW9uPSI5LjQuOC52MjAxNzExMjEiLz4KQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMS4xLjAudjIwMDkwNTAxMDcxMDAwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAxODA2MDYxNDUxMjQtUGhvdG9uLnRwZAppbmRleCBmNGVjNTBkLi5lY2VjNDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAxODA2MDYxNDUxMjQtUGhvdG9uLnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAxODA2MDYxNDUxMjQtUGhvdG9uLnRwZApAQCAtMTgsNiArMTgsNyBAQAogCW9yZy5hcGFjaGUubG9nNGouc291cmNlIFsxLjIuMTUudjIwMTAxMjA3MDgxNSwxLjIuMTUudjIwMTAxMjA3MDgxNV0KIAlvcmcua29oc3VrZS5hcmdzNGogWzIuMzMuMC52MjAxNjAzMjMtMjIxOCwyLjMzLjAudjIwMTYwMzIzLTIyMThdCiAJb3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KKwlvcmcuaGFtY3Jlc3QgWzEuMS4wLnYyMDA5MDUwMTA3MTAwMCwxLjEuMC52MjAwOTA1MDEwNzEwMDBdCiAJb3JnLmhhbWNyZXN0LmNvcmUgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQogCW9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSBbMS4zLjAudjIwMTgwNDIwLTE1MTksMS4zLjAudjIwMTgwNDIwLTE1MTldCiAJb3JnLmhhbWNyZXN0LmxpYnJhcnkgWzEuMy4wLnYyMDE4MDUyNC0yMjQ2LDEuMy4wLnYyMDE4MDUyNC0yMjQ2XQpAQCAtNDQsNCArNDUsNCBAQAogCW9yZy5zbGY0ai5pbXBsLmxvZzRqMTIuc291cmNlIFsxLjcuMi52MjAxMzExMDUtMjIwMCwxLjcuMi52MjAxMzExMDUtMjIwMF0KIAljb20uamNyYWZ0Lmp6bGliIFsxLjEuMS52MjAxMjA1MTAyMzA1LDEuMS4xLnYyMDEyMDUxMDIzMDVdCiAJY29tLmpjcmFmdC5qemxpYi5zb3VyY2UgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbAppbmRleCAxYmY5ZjA4Li4zYzYwYTgzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC50YXJnZXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbAppbmRleCBmYjBiMWQ3Li4zY2IyMWMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKQEAgLTUzLDcgKzUzLDcgQEAKIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KIAogICA8bmFtZT5KR2l0IFR5Y2hvIFBhcmVudDwvbmFtZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGFjYTBkMzMuLjM5OTEwY2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywyOCArMywyOCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNC4xMS4zIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydWxlczt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCmluZGV4IDA4YjYzNzAuLjMwYzMyZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ0xJUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggMGVlYWJhYi4uMGQxODk0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ0xJUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ0xJUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKQEAgLTEyMiwxNyArMTIyLDE3IEBACiAJCXJldHVybiBKR2l0VGVzdFV0aWwud3JpdGVMaW5rKGRiLCBsaW5rLCB0YXJnZXQpOwogCX0KIAotCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcm90ZWN0ZWQgRmlsZSB3cml0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLndyaXRlVHJhc2hGaWxlKGRiLCBuYW1lLCBkYXRhKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoZmluYWwgRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwucmVhZChmaWxlKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlKR2l0VGVzdFV0aWwuZGVsZXRlVHJhc2hGaWxlKGRiLCBuYW1lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NMSUdpdENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NMSUdpdENvbW1hbmQuamF2YQppbmRleCA2OWViMTk4Li40NGFkNzlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhCkBAIC0xNTcsNyArMTU3LDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIGluaXQoZmluYWwgVGV4dEJ1aWx0aW4gY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgaW5pdChUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNtZC5vdXRzID0gcmVzdWx0Lm91dDsKIAkJY21kLmVycnMgPSByZXN1bHQuZXJyOwogCQlzdXBlci5pbml0KGNtZCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BcmNoaXZlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vQXJjaGl2ZVRlc3QuamF2YQppbmRleCBlNWM4NWViLi5hZmViNWVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BcmNoaXZlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwpAQCAtNjEyLDcgKzYxMiw3IEBACiAKIAlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIHJlYWRGcm9tUHJvY2VzcyhQcm9jZXNzIHByb2MpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgQ0hBUlNFVCkpOwogCX0KIAogCXByaXZhdGUgdm9pZCBncmVwRm9yRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlLCBTdHJpbmcuLi4gY21kbGluZSkKQEAgLTcwMCw3ICs3MDAsNyBAQAogCQlyZXR1cm4gbC50b0FycmF5KG5ldyBTdHJpbmdbbC5zaXplKCldKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGdXR1cmU8T2JqZWN0PiB3cml0ZUFzeW5jKGZpbmFsIE91dHB1dFN0cmVhbSBzdHJlYW0sIGZpbmFsIGJ5dGVbXSBkYXRhKSB7CisJcHJpdmF0ZSBzdGF0aWMgRnV0dXJlPE9iamVjdD4gd3JpdGVBc3luYyhPdXRwdXRTdHJlYW0gc3RyZWFtLCBieXRlW10gZGF0YSkgewogCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKIAogCQlyZXR1cm4gZXhlY3V0b3Iuc3VibWl0KG5ldyBDYWxsYWJsZTxPYmplY3Q+KCkgewpAQCAtNzUwLDcgKzc1MCw3IEBACiAJCQkvLyBmb3VuZCEKIAkJCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgVVRGXzgpKTsKKwkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBDSEFSU0VUKSk7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKQogCQkJCWwuYWRkKGxpbmUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YQppbmRleCA5Njg1ZDQ1Li5kZGUxYTMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YQpAQCAtOTIsNiArOTIsMTkgQEAKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZXRjaEZvcmNlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHJlc3VsdCA9IGV4ZWN1dGUoCisJCQkJImdpdCBmZXRjaCB0ZXN0IHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIik7CisJCWFzc2VydEVxdWFscygiICogW25ldyBicmFuY2hdICAgICAgbWFzdGVyICAgICAtPiBvcmlnaW4vbWFzdGVyIiwKKwkJCQlyZXN1bHRbMV0pOworCQlhc3NlcnRFcXVhbHMoIiAqIFtuZXcgdGFnXSAgICAgICAgIHRhZyAgICAgICAgLT4gdGFnIiwgcmVzdWx0WzJdKTsKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldEFtZW5kKHRydWUpLnNldE1lc3NhZ2UoImFtZW5kZWQiKS5jYWxsKCk7CisJCXJlc3VsdCA9IGV4ZWN1dGUoCisJCQkJImdpdCBmZXRjaCAtZiB0ZXN0IHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIik7CisJCWFzc2VydEVxdWFscygiIiwgcmVzdWx0WzBdKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGZXRjaE5vVGFncygpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmdbXSByZXN1bHQgPSBleGVjdXRlKCJnaXQgZmV0Y2ggLS1uby10YWdzIHRlc3QgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKTsKIAkJYXNzZXJ0RXF1YWxzKCIgKiBbbmV3IGJyYW5jaF0gICAgICBtYXN0ZXIgICAgIC0+IG9yaWdpbi9tYXN0ZXIiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Qcm94eUNvbmZpZ1Rlc3QuamF2YQppbmRleCAwNmU3YTFkLi40MGEyMjNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Qcm94eUNvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Qcm94eUNvbmZpZ1Rlc3QuamF2YQpAQCAtNDcsNiArNDcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMjAzLDcgKzIwNCw3IEBACiAJCQl3aGlsZSAoKGxlbmd0aCA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKIAkJCQlyZXN1bHQud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOwogCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygiVVRGLTgiKTsKKwkJCXJldHVybiByZXN1bHQudG9TdHJpbmcoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORyk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UYWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UYWdUZXN0LmphdmEKaW5kZXggMDMzOTFhMC4uZDM4YTQxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGFnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YQpAQCAtNDMsMTAgKzQzLDExIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5DTElSZXBvc2l0b3J5VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTc1LDEzICs3Niw5IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0VGFnRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWdpdC50YWcoKS5zZXROYW1lKCJ0ZXN0IikuY2FsbCgpOwotCi0JCVJlZiByZWYgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldFRhZ3MoKS5nZXQoInRlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWZzL3RhZ3MvdGVzdCIsIHJlZi5nZXROYW1lKCkpOwotCisJCWFzc2VydE5vdE51bGwoZ2l0LmdldFJlcG9zaXRvcnkoKS5leGFjdFJlZigicmVmcy90YWdzL3Rlc3QiKSk7CiAJCWFzc2VydEVxdWFscygiIiwgZXhlY3V0ZVVuY2hlY2tlZCgiZ2l0IHRhZyAtZCB0ZXN0IilbMF0pOwotCQlSZWYgZGVsZXRlZFJlZiA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0VGFncygpLmdldCgidGVzdCIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVsZXRlZFJlZik7CisJCWFzc2VydE51bGwoZ2l0LmdldFJlcG9zaXRvcnkoKS5leGFjdFJlZigicmVmcy90YWdzL3Rlc3QiKSk7CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL0JVSUxEIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKaW5kZXggMDc5MjI2OC4uZGRjODRiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKQEAgLTI1LDYgKzI1LDEyIEBACiAgICAgXSwKICkKIAoramF2YV9iaW5hcnkoCisgICAgbmFtZSA9ICJqZ2l0IiwKKyAgICBtYWluX2NsYXNzID0gIm9yZy5lY2xpcHNlLmpnaXQucGdtLk1haW4iLAorICAgIHJ1bnRpbWVfZGVwcyA9IFsiOnBnbSJdLAorKQorCiBqYXZhX2ltcG9ydCgKICAgICBuYW1lID0gInNlcnZpY2VzIiwKICAgICBqYXJzID0gWyI6c2VydmljZXNfamFyIl0sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDE3ZDNjNDAuLmY4YWEwOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20KLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpAQCAtMjgsNDkgKzI4LDQ5IEBACiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5sb2c7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwua2V0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcua29oc3VrZS5hcmdzNGo7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGk7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjQuMTEuMyI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LApAQCAtODEsMTEgKzgxLDExIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgamF2YXguc3dpbmcsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7dmVyc2lvbj0iNC4xMS4zIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS4zIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249IjQuMTEuMyI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcua29oc3VrZS5hcmdzNGouc3BpLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGZmNTllZGIuLjFkNDU3NWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20gLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI0LjExLjMucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKaW5kZXggMjgwYTVjNS4uZGI2NzQ1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKaW5kZXggY2IwZWExYi4uZTkzNzA5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCkBAIC0zNDMsNiArMzQzLDcgQEAKIHVzYWdlX2ZvcmNlQ2hlY2tvdXQ9d2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXMsIHByb2NlZWQgZXZlbiBpZiB0aGUgaW5kZXggb3IgdGhlIHdvcmtpbmcgdHJlZSBkaWZmZXJzIGZyb20gSEVBRAogdXNhZ2VfZm9yY2VDbGVhbj1yZXF1aXJlZCB0byBkZWxldGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKIHVzYWdlX2ZvcmNlQ3JlYXRlQnJhbmNoRXZlbkV4aXN0cz1mb3JjZSBjcmVhdGUgYnJhbmNoIGV2ZW4gZXhpc3RzCit1c2FnZV9mb3JjZWRGZXRjaD1mb3JjZSByZWYgdXBkYXRlIGZldGNoIG9wdGlvbgogdXNhZ2VfZm9yY2VSZXBsYWNpbmdBbkV4aXN0aW5nVGFnPWZvcmNlIHJlcGxhY2luZyBhbiBleGlzdGluZyB0YWcKIHVzYWdlX2dldEFuZFNldE9wdGlvbnM9R2V0IGFuZCBzZXQgcmVwb3NpdG9yeSBvciBnbG9iYWwgb3B0aW9ucwogdXNhZ2VfZ3JvdXBzPVJlc3RyaWN0IG1hbmlmZXN0IHByb2plY3RzIHRvIG9uZXMgd2l0aCBzcGVjaWZpZWQgZ3JvdXAocyksIHVzZSAiLSIgZm9yIGV4Y2x1ZGluZyBbZGVmYXVsdHxhbGx8RzEsRzIsRzN8RzQsLUc1LC1HNl0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BYnN0cmFjdEZldGNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKaW5kZXggZjA3NTRiMS4uOTIyM2UwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKQEAgLTc0LDEwICs3NCwxMCBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIGFueS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93RmV0Y2hSZXN1bHQoZmluYWwgRmV0Y2hSZXN1bHQgcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93RmV0Y2hSZXN1bHQoRmV0Y2hSZXN1bHQgcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCkpIHsKIAkJCWJvb2xlYW4gc2hvd25VUkkgPSBmYWxzZTsKLQkJCWZvciAoZmluYWwgVHJhY2tpbmdSZWZVcGRhdGUgdSA6IHIuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkpIHsKKwkJCWZvciAoVHJhY2tpbmdSZWZVcGRhdGUgdSA6IHIuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkpIHsKIAkJCQlpZiAoIXZlcmJvc2UgJiYgdS5nZXRSZXN1bHQoKSA9PSBSZWZVcGRhdGUuUmVzdWx0Lk5PX0NIQU5HRSkKIAkJCQkJY29udGludWU7CiAKQEAgLTE4MSw3ICsxODEsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgY2hhciBzaG9ydFR5cGVPZihmaW5hbCBSZWZVcGRhdGUuUmVzdWx0IHIpIHsKKwlwcml2YXRlIHN0YXRpYyBjaGFyIHNob3J0VHlwZU9mKFJlZlVwZGF0ZS5SZXN1bHQgcikgewogCQlpZiAociA9PSBSZWZVcGRhdGUuUmVzdWx0LkxPQ0tfRkFJTFVSRSkKIAkJCXJldHVybiAnISc7CiAJCWlmIChyID09IFJlZlVwZGF0ZS5SZXN1bHQuSU9fRkFJTFVSRSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BbWF6b25TM0NsaWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEKaW5kZXggY2NlODg5Yi4uZjRmOGQ4ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQkJfQogCiAJCX0gZWxzZSBpZiAoImxzIi5lcXVhbHMob3ApIHx8ICJsaXN0Ii5lcXVhbHMob3ApKSB7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmb3IgKGZpbmFsIFN0cmluZyBrIDogczMubGlzdChidWNrZXQsIGtleSkpCisJCQlmb3IgKFN0cmluZyBrIDogczMubGlzdChidWNrZXQsIGtleSkpCiAJCQkJb3V0dy5wcmludGxuKGspOwogCiAJCX0gZWxzZSBpZiAoInJtIi5lcXVhbHMob3ApIHx8ICJkZWxldGUiLmVxdWFscyhvcCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEKaW5kZXggZTY2ODVjMi4uYTg4MzU0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JyYW5jaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YQpAQCAtMjkyLDcgKzI5Miw3IEBACiAJCQkJYWRkUmVmcyhyZWZzLCBDb25zdGFudHMuUl9SRU1PVEVTKTsKIAogCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRiLm5ld09iamVjdFJlYWRlcigpKSB7Ci0JCQkJCWZvciAoZmluYWwgRW50cnk8U3RyaW5nLCBSZWY+IGUgOiBwcmludFJlZnMuZW50cnlTZXQoKSkgeworCQkJCQlmb3IgKEVudHJ5PFN0cmluZywgUmVmPiBlIDogcHJpbnRSZWZzLmVudHJ5U2V0KCkpIHsKIAkJCQkJCWZpbmFsIFJlZiByZWYgPSBlLmdldFZhbHVlKCk7CiAJCQkJCQlwcmludEhlYWQocmVhZGVyLCBlLmdldEtleSgpLAogCQkJCQkJCQljdXJyZW50LmVxdWFscyhyZWYuZ2V0TmFtZSgpKSwgcmVmKTsKQEAgLTMwMiwxNSArMzAyLDE1IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkUmVmcyhmaW5hbCBDb2xsZWN0aW9uPFJlZj4gcmVmcywgZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlmb3IgKGZpbmFsIFJlZiByZWYgOiBSZWZDb21wYXJhdG9yLnNvcnQocmVmcykpIHsKKwlwcml2YXRlIHZvaWQgYWRkUmVmcyhDb2xsZWN0aW9uPFJlZj4gcmVmcywgU3RyaW5nIHByZWZpeCkgeworCQlmb3IgKFJlZiByZWYgOiBSZWZDb21wYXJhdG9yLnNvcnQocmVmcykpIHsKIAkJCWZpbmFsIFN0cmluZyBuYW1lID0gcmVmLmdldE5hbWUoKTsKIAkJCWlmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkKIAkJCQlhZGRSZWYobmFtZS5zdWJzdHJpbmcobmFtZS5pbmRleE9mKCcvJywgNSkgKyAxKSwgcmVmKTsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRSZWYoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJlZiByZWYpIHsKKwlwcml2YXRlIHZvaWQgYWRkUmVmKFN0cmluZyBuYW1lLCBSZWYgcmVmKSB7CiAJCXByaW50UmVmcy5wdXQobmFtZSwgcmVmKTsKIAkJbWF4TmFtZUxlbmd0aCA9IE1hdGgubWF4KG1heE5hbWVMZW5ndGgsIG5hbWUubGVuZ3RoKCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRDYXRhbG9nLmphdmEKaW5kZXggODFhZWVmOC4uNTc1NGQ3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRDYXRhbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRDYXRhbG9nLmphdmEKQEAgLTQzLDExICs0MywxMCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtODgsNyArODcsNyBAQAogCSAqICAgICAgICAgICAgd2FzIGRlcml2ZWQgZnJvbSB0aGUgRGFzaExvd2VyQ2FzZUZvcm0gY2xhc3MgbmFtZS4KIAkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIGluc3RhbmNlOyBudWxsIGlmIG5vIGNvbW1hbmQgZXhpc3RzIGJ5IHRoYXQgbmFtZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1hbmRSZWYgZ2V0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIHN0YXRpYyBDb21tYW5kUmVmIGdldChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gSU5TVEFOQ0UuY29tbWFuZHMuZ2V0KG5hbWUpOwogCX0KIApAQCAtMTA4LDE3ICsxMDcsMTcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIENvbW1hbmRSZWZbXSBjb21tb24oKSB7CiAJCWZpbmFsIEFycmF5TGlzdDxDb21tYW5kUmVmPiBjb21tb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBJTlNUQU5DRS5jb21tYW5kcy52YWx1ZXMoKSkKKwkJZm9yIChDb21tYW5kUmVmIGMgOiBJTlNUQU5DRS5jb21tYW5kcy52YWx1ZXMoKSkKIAkJCWlmIChjLmlzQ29tbW9uKCkpCiAJCQkJY29tbW9uLmFkZChjKTsKIAkJcmV0dXJuIHRvU29ydGVkQXJyYXkoY29tbW9uKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb21tYW5kUmVmW10gdG9Tb3J0ZWRBcnJheShmaW5hbCBDb2xsZWN0aW9uPENvbW1hbmRSZWY+IGMpIHsKKwlwcml2YXRlIHN0YXRpYyBDb21tYW5kUmVmW10gdG9Tb3J0ZWRBcnJheShDb2xsZWN0aW9uPENvbW1hbmRSZWY+IGMpIHsKIAkJZmluYWwgQ29tbWFuZFJlZltdIHIgPSBjLnRvQXJyYXkobmV3IENvbW1hbmRSZWZbYy5zaXplKCldKTsKIAkJQXJyYXlzLnNvcnQociwgbmV3IENvbXBhcmF0b3I8Q29tbWFuZFJlZj4oKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBDb21tYW5kUmVmIG8xLCBmaW5hbCBDb21tYW5kUmVmIG8yKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoQ29tbWFuZFJlZiBvMSwgQ29tbWFuZFJlZiBvMikgewogCQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CiAJCQl9CiAJCX0pOwpAQCAtMTQ3LDM2ICsxNDYsMjAgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzY2FuKGZpbmFsIFVSTCBjVXJsKSB7Ci0JCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGNJbjsKLQkJdHJ5IHsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGluID0gY1VybC5vcGVuU3RyZWFtKCk7Ci0JCQljSW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCS8vIElmIHdlIGNhbm5vdCByZWFkIGZyb20gdGhlIHNlcnZpY2UgbGlzdCwgZ28gdG8gdGhlIG5leHQuCi0JCQkvLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKKwlwcml2YXRlIHZvaWQgc2NhbihVUkwgY1VybCkgeworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGNJbiA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoY1VybC5vcGVuU3RyZWFtKCksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBjSW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWlmIChsaW5lLmxlbmd0aCgpID4gMCAmJiAhbGluZS5zdGFydHNXaXRoKCIjIikpIC8vJE5PTi1OTFMtMSQKIAkJCQkJbG9hZChsaW5lKTsKIAkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0JCQkvLyBJZiB3ZSBmYWlsZWQgZHVyaW5nIGEgcmVhZCwgaWdub3JlIHRoZSBlcnJvci4KLQkJCS8vCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWNJbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSB0aGUgY2xvc2UgZXJyb3I7IHdlIGFyZSBvbmx5IHJlYWRpbmcuCi0JCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZSBlcnJvcnMKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBsb2FkKGZpbmFsIFN0cmluZyBjbikgeworCXByaXZhdGUgdm9pZCBsb2FkKFN0cmluZyBjbikgewogCQlmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6OwogCQl0cnkgewogCQkJY2xhenogPSBDbGFzcy5mb3JOYW1lKGNuLCBmYWxzZSwgbGRyKS5hc1N1YmNsYXNzKFRleHRCdWlsdGluLmNsYXNzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kUmVmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZFJlZi5qYXZhCmluZGV4IDJjOWJjMGQuLjE3NzNkZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kUmVmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YQpAQCAtNjYsMjkgKzY2LDI5IEBACiAKIAlib29sZWFuIGNvbW1vbjsKIAotCUNvbW1hbmRSZWYoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eikgeworCUNvbW1hbmRSZWYoQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eikgewogCQl0aGlzKGNsYXp6LCBndWVzc05hbWUoY2xhenopKTsKIAl9CiAKLQlDb21tYW5kUmVmKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIGZpbmFsIENvbW1hbmQgY21kKSB7CisJQ29tbWFuZFJlZihDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6LCBDb21tYW5kIGNtZCkgewogCQl0aGlzKGNsYXp6LCBjbWQubmFtZSgpLmxlbmd0aCgpID4gMCA/IGNtZC5uYW1lKCkgOiBndWVzc05hbWUoY2xhenopKTsKIAkJdXNhZ2UgPSBjbWQudXNhZ2UoKTsKIAkJY29tbW9uID0gY21kLmNvbW1vbigpOwogCX0KIAotCXByaXZhdGUgQ29tbWFuZFJlZihmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6LCBmaW5hbCBTdHJpbmcgY24pIHsKKwlwcml2YXRlIENvbW1hbmRSZWYoQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgU3RyaW5nIGNuKSB7CiAJCWltcGwgPSBjbGF6ejsKIAkJbmFtZSA9IGNuOwogCQl1c2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGd1ZXNzTmFtZShmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6KSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGd1ZXNzTmFtZShDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6KSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWlmIChjbGF6ei5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWcuIikpIC8vJE5PTi1OTFMtMSQKIAkJCXMuYXBwZW5kKCJkZWJ1Zy0iKTsgLy8kTk9OLU5MUy0xJAogCiAJCWJvb2xlYW4gbGFzdFdhc0Rhc2ggPSB0cnVlOwotCQlmb3IgKGZpbmFsIGNoYXIgYyA6IGNsYXp6LmdldFNpbXBsZU5hbWUoKS50b0NoYXJBcnJheSgpKSB7CisJCWZvciAoY2hhciBjIDogY2xhenouZ2V0U2ltcGxlTmFtZSgpLnRvQ2hhckFycmF5KCkpIHsKIAkJCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYykpIHsKIAkJCQlpZiAoIWxhc3RXYXNEYXNoKQogCQkJCQlzLmFwcGVuZCgnLScpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RhZW1vbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RhZW1vbi5qYXZhCmluZGV4IGQwYWRhNjcuLjMxOWI1ZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQkJcGFja0NvbmZpZy5zZXRFeGVjdXRvcihFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKHRocmVhZHMpKTsKIAogCQlmaW5hbCBGaWxlUmVzb2x2ZXI8RGFlbW9uQ2xpZW50PiByZXNvbHZlciA9IG5ldyBGaWxlUmVzb2x2ZXI8PigpOwotCQlmb3IgKGZpbmFsIEZpbGUgZiA6IGRpcmVjdG9yeSkgeworCQlmb3IgKEZpbGUgZiA6IGRpcmVjdG9yeSkgewogCQkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuZXhwb3J0aW5nLCBmLmdldEFic29sdXRlUGF0aCgpKSk7CiAJCQlyZXNvbHZlci5leHBvcnREaXJlY3RvcnkoZik7CiAJCX0KQEAgLTE1NywxNCArMTU3LDE0IEBACiAJCWlmICgwIDw9IHRpbWVvdXQpCiAJCQlkLnNldFRpbWVvdXQodGltZW91dCk7CiAKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGVuYWJsZSkKKwkJZm9yIChTdHJpbmcgbiA6IGVuYWJsZSkKIAkJCXNlcnZpY2UoZCwgbikuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGRpc2FibGUpCisJCWZvciAoU3RyaW5nIG4gOiBkaXNhYmxlKQogCQkJc2VydmljZShkLCBuKS5zZXRFbmFibGVkKGZhbHNlKTsKIAotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogY2FuT3ZlcnJpZGUpCisJCWZvciAoU3RyaW5nIG4gOiBjYW5PdmVycmlkZSkKIAkJCXNlcnZpY2UoZCwgbikuc2V0T3ZlcnJpZGFibGUodHJ1ZSk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIG4gOiBmb3JiaWRPdmVycmlkZSkKKwkJZm9yIChTdHJpbmcgbiA6IGZvcmJpZE92ZXJyaWRlKQogCQkJc2VydmljZShkLCBuKS5zZXRPdmVycmlkYWJsZShmYWxzZSk7CiAJCWlmIChrZXRjaFNlcnZlclR5cGUgPT0gS2V0Y2hTZXJ2ZXJUeXBlLkxFQURFUikgewogCQkJc3RhcnRLZXRjaExlYWRlcihkKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YQppbmRleCA1OWRlODBjLi40ZWM1ZjA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGllLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyB0byB0aGUgZW5kLXVzZXIuCiAJICovCi0JcHVibGljIERpZShmaW5hbCBTdHJpbmcgd2h5KSB7CisJcHVibGljIERpZShTdHJpbmcgd2h5KSB7CiAJCXN1cGVyKHdoeSk7CiAJfQogCkBAIC03NSw3ICs3NSw3IEBACiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICB3aHkgdGhlIGNvbW1hbmQgaGFzIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHksIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBEaWUoU3RyaW5nIHdoeSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHdoeSwgY2F1c2UpOwogCX0KIApAQCAtMTAwLDcgKzEwMCw3IEBACiAJICogICAgICAgICAgICBjYW4gYmUgbnVsbAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgRGllKGJvb2xlYW4gYWJvcnRlZCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIERpZShib29sZWFuIGFib3J0ZWQsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihjYXVzZSAhPSBudWxsID8gY2F1c2UuZ2V0TWVzc2FnZSgpIDogbnVsbCwgY2F1c2UpOwogCQl0aGlzLmFib3J0ZWQgPSBhYm9ydGVkOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZi5qYXZhCmluZGV4IGVkNmY3YjQuLjk3ZTNkZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhCmluZGV4IDUxMDQwNjMuLjQyYWFiYzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhCkBAIC03NSw5ICs3NSw5IEBACiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl3YWxrLnNldFJlY3Vyc2l2ZShyZWN1cnNpdmUpOwotCQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBpIDogdHJlZXMpCisJCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkgOiB0cmVlcykKIAkJCQl3YWxrLmFkZFRyZWUoaSk7CiAJCQl3YWxrLnNldEZpbHRlcihBbmRUcmVlRmlsdGVyLmNyZWF0ZShUcmVlRmlsdGVyLkFOWV9ESUZGLCBwYXRoRmlsdGVyKSk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoLmphdmEKaW5kZXggYmM3NjM3Mi4uNjFmZDUyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoLmphdmEKQEAgLTEwMCw2ICsxMDAsOSBAQAogCQl0YWdzID0gQm9vbGVhbi5GQUxTRTsKIAl9CiAKKwlAT3B0aW9uKG5hbWUgPSAiLS1mb3JjZSIsIHVzYWdlID0gInVzYWdlX2ZvcmNlZEZldGNoIiwgYWxpYXNlcyA9IHsgIi1mIiB9KQorCXByaXZhdGUgQm9vbGVhbiBmb3JjZTsKKwogCXByaXZhdGUgRmV0Y2hSZWN1cnNlU3VibW9kdWxlc01vZGUgcmVjdXJzZVN1Ym1vZHVsZXM7CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1yZWN1cnNlLXN1Ym1vZHVsZXMiLCB1c2FnZSA9ICJ1c2FnZV9yZWN1cnNlU3VibW9kdWxlcyIpCkBAIC0xNTUsNiArMTU4LDkgQEAKIAkJCWlmIChxdWlldCA9PSBudWxsIHx8ICFxdWlldC5ib29sZWFuVmFsdWUoKSkKIAkJCQlmZXRjaC5zZXRQcm9ncmVzc01vbml0b3IobmV3IFRleHRQcm9ncmVzc01vbml0b3IoZXJydykpOwogCQkJZmV0Y2guc2V0UmVjdXJzZVN1Ym1vZHVsZXMocmVjdXJzZVN1Ym1vZHVsZXMpLnNldENhbGxiYWNrKHRoaXMpOworCQkJaWYgKGZvcmNlICE9IG51bGwpIHsKKwkJCQlmZXRjaC5zZXRGb3JjZVVwZGF0ZShmb3JjZS5ib29sZWFuVmFsdWUoKSk7CisJCQl9CiAKIAkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IGZldGNoLmNhbGwoKTsKIAkJCWlmIChyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0dsb2cuamF2YQppbmRleCBhMDgxYjc4Li4yYjVhZjVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkJZnJhbWUgPSBuZXcgSkZyYW1lKCk7CiAJCWZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKGZpbmFsIFdpbmRvd0V2ZW50IGUpIHsKKwkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewogCQkJCWZyYW1lLmRpc3Bvc2UoKTsKIAkJCX0KIAkJfSk7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvdyhSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhCmluZGV4IDc1NTQyZDQuLmFkOTJhNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEKQEAgLTE4Niw3ICsxODYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXN1cGVyLmluaXQocmVwb3NpdG9yeSwgZ2l0RGlyKTsKIAkJZGlmZkZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRzKSk7CiAJfQpAQCAtMjQxLDcgKzI0MSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNob3coZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNob3coUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24gewogCQlvdXR3LnByaW50KENMSVRleHQuZ2V0KCkuY29tbWl0TGFiZWwpOwogCQlvdXR3LnByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKIAkJYy5nZXRJZCgpLmNvcHlUbyhvdXRidWZmZXIsIG91dHcpOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAKIAkJb3V0dy5wcmludGxuKCk7CiAJCWZpbmFsIFN0cmluZ1tdIGxpbmVzID0gYy5nZXRGdWxsTWVzc2FnZSgpLnNwbGl0KCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiBsaW5lcykgeworCQlmb3IgKFN0cmluZyBzIDogbGluZXMpIHsKIAkJCW91dHcucHJpbnQoIiAgICAiKTsgLy8kTk9OLU5MUy0xJAogCQkJb3V0dy5wcmludChzKTsKIAkJCW91dHcucHJpbnRsbigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xzUmVtb3RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YQppbmRleCA5MDEzZmY2Li4yNzExYzE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YQpAQCAtODMsNyArODMsNyBAQAogCQkJfQogCQl9KTsKIAkJcmVmcy5hZGRBbGwoY29tbWFuZC5jYWxsKCkpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJc2hvdyhyLmdldE9iamVjdElkKCksIHIuZ2V0TmFtZSgpKTsKIAkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQlzaG93KHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSwgci5nZXROYW1lKCkgKyAiXnt9Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTk2LDcgKzk2LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgbmFtZSkKKwlwcml2YXRlIHZvaWQgc2hvdyhBbnlPYmplY3RJZCBpZCwgU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXR3LnByaW50KGlkLm5hbWUoKSk7CiAJCW91dHcucHJpbnQoJ1x0Jyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNUcmVlLmphdmEKaW5kZXggYzU3ZjlmMi4uMDFmYTdlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xzVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJd2Fsay5yZXNldCgpOyAvLyBkcm9wIHRoZSBmaXJzdCBlbXB0eSB0cmVlLCB3aGljaCB3ZSBkbyBub3QgbmVlZCBoZXJlCiAJCQlpZiAocGF0aHMuc2l6ZSgpID4gMCkKIAkJCQl3YWxrLnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MocGF0aHMpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NYWluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhCmluZGV4IGEzNzZiYzAuLmFjNTNkZTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NYWluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTcxLDYgKzcxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbC5DTElUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5DbWRMaW5lUGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5TdWJjb21tYW5kSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5XaW5kb3dDYWNoZUNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5IdHRwVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlLkh0dHBDbGllbnRDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQ2FjaGVkQXV0aGVudGljYXRvcjsKQEAgLTEwNSwxMCArMTA2LDE5IEBACiAKIAlwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBnY0V4ZWN1dG9yOwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1CID0gMTAyNCAqIDEwMjQ7CisKIAkvKioKIAkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgTWFpbi48L3A+CiAJICovCiAJcHVibGljIE1haW4oKSB7CisJCWZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGMgPSBuZXcgV2luZG93Q2FjaGVDb25maWcoKTsKKwkJYy5zZXRQYWNrZWRHaXRNTUFQKHRydWUpOworCQljLnNldFBhY2tlZEdpdFdpbmRvd1NpemUoOCAqIDEwMjQpOworCQljLnNldFBhY2tlZEdpdExpbWl0KDEwICogTUIpOworCQljLnNldERlbHRhQmFzZUNhY2hlTGltaXQoMTAgKiBNQik7CisJCWMuc2V0U3RyZWFtRmlsZVRocmVzaG9sZCg1MCAqIE1CKTsKKwkJYy5pbnN0YWxsKCk7CiAJCUh0dHBUcmFuc3BvcnQuc2V0Q29ubmVjdGlvbkZhY3RvcnkobmV3IEh0dHBDbGllbnRDb25uZWN0aW9uRmFjdG9yeSgpKTsKIAkJQnVpbHRpbkxGUy5yZWdpc3RlcigpOwogCQlnY0V4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5KCkgewpAQCAtMTMxLDcgKzE0MSw3IEBACiAJICogICAgICAgICAgICBhcmd1bWVudHMuCiAJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIG1ha2Ugc3VyZSBidWlsdC1pbiBmaWx0ZXJzIGFyZSByZWdpc3RlcmVkCiAJCUJ1aWx0aW5MRlMucmVnaXN0ZXIoKTsKIApAQCAtMTU1LDcgKzE2NSw3IEBACiAJICogICAgICAgICAgICBhcmd1bWVudHMuCiAJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKGZpbmFsIFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHJ1bihTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJd3JpdGVyID0gY3JlYXRlRXJyb3JXcml0ZXIoKTsKIAkJdHJ5IHsKIAkJCWlmICghaW5zdGFsbENvbnNvbGUoKSkgewpAQCAtMjE3LDEwICsyMjcsMTAgQEAKIAl9CiAKIAlQcmludFdyaXRlciBjcmVhdGVFcnJvcldyaXRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5lcnIsIFVURl84KSk7CisJCXJldHVybiBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBDSEFSU0VUKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIENtZExpbmVQYXJzZXIgY2xwID0gbmV3IFN1YmNvbW1hbmRMaW5lUGFyc2VyKHRoaXMpOwogCiAJCXRyeSB7CkBAIC0yNDYsMTIgKzI1NiwxMiBAQAogCQkJCXdyaXRlci5wcmludGxuKENMSVRleHQuZ2V0KCkubW9zdENvbW1vbmx5VXNlZENvbW1hbmRzQXJlKTsKIAkJCQlmaW5hbCBDb21tYW5kUmVmW10gY29tbW9uID0gQ29tbWFuZENhdGFsb2cuY29tbW9uKCk7CiAJCQkJaW50IHdpZHRoID0gMDsKLQkJCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IGNvbW1vbikgeworCQkJCWZvciAoQ29tbWFuZFJlZiBjIDogY29tbW9uKSB7CiAJCQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGMuZ2V0TmFtZSgpLmxlbmd0aCgpKTsKIAkJCQl9CiAJCQkJd2lkdGggKz0gMjsKIAotCQkJCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogY29tbW9uKSB7CisJCQkJZm9yIChDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKIAkJCQkJd3JpdGVyLnByaW50KCcgJyk7CiAJCQkJCXdyaXRlci5wcmludChjLmdldE5hbWUoKSk7CiAJCQkJCWZvciAoaW50IGkgPSBjLmdldE5hbWUoKS5sZW5ndGgoKTsgaSA8IHdpZHRoOyBpKyspIHsKQEAgLTI4Niw3ICsyOTYsNyBAQAogCQl9CiAJfQogCi0Jdm9pZCBpbml0KGZpbmFsIFRleHRCdWlsdGluIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGluaXQoVGV4dEJ1aWx0aW4gY21kKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoY21kLnJlcXVpcmVzUmVwb3NpdG9yeSgpKSB7CiAJCQljbWQuaW5pdChvcGVuR2l0RGlyKGdpdGRpciksIG51bGwpOwogCQl9IGVsc2UgewpAQCAtMzUwLDcgKzM2MCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGwoZmluYWwgU3RyaW5nIG5hbWUpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnN0YWxsKFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCiAJCQlOb1N1Y2hNZXRob2RFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlQmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlQmFzZS5qYXZhCmluZGV4IDYyYTg4YWUuLjY4NDJkOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZUJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogY29tbWl0cykKKwkJZm9yIChSZXZDb21taXQgYyA6IGNvbW1pdHMpCiAJCQlhcmdXYWxrLm1hcmtTdGFydChjKTsKIAkJYXJnV2Fsay5zZXRSZXZGaWx0ZXIoUmV2RmlsdGVyLk1FUkdFX0JBU0UpOwogCQlpbnQgbWF4ID0gYWxsID8gSW50ZWdlci5NQVhfVkFMVUUgOiAxOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1B1c2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEKaW5kZXggMzA5ZGNhMi4uYmU4YWQzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1B1c2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJYm9vbGVhbiBldmVyeXRoaW5nVXBUb0RhdGUgPSB0cnVlOwogCiAJCS8vIGF0IGZpcnN0LCBwcmludCB1cC10by1kYXRlIG9uZXMuLi4KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5VUF9UT19EQVRFKSB7CiAJCQkJaWYgKHZlcmJvc2UpCiAJCQkJCXByaW50UmVmVXBkYXRlUmVzdWx0KHJlYWRlciwgdXJpLCByZXN1bHQsIHJydSk7CkBAIC0xNTcsMTMgKzE1NywxMyBAQAogCQkJCWV2ZXJ5dGhpbmdVcFRvRGF0ZSA9IGZhbHNlOwogCQl9CiAKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQkvLyAuLi50aGVuIHN1Y2Nlc3NmdWwgdXBkYXRlcy4uLgogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuT0spCiAJCQkJcHJpbnRSZWZVcGRhdGVSZXN1bHQocmVhZGVyLCB1cmksIHJlc3VsdCwgcnJ1KTsKIAkJfQogCi0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgewogCQkJLy8gLi4uZmluYWxseSwgb3RoZXJzIChwcm9ibGVtYXRpYykKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgIT0gU3RhdHVzLk9LCiAJCQkJCSYmIHJydS5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuVVBfVE9fREFURSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZW1vdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZW1vdGUuamF2YQppbmRleCA5NDhjYmM1Li4zMzA4ZTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVtb3RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApCisJcHVibGljIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQllcnJ3LnByaW50bG4obWVzc2FnZSk7CiAJCWVycncucHJpbnRsbigiamdpdCByZW1vdGUgWy0tdmVyYm9zZSAoLXYpXSBbLS1oZWxwICgtaCldIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2TGlzdC5qYXZhCmluZGV4IDhjODhhNWMuLjEwMWZiYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogY2xhc3MgUmV2TGlzdCBleHRlbmRzIFJldldhbGtUZXh0QnVpbHRpbiB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGMuaGFzKFJldkZsYWcuVU5JTlRFUkVTVElORykpCiAJCQlvdXR3LnByaW50KCctJyk7CiAJCWMuZ2V0SWQoKS5jb3B5VG8ob3V0YnVmZmVyLCBvdXR3KTsKQEAgLTY3LDcgKzY3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBPYmplY3RXYWxrIG93LCBmaW5hbCBSZXZPYmplY3Qgb2JqKQorCXByb3RlY3RlZCB2b2lkIHNob3coT2JqZWN0V2FsayBvdywgUmV2T2JqZWN0IG9iaikKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlpZiAob2JqLmhhcyhSZXZGbGFnLlVOSU5URVJFU1RJTkcpKQogCQkJb3V0dy5wcmludCgnLScpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2UGFyc2UuamF2YQppbmRleCAyMWFkZjczLi5hYzA4Y2Q2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2UGFyc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2UGFyc2UuamF2YQpAQCAtNDUsMTEgKzQ1LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CkBAIC03NCw4ICs3MSw3IEBACiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWlmIChhbGwpIHsKLQkJCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQkJZm9yIChmaW5hbCBSZWYgciA6IGFsbFJlZnMudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIHIgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJCU9iamVjdElkIG9iamVjdElkID0gci5nZXRPYmplY3RJZCgpOwogCQkJCS8vIGdldFJlZnMgc2tpcHMgZGFuZ2xpbmcgc3ltcmVmcywgc28gb2JqZWN0SWQgc2hvdWxkIG5ldmVyIGJlCiAJCQkJLy8gbnVsbC4KQEAgLTkxLDcgKzg3LDcgQEAKIAkJCQkJCUNMSVRleHQuZm9ybWF0KENMSVRleHQuZ2V0KCkubmVlZFNpbmdsZVJldmlzaW9uKSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgT2JqZWN0SWQgbyA6IGNvbW1pdHMpIHsKKwkJCWZvciAoT2JqZWN0SWQgbyA6IGNvbW1pdHMpIHsKIAkJCQlvdXR3LnByaW50bG4oby5uYW1lKCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEKaW5kZXggM2ZjOTEwMS4uMTVhYmVhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldldhbGtUZXh0QnVpbHRpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YQpAQCAtNDcsMTQgKzQ3LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlBhdGhUcmVlRmlsdGVySGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9sbG93RmlsdGVyOwpAQCAtOTMsNyArOTEsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBFbnVtU2V0PFJldlNvcnQ+IHNvcnRpbmcgPSBFbnVtU2V0Lm5vbmVPZihSZXZTb3J0LmNsYXNzKTsKIAotCXByaXZhdGUgdm9pZCBlbmFibGVSZXZTb3J0KGZpbmFsIFJldlNvcnQgdHlwZSwgZmluYWwgYm9vbGVhbiBvbikgeworCXByaXZhdGUgdm9pZCBlbmFibGVSZXZTb3J0KFJldlNvcnQgdHlwZSwgYm9vbGVhbiBvbikgewogCQlpZiAob24pCiAJCQlzb3J0aW5nLmFkZCh0eXBlKTsKIAkJZWxzZQpAQCAtMTAxLDIyICs5OSwyMiBAQAogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWRhdGUtb3JkZXIiKQotCXZvaWQgZW5hYmxlRGF0ZU9yZGVyKGZpbmFsIGJvb2xlYW4gb24pIHsKKwl2b2lkIGVuYWJsZURhdGVPcmRlcihib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5DT01NSVRfVElNRV9ERVNDLCBvbik7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tdG9wby1vcmRlciIpCi0Jdm9pZCBlbmFibGVUb3BvT3JkZXIoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlVG9wb09yZGVyKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LlRPUE8sIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1yZXZlcnNlIikKLQl2b2lkIGVuYWJsZVJldmVyc2UoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlUmV2ZXJzZShib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5SRVZFUlNFLCBvbik7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tYm91bmRhcnkiKQotCXZvaWQgZW5hYmxlQm91bmRhcnkoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlQm91bmRhcnkoYm9vbGVhbiBvbikgewogCQllbmFibGVSZXZTb3J0KFJldlNvcnQuQk9VTkRBUlksIG9uKTsKIAl9CiAKQEAgLTEzMiwxNyArMTMwLDE3IEBACiAJcHJpdmF0ZSBmaW5hbCBMaXN0PFJldkZpbHRlcj4gcmV2TGltaXRlciA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJQE9wdGlvbihuYW1lID0gIi0tYXV0aG9yIikKLQl2b2lkIGFkZEF1dGhvclJldkZpbHRlcihmaW5hbCBTdHJpbmcgd2hvKSB7CisJdm9pZCBhZGRBdXRob3JSZXZGaWx0ZXIoU3RyaW5nIHdobykgewogCQlyZXZMaW1pdGVyLmFkZChBdXRob3JSZXZGaWx0ZXIuY3JlYXRlKHdobykpOwogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWNvbW1pdHRlciIpCi0Jdm9pZCBhZGRDb21taXR0ZXJSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIHdobykgeworCXZvaWQgYWRkQ29tbWl0dGVyUmV2RmlsdGVyKFN0cmluZyB3aG8pIHsKIAkJcmV2TGltaXRlci5hZGQoQ29tbWl0dGVyUmV2RmlsdGVyLmNyZWF0ZSh3aG8pKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1ncmVwIikKLQl2b2lkIGFkZENNZXNzYWdlUmV2RmlsdGVyKGZpbmFsIFN0cmluZyBtc2cpIHsKKwl2b2lkIGFkZENNZXNzYWdlUmV2RmlsdGVyKFN0cmluZyBtc2cpIHsKIAkJcmV2TGltaXRlci5hZGQoTWVzc2FnZVJldkZpbHRlci5jcmVhdGUobXNnKSk7CiAJfQogCkBAIC0xNTMsNyArMTUxLDcgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJd2FsayA9IGNyZWF0ZVdhbGsoKTsKLQkJZm9yIChmaW5hbCBSZXZTb3J0IHMgOiBzb3J0aW5nKQorCQlmb3IgKFJldlNvcnQgcyA6IHNvcnRpbmcpCiAJCQl3YWxrLnNvcnQocywgdHJ1ZSk7CiAKIAkJaWYgKHBhdGhGaWx0ZXIgPT0gVHJlZUZpbHRlci5BTEwpIHsKQEAgLTE3MSw5ICsxNjksNyBAQAogCQkJd2Fsay5zZXRSZXZGaWx0ZXIoQW5kUmV2RmlsdGVyLmNyZWF0ZShyZXZMaW1pdGVyKSk7CiAKIAkJaWYgKGFsbCkgewotCQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0KLQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKTsKLQkJCWZvciAoUmVmIGEgOiByZWZzLnZhbHVlcygpKSB7CisJCQlmb3IgKFJlZiBhIDogZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpIHsKIAkJCQlPYmplY3RJZCBvaWQgPSBhLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQkJaWYgKG9pZCA9PSBudWxsKQogCQkJCQlvaWQgPSBhLmdldE9iamVjdElkKCk7CkBAIC0xOTEsNyArMTg3LDcgQEAKIAkJCQl0aHJvdyBkaWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5jYW5ub3RSZXNvbHZlLCBDb25zdGFudHMuSEVBRCkpOwogCQkJY29tbWl0cy5hZGQod2Fsay5wYXJzZUNvbW1pdChoZWFkKSk7CiAJCX0KLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IGNvbW1pdHMpIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IGNvbW1pdHMpIHsKIAkJCWZpbmFsIFJldkNvbW1pdCByZWFsID0gYXJnV2FsayA9PSB3YWxrID8gYyA6IHdhbGsucGFyc2VDb21taXQoYyk7CiAJCQlpZiAoYy5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCQl3YWxrLm1hcmtVbmludGVyZXN0aW5nKHJlYWwpOwpAQCAtMjM3LDcgKzIzMyw3IEBACiAJICovCiAJcHJvdGVjdGVkIGludCB3YWxrTG9vcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlpbnQgbiA9IDA7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IGMgOiB3YWxrKSB7CisJCWZvciAoUmV2Q29tbWl0IGMgOiB3YWxrKSB7CiAJCQlpZiAoKytuID4gbWF4Q291bnQgJiYgbWF4Q291bnQgPj0gMCkKIAkJCQlicmVhazsKIAkJCXNob3coYyk7CkBAIC0yNjQsNyArMjYwLDcgQEAKIAkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0fQogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNob3coZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb247CisJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2hvdyhSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbjsKIAogCS8qKgogCSAqICJTaG93IiB0aGUgY3VycmVudCBSZXZDb21taXQgd2hlbiBjYWxsZWQgZnJvbSB0aGUgbWFpbiBwcm9jZXNzaW5nIGxvb3AuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YQppbmRleCBkZTA0MDQ1Li44OWExNWZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvdy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXN1cGVyLmluaXQocmVwb3NpdG9yeSwgZ2l0RGlyKTsKIAkJZGlmZkZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRzKSk7CiAJfQpAQCAtMjQ4LDcgKzI0OCw3IEBACiAKIAkJb3V0dy5wcmludGxuKCk7CiAJCWZpbmFsIFN0cmluZ1tdIGxpbmVzID0gdGFnLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CkBAIC0yNTksNyArMjU5LDcgQEAKIAogCXByaXZhdGUgdm9pZCBzaG93KFJldlRyZWUgb2JqKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl3YWxrLnJlc2V0KCk7CiAJCQl3YWxrLmFkZFRyZWUob2JqKTsKIApAQCAtMjczLDcgKzI3Myw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhSZXZXYWxrIHJ3LCBmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHNob3coUmV2V2FsayBydywgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24gewogCQljaGFyW10gb3V0YnVmZmVyID0gbmV3IGNoYXJbQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEggKiAyXTsKIAogCQlvdXR3LnByaW50KENMSVRleHQuZ2V0KCkuY29tbWl0TGFiZWwpOwpAQCAtMjkyLDcgKzI5Miw3IEBACiAKIAkJb3V0dy5wcmludGxuKCk7CiAJCWZpbmFsIFN0cmluZ1tdIGxpbmVzID0gYy5nZXRGdWxsTWVzc2FnZSgpLnNwbGl0KCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiBsaW5lcykgeworCQlmb3IgKFN0cmluZyBzIDogbGluZXMpIHsKIAkJCW91dHcucHJpbnQoIiAgICAiKTsgLy8kTk9OLU5MUy0xJAogCQkJb3V0dy5wcmludChzKTsKIAkJCW91dHcucHJpbnRsbigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3dSZWYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEKaW5kZXggN2I1OWQ0My4uNjMxOGE2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3dSZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhCkBAIC00NSwyMyArNDUsMTkgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SZWZNYXA7CiAKIEBDb21tYW5kKHVzYWdlID0gInVzYWdlX1Nob3dSZWYiKQogY2xhc3MgU2hvd1JlZiBleHRlbmRzIFRleHRCdWlsdGluIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFJlZiByIDogZ2V0U29ydGVkUmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBnZXRTb3J0ZWRSZWZzKCkpIHsKIAkJCXNob3coci5nZXRPYmplY3RJZCgpLCByLmdldE5hbWUoKSk7CiAJCQlpZiAoci5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCiAJCQkJc2hvdyhyLmdldFBlZWxlZE9iamVjdElkKCksIHIuZ2V0TmFtZSgpICsgIl57fSIpOyAvLyROT04tTkxTLTEkCkBAIC02OSwxNCArNjUsMTMgQEAKIAl9CiAKIAlwcml2YXRlIEl0ZXJhYmxlPFJlZj4gZ2V0U29ydGVkUmVmcygpIHRocm93cyBFeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBSZWY+IGFsbCA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQlpZiAoYWxsIGluc3RhbmNlb2YgUmVmTWFwCi0JCQkJfHwgKGFsbCBpbnN0YW5jZW9mIFNvcnRlZE1hcCAmJiAoKFNvcnRlZE1hcCkgYWxsKS5jb21wYXJhdG9yKCkgPT0gbnVsbCkpCi0JCQlyZXR1cm4gYWxsLnZhbHVlcygpOwotCQlyZXR1cm4gUmVmQ29tcGFyYXRvci5zb3J0KGFsbC52YWx1ZXMoKSk7CisJCUxpc3Q8UmVmPiBhbGwgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKKwkJLy8gVE9ETyhqcm4pIGNoZWNrIGlmIHdlIGNhbiByZWludHJvZHVjZSBmYXN0LXBhdGggYnkgZS5nLiBpbXBsZW1lbnRpbmcKKwkJLy8gU29ydGVkTGlzdAorCQlyZXR1cm4gUmVmQ29tcGFyYXRvci5zb3J0KGFsbCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyBuYW1lKQorCXByaXZhdGUgdm9pZCBzaG93KEFueU9iamVjdElkIGlkLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoaWQubmFtZSgpKTsKIAkJb3V0dy5wcmludCgnXHQnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UZXh0QnVpbHRpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEKaW5kZXggYmMzNzU1ZC4uN2U1YjU0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEKQEAgLTEyOSw3ICsxMjksNyBAQAogCS8qKiBSZXZXYWxrIHVzZWQgZHVyaW5nIGNvbW1hbmQgbGluZSBwYXJzaW5nLCBpZiBpdCB3YXMgcmVxdWlyZWQuICovCiAJcHJvdGVjdGVkIFJldldhbGsgYXJnV2FsazsKIAotCWZpbmFsIHZvaWQgc2V0Q29tbWFuZE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlmaW5hbCB2b2lkIHNldENvbW1hbmROYW1lKFN0cmluZyBuYW1lKSB7CiAJCWNvbW1hbmROYW1lID0gbmFtZTsKIAl9CiAKQEAgLTE3Niw3ICsxNzYsNyBAQAogCSAqICAgICAgICAgICAgdmFsdWUgb2YgdGhlIHtAY29kZSAtLWdpdC1kaXJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIGlmCiAJICogICAgICAgICAgICB7QGNvZGUgcmVwb3NpdG9yeX0gaXMgbnVsbC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcgPSByZXBvc2l0b3J5ICE9IG51bGwgPyByZXBvc2l0b3J5CiAJCQkJCS5nZXRDb25maWcoKS5nZXRTdHJpbmcoImkxOG4iLCBudWxsLCAibG9nT3V0cHV0RW5jb2RpbmciKSA6IG51bGw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMjM5LDcgKzIzOSw3IEBACiAJICogICAgICAgICAgICB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmIGFueS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENtZExpbmVQYXJzZXIgY2xwID0gbmV3IENtZExpbmVQYXJzZXIodGhpcyk7CiAJCWhlbHAgPSBjb250YWluc0hlbHAoYXJncyk7CiAJCXRyeSB7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5DbWRMaW5lUGFyc2VyfSBvYmplY3QuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByaW50VXNhZ2VBbmRFeGl0KCIiLCBjbHApOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC0yODAsNyArMjgwLDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5DbWRMaW5lUGFyc2VyfSBvYmplY3QuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIENtZExpbmVQYXJzZXIgY2xwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHByaW50VXNhZ2VBbmRFeGl0KFN0cmluZyBtZXNzYWdlLCBDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcHJpbnRVc2FnZShtZXNzYWdlLCBjbHApOwogCQl0aHJvdyBkaWUodHJ1ZSk7CiAJfQpAQCAtMjk1LDcgKzI5NSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50VXNhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIENtZExpbmVQYXJzZXIgY2xwKQorCXByb3RlY3RlZCB2b2lkIHByaW50VXNhZ2UoU3RyaW5nIG1lc3NhZ2UsIENtZExpbmVQYXJzZXIgY2xwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZXJydy5wcmludGxuKG1lc3NhZ2UpOwogCQllcnJ3LnByaW50KCJqZ2l0ICIpOyAvLyROT04tTkxTLTEkCkBAIC0zNjEsNyArMzYxLDcgQEAKIAkJcmV0dXJuIGRiOwogCX0KIAotCU9iamVjdElkIHJlc29sdmUoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJT2JqZWN0SWQgcmVzb2x2ZShTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgT2JqZWN0SWQgciA9IGRiLnJlc29sdmUocyk7CiAJCWlmIChyID09IG51bGwpCiAJCQl0aHJvdyBkaWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5ub3RBUmV2aXNpb24sIHMpKTsKQEAgLTM3NSw3ICszNzUsNyBAQAogCSAqICAgICAgICAgICAgdGV4dHVhbCBleHBsYW5hdGlvbgogCSAqIEByZXR1cm4gYSBydW50aW1lIGV4Y2VwdGlvbiB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHRocm93CiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoU3RyaW5nIHdoeSkgewogCQlyZXR1cm4gbmV3IERpZSh3aHkpOwogCX0KIApAQCAtMzg4LDcgKzM4OCw3IEBACiAJICogICAgICAgICAgICB3aHkgdGhlIGNvbW1hbmQgaGFzIGZhaWxlZC4KIAkgKiBAcmV0dXJuIGEgcnVudGltZSBleGNlcHRpb24gdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB0aHJvdwogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShmaW5hbCBTdHJpbmcgd2h5LCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoU3RyaW5nIHdoeSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXJldHVybiBuZXcgRGllKHdoeSwgY2F1c2UpOwogCX0KIApAQCAtNDE2LDcgKzQxNiw3IEBACiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKiBAc2luY2UgNC4yCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGJvb2xlYW4gYWJvcnRlZCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGJvb2xlYW4gYWJvcnRlZCwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXJldHVybiBuZXcgRGllKGFib3J0ZWQsIGNhdXNlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVmVyc2lvbi5qYXZhCmluZGV4IDVlZmMwM2IuLjU4YWNjNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YQpAQCAtOTYsMTQgKzk2LDkgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QnVuZGxlVmVyc2lvbihVUkwgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGlzKTsKLQkJCQlyZXR1cm4gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZSgiQnVuZGxlLVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBmaW5hbGx5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKSkgeworCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaXMpOworCQkJcmV0dXJuIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoIkJ1bmRsZS1WZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJLy8gZG8gbm90aGluZyAtIHdpbGwgcmV0dXJuIG51bGwKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL0JlbmNobWFya1JlZnRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQppbmRleCAyNDhlYWFjLi41NzVhMTIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuTUFTVEVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQlSZWZMaXN0LkJ1aWxkZXI8UmVmPiBsaXN0ID0gbmV3IFJlZkxpc3QuQnVpbGRlcjw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obHNSZW1vdGVQYXRoKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obHNSZW1vdGVQYXRoKSwgQ0hBUlNFVCkpKSB7CiAJCQlSZWYgbGFzdCA9IG51bGw7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvTWFrZUNhY2hlVHJlZS5qYXZhCmluZGV4IDEyN2U1NDEuLjJhMTMyNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCQlzaG93KHRyZWUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KGZpbmFsIERpckNhY2hlVHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBzaG93KERpckNhY2hlVHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5jYWNoZVRyZWVQYXRoSW5mbywKIAkJCQl0cmVlLmdldFBhdGhTdHJpbmcoKSwgdmFsdWVPZih0cmVlLmdldEVudHJ5U3BhbigpKSwKIAkJCQl2YWx1ZU9mKHRyZWUuZ2V0Q2hpbGRDb3VudCgpKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRDb21taXRHcmFwaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRDb21taXRHcmFwaC5qYXZhCmluZGV4IDJlNDFlZWMuLjJkMTZmZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEKQEAgLTQzLDggKzQzLDYgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1ZzsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKQEAgLTExNyw3ICsxMTUsNyBAQAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghcmVhbGx5ICYmICFkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKS5pc0VtcHR5KCkpIHsKKwkJaWYgKCFyZWFsbHkgJiYgZGIuZ2V0UmVmRGF0YWJhc2UoKS5oYXNSZWZzKCkpIHsKIAkJCUZpbGUgZGlyZWN0b3J5ID0gZGIuZ2V0RGlyZWN0b3J5KCk7CiAJCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gZGlyZWN0b3J5ID09IG51bGwgPyAibnVsbCIgLy8kTk9OLU5MUy0xJAogCQkJCQk6IGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKQEAgLTIyNCw3ICsyMjIsNyBAQAogCiAJCU9iamVjdElkIG5ld0lkOwogCi0JCVRvUmV3cml0ZShmaW5hbCBPYmplY3RJZCBvLCBmaW5hbCBsb25nIHQsIGZpbmFsIE9iamVjdElkW10gcCkgeworCQlUb1Jld3JpdGUoT2JqZWN0SWQgbywgbG9uZyB0LCBPYmplY3RJZFtdIHApIHsKIAkJCW9sZElkID0gbzsKIAkJCWNvbW1pdFRpbWUgPSB0OwogCQkJb2xkUGFyZW50cyA9IHA7CkBAIC0yNDcsOCArMjQ1LDcgQEAKIAogCXByaXZhdGUgdm9pZCBkZWxldGVBbGxSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhkYik7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpIHsKIAkJCWlmIChDb25zdGFudHMuSEVBRC5lcXVhbHMoci5nZXROYW1lKCkpKQogCQkJCWNvbnRpbnVlOwogCQkJZmluYWwgUmVmVXBkYXRlIHUgPSBkYi51cGRhdGVSZWYoci5nZXROYW1lKCkpOwpAQCAtMjYxLDcgKzI1OCw3IEBACiAJCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGNvbXB1dGVOZXdSZWZzKCk7CiAJCW5ldyBSZWZXcml0ZXIocmVmcy52YWx1ZXMoKSkgewogCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJ5dGVbXSBjb250ZW50KQorCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKFN0cmluZyBuYW1lLCBieXRlW10gY29udGVudCkKIAkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgbmFtZSk7CiAJCQkJZmluYWwgTG9ja0ZpbGUgbGNrID0gbmV3IExvY2tGaWxlKGZpbGUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZFJlZlRyZWUuamF2YQppbmRleCAzMTcyNDgzLi4wNjM2MDBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZFJlZlRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZFJlZlRyZWUuamF2YQpAQCAtMTU0LDE0ICsxNTQsMTQgQEAKIAkJCQkJaGVhZCkpOwogCQl9CiAKLQkJZm9yIChSZWYgciA6IHJlZmRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogcmVmZGIuZ2V0UmVmcygpKSB7CiAJCQlpZiAoci5nZXROYW1lKCkuZXF1YWxzKHR4bkNvbW1pdHRlZCkgfHwgci5nZXROYW1lKCkuZXF1YWxzKEhFQUQpCiAJCQkJCXx8IHIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgodHhuTmFtZXNwYWNlKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJY21kcy5hZGQobmV3IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlLkNvbW1hbmQoCiAJCQkJCW51bGwsCi0JCQkJCWRiLnBlZWwocikpKTsKKwkJCQkJZGIuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHIpKSk7CiAJCX0KIAkJdHJlZS5hcHBseShjbWRzKTsKIAkJcmV0dXJuIHRyZWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NhY2hlVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDYWNoZVRyZWUuamF2YQppbmRleCAyMGZhNGEzLi42Yjk3ZTA4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NhY2hlVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEKQEAgLTY3LDcgKzY3LDcgQEAKIAkJc2hvdyh0cmVlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuY2FjaGVUcmVlUGF0aEluZm8sCiAJCQkJdHJlZS5nZXRQYXRoU3RyaW5nKCksIHZhbHVlT2YodHJlZS5nZXRFbnRyeVNwYW4oKSksCiAJCQkJdmFsdWVPZih0cmVlLmdldENoaWxkQ291bnQoKSkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YQppbmRleCBhOTYwZWM2Li5hZjU2ZDY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NvbW1hbmRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhCkBAIC02NSwxMSArNjUsMTEgQEAKIAkJZmluYWwgQ29tbWFuZFJlZltdIGxpc3QgPSBDb21tYW5kQ2F0YWxvZy5hbGwoKTsKIAogCQlpbnQgd2lkdGggPSAwOwotCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IGxpc3QpCisJCWZvciAoQ29tbWFuZFJlZiBjIDogbGlzdCkKIAkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGMuZ2V0TmFtZSgpLmxlbmd0aCgpKTsKIAkJd2lkdGggKz0gMjsKIAotCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IGxpc3QpIHsKKwkJZm9yIChDb21tYW5kUmVmIGMgOiBsaXN0KSB7CiAJCQllcnJ3LnByaW50KGMuaXNDb21tb24oKSA/ICcqJyA6ICcgJyk7CiAJCQllcnJ3LnByaW50KCcgJyk7CiAKQEAgLTg3LDcgKzg3LDcgQEAKIAkJLyoqICovCiAJCVVTQUdFIHsKIAkJCUBPdmVycmlkZQotCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgZmluYWwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCVN0cmluZyB1c2FnZSA9IGMuZ2V0VXNhZ2UoKTsKIAkJCQlpZiAodXNhZ2UgIT0gbnVsbCAmJiB1c2FnZS5sZW5ndGgoKSA+IDApCiAJCQkJCWVyci5wcmludChDTElUZXh0LmdldCgpLnJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKHVzYWdlKSk7CkBAIC05Nyw3ICs5Nyw3IEBACiAJCS8qKiAqLwogCQlDTEFTU0VTIHsKIAkJCUBPdmVycmlkZQotCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgZmluYWwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWVyci5wcmludChjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCkpOwogCQkJfQogCQl9LApAQCAtMTA1LDcgKzEwNSw3IEBACiAJCS8qKiAqLwogCQlVUkxTIHsKIAkJCUBPdmVycmlkZQotCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgZmluYWwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWZpbmFsIENsYXNzTG9hZGVyIGxkciA9IGMuZ2V0SW1wbGVtZW50YXRpb25DbGFzc0xvYWRlcigpOwogCiAJCQkJU3RyaW5nIGNuID0gYy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dQYWNrRGVsdGEuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93UGFja0RlbHRhLmphdmEKaW5kZXggYmJjMWIwZi4uZjM5ZWNiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dQYWNrRGVsdGEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhCkBAIC0xMjUsMTIgKzEyNSwxMyBAQAogCQkJcHRyKys7CiAJCXB0cisrOwogCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIgLyogamF2YSA3ICovKQotCQlUZW1wb3JhcnlCdWZmZXIuSGVhcCByYXcgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoYnVmQXJyYXkubGVuZ3RoKTsKLQkJSW5mbGF0ZXJJbnB1dFN0cmVhbSBpbmYgPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbSgKLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmQXJyYXksIHB0ciwgYnVmQXJyYXkubGVuZ3RoKSk7Ci0JCXJhdy5jb3B5KGluZik7Ci0JCWluZi5jbG9zZSgpOwotCQlyZXR1cm4gcmF3LnRvQnl0ZUFycmF5KCk7CisJCXRyeSAoVGVtcG9yYXJ5QnVmZmVyLkhlYXAgcmF3ID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKAorCQkJCWJ1ZkFycmF5Lmxlbmd0aCk7CisJCQkJSW5mbGF0ZXJJbnB1dFN0cmVhbSBpbmYgPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbSgKKwkJCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZBcnJheSwgcHRyLAorCQkJCQkJCQlidWZBcnJheS5sZW5ndGgpKSkgeworCQkJcmF3LmNvcHkoaW5mKTsKKwkJCXJldHVybiByYXcudG9CeXRlQXJyYXkoKTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9UZXh0SGFzaEZ1bmN0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEKaW5kZXggODNiN2JjZS4uYmI1MWI1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEKQEAgLTI4OCwxMSArMjg4LDggQEAKIAkJCWVsc2UKIAkJCQlyYi5maW5kR2l0RGlyKGRpcik7CiAKLQkJCVJlcG9zaXRvcnkgcmVwbyA9IHJiLmJ1aWxkKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG8gPSByYi5idWlsZCgpKSB7CiAJCQkJcnVuKHJlcG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyZXBvLmNsb3NlKCk7CiAJCQl9CiAJCX0KIAl9CkBAIC01MDIsNyArNDk5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZUJpdHMoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhpbnQgc3opIHsKIAkJaW50IGJpdHMgPSAzMSAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3Moc3opOwogCQlpZiAoYml0cyA9PSAwKQogCQkJYml0cyA9IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1dyaXRlUmVmdGFibGUuamF2YQppbmRleCA2Y2JjMWIwLi5jNWVhMDI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1ZzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuSEVBRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk1BU1RFUjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfSEVBRFM7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAlzdGF0aWMgTGlzdDxSZWY+IHJlYWRSZWZzKFN0cmluZyBpbnB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUxpc3Q8UmVmPiByZWZzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKSwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDAsIDQwKSk7CkBAIC0yMjcsNyArMjI3LDcgQEAKIAogCQlMaXN0PExvZ0VudHJ5PiBsb2cgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShsb2dQYXRoKSwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1BhdGgpLCBDSEFSU0VUKSkpIHsKIAkJCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoW14sXSspIiAvLyAxOiByZWYKIAkJCQkJKyAiLChbMC05XSsoPzpbLl1bMC05XSspPykiIC8vIDI6IHRpbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0Fic3RyYWN0VHJlZUl0ZXJhdG9ySGFuZGxlci5qYXZhCmluZGV4IDZmZTc5MjcuLmExNGY2NTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YQpAQCAtOTgsNyArOTgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKIAkJaWYgKG5ldyBGaWxlKG5hbWUpLmlzRGlyZWN0b3J5KCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQ21kTGluZVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKaW5kZXggZTA3MWJkZi4uNWNjOThjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqICAgICAgICAgICAgIGlmIHRoZSBvcHRpb24gYmVhbiBjbGFzcyBpcyB1c2luZyBhcmdzNGogYW5ub3RhdGlvbnMKIAkgKiAgICAgICAgICAgICBpbmNvcnJlY3RseS4KIAkgKi8KLQlwdWJsaWMgQ21kTGluZVBhcnNlcihmaW5hbCBPYmplY3QgYmVhbikgeworCXB1YmxpYyBDbWRMaW5lUGFyc2VyKE9iamVjdCBiZWFuKSB7CiAJCXRoaXMoYmVhbiwgbnVsbCk7CiAJfQogCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW9uIGJlYW4gY2xhc3MgaXMgdXNpbmcgYXJnczRqIGFubm90YXRpb25zCiAJICogICAgICAgICAgICAgaW5jb3JyZWN0bHkuCiAJICovCi0JcHVibGljIENtZExpbmVQYXJzZXIoZmluYWwgT2JqZWN0IGJlYW4sIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBDbWRMaW5lUGFyc2VyKE9iamVjdCBiZWFuLCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIoYmVhbik7CiAJCWlmIChiZWFuIGluc3RhbmNlb2YgVGV4dEJ1aWx0aW4pIHsKIAkJCWNtZCA9IChUZXh0QnVpbHRpbikgYmVhbjsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KGZpbmFsIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcGFyc2VBcmd1bWVudChTdHJpbmcuLi4gYXJncykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB0bXAgPSBuZXcgQXJyYXlMaXN0PD4oYXJncy5sZW5ndGgpOwogCQlmb3IgKGludCBhcmdpID0gMDsgYXJnaSA8IGFyZ3MubGVuZ3RoOyBhcmdpKyspIHsKIAkJCWZpbmFsIFN0cmluZyBzdHIgPSBhcmdzW2FyZ2ldOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBhcnJheSBjb250YWlucyBoZWxwIG9wdGlvbgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0hlbHAoZmluYWwgU3RyaW5nLi4uIGFyZ3MpIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0hlbHAoU3RyaW5nLi4uIGFyZ3MpIHsKIAkJcmV0dXJuIFRleHRCdWlsdGluLmNvbnRhaW5zSGVscChhcmdzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L09iamVjdElkSGFuZGxlci5qYXZhCmluZGV4IDBlNWIwZjUuLjVmN2U4MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YQpAQCAtODQsNyArODQsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUGF0aFRyZWVGaWx0ZXJIYW5kbGVyLmphdmEKaW5kZXggMzNkNjY5Yy4uZDk5Zjg4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpc3Q8UGF0aEZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlmb3IgKGludCBpZHggPSAwOzsgaWR4KyspIHsKIAkJCWZpbmFsIFN0cmluZyBwYXRoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhCmluZGV4IGRkODUyMGEuLjI5NTc3ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmVmU3BlY0hhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24geworCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKIAkJc2V0dGVyLmFkZFZhbHVlKG5ldyBSZWZTcGVjKHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCkpKTsKIAkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZDb21taXRIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YQppbmRleCBkMmZhNzY0Li5iOTI1ZTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YQpAQCAtODgsNyArODgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKIAkJYm9vbGVhbiBpbnRlcmVzdGluZyA9IHRydWU7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZE9uZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYm9vbGVhbiBpbnRlcmVzdGluZykKKwlwcml2YXRlIHZvaWQgYWRkT25lKFN0cmluZyBuYW1lLCBib29sZWFuIGludGVyZXN0aW5nKQogCQkJdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCBpZDsKIAkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2VHJlZUhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2VHJlZUhhbmRsZXIuamF2YQppbmRleCA5NDQ0MzYzLi44NTkyMmEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldlRyZWVIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhCkBAIC04Nyw3ICs4Nyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAkJZmluYWwgT2JqZWN0SWQgaWQ7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1N1YmNvbW1hbmRIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1N1YmNvbW1hbmRIYW5kbGVyLmphdmEKaW5kZXggZDYwMDcxZi4uOTJlZWJmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YQpAQCAtODQsNyArODQsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIENvbW1hbmRSZWYgY3IgPSBDb21tYW5kQ2F0YWxvZy5nZXQobmFtZSk7CiAJCWlmIChjciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDgwNjI3YjUuLjRiODNmYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNTggKzMsNTggQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlY29kZS5qYXZhZXdhaDt2ZXJzaW9uPSJbMS4xLjYsMi4wLjApIiwKICBjb20uamNyYWZ0LmpzY2g7dmVyc2lvbj0iWzAuMS41NCwwLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0VnNKR2l0UmFuZG9tSWdub3JlUGF0dGVyblRlc3QuamF2YQppbmRleCA0MzhkMmQ2Li40ZDllODY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJCXRoaXMuZ2l0RGlyID0gZ2l0RGlyOwogCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAkJCUZpbGVzLndyaXRlKEZpbGVVdGlscy50b1BhdGgobmV3IEZpbGUoZ2l0RGlyLCAiLmdpdGlnbm9yZSIpKSwKLQkJCQkJKHBhdHRlcm4gKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCksIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsCisJCQkJCShwYXR0ZXJuICsgIlxuIikuZ2V0Qnl0ZXMoQ0hBUlNFVCksIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsCiAJCQkJCVN0YW5kYXJkT3Blbk9wdGlvbi5UUlVOQ0FURV9FWElTVElORywKIAkJCQkJU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKIAkJfQpAQCAtMTg4LDcgKzE4OCw3IEBACiAJCQlQcm9jZXNzIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQsIG5ldyBTdHJpbmdbMF0sCiAJCQkJCWdpdERpcik7CiAJCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBwcm9jLmdldE91dHB1dFN0cmVhbSgpKSB7Ci0JCQkJb3V0LndyaXRlKChwYXRoICsgIlxuIikuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQlvdXQud3JpdGUoKHBhdGggKyAiXG4iKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQkJb3V0LmZsdXNoKCk7CiAJCQl9CiAJCQlyZXR1cm4gcHJvYzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FR2l0UGF0Y2hIaXN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEKaW5kZXggM2Y5ZWYxMi4uNzlkOGQwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEKQEAgLTg1LDcgKzg1LDcgQEAKIAogCQlpbnQgZXJyb3JzOwogCi0JCVBhdGNoUmVhZGVyKGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBIYXNoTWFwPFN0cmluZywgU3RhdEluZm8+PiBzKQorCQlQYXRjaFJlYWRlcihIYXNoTWFwPFN0cmluZywgSGFzaE1hcDxTdHJpbmcsIFN0YXRJbmZvPj4gcykKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJc3VwZXIobmV3IFN0cmluZ1tdIHsgIi1wIiB9KTsKIAkJCXN0YXRzID0gczsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJcC5wYXJzZShidWYsIDAsIGJ1Zi5sZW5ndGggLSAxKTsKIAkJCWFzc2VydEVxdWFscygiRmlsZSBjb3VudCAiICsgY2lkLCBmaWxlcy5zaXplKCksIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwogCQkJaWYgKCFwLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCWZvciAoZmluYWwgRm9ybWF0RXJyb3IgZSA6IHAuZ2V0RXJyb3JzKCkpIHsKKwkJCQlmb3IgKEZvcm1hdEVycm9yIGUgOiBwLmdldEVycm9ycygpKSB7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3IgIiArIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGF0ICIgKyBlLmdldExpbmVUZXh0KCkpOwogCQkJCX0KQEAgLTExMSw3ICsxMTEsNyBAQAogCQkJCWZhaWwoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gIiArIGNpZCk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgRmlsZUhlYWRlciBmaCA6IHAuZ2V0RmlsZXMoKSkgeworCQkJZm9yIChGaWxlSGVhZGVyIGZoIDogcC5nZXRGaWxlcygpKSB7CiAJCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lOwogCQkJCWlmIChmaC5nZXRDaGFuZ2VUeXBlKCkgIT0gRmlsZUhlYWRlci5DaGFuZ2VUeXBlLkRFTEVURSkKIAkJCQkJZmlsZU5hbWUgPSBmaC5nZXROZXdQYXRoKCk7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCQlmaW5hbCBTdHJpbmcgbmlkID0gZmlsZU5hbWUgKyAiIGluICIgKyBjaWQ7CiAJCQkJYXNzZXJ0Tm90TnVsbCgiTm8gIiArIG5pZCwgcyk7CiAJCQkJaW50IGFkZGVkID0gMCwgZGVsZXRlZCA9IDA7Ci0JCQkJZm9yIChmaW5hbCBIdW5rSGVhZGVyIGggOiBmaC5nZXRIdW5rcygpKSB7CisJCQkJZm9yIChIdW5rSGVhZGVyIGggOiBmaC5nZXRIdW5rcygpKSB7CiAJCQkJCWFkZGVkICs9IGguZ2V0T2xkSW1hZ2UoKS5nZXRMaW5lc0FkZGVkKCk7CiAJCQkJCWRlbGV0ZWQgKz0gaC5nZXRPbGRJbWFnZSgpLmdldExpbmVzRGVsZXRlZCgpOwogCQkJCX0KQEAgLTE0Nyw3ICsxNDcsNyBAQAogCQkJYXNzZXJ0VHJ1ZSgiTWlzc2VkIGZpbGVzIGluICIgKyBjaWQsIGZpbGVzLmlzRW1wdHkoKSk7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoZmluYWwgYnl0ZVtdIGJ1ZikgeworCQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoYnl0ZVtdIGJ1ZikgewogCQkJU3RyaW5nIHN0cjsKIAkJCXRyeSB7CiAJCQkJc3RyID0gbmV3IFN0cmluZyhidWYsIDAsIGJ1Zi5sZW5ndGggLSAxLCAiSVNPLTg4NTktMSIpOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbW1pdFJlYWRlciB7CiAJCXByaXZhdGUgUHJvY2VzcyBwcm9jOwogCi0JCUNvbW1pdFJlYWRlcihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb21taXRSZWFkZXIoU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZ1tdIHJlYWxBcmdzID0gbmV3IFN0cmluZ1szICsgYXJncy5sZW5ndGggKyAxXTsKIAkJCXJlYWxBcmdzWzBdID0gImdpdCI7CiAJCQlyZWFsQXJnc1sxXSA9ICJsb2ciOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzODM4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+CisgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAorICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQorICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmVld2FsazsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBTaW1wbGUgcGVyZm9ybWFuY2UgdGVzdCBmb3IgZ2l0IGFkZCAvIEZpbGVUcmVlSXRlcmF0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGludCBOX09GX0ZJTEVTID0gNTAxOworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybWFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWxvbmcgdGltZXNbXSA9IG5ldyBsb25nW05fT0ZfRklMRVNdOworCQkJbG9uZyBzdW0gPSAwOworCQkJU3RyaW5nIGxhc3ROYW1lID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgTl9PRl9GSUxFUzsgaSsrKSB7CisJCQkJbGFzdE5hbWUgPSAiYSIgKyAoaSArIDEwMDAwMCkgKyAiLnR4dCI7CisJCQkJd3JpdGVUcmFzaEZpbGUobGFzdE5hbWUsICIiKTsKKwkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGxhc3ROYW1lKS5jYWxsKCk7CisJCQkJbG9uZyBlbGFwc2VkID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKKwkJCQl0aW1lc1tpXSA9IGVsYXBzZWQ7CisJCQkJc3VtICs9IGVsYXBzZWQ7CisJCQl9CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsICjCtXMpICIgKyBzdW0gLyAxMDAwLjApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lcy5sZW5ndGg7IGkrKykgeworCQkJCVN5c3RlbS5vdXQKKwkJCQkJCS5wcmludGxuKCJUaW1lICIgKyBpICsgIiAowrVzKSA9ICIgKyB0aW1lc1tpXSAvIDEwMDAuMCk7CisJCQl9CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQkJd2Fsay5zZXRGaWx0ZXIoUGF0aEZpbHRlci5jcmVhdGUobGFzdE5hbWUpKTsKKwkJCQl3YWxrLmFkZFRyZWUoaXRlcik7CisJCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJCWlmICh3YWxrLm5leHQoKSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhbGsgdGltZSAowrVzKSA9ICIKKwkJCQkJCQkrIChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0KSAvIDEwMDAuMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmFpbCgiRmlsZSBub3QgZm91bmQiKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCmluZGV4IGZkZGVlZWMuLmU2YzcxMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGVzdDwvYXJ0aWZhY3RJZD4KQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgSlVuaXQgdGVzdHMgZm9yIHRoZSBjb3JlIGxpYnJhcnkuCiAgIDwvZGVzY3JpcHRpb24+CiAKKyAgPHByb3BlcnRpZXM+CisgICAgPG1hdmVuLmphdmFkb2Muc2tpcD50cnVlPC9tYXZlbi5qYXZhZG9jLnNraXA+CisgIDwvcHJvcGVydGllcz4KKwogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bAppbmRleCBjNzVhYjc2Li5mMzY4MDAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgICAgIGlmICJsaWIiIG5vdCBpbiBsYWJlbHM6CiAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKCJsaWIiKQogCisgICAgICAgICMgVE9ETyhodHRwOi8vZWNsaXAuc2UvNTM0Mjg1KTogTWFrZSB0aGlzIHRlc3QgcGFzcyByZWxpYWJseQorICAgICAgICAjIGFuZCByZW1vdmUgdGhlIGZsYWt5IGF0dHJpYnV0ZS4KKyAgICAgICAgZmxha3kgPSBzcmMuZW5kc3dpdGgoIkNyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YSIpCisKICAgICAgICAgYWRkaXRpb25hbF9kZXBzID0gW10KICAgICAgICAgaWYgc3JjLmVuZHN3aXRoKCJSb290TG9jYWxlVGVzdC5qYXZhIik6CiAgICAgICAgICAgICBhZGRpdGlvbmFsX2RlcHMgPSBbCkBAIC01Miw1ICs1Niw2IEBACiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdDpqdW5pdCIsCiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnM6amdpdC1sZnMiLAogICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGZsYWt5ID0gZmxha3ksCiAgICAgICAgICAgICBqdm1fZmxhZ3MgPSBbIi1YbXgyNTZtIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCJdLAogICAgICAgICApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCmluZGV4IDE3MjgwN2MuLjFkZDMyOWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAKIAlwcml2YXRlIFJhd1RleHQgYjsKIAotCXByaXZhdGUgQXBwbHlSZXN1bHQgaW5pdChmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBBcHBseVJlc3VsdCBpbml0KFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGluaXQobmFtZSwgdHJ1ZSwgdHJ1ZSk7CiAJfQogCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJYXNzZXJ0RmFsc2UobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk5vbkFTQ0lJRGVsIikuZXhpc3RzKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldFRlc3RSZXNvdXJjZShwYXRjaEZpbGUpOwogCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKQEAgLTI5MSw3ICsyOTEsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0VGVzdFJlc291cmNlKGZpbmFsIFN0cmluZyBwYXRjaEZpbGUpIHsKKwlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRUZXN0UmVzb3VyY2UoU3RyaW5nIHBhdGNoRmlsZSkgewogCQlyZXR1cm4gQXBwbHlDb21tYW5kVGVzdC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpCiAJCQkJLmdldFJlc291cmNlQXNTdHJlYW0oIm9yZy9lY2xpcHNlL2pnaXQvZGlmZi8iICsgcGF0Y2hGaWxlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YQppbmRleCBlZGFiOTZiLi4xMzAwZjk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEKQEAgLTIyOSwxMSArMjI5LDYgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwdXRFbnRyeShNb2NrT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpIHsKLQkJCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSwgbG9hZGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBwdXRFbnRyeShNb2NrT3V0cHV0U3RyZWFtIG91dCwgT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpIHsKIAkJCVN0cmluZyBjb250ZW50ID0gbW9kZSAhPSBGaWxlTW9kZS5UUkVFID8gbmV3IFN0cmluZyhsb2FkZXIuZ2V0Qnl0ZXMoKSkgOiBudWxsOwogCQkJZW50cmllcy5wdXQocGF0aCwgY29udGVudCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQmxhbWVDb21tYW5kVGVzdC5qYXZhCmluZGV4IGYzN2FhMTMuLjdhMWQyMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQmxhbWVDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQmxhbWVDb21tYW5kVGVzdC5qYXZhCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJdGVzdFJlbmFtZSgic3ViZGlyL2ZpbGUxLnR4dCIsICJvdGhlcmRpci9maWxlMS50eHQiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdGVzdFJlbmFtZShmaW5hbCBTdHJpbmcgc291cmNlUGF0aCwgZmluYWwgU3RyaW5nIGRlc3RQYXRoKQorCXByaXZhdGUgdm9pZCB0ZXN0UmVuYW1lKFN0cmluZyBzb3VyY2VQYXRoLCBTdHJpbmcgZGVzdFBhdGgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKIAkJCVN0cmluZ1tdIGNvbnRlbnQxID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiB9OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IDJmZTQwYjkuLjA4ZjFmZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKQEAgLTE5MSw2ICsxOTEsMTggQEAKIAkJCQktIGFsbEJlZm9yZSk7CiAJfQogCisJQFRlc3QoZXhwZWN0ZWQgPSBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEJyYW5jaEhFQUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIkhFQUQiKS5jYWxsKCk7CisJCWZhaWwoIkNyZWF0ZSBicmFuY2ggd2l0aCBpbnZhbGlkIHJlZiBuYW1lIHNob3VsZCBmYWlsIik7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEJyYW5jaERhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIi14IikuY2FsbCgpOworCQlmYWlsKCJDcmVhdGUgYnJhbmNoIHdpdGggaW52YWxpZCByZWYgbmFtZSBzaG91bGQgZmFpbCIpOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdExpc3RBbGxCcmFuY2hlc1Nob3VsZE5vdERpZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlzZXRVcFJlcG9XaXRoUmVtb3RlKCkuYnJhbmNoTGlzdCgpLnNldExpc3RNb2RlKExpc3RNb2RlLkFMTCkuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKaW5kZXggMzU0YjljNi4uZmJjMmNmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVDaGVycnlQaWNrKGZpbmFsIEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVDaGVycnlQaWNrKEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUsIGFkZCBhbmQgY29tbWl0IGZpbGUgYQogCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJhIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQppbmRleCAwZGQzNzQ5Li4zYTEzYWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuV3JvbmdSZXBvc2l0b3J5U3RhdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOwpAQCAtNTUzLDggKzU1Myw4IEBACiAJCQkJZ2l0LmNvbW1pdCgpLnNldEF1dGhvcigiTmV3IEF1dGhvciIsICJuZXdhdXRob3JAZXhhbXBsZS5vcmciKQogCQkJCQkJLnNldE1lc3NhZ2UoImFnYWluIG5vIGNoYW5nZSIpLnNldEFsbG93RW1wdHkoZmFsc2UpCiAJCQkJCQkuY2FsbCgpOwotCQkJCWZhaWwoIkRpZG4ndCBnZXQgdGhlIGV4cGVjdGVkIEVtdHB5Q29tbWl0RXhjZXB0aW9uIik7Ci0JCQl9IGNhdGNoIChFbXRweUNvbW1pdEV4Y2VwdGlvbiBlKSB7CisJCQkJZmFpbCgiRGlkbid0IGdldCB0aGUgZXhwZWN0ZWQgRW1wdHlDb21taXRFeGNlcHRpb24iKTsKKwkJCX0gY2F0Y2ggKEVtcHR5Q29tbWl0RXhjZXB0aW9uIGUpIHsKIAkJCQkvLyBleHBlY3QgdGhpcyBleGNlcHRpb24KIAkJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRPbmx5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRPbmx5VGVzdC5qYXZhCmluZGV4IGNjMjFiNDcuLmJiZDZlYzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEKQEAgLTEyODksNyArMTI4OSw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRIZWFkKGZpbmFsIEdpdCBnaXQsIGZpbmFsIFN0cmluZyBwYXRoKQorCXN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRIZWFkKEdpdCBnaXQsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmaW5hbCBSZXBvc2l0b3J5IHJlcG8gPSBnaXQuZ2V0UmVwb3NpdG9yeSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YQppbmRleCA3OWRhMmRhLi5hNDIyZWY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTQsNyArNTQsNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuUmVmTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW52YWxpZFBhdHRlcm5FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC02OCwxMyArNjcsMTggQEAKIAogCXByaXZhdGUgR2l0IGdpdDsKIAotCUBQYXJhbWV0ZXIKKwlAUGFyYW1ldGVyKDApCiAJcHVibGljIGJvb2xlYW4gdXNlQW5ub3RhdGVkVGFnczsKIAotCUBQYXJhbWV0ZXJzCisJQFBhcmFtZXRlcigxKQorCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlVXNlQWxsVGFnczsKKworCUBQYXJhbWV0ZXJzKG5hbWUgPSAiZ2l0IHRhZyAtYSB7MH0/LWE6IHdpdGggZ2l0IGRlc2NyaWJlIHsxfT8tLXRhZ3M6IikKIAlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Qm9vbGVhbltdPiBnZXRVc2VBbm5vdGF0ZWRUYWdzVmFsdWVzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQm9vbGVhbltdW10geyB7IEJvb2xlYW4uVFJVRSB9LAotCQkJCXsgQm9vbGVhbi5GQUxTRSB9IH0pOworCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQm9vbGVhbltdW10geyB7IEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRSB9LAorCQkJCXsgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5GQUxTRSB9LAorCQkJCXsgQm9vbGVhbi5UUlVFLCBCb29sZWFuLlRSVUUgfSwKKwkJCQl7IEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSB9IH0pOwogCX0KIAogCUBPdmVycmlkZQpAQCAtOTksMzUgKzEwMyw1MiBAQAogCQl0YWcoImJvYi10MiIpOwogCiAJCU9iamVjdElkIGM0ID0gbW9kaWZ5KCJkZGQiKTsKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIzZTU2M2M1Iik7CiAKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMSkpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMxLCB0cnVlKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzEsICJhKiIsICJiKiIsICJjKiIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYWxpY2UqIikpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMyLCAiYm9iKiIpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMiwgIj9vYioiKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMiwgImEqIiwgImIqIiwgImMqIikpOwogCi0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMC1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYWxpY2UqIikpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTEtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgImE/P2M/LXQqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiYm9iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgIj9vYioiKSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJhKiIsICJiKiIsICJjKiIpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgfHwgZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMiwgImFsaWNlKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMiwgImEqIiwgImIqIiwgImMqIikpOwogCi0JCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiM2U1NjNjNSIpOwotCQkvLyB0aGUgdmFsdWUgdmVyaWZpZWQgd2l0aCBnaXQtZGVzY3JpYmUoMSkKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0KSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTItZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImFsaWNlKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYm9iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0wLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsIHRydWUpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhPz9jPy10KiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJib2IqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgIj9vYioiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiYSoiLCAiYioiLCAiYyoiKSk7CisKKwkJCS8vIHRoZSB2YWx1ZSB2ZXJpZmllZCB3aXRoIGdpdC1kZXNjcmliZSgxKQorCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0KSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsIHRydWUpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMi1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYm9iKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImEqIiwgImIqIiwgImMqIikpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMyKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzMpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAKIAkJLy8gdGVzdCBkZWZhdWx0IHRhcmdldAotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZ2l0LmRlc2NyaWJlKCkuY2FsbCgpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBnaXQuZGVzY3JpYmUoKS5jYWxsKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsCisJCQkJCWdpdC5kZXNjcmliZSgpLnNldFRhZ3MoZmFsc2UpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwKKwkJCQkJZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyh0cnVlKS5jYWxsKCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5kZXNjcmliZSgpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyhmYWxzZSkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLAorCQkJCQlnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKHRydWUpLmNhbGwoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTM3LDcgKzE1OCwxNCBAQAogCQl0YWcoInYxLjEuMSIpOwogCQlPYmplY3RJZCBjMiA9IG1vZGlmeSgiYmJiIik7CiAKLQkJLy8gRW5zdXJlIHRoYXQgaWYgd2UncmUgaW50ZXJlc3RlZCBpbiBhbnkgdGFncywgd2UgZ2V0IHRoZSBmaXJzdCBtYXRjaCBhcyBwZXIgR2l0IGJlaGF2aW91cgorCQlpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMxKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEVuc3VyZSB0aGF0IGlmIHdlJ3JlIGludGVyZXN0ZWQgaW4gYW55IHRhZ3MsIHdlIGdldCB0aGUgZmlyc3QgbWF0Y2gKKwkJLy8gYXMgcGVyIEdpdCBiZWhhdmlvdXIKIAkJYXNzZXJ0RXF1YWxzKCJ2MS4wLjAiLCBkZXNjcmliZShjMSkpOwogCQlhc3NlcnRFcXVhbHMoInYxLjAuMC0xLWczNzQ3ZGIzIiwgZGVzY3JpYmUoYzIpKTsKIApAQCAtMTc5LDcgKzIwNywxMSBAQAogCQlPYmplY3RJZCBjNCA9IG1lcmdlKGMyKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjExOTg5MmIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0LTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLyAyIGNvbW1pdHM6IGM0IGFuZCBjMworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiMiBjb21taXRzOiBjNCBhbmQgYzMiLCAidC0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzMpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMywgdHJ1ZSkpOwogCX0KQEAgLTIxMSwxNCArMjQzLDc2IEBACiAJCWJyYW5jaCgiYiIsIGMxKTsKIAogCQlPYmplY3RJZCBjMyA9IG1vZGlmeSgiY2NjIik7CisJCWFzc2VydE5hbWVTdGFydHNXaXRoKGMzLCAiMDI0NGU3ZiIpOwogCiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOwotCQlhc3NlcnRFcXVhbHMoInQyLTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLyAyIGNvbW1pdHM6IGM0IGFuZCBjMworCisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0Mi0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8gMiBjb21taXRzOiBjNCBhbmQgYzMKKwkJCWFzc2VydEVxdWFscygidDEtMS1nMDI0NGU3ZiIsIGRlc2NyaWJlKGMzKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzQpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOworCQl9CisJfQorCisJLyoqCisJICogV2hlbiB0MSBhbm5vdGF0ZWQgZG9taW5hdGVzIHQyIGxpZ2h0d2VpZ2h0IHRhZworCSAqCisJICogPHByZT4KKwkgKiB0MSAtKy0+IHQyICAtCisJICogICAgIHwgICAgICAgfAorCSAqICAgICArLT4gYzMgLSstPiBjNAorCSAqIDwvcHJlPgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHQxQW5ub3RhdGVkRG9taW5hdGVzVDJsaWdodHdlaWdodCgpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3RJZCBjMSA9IG1vZGlmeSgiYWFhIik7CisJCXRhZygidDEiLCB1c2VBbm5vdGF0ZWRUYWdzKTsKKworCQlPYmplY3RJZCBjMiA9IG1vZGlmeSgiYmJiIik7CisJCXRhZygidDIiLCBmYWxzZSk7CisKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzIsICIzNzQ3ZGIzIik7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzICYmICFkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIm9ubHkgYW5ub3RhdGVkIHRhZyB0MSBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBkZXNjcmliZSIsCisJCQkJCSJ0MS0xLWczNzQ3ZGIzIiwgZGVzY3JpYmUoYzIpKTsgLy8gMSBjb21taXRzOiB0MiBvdmVycmlkZGVuCisJCQkJCQkJCQkJCQkJLy8gYnkgdDEKKwkJfSBlbHNlIGlmICghdXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoIm5vIGNvbW1pdHMgdG8gZGVzY3JpYmUgZXhwZWN0ZWQiLCBudWxsLCBkZXNjcmliZShjMikpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKCJsaWdodHdlaWdodCB0YWcgdDIgZXhwZWN0ZWQgaW4gZGVzY3JpYmUiLCAidDIiLAorCQkJCQlkZXNjcmliZShjMikpOworCQl9CisKKwkJYnJhbmNoKCJiIiwgYzEpOworCisJCU9iamVjdElkIGMzID0gbW9kaWZ5KCJjY2MiKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjMywgIjAyNDRlN2YiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0MS0xLWcwMjQ0ZTdmIiwgZGVzY3JpYmUoYzMpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgfHwgZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoInQxLTEtZzAyNDRlN2YiLCBkZXNjcmliZShjMykpOworCQl9CisKKwkJT2JqZWN0SWQgYzQgPSBtZXJnZShjMik7CisKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIxMTk4OTJiIik7CisJCWlmIChkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIjIgY29tbWl0cyBmb3IgZGVzY3JpYmUgY29tbWl0IGluY3JlbWVudCBleHBlY3RlZCBzaW5jZSBsaWdodHdlaWdodCB0YWc6IGM0IGFuZCBjMyIsCisJCQkJCSJ0Mi0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8gMiBjb21taXRzOiBjNCBhbmQgYzMKKwkJfSBlbHNlIGlmICghdXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoIm5vIG1hdGNoaW5nIGNvbW1pdHMgZXhwZWN0ZWQiLCBudWxsLCBkZXNjcmliZShjNCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiMyBjb21taXRzIGZvciBkZXNjcmliZSBjb21taXQgaW5jcmVtZW50IGV4cGVjdGVkIHNpbmNlIGFubm90YXRlZCB0YWc6IGM0IGFuZCBjMyBhbmQgYzIiLAorCQkJCQkidDEtMy1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vCisJCX0KIAl9CiAKIAkvKioKQEAgLTI0Niw3ICszNDAsMTEgQEAKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZSh0MSk7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDEtMy1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0zLWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJLyoqCkBAIC0yNzUsNyArMzczLDExIEBACiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiYmIzODlhNCIpOwotCQlhc3NlcnRFcXVhbHMoInQyLTQtZ2JiMzg5YTQiLCBkZXNjcmliZShjNCkpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygidDItNC1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzQpKTsKKwkJfQogCX0KIAogCXByaXZhdGUgT2JqZWN0SWQgbWVyZ2UoT2JqZWN0SWQgYzIpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewpAQCAtMjg5LDEwICszOTEsMTUgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgdGFnKFN0cmluZyB0YWcpIHRocm93cyBHaXRBUElFeGNlcHRpb24geworCQl0YWcodGFnLCB0aGlzLnVzZUFubm90YXRlZFRhZ3MpOworCX0KKworCXByaXZhdGUgdm9pZCB0YWcoU3RyaW5nIHRhZywgYm9vbGVhbiBhbm5vdGF0ZWRUYWcpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQlUYWdDb21tYW5kIHRhZ0NvbW1hbmQgPSBnaXQudGFnKCkuc2V0TmFtZSh0YWcpCi0JCQkJLnNldEFubm90YXRlZCh1c2VBbm5vdGF0ZWRUYWdzKTsKLQkJaWYgKHVzZUFubm90YXRlZFRhZ3MpCisJCQkJLnNldEFubm90YXRlZChhbm5vdGF0ZWRUYWcpOworCQlpZiAoYW5ub3RhdGVkVGFnKSB7CiAJCQl0YWdDb21tYW5kLnNldE1lc3NhZ2UodGFnKTsKKwkJfQogCQl0YWdDb21tYW5kLmNhbGwoKTsKIAl9CiAKQEAgLTMwNCwxNSArNDExLDE3IEBACiAKIAlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgYm9vbGVhbiBsb25nRGVzYykKIAkJCXRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0TG9uZyhsb25nRGVzYykuY2FsbCgpOworCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRUYWdzKGRlc2NyaWJlVXNlQWxsVGFncykKKwkJCQkuc2V0TG9uZyhsb25nRGVzYykuY2FsbCgpOwogCX0KIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBkZXNjcmliZShjMSwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBTdHJpbmcuLi4gcGF0dGVybnMpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBJbnZhbGlkUGF0dGVybkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldE1hdGNoKHBhdHRlcm5zKS5jYWxsKCk7CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIFN0cmluZy4uLiBwYXR0ZXJucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQorCQkJCS5zZXRNYXRjaChwYXR0ZXJucykuY2FsbCgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoT2JqZWN0SWQgYzQsIFN0cmluZyBwcmVmaXgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFN0cmVhbVR5cGVVdGlsVGVzdC5qYXZhCmluZGV4IDFlM2EzOWEuLmJiMzAzY2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5BVVRPX0NSTEY7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5BVVRPX0xGOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnLkVvbFN0cmVhbVR5cGUuRElSRUNUOwpAQCAtMTUwLDggKzE1MCw4IEBACiAJCQlFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVXaXRoQmluYXJ5Q2hlY2ssIFN0cmluZyBvdXRwdXQsCiAJCQlTdHJpbmcgZXhwZWN0ZWRDb252ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGI7Ci0JCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IG91dHB1dC5nZXRCeXRlcyhVVEZfOCk7Ci0JCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IG91dHB1dC5nZXRCeXRlcyhDSEFSU0VUKTsKKwkJYnl0ZVtdIGV4cGVjdGVkQ29udmVyc2lvbkJ5dGVzID0gZXhwZWN0ZWRDb252ZXJzaW9uLmdldEJ5dGVzKENIQVJTRVQpOwogCiAJCS8vIHRlc3QgdXNpbmcgb3V0cHV0IHRleHQgYW5kIGFzc3VtaW5nIGl0IHdhcyBkZWNsYXJlZCBURVhUCiAJCWIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CkBAIC0yNzcsOCArMjc3LDggQEAKIAlwcml2YXRlIHZvaWQgdGVzdENoZWNraW4oRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlVGV4dCwKIAkJCUVvbFN0cmVhbVR5cGUgc3RyZWFtVHlwZVdpdGhCaW5hcnlDaGVjaywgU3RyaW5nIGlucHV0LAogCQkJU3RyaW5nIGV4cGVjdGVkQ29udmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBpbnB1dEJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoVVRGXzgpOwotCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gaW5wdXRCeXRlcyA9IGlucHV0LmdldEJ5dGVzKENIQVJTRVQpOworCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAKIAkJLy8gdGVzdCB1c2luZyBpbnB1dCB0ZXh0IGFuZCBhc3N1bWluZyBpdCB3YXMgZGVjbGFyZWQgVEVYVAogCQl0cnkgKElucHV0U3RyZWFtIGluID0gRW9sU3RyZWFtVHlwZVV0aWwud3JhcElucHV0U3RyZWFtKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YQppbmRleCA1MzBmYjFiLi5hZGM0ZDk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YQpAQCAtNDMsMTIgKzQzLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5KR2l0VGVzdFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwpAQCAtMTA1LDYgKzExMCwyNSBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcmNlZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQiKS5jYWxsKCk7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQyIikuY2FsbCgpOworCQlnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9tYXN0ZXIiKS5jYWxsKCk7CisKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldEFtZW5kKHRydWUpLnNldE1lc3NhZ2UoImFtZW5kZWQiKS5jYWxsKCk7CisJCUZldGNoUmVzdWx0IHJlcyA9IGdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RXF1YWxzKFJlZlVwZGF0ZS5SZXN1bHQuUkVKRUNURUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwkJcmVzID0gZ2l0LmZldGNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkuc2V0UmVmU3BlY3MoInJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyIikKKwkJCQkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkuY2FsbCgpOworCQlhc3NlcnRFcXVhbHMoUmVmVXBkYXRlLlJlc3VsdC5GT1JDRUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkc0JyYW5jaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2gxID0gImIxIjsKIAkJZmluYWwgU3RyaW5nIGJyYW5jaDIgPSAiYjIiOwpAQCAtMjc1LDYgKzI5OSw0NSBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aFBydW5lU2hvdWxkS2VlcE9yaWdpbkhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGEgY29tbWl0IGluIHRoZSB0ZXN0IHJlcG8uCisJCWNvbW1pdEZpbGUoImZvbyIsICJmb28iLCAibWFzdGVyIik7CisJCS8vIFByb2R1Y2UgYSByZWFsIGNsb25lIG9mIHRoZSBnaXQgcmVwbworCQlHaXQgY2xvbmVkID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q2xvbmVSZXBvc2l0b3J5IikpCisJCQkJLnNldFVSSSgiZmlsZTovLyIKKwkJCQkJCSsgZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpKQorCQkJCS5jYWxsKCk7CisJCWFzc2VydE5vdE51bGwoY2xvbmVkKTsKKwkJUmVwb3NpdG9yeSBjbG9uZWRSZXBvID0gY2xvbmVkLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoY2xvbmVkUmVwbyk7CisJCU9iamVjdElkIG9yaWdpbk1hc3RlcklkID0gY2xvbmVkUmVwbworCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSBvcmlnaW4vbWFzdGVyIiwgb3JpZ2luTWFzdGVySWQpOworCQlhc3NlcnROb3RFcXVhbHMoIm9yaWdpbi9tYXN0ZXIgc2hvdWxkIG5vdCBiZSB6ZXJvIElEIiwKKwkJCQlPYmplY3RJZC56ZXJvSWQoKSwgb3JpZ2luTWFzdGVySWQpOworCQkvLyBDYW5vbmljYWwgZ2l0IGNyZWF0ZXMgb3JpZ2luL0hFQUQ7IEpHaXQgKGZvciBub3cpIGRvZXNuJ3QuIExldCdzCisJCS8vIHByZXRlbmQgd2UgZGlkIHRoZSBjbG9uZSB2aWEgY29tbWFuZC1saW5lIGdpdC4KKwkJT2JqZWN0SWQgb3JpZ2luSGVhZElkID0gY2xvbmVkUmVwby5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQiKTsKKwkJaWYgKG9yaWdpbkhlYWRJZCA9PSBudWxsKSB7CisJCQlKR2l0VGVzdFV0aWwud3JpdGUoCisJCQkJCW5ldyBGaWxlKGNsb25lZFJlcG8uZ2V0RGlyZWN0b3J5KCksCisJCQkJCQkJInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpLAorCQkJCQkicmVmOiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlclxuIik7CisJCQlvcmlnaW5IZWFkSWQgPSBjbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpOworCQl9CisJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgb3JpZ2luL0hFQUQiLCBvcmlnaW5NYXN0ZXJJZCwgb3JpZ2luSGVhZElkKTsKKwkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gY2xvbmVkLmZldGNoKCkuc2V0UmVtb3RlKCJvcmlnaW4iKQorCQkJCS5zZXRSZW1vdmVEZWxldGVkUmVmcyh0cnVlKS5jYWxsKCk7CisJCWFzc2VydFRydWUoIkZldGNoIGFmdGVyIGNsb25lIHNob3VsZCBiZSB1cC10by1kYXRlIiwKKwkJCQlyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJvcmlnaW4vbWFzdGVyIHNob3VsZCBzdGlsbCBleGlzdCIsIG9yaWdpbk1hc3RlcklkLAorCQkJCWNsb25lZFJlcG8ucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKSk7CisJCWFzc2VydEVxdWFscygib3JpZ2luL0hFQUQgc2hvdWxkIGJlIHVuY2hhbmdlZCIsIG9yaWdpbkhlYWRJZCwKKwkJCQljbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkUmVmc1dpdGhEdXBsaWNhdGVSZWZzcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2hOYW1lID0gImJyYW5jaCI7CiAJCWZpbmFsIFN0cmluZyByZW1vdGVCcmFuY2hOYW1lID0gInRlc3QvIiArIGJyYW5jaE5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEKaW5kZXggYmQwZWZhZC4uNGVmNTExZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZFRlc3QuamF2YQpAQCAtMTE2LDcgKzExNiw3IEBACiAJCUl0ZXJhdG9yPFJldkNvbW1pdD4gbG9nID0gZ2l0LmxvZygpLmFsbCgpLmNhbGwoKS5pdGVyYXRvcigpOwogCQlhc3NlcnRUcnVlKGxvZy5oYXNOZXh0KCkpOwogCQlSZXZDb21taXQgY29tbWl0ID0gbG9nLm5leHQoKTsKLQkJdGFnID0gZGIucGVlbCh0YWcpOworCQl0YWcgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnKTsKIAogCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldE5hbWUoKSwgdGFnLmdldFBlZWxlZE9iamVjdElkKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZShjb21taXRzLmNvbnRhaW5zKGNvbW1pdCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCA0YjIzMzQ5Li45YWYwMDNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLk1lcmdlQ29tbWFuZC5GYXN0Rm9yd2FyZE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VSZXN1bHQuTWVyZ2VTdGF0dXM7CkBAIC0xNTg0LDI3ICsxNTg1LDMxIEBACiAJCWFzc2VydEVxdWFscyhNZXJnZVN0YXR1cy5DT05GTElDVElORywgcmVzdWx0LmdldE1lcmdlU3RhdHVzKCkpOwogCX0KIAorCXByaXZhdGUgUmVmIHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7CisJCVJldkNvbW1pdCBpbml0aWFsQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwiKS5jYWxsKCk7CisKKwkJY3JlYXRlQnJhbmNoKGluaXRpYWxDb21taXQsICJyZWZzL2hlYWRzL3NpZGUiKTsKKwkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvc2lkZSIpOworCisJCXdyaXRlVHJhc2hGaWxlKCJiIiwgIjFcbmJcbjNcbiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImIiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJzaWRlIikuY2FsbCgpOworCisJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpOworCisJCXdyaXRlVHJhc2hGaWxlKCJjIiwgIjFcbmNcbjNcbiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImMiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJtYWluIikuY2FsbCgpOworCisJCXJldHVybiBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9zaWRlIik7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoTWVzc2FnZU9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewotCQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYVxuM1xuIik7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7Ci0JCQlSZXZDb21taXQgaW5pdGlhbENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIikuY2FsbCgpOwotCi0JCQljcmVhdGVCcmFuY2goaW5pdGlhbENvbW1pdCwgInJlZnMvaGVhZHMvc2lkZSIpOwotCQkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvc2lkZSIpOwotCi0JCQl3cml0ZVRyYXNoRmlsZSgiYiIsICIxXG5iXG4zXG4iKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYiIpLmNhbGwoKTsKLQkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJzaWRlIikuY2FsbCgpOwotCi0JCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKTsKLQotCQkJd3JpdGVUcmFzaEZpbGUoImMiLCAiMVxuY1xuM1xuIik7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImMiKS5jYWxsKCk7Ci0JCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWFpbiIpLmNhbGwoKTsKLQotCQkJUmVmIHNpZGVCcmFuY2ggPSBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9zaWRlIik7CisJCQlSZWYgc2lkZUJyYW5jaCA9IHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoZ2l0KTsKIAogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCiAJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CkBAIC0xNjE4LDYgKzE2MjMsNDMgQEAKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhDaGFuZ2VJZCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJUmVmIHNpZGVCcmFuY2ggPSBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKGdpdCk7CisKKwkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKQorCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQodHJ1ZSkuY2FsbCgpOworCisJCQlhc3NlcnROdWxsKGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKworCQkJSXRlcmF0b3I8UmV2Q29tbWl0PiBpdCA9IGdpdC5sb2coKS5jYWxsKCkuaXRlcmF0b3IoKTsKKwkJCVJldkNvbW1pdCBuZXdIZWFkID0gaXQubmV4dCgpOworCQkJU3RyaW5nIGNvbW1pdE1lc3NhZ2UgPSBuZXdIZWFkLmdldEZ1bGxNZXNzYWdlKCk7CisJCQlhc3NlcnRUcnVlKFBhdHRlcm4uY29tcGlsZSgiXG5DaGFuZ2UtSWQ6IElbMC05YS1mQS1GXXs0MH1cbiIpCisJCQkJCS5tYXRjaGVyKGNvbW1pdE1lc3NhZ2UpLmZpbmQoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhNZXNzYWdlQW5kQ2hhbmdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCVJlZiBzaWRlQnJhbmNoID0gcHJlcGFyZVN1Y2Nlc3NmdWxNZXJnZShnaXQpOworCisJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKKwkJCQkJLnNldE1lc3NhZ2UoInVzZXIgbWVzc2FnZSIpLnNldEluc2VydENoYW5nZUlkKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0TnVsbChkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisKKwkJCUl0ZXJhdG9yPFJldkNvbW1pdD4gaXQgPSBnaXQubG9nKCkuY2FsbCgpLml0ZXJhdG9yKCk7CisJCQlSZXZDb21taXQgbmV3SGVhZCA9IGl0Lm5leHQoKTsKKwkJCVN0cmluZyBjb21taXRNZXNzYWdlID0gbmV3SGVhZC5nZXRGdWxsTWVzc2FnZSgpOworCQkJYXNzZXJ0VHJ1ZShjb21taXRNZXNzYWdlLnN0YXJ0c1dpdGgoInVzZXIgbWVzc2FnZVxuXG4iKSk7CisJCQlhc3NlcnRUcnVlKFBhdHRlcm4uY29tcGlsZSgiXG5DaGFuZ2UtSWQ6IElbMC05YS1mQS1GXXs0MH1cbiIpCisJCQkJCS5tYXRjaGVyKGNvbW1pdE1lc3NhZ2UpLmZpbmQoKSk7CisJCX0KKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNZXJnZUNvbmZsaWN0V2l0aE1lc3NhZ2VPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKIAkJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOwpAQCAtMTY1Nyw3ICsxNjk5LDcgQEAKIAkJCQkuZ2V0V29ya1RyZWUoKSwgcGF0aCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFJldkNvbW1pdCBhZGRBbGxBbmRDb21taXQoZmluYWwgR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgUmV2Q29tbWl0IGFkZEFsbEFuZENvbW1pdChHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOwogCQlyZXR1cm4gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm1lc3NhZ2UiKS5jYWxsKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Ob3Rlc0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YQppbmRleCA2ZTA2ZTk1Li5lMjM0YWEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC04OCw3ICs4OCw3IEBACiAJCWdpdC5ub3Rlc0FkZCgpLnNldE9iamVjdElkKGNvbW1pdDIpLnNldE1lc3NhZ2UoImRhdGEiKS5jYWxsKCk7CiAJCU5vdGUgbm90ZSA9IGdpdC5ub3Rlc1Nob3coKS5zZXRPYmplY3RJZChjb21taXQyKS5jYWxsKCk7CiAJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhkYi5vcGVuKG5vdGUuZ2V0RGF0YSgpKS5nZXRDYWNoZWRCeXRlcygpLAotCQkJCVVURl84KTsKKwkJCQlDSEFSU0VUKTsKIAkJYXNzZXJ0RXF1YWxzKGNvbnRlbnQsICJkYXRhIik7CiAKIAkJZ2l0Lm5vdGVzUmVtb3ZlKCkuc2V0T2JqZWN0SWQoY29tbWl0MikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKaW5kZXggOTQ2MWM0Mi4uMGIwZTNiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTU5Miw3ICs1OTIsNyBAQAogCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoRmlsZSBhY3RGaWxlLCBTdHJpbmcgc3RyaW5nKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFjdEZpbGUpKSB7Ci0JCQlmb3Mud3JpdGUoc3RyaW5nLmdldEJ5dGVzKFVURl84KSk7CisJCQlmb3Mud3JpdGUoc3RyaW5nLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJfQogCX0KIApAQCAtNjA2LDcgKzYwNiw3IEBACiAJCQkJYm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7CiAJCQkJcmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcik7CiAJCQl9Ci0JCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIFVURl84KTsKKwkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCk7CiAJCQlhc3NlcnRFcXVhbHMoc3RyaW5nLCBjb250ZW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKaW5kZXggOTEzYjRhYy4uYjM0OWM2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJCQlib3Mud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKIAkJCQlyZWFkID0gZmlzLnJlYWQoYnVmZmVyKTsKIAkJCX0KLQkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgVVRGXzgpOworCQkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpLCBDSEFSU0VUKTsKIAkJCWFzc2VydEVxdWFscyhzdHJpbmcsIGNvbnRlbnQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKaW5kZXggZTBjMTQ5OS4uMWFmMzdlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcml2YXRlIEZpbGUgd3JpdGVIb29rRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpICsgIi8uZ2l0L2hvb2tzLyIsIG5hbWUpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUocGF0aCwgZGF0YSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggMmJmOTFhZS4uOTZlNzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CkBAIC0xNDY0LDcgKzE0NjQsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkdJVF9BVVRIT1JfREFURT0nQDEyMzQ1Njc4OSAtMDEwMCciLCBsaW5lc1syXSk7CiAKIAkJUGVyc29uSWRlbnQgcGFyc2VkSWRlbnQgPSBnaXQucmViYXNlKCkucGFyc2VBdXRob3IoCi0JCQkJY29udmVydGVkQXV0aG9yLmdldEJ5dGVzKFVURl84KSk7CisJCQkJY29udmVydGVkQXV0aG9yLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0RXF1YWxzKGlkZW50LmdldE5hbWUoKSwgcGFyc2VkSWRlbnQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGlkZW50LmdldEVtYWlsQWRkcmVzcygpLCBwYXJzZWRJZGVudC5nZXRFbWFpbEFkZHJlc3MoKSk7CiAJCS8vIHRoaXMgaXMgcm91bmRlZCB0byB0aGUgbGFzdCBzZWNvbmQKQEAgLTE0ODEsNyArMTQ4MSw3IEBACiAJCWFzc2VydEVxdWFscygiR0lUX0FVVEhPUl9EQVRFPSdAMTIzNDU2Nzg5ICswOTMwJyIsIGxpbmVzWzJdKTsKIAogCQlwYXJzZWRJZGVudCA9IGdpdC5yZWJhc2UoKS5wYXJzZUF1dGhvcigKLQkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0TmFtZSgpLCBwYXJzZWRJZGVudC5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0RW1haWxBZGRyZXNzKCksIHBhcnNlZElkZW50LmdldEVtYWlsQWRkcmVzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKDEyMzQ1Njc4OTAwMEwsIHBhcnNlZElkZW50LmdldFdoZW4oKS5nZXRUaW1lKCkpOwpAQCAtMjEwNCw3ICsyMTA0LDcgQEAKIAkJaW50IGNvdW50ID0gMDsKIAkJRmlsZSB0b2RvRmlsZSA9IGdldFRvZG9GaWxlKCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0odG9kb0ZpbGUpLCBVVEZfOCkpKSB7CisJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbSh0b2RvRmlsZSksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwogCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewogCQkJCWludCBmaXJzdEJsYW5rID0gbGluZS5pbmRleE9mKCcgJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhCmluZGV4IGJhNTE4ODEuLjhmNTZhOTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhCkBAIC0xMDAsMzkgKzEwMCwzOSBAQAogCQlGaWxlIG5lc3RlZEZpbGUgPSBuZXcgRmlsZShkaXIsICJiLnR4dCIpOwogCQlGaWxlVXRpbHMuY3JlYXRlTmV3RmlsZShuZXN0ZWRGaWxlKTsKIAotCQlQcmludFdyaXRlciBuZXN0ZXJGaWxlV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5lc3RlZEZpbGUpOwotCQluZXN0ZXJGaWxlV3JpdGVyLnByaW50KCJjb250ZW50Iik7Ci0JCW5lc3RlckZpbGVXcml0ZXIuZmx1c2goKTsKKwkJdHJ5IChQcmludFdyaXRlciBuZXN0ZWRGaWxlV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5lc3RlZEZpbGUpKSB7CisJCQluZXN0ZWRGaWxlV3JpdGVyLnByaW50KCJjb250ZW50Iik7CisJCQluZXN0ZWRGaWxlV3JpdGVyLmZsdXNoKCk7CiAKLQkJLy8gY3JlYXRlIGZpbGUKLQkJaW5kZXhGaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImEudHh0Iik7Ci0JCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKGluZGV4RmlsZSk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihpbmRleEZpbGUpOwotCQl3cml0ZXIucHJpbnQoImNvbnRlbnQiKTsKLQkJd3JpdGVyLmZsdXNoKCk7CisJCQkvLyBjcmVhdGUgZmlsZQorCQkJaW5kZXhGaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImEudHh0Iik7CisJCQlGaWxlVXRpbHMuY3JlYXRlTmV3RmlsZShpbmRleEZpbGUpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoaW5kZXhGaWxlKSkgeworCQkJCXdyaXRlci5wcmludCgiY29udGVudCIpOworCQkJCXdyaXRlci5mbHVzaCgpOwogCi0JCS8vIGFkZCBmaWxlIGFuZCBjb21taXQgaXQKLQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJkaXIiKS5hZGRGaWxlcGF0dGVybigiYS50eHQiKS5jYWxsKCk7Ci0JCXNlY29uZENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgYS50eHQgYW5kIGRpci9iLnR4dCIpCi0JCQkJLmNhbGwoKTsKKwkJCQkvLyBhZGQgZmlsZSBhbmQgY29tbWl0IGl0CisJCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJkaXIiKS5hZGRGaWxlcGF0dGVybigiYS50eHQiKS5jYWxsKCk7CisJCQkJc2Vjb25kQ29tbWl0ID0gZ2l0LmNvbW1pdCgpCisJCQkJCQkuc2V0TWVzc2FnZSgiYWRkaW5nIGEudHh0IGFuZCBkaXIvYi50eHQiKS5jYWxsKCk7CiAKLQkJcHJlc3RhZ2UgPSBEaXJDYWNoZS5yZWFkKGRiLmdldEluZGV4RmlsZSgpLCBkYi5nZXRGUygpKS5nZXRFbnRyeSgKLQkJCQlpbmRleEZpbGUuZ2V0TmFtZSgpKTsKKwkJCQlwcmVzdGFnZSA9IERpckNhY2hlLnJlYWQoZGIuZ2V0SW5kZXhGaWxlKCksIGRiLmdldEZTKCkpCisJCQkJCQkuZ2V0RW50cnkoaW5kZXhGaWxlLmdldE5hbWUoKSk7CiAKLQkJLy8gbW9kaWZ5IGZpbGUgYW5kIGFkZCB0byBpbmRleAotCQl3cml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQluZXN0ZXJGaWxlV3JpdGVyLnByaW50KCJuZXcgY29udGVudCIpOwotCQluZXN0ZXJGaWxlV3JpdGVyLmNsb3NlKCk7CisJCQkJLy8gbW9kaWZ5IGZpbGUgYW5kIGFkZCB0byBpbmRleAorCQkJCXdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKKwkJCX0KKwkJCW5lc3RlZEZpbGVXcml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7CisJCX0KIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmFkZEZpbGVwYXR0ZXJuKCJkaXIiKS5jYWxsKCk7CiAKIAkJLy8gY3JlYXRlIGEgZmlsZSBub3QgYWRkZWQgdG8gdGhlIGluZGV4CiAJCXVudHJhY2tlZEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLAogCQkJCSJub3RBZGRlZFRvSW5kZXgudHh0Iik7CiAJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKHVudHJhY2tlZEZpbGUpOwotCQlQcmludFdyaXRlciB3cml0ZXIyID0gbmV3IFByaW50V3JpdGVyKHVudHJhY2tlZEZpbGUpOwotCQl3cml0ZXIyLnByaW50KCJjb250ZW50Iik7Ci0JCXdyaXRlcjIuY2xvc2UoKTsKKwkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIyID0gbmV3IFByaW50V3JpdGVyKHVudHJhY2tlZEZpbGUpKSB7CisJCQl3cml0ZXIyLnByaW50KCJjb250ZW50Iik7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCmluZGV4IGVhNjMxMDQuLmQ3N2M0ZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKQEAgLTM3OSw3ICszNzksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcHJlcGFyZVJldmVydChmaW5hbCBHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJldkNvbW1pdCBwcmVwYXJlUmV2ZXJ0KEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUsIGFkZCBhbmQgY29tbWl0IGZpbGUgYQogCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJhIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggYjlmOWY1Yi4uM2I1ODJkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEKQEAgLTk0LDcgKzk0LDcgQEAKIAkJdW50cmFja2VkRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJ1bnRyYWNrZWQudHh0IiwgImNvbnRlbnQiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTdGFzaGVkQ29tbWl0KGZpbmFsIFJldkNvbW1pdCBjb21taXQpCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU3Rhc2hlZENvbW1pdChSZXZDb21taXQgY29tbWl0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdmFsaWRhdGVTdGFzaGVkQ29tbWl0KGNvbW1pdCwgMik7CiAJfQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybiB3YWxrOwogCX0KIAotCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZXb3JraW5nQWdhaW5zdEhlYWQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmV29ya2luZ0FnYWluc3RIZWFkKFJldkNvbW1pdCBjb21taXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBjcmVhdGVUcmVlV2FsaygpKSB7CiAJCQl3YWxrLmFkZFRyZWUoY29tbWl0LmdldFBhcmVudCgwKS5nZXRUcmVlKCkpOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQorCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZJbmRleEFnYWluc3RIZWFkKFJldkNvbW1pdCBjb21taXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBjcmVhdGVUcmVlV2FsaygpKSB7CiAJCQl3YWxrLmFkZFRyZWUoY29tbWl0LmdldFBhcmVudCgwKS5nZXRUcmVlKCkpOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0V29ya2luZyhmaW5hbCBSZXZDb21taXQgY29tbWl0KQorCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZJbmRleEFnYWluc3RXb3JraW5nKFJldkNvbW1pdCBjb21taXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBjcmVhdGVUcmVlV2FsaygpKSB7CiAJCQl3YWxrLmFkZFRyZWUoY29tbWl0LmdldFBhcmVudCgxKS5nZXRUcmVlKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UYWdDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UYWdDb21tYW5kVGVzdC5qYXZhCmluZGV4IDg3MDk4YjYuLmEyMjBlNzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvVGFnQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1RhZ0NvbW1hbmRUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC02NiwxOSArNjcsMjIgQEAKIAkJCQlSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZGIucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnUmVmKS5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJCWFzc2VydEVxdWFscygidGFnIiwgd2Fsay5wYXJzZVRhZyh0YWdSZWYuZ2V0T2JqZWN0SWQoKSkuZ2V0VGFnTmFtZSgpKTsKIAkJfQogCX0KIAogCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFRhZ2dpbmcoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBKR2l0SW50ZXJuYWxFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHRlc3RUYWdnaW5nKCkKKwkJCXRocm93cyBHaXRBUElFeGNlcHRpb24sIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJzZWNvbmQgY29tbWl0IikuY2FsbCgpOwogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoInRoaXJkIGNvbW1pdCIpLmNhbGwoKTsKIAkJCVJlZiB0YWdSZWYgPSBnaXQudGFnKCkuc2V0T2JqZWN0SWQoY29tbWl0KS5zZXROYW1lKCJ0YWciKS5jYWxsKCk7Ci0JCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGRiLnBlZWwodGFnUmVmKS5nZXRQZWVsZWRPYmplY3RJZCgpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZGIuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHRhZ1JlZikuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CiAJCX0KIAl9CiAKQEAgLTEzNSwyNiArMTM5LDMwIEBACiAJCX0KIAl9CiAKKwlwcml2YXRlIExpc3Q8UmVmPiBnZXRUYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChSX1RBR1MpOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWciKS5jYWxsKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCUxpc3Q8U3RyaW5nPiBkZWxldGVkID0gZ2l0LnRhZ0RlbGV0ZSgpLnNldFRhZ3ModGFnUmVmLmdldE5hbWUoKSkKIAkJCQkJLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygxLCBkZWxldGVkLnNpemUoKSk7CiAJCQlhc3NlcnRFcXVhbHModGFnUmVmLmdldE5hbWUoKSwgZGVsZXRlZC5nZXQoMCkpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIGdldFRhZ3MoKS5zaXplKCkpOwogCiAJCQlSZWYgdGFnUmVmMSA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWcxIikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZjIgPSBnaXQudGFnKCkuc2V0TmFtZSgidGFnMiIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscygyLCBkYi5nZXRUYWdzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygyLCBnZXRUYWdzKCkuc2l6ZSgpKTsKIAkJCWRlbGV0ZWQgPSBnaXQudGFnRGVsZXRlKCkuc2V0VGFncyh0YWdSZWYxLmdldE5hbWUoKSwgdGFnUmVmMi5nZXROYW1lKCkpCiAJCQkJCS5jYWxsKCk7CiAJCQlhc3NlcnRFcXVhbHMoMiwgZGVsZXRlZC5zaXplKCkpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIGdldFRhZ3MoKS5zaXplKCkpOwogCQl9CiAJfQogCkBAIC0xNjMsMTMgKzE3MSwxMyBAQAogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWciKS5jYWxsKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCUxpc3Q8U3RyaW5nPiBkZWxldGVkID0gZ2l0LnRhZ0RlbGV0ZSgpCiAJCQkJCS5zZXRUYWdzKFJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUodGFnUmVmLmdldE5hbWUoKSkpLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygxLCBkZWxldGVkLnNpemUoKSk7CiAJCQlhc3NlcnRFcXVhbHModGFnUmVmLmdldE5hbWUoKSwgZGVsZXRlZC5nZXQoMCkpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIGdldFRhZ3MoKS5zaXplKCkpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvQWJzdHJhY3REaWZmVGVzdENhc2UuamF2YQppbmRleCAwZjEzYTY4Li4zMmYzNDIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0Fic3RyYWN0RGlmZlRlc3RDYXNlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIApAQCAtMjQwLDYgKzI0MCw2IEBACiAJCQlyLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7CiAJCQlyLmFwcGVuZCgnXG4nKTsKIAkJfQotCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyUmVmbG93VGVzdC5qYXZhCmluZGV4IDQ5ZTVkMWIuLjBlMzQ0ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlclJlZmxvd1Rlc3QuamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCWFzc2VydEZvcm1hdHRlZCgiWi5wYXRjaCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbml0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhID0gbmV3IFJhd1RleHQocmVhZEZpbGUobmFtZSArICJfUHJlSW1hZ2UiKSk7CiAJCWIgPSBuZXcgUmF3VGV4dChyZWFkRmlsZShuYW1lICsgIl9Qb3N0SW1hZ2UiKSk7CiAJCWZpbGUgPSBwYXJzZVRlc3RQYXRjaEZpbGUobmFtZSArICIucGF0Y2giKS5nZXRGaWxlcygpLmdldCgwKTsKQEAgLTE1NiwxMyArMTU2LDEzIEBACiAJCWFzc2VydEZvcm1hdHRlZChKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5vdXQiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0Rm9ybWF0dGVkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRGb3JtYXR0ZWQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZtdC5mb3JtYXQoZmlsZSwgYSwgYik7CiAJCWZpbmFsIFN0cmluZyBleHAgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShyZWFkRmlsZShuYW1lKSk7CiAJCWFzc2VydEVxdWFscyhleHAsIFJhd1BhcnNlVXRpbHMuZGVjb2RlKG91dC50b0J5dGVBcnJheSgpKSk7CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gcmVhZEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGJ5dGVbXSByZWFkRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwogCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKQEAgLTE4MCw3ICsxODAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKIAkJCWlmIChpbiA9PSBudWxsKSB7CiAJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0VGVzdC5qYXZhCmluZGV4IDZhZDU5YjkuLjU4YThiMmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dFRlc3QuamF2YQpAQCAtNDQsNyArNDQsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtNjUsNiArNjYsMTYgQEAKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoKSB7CisJCVN0cmluZyBpbnB1dCA9ICJmb28tYVxuZlwwby1iXG4iOworCQlieXRlW10gZGF0YSA9IENvbnN0YW50cy5lbmNvZGVBU0NJSShpbnB1dCk7CisJCWZpbmFsIFJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KGRhdGEpOworCQlhc3NlcnRBcnJheUVxdWFscyhhLmNvbnRlbnQsIGRhdGEpOworCQlhc3NlcnRFcXVhbHMoYS5zaXplKCksIDEpOworCQlhc3NlcnRFcXVhbHMoYS5nZXRTdHJpbmcoMCwgMSwgZmFsc2UpLCBpbnB1dCk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewogCQlmaW5hbCBSYXdUZXh0IGEgPSBuZXcgUmF3VGV4dChDb25zdGFudHMuZW5jb2RlQVNDSUkoImZvby1hXG5mb28tYlxuIikpOwogCQlmaW5hbCBSYXdUZXh0IGIgPSBuZXcgUmF3VGV4dChDb25zdGFudHMuZW5jb2RlQVNDSUkoImZvby1iXG5mb28tY1xuIikpOwpAQCAtMTM2LDggKzE0Nyw4IEBACiAJCWUgPSBjLnJlZHVjZUNvbW1vblN0YXJ0RW5kKHQoImFiUXh5IiksIHQoImFiUnh5IiksIGUpOwogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMiwgMywgMiwgMyksIGUpOwogCi0JCVJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KCJwXG5hIGJcblFcbmMgZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQlSYXdUZXh0IGIgPSBuZXcgUmF3VGV4dCgicFxuYSAgYiBcblJcbiBjICBkIFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlSYXdUZXh0IGEgPSBuZXcgUmF3VGV4dCgicFxuYSBiXG5RXG5jIGRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQlSYXdUZXh0IGIgPSBuZXcgUmF3VGV4dCgicFxuYSAgYiBcblJcbiBjICBkIFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWUgPSBuZXcgRWRpdCgwLCA0LCAwLCA0KTsKIAkJZSA9IFJhd1RleHRDb21wYXJhdG9yLldTX0lHTk9SRV9BTEwucmVkdWNlQ29tbW9uU3RhcnRFbmQoYSwgYiwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgyLCAzLCAyLCAzKSwgZSk7CkBAIC0xNDksMTQgKzE2MCwxNCBAQAogCQlSYXdUZXh0IGI7CiAJCUVkaXQgZTsKIAotCQlhID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIgPSBuZXcgUmF3VGV4dCgiU1xuXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYiA9IG5ldyBSYXdUZXh0KCJTXG5cbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDIsIDAsIDMpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDEsIDAsIDIpLCBlKTsKIAotCQlhID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJSXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDMsIDAsIDIpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDIsIDAsIDEpLCBlKTsKQEAgLTE2Nyw4ICsxNzgsOCBAQAogCQlSYXdUZXh0IGE7CiAJCVJhd1RleHQgYjsKIAkJRWRpdCBlOwotCQlhID0gbmV3IFJhd1RleHQoInN0YXJ0Ii5nZXRCeXRlcyhVVEZfOCkpOwotCQliID0gbmV3IFJhd1RleHQoInN0YXJ0IG9mIGxpbmUiLmdldEJ5dGVzKFVURl84KSk7CisJCWEgPSBuZXcgUmF3VGV4dCgic3RhcnQiLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYiA9IG5ldyBSYXdUZXh0KCJzdGFydCBvZiBsaW5lIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWUgPSBuZXcgRWRpdCgwLCAxLCAwLCAxKTsKIAkJZSA9IFJhd1RleHRDb21wYXJhdG9yLkRFRkFVTFQucmVkdWNlQ29tbW9uU3RhcnRFbmQoYSwgYiwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgwLCAxLCAwLCAxKSwgZSk7CkBAIC0xNzksOCArMTkwLDggQEAKIAkJUmF3VGV4dCBhOwogCQlSYXdUZXh0IGI7CiAJCUVkaXQgZTsKLQkJYSA9IG5ldyBSYXdUZXh0KCJzdGFydCIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJzdGFydCBvZlxubGFzdGxpbmUiLmdldEJ5dGVzKFVURl84KSk7CisJCWEgPSBuZXcgUmF3VGV4dCgic3RhcnQiLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYiA9IG5ldyBSYXdUZXh0KCJzdGFydCBvZlxubGFzdGxpbmUiLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDEsIDAsIDIpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDEsIDAsIDIpLCBlKTsKQEAgLTIzOSw2ICsyNTAsNiBAQAogCQkJci5hcHBlbmQodGV4dC5jaGFyQXQoaSkpOwogCQkJci5hcHBlbmQoJ1xuJyk7CiAJCX0KLQkJcmV0dXJuIG5ldyBSYXdUZXh0KHIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXhUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXhUZXN0LmphdmEKaW5kZXggZjE2OGU4My4uNTFhNmY4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCkBAIC04Miw3ICs4Miw3IEBACiAJCQkJKyAiQVxuIiAvLwogCQkJCSsgIkJcbiIgLy8KIAkJCQkrICJCXG4iIC8vCi0JCQkJKyAiQlxuIikuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJCSsgIkJcbiIpLmdldEJ5dGVzKENIQVJTRVQpOwogCQlTaW1pbGFyaXR5SW5kZXggc2kgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7CiAJCXNpLmhhc2gobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluKSwgaW4ubGVuZ3RoLCBmYWxzZSk7CiAJCWFzc2VydEVxdWFscygyLCBzaS5zaXplKCkpOwpAQCAtMTMwLDEyICsxMzAsMTIgQEAKIAkJCQkrICJEXHJcbiIgLy8KIAkJCQkrICJCXHJcbiI7CiAJCVNpbWlsYXJpdHlJbmRleCBzcmMgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7Ci0JCWJ5dGVbXSBieXRlczEgPSB0ZXh0LmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzMSA9IHRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCXNyYy5oYXNoKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczEpLCBieXRlczEubGVuZ3RoLCB0cnVlKTsKIAkJc3JjLnNvcnQoKTsKIAogCQlTaW1pbGFyaXR5SW5kZXggZHN0ID0gbmV3IFNpbWlsYXJpdHlJbmRleCgpOwotCQlieXRlW10gYnl0ZXMyID0gdGV4dC5yZXBsYWNlKCJcciIsICIiKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBieXRlczIgPSB0ZXh0LnJlcGxhY2UoIlxyIiwgIiIpLmdldEJ5dGVzKENIQVJTRVQpOwogCQlkc3QuaGFzaChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMyKSwgYnl0ZXMyLmxlbmd0aCwgdHJ1ZSk7CiAJCWRzdC5zb3J0KCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXJJdGVyYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXJJdGVyYXRvclRlc3QuamF2YQppbmRleCAyYjEwODg3Li4zNTk4ZjNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVySXRlcmF0b3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhCkBAIC03OCw3ICs3OCw3IEBACiAKIAkJZmluYWwgaW50IGV4cElkeCA9IDI7CiAJCWZpbmFsIERpckNhY2hlQnVpbGRlciBiID0gZGMuYnVpbGRlcigpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yKGIpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCXR3LnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUNHaXRDb21wYXRhYmlsaXR5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ0dpdENvbXBhdGFiaWxpdHlUZXN0LmphdmEKaW5kZXggZGVjMTc2Mi4uYzM2MmU3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ0dpdENvbXBhdGFiaWxpdHlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ0dpdENvbXBhdGFiaWxpdHlUZXN0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CkBAIC05OSw3ICs5OSw3IEBACiAJCWFzc2VydEVxdWFscyhscy5zaXplKCksIGRjLmdldEVudHJ5Q291bnQoKSk7CiAJCXsKIAkJCWZpbmFsIEl0ZXJhdG9yPENHaXRJbmRleFJlY29yZD4gckl0ciA9IGxzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCQl0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CiAJCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYykpOwogCQkJCXdoaWxlIChySXRyLmhhc05leHQoKSkgewpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCWFzc2VydEVxdWFscyhjTGlzdC5zaXplKCksIGpUcmVlLmdldEVudHJ5U3BhbigpKTsKIAogCQlmaW5hbCBBcnJheUxpc3Q8Q0dpdExzVHJlZVJlY29yZD4gc3VidHJlZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChmaW5hbCBDR2l0THNUcmVlUmVjb3JkIHIgOiBjVHJlZS52YWx1ZXMoKSkgeworCQlmb3IgKENHaXRMc1RyZWVSZWNvcmQgciA6IGNUcmVlLnZhbHVlcygpKSB7CiAJCQlpZiAoRmlsZU1vZGUuVFJFRS5lcXVhbHMoci5tb2RlKSkKIAkJCQlzdWJ0cmVlcy5hZGQocik7CiAJCX0KQEAgLTIyOSwxNCArMjI5LDE0IEBACiAJCWFzc2VydEVxdWFscyhpbnRlbnRUb0FkZCwgZW50cnkuaXNJbnRlbnRUb0FkZCgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlIHBhdGhPZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIEZpbGUgcGF0aE9mKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuZ2V0VGVzdFJlc291cmNlRmlsZShuYW1lKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDR2l0SW5kZXhSZWNvcmQ+IHJlYWRMc0ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDR2l0SW5kZXhSZWNvcmQ+IHIgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHNmaWxlcyIpKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHNmaWxlcyIpKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlmaW5hbCBDR2l0SW5kZXhSZWNvcmQgY3IgPSBuZXcgQ0dpdEluZGV4UmVjb3JkKGxpbmUpOwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ0dpdExzVHJlZVJlY29yZD4gcmVhZExzVHJlZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBMaW5rZWRIYXNoTWFwPFN0cmluZywgQ0dpdExzVHJlZVJlY29yZD4gciA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoT2YoImdpdGdpdC5sc3RyZWUiKSksIFVURl84KSkpIHsKKwkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHBhdGhPZigiZ2l0Z2l0LmxzdHJlZSIpKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlmaW5hbCBDR2l0THNUcmVlUmVjb3JkIGNyID0gbmV3IENHaXRMc1RyZWVSZWNvcmQobGluZSk7CkBAIC0yNjgsNyArMjY4LDcgQEAKIAogCQlmaW5hbCBTdHJpbmcgcGF0aDsKIAotCQlDR2l0SW5kZXhSZWNvcmQoZmluYWwgU3RyaW5nIGxpbmUpIHsKKwkJQ0dpdEluZGV4UmVjb3JkKFN0cmluZyBsaW5lKSB7CiAJCQlmaW5hbCBpbnQgdGFiID0gbGluZS5pbmRleE9mKCdcdCcpOwogCQkJZmluYWwgaW50IHNwMSA9IGxpbmUuaW5kZXhPZignICcpOwogCQkJZmluYWwgaW50IHNwMiA9IGxpbmUuaW5kZXhPZignICcsIHNwMSArIDEpOwpAQCAtMjg2LDcgKzI4Niw3IEBACiAKIAkJZmluYWwgU3RyaW5nIHBhdGg7CiAKLQkJQ0dpdExzVHJlZVJlY29yZChmaW5hbCBTdHJpbmcgbGluZSkgeworCQlDR2l0THNUcmVlUmVjb3JkKFN0cmluZyBsaW5lKSB7CiAJCQlmaW5hbCBpbnQgdGFiID0gbGluZS5pbmRleE9mKCdcdCcpOwogCQkJZmluYWwgaW50IHNwMSA9IGxpbmUuaW5kZXhPZignICcpOwogCQkJZmluYWwgaW50IHNwMiA9IGxpbmUuaW5kZXhPZignICcsIHNwMSArIDEpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQppbmRleCAwNWZhMDA3Li44NmUyODUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCWNvcHlNZXRhRGF0YUhlbHBlcih0cnVlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlNZXRhRGF0YUhlbHBlcihmaW5hbCBib29sZWFuIGtlZXBTdGFnZSkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgY29weU1ldGFEYXRhSGVscGVyKGJvb2xlYW4ga2VlcFN0YWdlKSB7CiAJCURpckNhY2hlRW50cnkgZSA9IG5ldyBEaXJDYWNoZUVudHJ5KCJzb21lL3BhdGgiLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzIpOwogCQllLnNldEFzc3VtZVZhbGlkKGZhbHNlKTsKIAkJZS5zZXRDcmVhdGlvblRpbWUoMkwpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQppbmRleCBkZDI0MmU1Li44MjU2NWZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQpAQCAtNzYsNyArNzYsNyBAQAogCQlmaW5hbCBEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlhc3NlcnRFcXVhbHMoMCwgZGMuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYykpOwogCQkJYXNzZXJ0RmFsc2UodHcubmV4dCgpKTsKIAkJfQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCWIuZmluaXNoKCk7CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKIAkJCXdoaWxlICh0dy5uZXh0KCkpIHsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQlmaW5hbCBpbnQgZXhwUG9zW10gPSB7IDAsIC0xLCA0IH07CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZShmYWxzZSk7CiAJCQlpbnQgcGF0aElkeCA9IDA7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJYi5maW5pc2goKTsKIAogCQlmaW5hbCBEaXJDYWNoZUl0ZXJhdG9yIGkgPSBuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYyk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKGkpOwogCQkJdHcuc2V0UmVjdXJzaXZlKHRydWUpOwogCQkJaW50IHBhdGhJZHggPSAwOwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCQliLmFkZChlbnRzW2ldKTsKIAkJYi5maW5pc2goKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYykpOwogCQkJdHcuc2V0UmVjdXJzaXZlKHRydWUpOwogCQkJaW50IHBhdGhJZHggPSAwOwpAQCAtNDAyLDcgKzQwMiw3IEBACiAJCQliLmFkZChlbnRzW2ldKTsKIAkJYi5maW5pc2goKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJZm9yIChpbnQgdmljdGltSWR4ID0gMDsgdmljdGltSWR4IDwgcGF0aHMubGVuZ3RoOyB2aWN0aW1JZHgrKykgewogCQkJCXR3LnJlc2V0KCk7CiAJCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYykpOwpAQCAtNDMwLDcgKzQzMCw3IEBACiAJCWZpbmFsIERpckNhY2hlIGRjID0gRGlyQ2FjaGUucmVhZChwYXRoLCBGUy5ERVRFQ1RFRCk7CiAJCWFzc2VydEVxdWFscygyLCBkYy5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YQppbmRleCBlZjNlNjExLi5kZmMxMzZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVMYXJnZVBhdGhUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlTGFyZ2VQYXRoVGVzdC5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAJCXRlc3RMb25nUGF0aCgxNjM4NCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRlc3RMb25nUGF0aChmaW5hbCBpbnQgbGVuKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwKKwlwcml2YXRlIHZvaWQgdGVzdExvbmdQYXRoKGludCBsZW4pIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbG9uZ1BhdGggPSBtYWtlTG9uZ1BhdGgobGVuKTsKIAkJZmluYWwgU3RyaW5nIHNob3J0UGF0aCA9ICJ+fn4gc2hvcnRlci1wYXRoIjsKQEAgLTExOSw3ICsxMTksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VMb25nUGF0aChmaW5hbCBpbnQgbGVuKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VMb25nUGF0aChpbnQgbGVuKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCQlyLmFwcGVuZCgnYScgKyAoaSAlIDI2KSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9NYW5pZmVzdFBhcnNlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCmluZGV4IGM5NjczYTYuLjY5YTQ4Y2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC04Miw3ICs4Miw3IEBACiAKIAkJTWFuaWZlc3RQYXJzZXIgcGFyc2VyID0gbmV3IE1hbmlmZXN0UGFyc2VyKAogCQkJCW51bGwsIG51bGwsICJtYXN0ZXIiLCBiYXNlVXJsLCBudWxsLCBudWxsKTsKLQkJcGFyc2VyLnJlYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKTsKKwkJcGFyc2VyLnJlYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpOwogCQkvLyBVbmZpbHRlcmVkIHByb2plY3RzIHNob3VsZCBoYXZlIHRoZW0gYWxsLgogCQlyZXN1bHRzLmNsZWFyKCk7CiAJCXJlc3VsdHMuYWRkKCJmb28iKTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQkJCWJhc2VVcmwsIG51bGwsIG51bGwpOwogCQl0cnkgewogCQkJcGFyc2VyLnJlYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSk7CisJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpOwogCQkJZmFpbCgiTWFuaWZlc3RQYXJzZXIgZGlkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG1pc3NpbmcgZmV0Y2giKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRTeW1saW5rVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRTeW1saW5rVGVzdC5qYXZhCmluZGV4IDM0MWNjNGYuLjU0OGI5MDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kU3ltbGlua1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEKQEAgLTExOSw0NSArMTE5LDQ3IEBACiAJCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkJLy8gQ2xvbmUgaXQKIAkJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdENvcHlGaWxlQmFyZSIpOwotCQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCQl0cnkgKFJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQorCQkJCQkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCQkuZ2V0UmVwb3NpdG9yeSgpOworCQkJCQkuZ2V0UmVwb3NpdG9yeSgpKSB7CiAKLQkJCS8vIFRoZSBMaW5rZWRIZWxsbyBzeW1saW5rIHNob3VsZCBleGlzdC4KLQkJCUZpbGUgbGlua2VkaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJMaW5rZWRIZWxsbyIpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIExpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRoZWxsbykpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIExpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2VkaGVsbG8pKTsKLQkJCWFzc2VydEVxdWFscygiZm9vL2hlbGxvLnR4dCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRoZWxsbykpOworCQkJCS8vIFRoZSBMaW5rZWRIZWxsbyBzeW1saW5rIHNob3VsZCBleGlzdC4KKwkJCQlGaWxlIGxpbmtlZGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQkJIkxpbmtlZEhlbGxvIik7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIExpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkaGVsbG8pKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2VkaGVsbG8pKTsKKwkJCQlhc3NlcnRFcXVhbHMoImZvby9oZWxsby50eHQiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZGhlbGxvKSk7CiAKLQkJCS8vIFRoZSBmb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZC4KLQkJCUZpbGUgbGlua2VkZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vTGlua2VkSGVsbG8iKTsKLQkJCWFzc2VydEZhbHNlKCJUaGUgZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGZvb2hlbGxvKSk7CisJCQkJLy8gVGhlIGZvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkLgorCQkJCUZpbGUgbGlua2VkZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCQkiZm9vL0xpbmtlZEhlbGxvIik7CisJCQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGZvb2hlbGxvKSk7CiAKLQkJCS8vIFRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgdXNlIGEgcmVsYXRpdmUgLi4vCi0JCQlGaWxlIGxpbmtlZHN1YmRpcmhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCQkic3ViZGlyL0xpbmtlZEhlbGxvIik7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRzdWJkaXJoZWxsbykpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZHN1YmRpcmhlbGxvKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIi4uL2Zvby9oZWxsby50eHQiLAotCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2Vkc3ViZGlyaGVsbG8pKTsKKwkJCQkvLyBUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIHVzZSBhIHJlbGF0aXZlIC4uLworCQkJCUZpbGUgbGlua2Vkc3ViZGlyaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCQkic3ViZGlyL0xpbmtlZEhlbGxvIik7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZHN1YmRpcmhlbGxvKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRzdWJkaXJoZWxsbykpOworCQkJCWFzc2VydEVxdWFscygiLi4vZm9vL2hlbGxvLnR4dCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2Vkc3ViZGlyaGVsbG8pKTsKIAotCQkJLy8gVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgdXNlIGEgc2luZ2xlIHJlbGF0aXZlIC4uLwotCQkJRmlsZSBsaW5rZWRiYXJmb29oZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKLQkJCQkJImJhci9mb28vTGlua2VkSGVsbG8iKTsKLQkJCWFzc2VydFRydWUoIlRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRiYXJmb29oZWxsbykpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRiYXJmb29oZWxsbykpOwotCQkJYXNzZXJ0RXF1YWxzKCIuLi9iYXovaGVsbG8udHh0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZGJhcmZvb2hlbGxvKSk7Ci0KLQkJCWxvY2FsRGIuY2xvc2UoKTsKKwkJCQkvLyBUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCB1c2UgYSBzaW5nbGUgcmVsYXRpdmUgLi4vCisJCQkJRmlsZSBsaW5rZWRiYXJmb29oZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKKwkJCQkJCSJiYXIvZm9vL0xpbmtlZEhlbGxvIik7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRiYXJmb29oZWxsbykpOworCQkJCWFzc2VydFRydWUoIlRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZGJhcmZvb2hlbGxvKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCIuLi9iYXovaGVsbG8udHh0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRiYXJmb29oZWxsbykpOworCQkJfQogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQppbmRleCAyMjUzYTA0Li5kZjMxYWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQkJUmVmIHJlZiA9IHIuZmluZFJlZihyZWZuYW1lKTsKIAkJCQlpZiAocmVmID09IG51bGwpIHJldHVybiBudWxsOwogCi0JCQkJcmVmID0gci5wZWVsKHJlZik7CisJCQkJcmVmID0gci5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQkJCXJldHVybiBpZDsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTE4NSwxMDggKzE4NSw5MyBAQAogCQl9CiAJfQogCisJcHJpdmF0ZSBSZXBvc2l0b3J5IGNsb25lUmVwb3NpdG9yeShSZXBvc2l0b3J5IHJlcG8sIGJvb2xlYW4gYmFyZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlSZXBvc2l0b3J5IHIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkuc2V0VVJJKHJlcG8uZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQorCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZShiYXJlKS5jYWxsKCkKKwkJCQkuZ2V0UmVwb3NpdG9yeSgpOworCQlpZiAoYmFyZSkgeworCQkJYXNzZXJ0VHJ1ZShyLmlzQmFyZSgpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEZhbHNlKHIuaXNCYXJlKCkpOworCQl9CisJCXJldHVybiByOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgcnVuVHdpY2VJc05PUCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGdyb3VwQURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCXRyeSAoUmVwb3NpdG9yeSBjaGlsZCA9IGNsb25lUmVwb3NpdG9yeShncm91cEFEYiwgdHJ1ZSk7CisJCQkJUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCisJCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJyZW1vdGUxXCIgZmV0Y2g9XCIuLlwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwiYmFzZVwiIG5hbWU9XCJwbGF0Zm9ybS9iYXNlXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOworCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCVJlcG9zaXRvcnkgZGVzdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpLnNldEJhcmUodHJ1ZSkuY2FsbCgpCi0JCQkuZ2V0UmVwb3NpdG9yeSgpOworCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOworCQkJcmVwb3MucHV0KCJwbGF0Zm9ybS9iYXNlIiwgY2hpbGQpOwogCi0JCWFzc2VydFRydWUoZGVzdC5pc0JhcmUoKSk7Ci0JCWFzc2VydFRydWUoY2hpbGQuaXNCYXJlKCkpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSSgicGxhdGZvcm0vIikKKwkJCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKIAotCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJyZW1vdGUxXCIgZmV0Y2g9XCIuLlwiIC8+IikKLQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwicmVtb3RlMVwiIC8+IikKLQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJiYXNlXCIgbmFtZT1cInBsYXRmb3JtL2Jhc2VcIiAvPiIpCi0JCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOwotCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7Ci0KLQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQlyZXBvcy5wdXQoInBsYXRmb3JtL2Jhc2UiLCBjaGlsZCk7Ci0KLQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCJwbGF0Zm9ybS8iKQotCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGZpcnN0SWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQljb21taXQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCkKLQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpCi0JCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKQotCQkJLnNldFVSSSgicGxhdGZvcm0vIikKLQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCi0JCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpCi0JCQkuY2FsbCgpOwotCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQlhc3NlcnRFcXVhbHMoZmlyc3RJZFN0ciwgaWRTdHIpOwotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CisJCQlTdHJpbmcgZmlyc3RJZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQljb21taXQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCkKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpCisJCQkJCS5jYWxsKCk7CisJCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOworCQkJYXNzZXJ0RXF1YWxzKGZpcnN0SWRTdHIsIGlkU3RyKTsKKwkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgYW5kcm9pZFNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgY2hpbGQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCQkuc2V0VVJJKGdyb3VwQURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpLnNldEJhcmUodHJ1ZSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGNoaWxkID0gY2xvbmVSZXBvc2l0b3J5KGdyb3VwQURiLCB0cnVlKTsKKwkJCQlSZXBvc2l0b3J5IGRlc3QgPSBjbG9uZVJlcG9zaXRvcnkoZGIsIHRydWUpKSB7CisJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCisJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJiYXNlXCIgbmFtZT1cInBsYXRmb3JtL2Jhc2VcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQlyZXBvcy5wdXQoInBsYXRmb3JtL2Jhc2UiLCBjaGlsZCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZC5pc0JhcmUoKSk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSkKKwkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKCJwbGF0Zm9ybS8iKQorCQkJCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQorCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQorCQkJCQkuY2FsbCgpOwogCi0JCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCi0JCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQlyZXBvcy5wdXQoInBsYXRmb3JtL2Jhc2UiLCBjaGlsZCk7Ci0KLQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCJwbGF0Zm9ybS8iKQotCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9iYXNlIik7CisJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpCisJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKKwkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgImJhc2UiLCAidXJsIik7CisJCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgIi4uL2Jhc2UiKTsKKwkJCX0KIAkJfQotCi0JCWNoaWxkLmNsb3NlKCk7Ci0JCWRlc3QuY2xvc2UoKTsKIAl9CiAKIAlAVGVzdApAQCAtMjk5LDIwMCArMjg0LDE3NCBAQAogCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKIAkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCXRyeSAoUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIobmV3IEluZGV4ZWRSZXBvcygpKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0SWdub3JlUmVtb3RlRmFpbHVyZXModHJ1ZSkKKwkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKS5jYWxsKCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJUmV2Q29tbWl0IGNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIobmV3IEluZGV4ZWRSZXBvcygpKQotCQkJLnNldFVSSSgicGxhdGZvcm0vIikKLQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCi0JCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkuc2V0SWdub3JlUmVtb3RlRmFpbHVyZXModHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICJodHRwczovL2hvc3QuY29tL3BsYXRmb3JtL2Jhc2UiKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViVXJsLCAiaHR0cHM6Ly9ob3N0LmNvbS9wbGF0Zm9ybS9iYXNlIik7CisJCQl9CiAJCX0KLQotCQlkZXN0LmNsb3NlKCk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBnZXJyaXRTZXR1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLlwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwicGx1Z2lucy9jb29rYm9va1wiIG5hbWU9XCJwbHVnaW5zL2Nvb2tib29rXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOworCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCVJlcG9zaXRvcnkgZGVzdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKQotCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKKwkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCXJlcG9zLnB1dCgicGx1Z2lucy9jb29rYm9vayIsIGNoaWxkKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOwotCQlhc3NlcnRUcnVlKGNoaWxkLmlzQmFyZSgpKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoIiIpLnNldFRhcmdldFVSSSgiZ2Vycml0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKIAotCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJyZW1vdGUxXCIgZmV0Y2g9XCIuXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInBsdWdpbnMvY29va2Jvb2tcIiBuYW1lPVwicGx1Z2lucy9jb29rYm9va1wiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQlyZXBvcy5wdXQoInBsdWdpbnMvY29va2Jvb2siLCBjaGlsZCk7Ci0KLQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCIiKQotCQkJLnNldFRhcmdldFVSSSgiZ2Vycml0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAicGx1Z2lucy9jb29rYm9vayIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9wbHVnaW5zL2Nvb2tib29rIik7CisJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpCisJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKKwkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInBsdWdpbnMvY29va2Jvb2siLAorCQkJCQkJInVybCIpOworCQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9wbHVnaW5zL2Nvb2tib29rIik7CisJCQl9CiAJCX0KLQotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBhYnNvbHV0ZVJlbW90ZVVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCS5zZXRCYXJlKHRydWUpLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKLQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7Ci0JCWJvb2xlYW4gZmV0Y2hTbGFzaCA9IGZhbHNlOwotCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwotCQlkbyB7CisJCXRyeSAoUmVwb3NpdG9yeSBjaGlsZCA9IGNsb25lUmVwb3NpdG9yeShncm91cEFEYiwgdHJ1ZSk7CisJCQkJUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJU3RyaW5nIGFicyA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20iOworCQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7CisJCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKKwkJCWJvb2xlYW4gYmFzZVNsYXNoID0gZmFsc2U7CiAJCQlkbyB7Ci0JCQkJU3RyaW5nIGZldGNoVXJsID0gZmV0Y2hTbGFzaCA/IGFicyArICIvIiA6IGFiczsKLQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKKwkJCQlkbyB7CisJCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJCVN0cmluZyBiYXNlVXJsID0gYmFzZVNsYXNoID8gYWJzICsgIi8iIDogYWJzOwogCi0JCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwib3JpZ2luXCIgZmV0Y2g9XCIiICsgZmV0Y2hVcmwgKyAiXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cIm9yaWdpblwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCQl4bWxDb250ZW50LmFwcGVuZCgKKwkJCQkJCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIgorCQkJCQkJCQkJKyBmZXRjaFVybCArICJcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CisJCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCQkJcmVwb3MucHV0KHJlcG9VcmwsIGNoaWxkKTsKIAotCQkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKLQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCQkJLnNldFVSSShiYXNlVXJsKQotCQkJCQkuc2V0VGFyZ2V0VVJJKCJnZXJyaXQiKQotCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCQkJLmNhbGwoKTsKKwkJCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAorCQkJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSShiYXNlVXJsKQorCQkJCQkJCS5zZXRUYXJnZXRVUkkoImdlcnJpdCIpLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQorCQkJCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkuY2FsbCgpOwogCi0JCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CisJCQkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7Ci0JCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLCAidXJsIik7Ci0JCQkJCWFzc2VydEVxdWFscygiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsIHN1YlVybCk7Ci0JCQkJfQotCQkJCWZldGNoU2xhc2ggPSAhZmV0Y2hTbGFzaDsKLQkJCX0gd2hpbGUgKGZldGNoU2xhc2gpOwotCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKLQkJfSB3aGlsZSAoYmFzZVNsYXNoKTsKLQkJY2hpbGQuY2xvc2UoKTsKLQkJZGVzdC5jbG9zZSgpOworCQkJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCQkJLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKKwkJCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLAorCQkJCQkJCQkidXJsIik7CisJCQkJCQlhc3NlcnRFcXVhbHMoCisJCQkJCQkJCSJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwKKwkJCQkJCQkJc3ViVXJsKTsKKwkJCQkJfQorCQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7CisJCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7CisJCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKKwkJCX0gd2hpbGUgKGJhc2VTbGFzaCk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGFic29sdXRlUmVtb3RlVVJMQWJzb2x1dGVUYXJnZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBjaGlsZCA9Ci0JCQlHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKGdyb3VwQURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdHJpbmcgYWJzID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbSI7Ci0JCVN0cmluZyByZXBvVXJsID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiOwotCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKLQkJYm9vbGVhbiBiYXNlU2xhc2ggPSBmYWxzZTsKLQkJZG8geworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKKwkJCVN0cmluZyByZXBvVXJsID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiOworCQkJYm9vbGVhbiBmZXRjaFNsYXNoID0gZmFsc2U7CisJCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwogCQkJZG8gewotCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7Ci0JCQkJU3RyaW5nIGJhc2VVcmwgPSBiYXNlU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJZG8geworCQkJCQlTdHJpbmcgZmV0Y2hVcmwgPSBmZXRjaFNsYXNoID8gYWJzICsgIi8iIDogYWJzOworCQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKIAotCQkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKLQkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIiArIGZldGNoVXJsICsgIlwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJzcmNcIiBuYW1lPVwiY2hyb21pdW0vc3JjXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOwotCQkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkJeG1sQ29udGVudC5hcHBlbmQoCisJCQkJCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJvcmlnaW5cIiBmZXRjaD1cIiIKKwkJCQkJCQkJCSsgZmV0Y2hVcmwgKyAiXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwib3JpZ2luXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJzcmNcIiBuYW1lPVwiY2hyb21pdW0vc3JjXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKIAotCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKLQkJCQlyZXBvcy5wdXQocmVwb1VybCwgY2hpbGQpOworCQkJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CiAKLQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpCi0JCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkJCS5zZXRVUkkoYmFzZVVybCkKLQkJCQkJLnNldFRhcmdldFVSSShhYnMgKyAiL3N1cGVycHJvamVjdCIpCi0JCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJCQkuY2FsbCgpOworCQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKGJhc2VVcmwpCisJCQkJCQkJLnNldFRhcmdldFVSSShhYnMgKyAiL3N1cGVycHJvamVjdCIpCisJCQkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQorCQkJCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkuY2FsbCgpOwogCi0JCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CisJCQkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7Ci0JCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLCAidXJsIik7Ci0JCQkJCWFzc2VydEVxdWFscygiLi4vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKLQkJCQl9Ci0JCQkJZmV0Y2hTbGFzaCA9ICFmZXRjaFNsYXNoOwotCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7Ci0JCQliYXNlU2xhc2ggPSAhYmFzZVNsYXNoOwotCQl9IHdoaWxlIChiYXNlU2xhc2gpOwotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CisJCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKQorCQkJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJCQlCbG9iQmFzZWRDb25maWcgY2ZnID0gbmV3IEJsb2JCYXNlZENvbmZpZyhiYXNlLCBieXRlcyk7CisJCQkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInNyYyIsCisJCQkJCQkJCSJ1cmwiKTsKKwkJCQkJCWFzc2VydEVxdWFscygiLi4vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKKwkJCQkJfQorCQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7CisJCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7CisJCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKKwkJCX0gd2hpbGUgKGJhc2VTbGFzaCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNTEzLDExICs0NzIsMTIgQEAKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwogCQlhc3NlcnRUcnVlKCJzdWJtb2R1bGUgc2hvdWxkIGJlIGNoZWNrZWQgb3V0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkibWFzdGVyIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC02MDMsMTkgKzU2MywyMSBAQAogCQkvLyBUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgaGF2ZSBleHBlY3RlZCBjb250ZW50IiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJCS8vIFRoZSBkZXN0IGZpbGUgc2hvdWxkIGFsc28gZXhpc3QKIAkJaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsbyIpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQljb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCisJCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC02MzgsMjQgKzYwMCwyNyBAQAogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RCYXJlUmVwbyIpOwotCQlSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGV4aXN0Ci0JCUZpbGUgZ2l0bW9kdWxlcyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIi5naXRtb2R1bGVzIik7Ci0JCWFzc2VydFRydWUoIlRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdCIsIGdpdG1vZHVsZXMuZXhpc3RzKCkpOwotCQkvLyBUaGUgZmlyc3QgbGluZSBvZiAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBiZSBleHBlY3RlZAotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZ2l0bW9kdWxlcykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgZmlyc3QgbGluZSBvZiAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJIltzdWJtb2R1bGUgXCJmb29cIl0iLCBjb250ZW50KTsKLQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIHNoYTEKLQkJU3RyaW5nIGdpdGxpbmsgPSBsb2NhbERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQgKyAiOmZvbyIpLm5hbWUoKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQlTdHJpbmcgcmVtb3RlID0gZGVmYXVsdERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpLm5hbWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2l0bGluayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgcmVtb3RlIGhlYWQiLCByZW1vdGUsCi0JCQkJZ2l0bGluayk7CisJCQkJLmdldFJlcG9zaXRvcnkoKSkgeworCQkJLy8gVGhlIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGV4aXN0CisJCQlGaWxlIGdpdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICIuZ2l0bW9kdWxlcyIpOworCQkJYXNzZXJ0VHJ1ZSgiVGhlIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGV4aXN0IiwKKwkJCQkJZ2l0bW9kdWxlcy5leGlzdHMoKSk7CisJCQkvLyBUaGUgZmlyc3QgbGluZSBvZiAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBiZSBleHBlY3RlZAorCQkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJCW5ldyBGaWxlUmVhZGVyKGdpdG1vZHVsZXMpKSkgeworCQkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkJIlRoZSBmaXJzdCBsaW5lIG9mIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJCSJbc3VibW9kdWxlIFwiZm9vXCJdIiwgY29udGVudCk7CisJCQl9CisJCQkvLyBUaGUgZ2l0bGluayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgcmVtb3RlIGhlYWQgc2hhMQorCQkJU3RyaW5nIGdpdGxpbmsgPSBsb2NhbERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQgKyAiOmZvbyIpLm5hbWUoKTsKKwkJCVN0cmluZyByZW1vdGUgPSBkZWZhdWx0RGIucmVzb2x2ZShDb25zdGFudHMuSEVBRCkubmFtZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2l0bGluayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgcmVtb3RlIGhlYWQiLAorCQkJCQlyZW1vdGUsIGdpdGxpbmspOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTY3NywxMSArNjQyLDEyIEBACiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNzAzLDExICs2NjksMTIgQEAKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03MjksMTEgKzY5NiwxMiBAQAogCQkJLnNldFVSSShyb290VXJpKQogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTc1NywxNCArNzI1LDE0IEBACiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJldmlzaW9uQmFyZSIpOwotCQlSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIG9sZENvbW1pdElkCi0JCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2l0bGluayBpcyBzYW1lIGFzIHJlbW90ZSBoZWFkIiwgb2xkQ29tbWl0SWQubmFtZSgpLAotCQkJCWdpdGxpbmspOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBvbGRDb21taXRJZAorCQkJU3RyaW5nIGdpdGxpbmsgPSBsb2NhbERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQgKyAiOmZvbyIpLm5hbWUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgaXMgc2FtZSBhcyByZW1vdGUgaGVhZCIsCisJCQkJCW9sZENvbW1pdElkLm5hbWUoKSwgZ2l0bGluayk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNzkwLDIyICs3NTgsMjQgQEAKIAkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJLy8gQ2xvbmUgaXQKIAkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q29weUZpbGVCYXJlIik7Ci0JCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQl0cnkgKFJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQogCQkJCS5zZXRVUkkocmVtb3RlRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOwotCQkvLyBUaGUgSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QKLQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7Ci0JCWFzc2VydFRydWUoIlRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJLy8gVGhlIGZvby9IZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkLgotCQlGaWxlIGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL0hlbGxvIik7Ci0JCWFzc2VydEZhbHNlKCJUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQiLCBmb29oZWxsby5leGlzdHMoKSk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJLy8gVGhlIGNvbnRlbnQgb2YgSGVsbG8gZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBIZWxsbyBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAotCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJCQkuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkvLyBUaGUgSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QKKwkJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsbyIpOworCQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIGZvby9IZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkLgorCQkJRmlsZSBmb29oZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9IZWxsbyIpOworCQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZCIsCisJCQkJCWZvb2hlbGxvLmV4aXN0cygpKTsKKwkJCS8vIFRoZSBjb250ZW50IG9mIEhlbGxvIGZpbGUgc2hvdWxkIGJlIGV4cGVjdGVkCisJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQkJYXNzZXJ0RXF1YWxzKCJUaGUgSGVsbG8gZmlsZSBzaG91bGQgaGF2ZSBleHBlY3RlZCBjb250ZW50IiwKKwkJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJCX0KKwkJfQogCX0KIAogCUBUZXN0CkBAIC04NDEsMzYgKzgxMSwzOCBAQAogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RSZXBsYWNlTWFuaWZlc3RCYXJlIik7Ci0JCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQlGaWxlIGRvdG1vZHVsZXM7CisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBub3QgZXhpc3QKLQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7Ci0JCWFzc2VydEZhbHNlKCJUaGUgSGVsbG8gZmlsZSBzaG91bGRuJ3QgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCS8vIFRoZSBIZWxsby50eHQgZmlsZSBzaG91bGQgZXhpc3QKLQkJRmlsZSBoZWxsb3R4dCA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvLnR4dCIpOwotCQlhc3NlcnRUcnVlKCJUaGUgSGVsbG8udHh0IGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG90eHQuZXhpc3RzKCkpOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBub3QgZXhpc3QKKwkJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsbyIpOworCQkJYXNzZXJ0RmFsc2UoIlRoZSBIZWxsbyBmaWxlIHNob3VsZG4ndCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKKwkJCS8vIFRoZSBIZWxsby50eHQgZmlsZSBzaG91bGQgZXhpc3QKKwkJCUZpbGUgaGVsbG90eHQgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsby50eHQiKTsKKwkJCWFzc2VydFRydWUoIlRoZSBIZWxsby50eHQgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsb3R4dC5leGlzdHMoKSk7CisJCQlkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQlDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKTsKKwkJfQogCQkvLyBUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgaGF2ZSAnc3VibW9kdWxlICJiYXIiJyBhbmQgc2hvdWxkbid0CiAJCS8vIGhhdmUKIAkJLy8gJ3N1Ym1vZHVsZSAiZm9vIicgbGluZXMuCi0JCUZpbGUgZG90bW9kdWxlcyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKLQkJCQlDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZG90bW9kdWxlcykpOwotCQlib29sZWFuIGZvbyA9IGZhbHNlOwotCQlib29sZWFuIGJhciA9IGZhbHNlOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJYnJlYWs7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vXCIiKSkKLQkJCQlmb28gPSB0cnVlOwotCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImJhclwiIikpCi0JCQkJYmFyID0gdHJ1ZTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoZG90bW9kdWxlcykpKSB7CisJCQlib29sZWFuIGZvbyA9IGZhbHNlOworCQkJYm9vbGVhbiBiYXIgPSBmYWxzZTsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlpZiAobGluZSA9PSBudWxsKQorCQkJCQlicmVhazsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vXCIiKSkKKwkJCQkJZm9vID0gdHJ1ZTsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYmFyXCIiKSkKKwkJCQkJYmFyID0gdHJ1ZTsKKwkJCX0KKwkJCWFzc2VydFRydWUoIlRoZSBiYXIgc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGJhcik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGZvbyBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vKTsKIAkJfQotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhciBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYmFyKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28gc3VibW9kdWxlIHNob3VsZG4ndCBleGlzdCIsIGZvbyk7CiAJfQogCiAJQFRlc3QKQEAgLTg5NiwzNCArODY4LDM3IEBACiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJlbW92ZU92ZXJsYXBwaW5nQmFyZSIpOwotCQlSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJRmlsZSBkb3Rtb2R1bGVzOworCQl0cnkgKFJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQogCQkJCS5zZXRVUkkocmVtb3RlRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJQ29uc3RhbnRzLkRPVF9HSVRfTU9EVUxFUyk7CisJCX0KKwogCQkvLyBUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgaGF2ZSAnc3VibW9kdWxlICJmb28iJyBhbmQgc2hvdWxkbid0CiAJCS8vIGhhdmUKIAkJLy8gJ3N1Ym1vZHVsZSAiZm9vL2JhciInIGxpbmVzLgotCQlGaWxlIGRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVRfTU9EVUxFUyk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGRvdG1vZHVsZXMpKTsKLQkJYm9vbGVhbiBmb28gPSBmYWxzZTsKLQkJYm9vbGVhbiBmb29iYXIgPSBmYWxzZTsKLQkJYm9vbGVhbiBhID0gZmFsc2U7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQotCQkJCWZvbyA9IHRydWU7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vL2JhclwiIikpCi0JCQkJZm9vYmFyID0gdHJ1ZTsKLQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJhXCIiKSkKLQkJCQlhID0gdHJ1ZTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoZG90bW9kdWxlcykpKSB7CisJCQlib29sZWFuIGZvbyA9IGZhbHNlOworCQkJYm9vbGVhbiBmb29iYXIgPSBmYWxzZTsKKwkJCWJvb2xlYW4gYSA9IGZhbHNlOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJCWlmIChsaW5lID09IG51bGwpCisJCQkJCWJyZWFrOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQorCQkJCQlmb28gPSB0cnVlOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb28vYmFyXCIiKSkKKwkJCQkJZm9vYmFyID0gdHJ1ZTsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYVwiIikpCisJCQkJCWEgPSB0cnVlOworCQkJfQorCQkJYXNzZXJ0VHJ1ZSgiVGhlIGZvbyBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgZm9vKTsKKwkJCWFzc2VydEZhbHNlKCJUaGUgZm9vL2JhciBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vYmFyKTsKKwkJCWFzc2VydFRydWUoIlRoZSBhIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBhKTsKIAkJfQotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGZvbyBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgZm9vKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vYmFyIHN1Ym1vZHVsZSBzaG91bGRuJ3QgZXhpc3QiLCBmb29iYXIpOwotCQlhc3NlcnRUcnVlKCJUaGUgYSBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYSk7CiAJfQogCiAJQFRlc3QKQEAgLTk1OSwxMSArOTM0LDEyIEBACiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwogCQlhc3NlcnRUcnVlKCJzdWJtb2R1bGUgc2hvdWxkIGJlIGNoZWNrZWQgb3V0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkibWFzdGVyIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZW1vdGVBbGlhcygpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMTE2NSwxMSArMTE0MSwxMiBAQAogCQkJLnNldFVSSShyb290VXJpKQogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTExOTEsMTEgKzExNjgsMTIgQEAKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCXByaXZhdGUgdm9pZCByZXNvbHZlUmVsYXRpdmVVcmlzKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0SWdub3JlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0SWdub3JlVGVzdC5qYXZhCmluZGV4IDNiMTE2MTYuLjBjNmVkMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdElnbm9yZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRJZ25vcmVUZXN0LmphdmEKQEAgLTE0MSw3ICsxNDEsOSBAQAogCQkvLyBEbyBhIHRyZWUgd2FsayB0aGF0IGRvZXMgZGVzY2VuZCBpbnRvIGlnbm9yZWQgZGlyZWN0b3JpZXMgYW5kIHJldHVybgogCQkvLyBhIGxpc3Qgb2YgYWxsIGlnbm9yZWQgZmlsZXMKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgewotCQkJd2Fsay5hZGRUcmVlKG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKSk7CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCQlpdGVyLnNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXModHJ1ZSk7CisJCQl3YWxrLmFkZFRyZWUoaXRlcik7CiAJCQl3YWxrLnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCXdoaWxlICh3YWxrLm5leHQoKSkgewogCQkJCWlmICh3YWxrLmdldFRyZWUoV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcykuaXNFbnRyeUlnbm9yZWQoKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhCmluZGV4IGNjYzY0ZmIuLjc4ZDlhODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGVUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtNTYsNyArNTYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLklnbm9yZU5vZGUuTWF0Y2hSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwpAQCAtNTQ2LDE5ICs1NDUsNiBAQAogCQllbmRXYWxrKCk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlnbm9yZU5vZGUoKSB7Ci0JCS8vIFJ1bGVzIGFyZSBuZXZlciBlbXB0eTogV29ya2luZ1RyZWVJdGVyYXRvciBvcHRpbWl6ZXMgZW1wdHkgZmlsZXMgYXdheQotCQkvLyBTbyB3ZSBoYXZlIHRvIHRlc3QgaXQgbWFudWFsbHkgaW4gY2FzZSB0aGlyZCBwYXJ0eSBjbGllbnRzIHVzZQotCQkvLyBJZ25vcmVOb2RlIGRpcmVjdGx5LgotCQlJZ25vcmVOb2RlIG5vZGUgPSBuZXcgSWdub3JlTm9kZSgpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5ULCBub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVCwgbm9kZS5pc0lnbm9yZWQoIiIsIGZhbHNlLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5UX05FR0FURV9GSVJTVF9NQVRDSCwKLQkJCQlub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UsIHRydWUpKTsKLQl9Ci0KIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlnbm9yZVJ1bGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSWdub3JlTm9kZSBub2RlID0gbmV3IElnbm9yZU5vZGUoKTsKQEAgLTc0Niw3ICs3MzIsOSBAQAogCiAJcHJpdmF0ZSB2b2lkIGJlZ2luV2FsaygpIHsKIAkJd2FsayA9IG5ldyBUcmVlV2FsayhkYik7Ci0JCXdhbGsuYWRkVHJlZShuZXcgRmlsZVRyZWVJdGVyYXRvcihkYikpOworCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCWl0ZXIuc2V0V2Fsa0lnbm9yZWREaXJlY3Rvcmllcyh0cnVlKTsKKwkJd2Fsay5hZGRUcmVlKGl0ZXIpOwogCX0KIAogCXByaXZhdGUgdm9pZCBlbmRXYWxrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTc3OSw2ICs3NjcsNiBAQAogCQlmb3IgKFN0cmluZyBsaW5lIDogcnVsZXMpIHsKIAkJCWRhdGEuYXBwZW5kKGxpbmUgKyAiXG4iKTsKIAkJfQotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbmRleGRpZmYvSW5kZXhEaWZmV2l0aFN5bWxpbmtUZXN0LmphdmEKaW5kZXggZDVkMzg1Ny4uMjZjMTFjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW5kZXhkaWZmL0luZGV4RGlmZldpdGhTeW1saW5rVGVzdC5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbmRleGRpZmY7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQlGaWxlIHJlc3RvcmVTY3JpcHQgPSBuZXcgRmlsZSh0ZXN0RGlyLCBuYW1lICsgIi5zaCIpOwogCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCiAJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0ocmVzdG9yZVNjcmlwdCkpOwotCQkJCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgVVRGXzgpKSB7CisJCQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBDSEFSU0VUKSkgewogCQkJd3JpdGVyLndyaXRlKCJlY2hvIGB3aGljaCBnaXRgIDE+JjJcbiIpOwogCQkJd3JpdGVyLndyaXRlKCJlY2hvIGBnaXQgLS12ZXJzaW9uYCAxPiYyXG4iKTsKIAkJCXdyaXRlci53cml0ZSgiZ2l0IGluaXQgIiArIG5hbWUgKyAiICYmIFxcXG4iKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ29uY3VycmVudFJlcGFja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ29uY3VycmVudFJlcGFja1Rlc3QuamF2YQppbmRleCA0ODEzZDI4Li42NDNkYWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NvbmN1cnJlbnRSZXBhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhCkBAIC0yMTAsMTcgKzIxMCwxNyBAQAogCQljb25maWcuaW5zdGFsbCgpOwogCX0KIAotCXByaXZhdGUgUmV2T2JqZWN0IHBhcnNlKGZpbmFsIEFueU9iamVjdElkIGlkKQorCXByaXZhdGUgUmV2T2JqZWN0IHBhcnNlKEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsoZGIpKSB7CiAJCQlyZXR1cm4gcncucGFyc2VBbnkoaWQpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBGaWxlW10gcGFjayhmaW5hbCBSZXBvc2l0b3J5IHNyYywgZmluYWwgUmV2T2JqZWN0Li4uIGxpc3QpCisJcHJpdmF0ZSBGaWxlW10gcGFjayhSZXBvc2l0b3J5IHNyYywgUmV2T2JqZWN0Li4uIGxpc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKFBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihzcmMpKSB7Ci0JCQlmb3IgKGZpbmFsIFJldk9iamVjdCBvIDogbGlzdCkgeworCQkJZm9yIChSZXZPYmplY3QgbyA6IGxpc3QpIHsKIAkJCQlwdy5hZGRPYmplY3Qobyk7CiAJCQl9CiAKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlW10gZmlsZXMsIGZpbmFsIFBhY2tXcml0ZXIgcHcpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZShGaWxlW10gZmlsZXMsIFBhY2tXcml0ZXIgcHcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBsb25nIGJlZ2luID0gZmlsZXNbMF0uZ2V0UGFyZW50RmlsZSgpLmxhc3RNb2RpZmllZCgpOwogCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwpAQCAtMjUxLDE2ICsyNTEsMTYgQEAKIAkJdG91Y2goYmVnaW4sIGZpbGVzWzBdLmdldFBhcmVudEZpbGUoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZVtdIGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZVtdIGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgYmVnaW4gPSBsaXN0WzBdLmdldFBhcmVudEZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJZm9yIChmaW5hbCBGaWxlIGYgOiBsaXN0KSB7CisJCWZvciAoRmlsZSBmIDogbGlzdCkgewogCQkJRmlsZVV0aWxzLmRlbGV0ZShmKTsKIAkJCWFzc2VydEZhbHNlKGYgKyAiIHdhcyByZW1vdmVkIiwgZi5leGlzdHMoKSk7CiAJCX0KIAkJdG91Y2goYmVnaW4sIGxpc3RbMF0uZ2V0UGFyZW50RmlsZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKGZpbmFsIGxvbmcgYmVnaW4sIGZpbmFsIEZpbGUgZGlyKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b3VjaChsb25nIGJlZ2luLCBGaWxlIGRpcikgewogCQl3aGlsZSAoYmVnaW4gPj0gZGlyLmxhc3RNb2RpZmllZCgpKSB7CiAJCQl0cnkgewogCQkJCVRocmVhZC5zbGVlcCgyNSk7CkBAIC0yNzEsMTIgKzI3MSwxMiBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBGaWxlIGZ1bGxQYWNrRmlsZU5hbWUoZmluYWwgT2JqZWN0SWQgbmFtZSwgZmluYWwgU3RyaW5nIHN1ZmZpeCkgeworCXByaXZhdGUgRmlsZSBmdWxsUGFja0ZpbGVOYW1lKE9iamVjdElkIG5hbWUsIFN0cmluZyBzdWZmaXgpIHsKIAkJZmluYWwgRmlsZSBwYWNrZGlyID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRQYWNrRGlyZWN0b3J5KCk7CiAJCXJldHVybiBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgbmFtZS5uYW1lKCkgKyBzdWZmaXgpOwogCX0KIAotCXByaXZhdGUgUmV2T2JqZWN0IHdyaXRlQmxvYihmaW5hbCBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFN0cmluZyBkYXRhKQorCXByaXZhdGUgUmV2T2JqZWN0IHdyaXRlQmxvYihSZXBvc2l0b3J5IHJlcG8sIFN0cmluZyBkYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGJ5dGVzID0gQ29uc3RhbnRzLmVuY29kZShkYXRhKTsKIAkJZmluYWwgT2JqZWN0SWQgaWQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZVRlc3QuamF2YQppbmRleCA5MWJkNTIzLi4wNGZjY2YzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEKQEAgLTE0NiwxNSArMTQ2LDE1IEBACiAJCWFzc2VydEZhbHNlKCJpcyBub3QgbGFyZ2UiLCBvbC5pc0xhcmdlKCkpOwogCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0xODAsMTUgKzE4MCwxNSBAQAogCQkJCQkuZ2V0TWVzc2FnZSgpKTsKIAkJfQogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIzOSwxNSArMjM5LDE1IEBACiAJCQlhc3NlcnROb3ROdWxsKG9sLmdldENhY2hlZEJ5dGVzKCkpOwogCQkJYXNzZXJ0QXJyYXlFcXVhbHMoZGF0YTMsIG9sLmdldENhY2hlZEJ5dGVzKCkpOwogCi0JCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJCWFzc2VydEVxdWFscyhDb25zdGFudHMuT0JKX0JMT0IsIGluLmdldFR5cGUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZGF0YTMubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQkJYnl0ZVtdIGFjdCA9IG5ldyBieXRlW2RhdGEzLmxlbmd0aF07Ci0JCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgZGF0YTMubGVuZ3RoKTsKLQkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoYWN0LCBkYXRhMykpOwotCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCQlpbi5jbG9zZSgpOworCQkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCQlhc3NlcnRFcXVhbHMoQ29uc3RhbnRzLk9CSl9CTE9CLCBpbi5nZXRUeXBlKCkpOworCQkJCWFzc2VydEVxdWFscyhkYXRhMy5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQkJYnl0ZVtdIGFjdCA9IG5ldyBieXRlW2RhdGEzLmxlbmd0aF07CisJCQkJSU8ucmVhZEZ1bGx5KGluLCBhY3QsIDAsIGRhdGEzLmxlbmd0aCk7CisJCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhhY3QsIGRhdGEzKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTI4MiwyMiArMjgyLDE2IEBACiAJCQlGaWxlIHBhY2tOYW1lID0gbmV3IEZpbGUoZGlyLCBpZEEubmFtZSgpICsgIi5wYWNrIik7CiAJCQlGaWxlIGlkeE5hbWUgPSBuZXcgRmlsZShkaXIsIGlkQS5uYW1lKCkgKyAiLmlkeCIpOwogCi0JCQlGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYWNrTmFtZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYWNrTmFtZSkpIHsKIAkJCQlmLndyaXRlKHBhY2sudG9CeXRlQXJyYXkoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWYuY2xvc2UoKTsKIAkJCX0KIAotCQkJZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeE5hbWUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4TmFtZSkpIHsKIAkJCQlMaXN0PFBhY2tlZE9iamVjdEluZm8+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJCQlsaXN0LmFkZChhKTsKIAkJCQlsaXN0LmFkZChiKTsKIAkJCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOwogCQkJCW5ldyBQYWNrSW5kZXhXcml0ZXJWMShmKS53cml0ZShsaXN0LCBmb290ZXIpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmLmNsb3NlKCk7CiAJCQl9CiAKIAkJCVBhY2tGaWxlIHBhY2tGaWxlID0gbmV3IFBhY2tGaWxlKHBhY2tOYW1lLCBQYWNrRXh0LklOREVYLmdldEJpdCgpKTsKQEAgLTMyMSwxNiArMzE1LDE3IEBACiAJCWFzc2VydFRydWUoImhhcyBibG9iIiwgd2MuaGFzKGlkKSk7CiAKIAkJT2JqZWN0TG9hZGVyIG9sID0gd2Mub3BlbihpZCk7Ci0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0VHJ1ZShpbiBpbnN0YW5jZW9mIE9iamVjdFN0cmVhbS5TbWFsbFN0cmVhbSk7Ci0JCWFzc2VydEVxdWFscygzMDAsIGluLmF2YWlsYWJsZSgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uU21hbGxTdHJlYW0pOworCQkJYXNzZXJ0RXF1YWxzKDMwMCwgaW4uYXZhaWxhYmxlKCkpOworCQl9CiAKIAkJd2Muc2V0U3RyZWFtRmlsZVRocmVzaG9sZCgyOTkpOwogCQlvbCA9IHdjLm9wZW4oaWQpOwotCQlpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0VHJ1ZShpbiBpbnN0YW5jZW9mIE9iamVjdFN0cmVhbS5GaWx0ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaW4uYXZhaWxhYmxlKCkpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0VHJ1ZShpbiBpbnN0YW5jZW9mIE9iamVjdFN0cmVhbS5GaWx0ZXIpOworCQkJYXNzZXJ0RXF1YWxzKDEsIGluLmF2YWlsYWJsZSgpKTsKKwkJfQogCX0KIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjbG9uZShpbnQgZmlyc3QsIGJ5dGVbXSBiYXNlKSB7CkBAIC0zNzIsNyArMzY3LDcgQEAKIAkJcGFjay53cml0ZShidWYsIDAsIG4pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVmbGF0ZShUZW1wb3JhcnlCdWZmZXIuSGVhcCBwYWNrLCBmaW5hbCBieXRlW10gY29udGVudCkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlZmxhdGUoVGVtcG9yYXJ5QnVmZmVyLkhlYXAgcGFjaywgYnl0ZVtdIGNvbnRlbnQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBEZWZsYXRlciBkZWZsYXRlciA9IG5ldyBEZWZsYXRlcigpOwogCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTI4XTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQppbmRleCAzNzk0MzJkLi4wNGJlZDA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCkBAIC0zNjgsNyArMzY4LDcgQEAKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI5MDJkNTQ3NmZhMjQ5YjdhYmM5ZDg0YzYxMTU3N2E4MTM4MWYwMzI3IiksCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyIpICwKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI1YjZlN2M2NmMyNzZlNzYxMGQ0YTczYzcwZWMxYTFmN2MxMDAzMjU5IikgfTsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHBhcnNlciA9IG5ldyBSZXZXYWxrKGRiKSkgeworCQl0cnkgKFJldldhbGsgcGFyc2VyID0gbmV3IFJldldhbGsoZGIpKSB7CiAJCQlmaW5hbCBSZXZPYmplY3QgZm9yY2VkT3JkZXJSZXZzW10gPSBuZXcgUmV2T2JqZWN0W2ZvcmNlZE9yZGVyLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvcmNlZE9yZGVyLmxlbmd0aDsgaSsrKQogCQkJCWZvcmNlZE9yZGVyUmV2c1tpXSA9IHBhcnNlci5wYXJzZUFueShmb3JjZWRPcmRlcltpXSk7CkBAIC01MTUsMTEgKzUxNSw4IEBACiAKIAkJLy8gVmFsaWRhdGUgdGhhdCBhbiBpbmRleCB3cml0dGVuIGJ5IFBhY2tXcml0ZXIgaXMgdGhlIHNhbWUuCiAJCWZpbmFsIEZpbGUgaWR4MkZpbGUgPSBuZXcgRmlsZShpbmRleEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLjIiKTsKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeDJGaWxlKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGlzID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4MkZpbGUpKSB7CiAJCQl3cml0ZXIud3JpdGVJbmRleChpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwogCQl9CiAJCWZpbmFsIFBhY2tJbmRleCBpZHgyID0gUGFja0luZGV4Lm9wZW4oaWR4MkZpbGUpOwogCQlhc3NlcnRUcnVlKGlkeDIgaW5zdGFuY2VvZiBQYWNrSW5kZXhWMik7CkBAIC03MTUsMTQgKzcxMiwxNCBAQAogCQkJU3RyaW5nIGlkID0gcHcuY29tcHV0ZU5hbWUoKS5nZXROYW1lKCk7CiAJCQlGaWxlIHBhY2tkaXIgPSByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja0RpcmVjdG9yeSgpOwogCQkJRmlsZSBwYWNrRmlsZSA9IG5ldyBGaWxlKHBhY2tkaXIsICJwYWNrLSIgKyBpZCArICIucGFjayIpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBwYWNrT1MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYWNrRmlsZSk7Ci0JCQlwdy53cml0ZVBhY2soTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKLQkJCQkJTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwgcGFja09TKTsKLQkJCXBhY2tPUy5jbG9zZSgpOworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIHBhY2tPUyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhY2tGaWxlKSkgeworCQkJCXB3LndyaXRlUGFjayhOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQkJTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwgcGFja09TKTsKKwkJCX0KIAkJCUZpbGUgaWR4RmlsZSA9IG5ldyBGaWxlKHBhY2tkaXIsICJwYWNrLSIgKyBpZCArICIuaWR4Iik7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGlkeE9TID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4RmlsZSk7Ci0JCQlwdy53cml0ZUluZGV4KGlkeE9TKTsKLQkJCWlkeE9TLmNsb3NlKCk7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gaWR4T1MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShpZHhGaWxlKSkgeworCQkJCXB3LndyaXRlSW5kZXgoaWR4T1MpOworCQkJfQogCQkJcmV0dXJuIFBhY2tJbmRleC5vcGVuKGlkeEZpbGUpOwogCQl9CiAJfQpAQCAtODM4LDcgKzgzNSw3IEBACiAJCXZlcmlmeU9wZW5QYWNrKHRoaW4pOwogCX0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJpZnlPcGVuUGFjayhmaW5hbCBMaXN0PFJldk9iamVjdD4gb2JqZWN0U291cmNlKQorCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJpZnlPcGVuUGFjayhMaXN0PFJldk9iamVjdD4gb2JqZWN0U291cmNlKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJTnVsbFByb2dyZXNzTW9uaXRvciBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKIAkJd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIoY29uZmlnLCBkYi5uZXdPYmplY3RSZWFkZXIoKSk7CkBAIC04NDksNyArODQ2LDcgQEAKIAkJdmVyaWZ5T3BlblBhY2soZmFsc2UpOwogCX0KIAotCXByaXZhdGUgdm9pZCB2ZXJpZnlPcGVuUGFjayhmaW5hbCBib29sZWFuIHRoaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHZlcmlmeU9wZW5QYWNrKGJvb2xlYW4gdGhpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIHBhY2tEYXRhID0gb3MudG9CeXRlQXJyYXkoKTsKIAogCQlpZiAodGhpbikgewpAQCAtODcxLDEzICs4NjgsMTMgQEAKIAkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBQYWNrRmlsZSBhZnRlciBwYXJzaW5nIiwgcGFjayk7CiAJfQogCi0JcHJpdmF0ZSBQYWNrUGFyc2VyIGluZGV4KGZpbmFsIGJ5dGVbXSBwYWNrRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFBhY2tQYXJzZXIgaW5kZXgoYnl0ZVtdIHBhY2tEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoaW5zZXJ0ZXIgPT0gbnVsbCkKIAkJCWluc2VydGVyID0gZHN0Lm5ld09iamVjdEluc2VydGVyKCk7CiAJCXJldHVybiBpbnNlcnRlci5uZXdQYWNrUGFyc2VyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwYWNrRGF0YSkpOwogCX0KIAotCXByaXZhdGUgdm9pZCB2ZXJpZnlPYmplY3RzT3JkZXIoZmluYWwgT2JqZWN0SWQgb2JqZWN0c09yZGVyW10pIHsKKwlwcml2YXRlIHZvaWQgdmVyaWZ5T2JqZWN0c09yZGVyKE9iamVjdElkIG9iamVjdHNPcmRlcltdKSB7CiAJCWZpbmFsIExpc3Q8UGFja0luZGV4Lk11dGFibGVFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJCWZvciAoTXV0YWJsZUVudHJ5IG1lIDogcGFjaykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQppbmRleCBmZWZjY2YzLi41YTJiZDljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQpAQCAtMTI3MSw3ICsxMjcxLDcgQEAKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyB2b2lkIG9uUmVmc0NoYW5nZWQoUmVmc0NoYW5nZWRFdmVudCBldmVudCkgewogCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWZEYi5nZXRSZWZzKCJyZWYiKTsKKwkJCQkJCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOwogCQkJCQkJCWNoYW5nZUNvdW50LmluY3JlbWVudEFuZEdldCgpOwogCQkJCQkJfSBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIHNvZSkgewogCQkJCQkJCWVycm9yLnNldChzb2UpOwpAQCAtMTI4MCw4ICsxMjgwLDggQEAKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0pOwotCQlyZWZEYi5nZXRSZWZzKCJyZWYiKTsKLQkJcmVmRGIuZ2V0UmVmcygicmVmIik7CisJCXJlZkRiLmdldFJlZnNCeVByZWZpeCgicmVmIik7CisJCXJlZkRiLmdldFJlZnNCeVByZWZpeCgicmVmIik7CiAJCWFzc2VydE51bGwoZXJyb3IuZ2V0KCkpOwogCQlhc3NlcnROdWxsKGV4Y2VwdGlvbi5nZXQoKSk7CiAJCWFzc2VydEVxdWFscygxLCBjaGFuZ2VDb3VudC5nZXQoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmVXBkYXRlVGVzdC5qYXZhCmluZGV4IGQ4ZDQ1YTguLmUxYWRlZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmVXBkYXRlVGVzdC5qYXZhCkBAIC00NSw4ICs0NSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuTE9DS19TVUZGSVg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtNjIsNiArNjIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CkBAIC05NCwxMyArOTUsMTMgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJlZlVwZGF0ZSB1cGRhdGVSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFJlZlVwZGF0ZSByZWYgPSBkYi51cGRhdGVSZWYobmFtZSk7CiAJCXJlZi5zZXROZXdPYmplY3RJZChkYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEKSk7CiAJCXJldHVybiByZWY7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZShmaW5hbCBSZWZVcGRhdGUgcmVmLCBmaW5hbCBSZXN1bHQgZXhwZWN0ZWQpCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZShSZWZVcGRhdGUgcmVmLCBSZXN1bHQgZXhwZWN0ZWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlkZWxldGUocmVmLCBleHBlY3RlZCwgdHJ1ZSwgdHJ1ZSk7CiAJfQpAQCAtMTEwLDExICsxMTEsMjEgQEAKIAkJZGVsZXRlKGRiLCByZWYsIGV4cGVjdGVkLCBleGlzdHMsIHJlbW92ZWQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGUoUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBSZWZVcGRhdGUgcmVmLCBmaW5hbCBSZXN1bHQgZXhwZWN0ZWQsCi0JCQlmaW5hbCBib29sZWFuIGV4aXN0cywgZmluYWwgYm9vbGVhbiByZW1vdmVkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoZXhpc3RzLCByZXBvLmdldEFsbFJlZnMoKS5jb250YWluc0tleShyZWYuZ2V0TmFtZSgpKSk7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZShSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFJlZlVwZGF0ZSByZWYsCisJCQlmaW5hbCBSZXN1bHQgZXhwZWN0ZWQsIGZpbmFsIGJvb2xlYW4gZXhpc3RzLCBmaW5hbCBib29sZWFuIHJlbW92ZWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoZXhpc3RzLCBnZXRSZWYocmVwbywgcmVmLmdldE5hbWUoKSkuaXNQcmVzZW50KCkpOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlZi5kZWxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyghcmVtb3ZlZCwgcmVwby5nZXRBbGxSZWZzKCkuY29udGFpbnNLZXkocmVmLmdldE5hbWUoKSkpOworCQlhc3NlcnRFcXVhbHMoIXJlbW92ZWQsIGdldFJlZihyZXBvLCByZWYuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSk7CisJfQorCisJcHJpdmF0ZSBPcHRpb25hbDxSZWY+IGdldFJlZihSZXBvc2l0b3J5IHJlcG8sIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFJlZihyZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIE9wdGlvbmFsPFJlZj4gZ2V0UmVmKExpc3Q8UmVmPiByZWZzLCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gcmVmcy5zdHJlYW0oKS5maWx0ZXIociAtPiByLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKIAl9CiAKIAlAVGVzdApAQCAtMTI1LDggKzEzNiw3IEBACiAJCXJ1LnNldE5ld09iamVjdElkKG5ld2lkKTsKIAkJUmVzdWx0IHVwZGF0ZSA9IHJ1LnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0Lk5FVywgdXBkYXRlKTsKLQkJZmluYWwgUmVmIHIgPSBkYi5nZXRBbGxSZWZzKCkuZ2V0KG5ld1JlZik7Ci0JCWFzc2VydE5vdE51bGwocik7CisJCWZpbmFsIFJlZiByID0gZ2V0UmVmKGRiLCBuZXdSZWYpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMobmV3UmVmLCByLmdldE5hbWUoKSk7CiAJCWFzc2VydE5vdE51bGwoci5nZXRPYmplY3RJZCgpKTsKIAkJYXNzZXJ0Tm90U2FtZShuZXdpZCwgci5nZXRPYmplY3RJZCgpKTsKQEAgLTI1Myw3ICsyNjMsNyBAQAogCiAJCU9iamVjdElkIGJsb2JJZDsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSBiYXJlUmVwby5uZXdPYmplY3RJbnNlcnRlcigpKSB7Ci0JCQlibG9iSWQgPSBpbnMuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgImNvbnRlbnRzIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJYmxvYklkID0gaW5zLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsICJjb250ZW50cyIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJaW5zLmZsdXNoKCk7CiAJCX0KIApAQCAtMzc4LDEwICszODgsMTAgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZktleVNhbWVBc05hbWUoKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAJCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKIAkJZm9yIChFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IGFsbFJlZnMuZW50cnlTZXQoKSkgewogCQkJYXNzZXJ0RXF1YWxzKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCiAJCX0KIAl9CiAKQEAgLTUyMCw4ICs1MzAsOCBAQAogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZnNDYWNoZUFmdGVyVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCB1c2UgdGhlIGRlZmFsdCByZXBvIGZvciB0aGlzIGNhc2UuCi0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKKwkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYXVsdCByZXBvIGZvciB0aGlzIGNhc2UuCisJCUxpc3Q8UmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCU9iamVjdElkIG9sZFZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRCIpOwogCQlPYmplY3RJZCBuZXdWYWx1ZSA9IGRiLnJlc29sdmUoIkhFQUReIik7CiAJCS8vIGZpcnN0IG1ha2UgSEVBRCByZWZlciB0byBsb29zZSByZWYKQEAgLTUzNyw5ICs1NDcsOSBAQAogCQl1cGRhdGUgPSB1cGRhdGVSZWYudXBkYXRlKCk7CiAJCWFzc2VydEVxdWFscyhSZXN1bHQuRkFTVF9GT1JXQVJELCB1cGRhdGUpOwogCi0JCWFsbFJlZnMgPSBkYi5nZXRBbGxSZWZzKCk7Ci0JCVJlZiBtYXN0ZXIgPSBhbGxSZWZzLmdldCgicmVmcy9oZWFkcy9tYXN0ZXIiKTsKLQkJUmVmIGhlYWQgPSBhbGxSZWZzLmdldCgiSEVBRCIpOworCQlhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CisJCVJlZiBtYXN0ZXIgPSBnZXRSZWYoYWxsUmVmcywgInJlZnMvaGVhZHMvbWFzdGVyIikuZ2V0KCk7CisJCVJlZiBoZWFkID0gZ2V0UmVmKGFsbFJlZnMsICJIRUFEIikuZ2V0KCk7CiAJCWFzc2VydEVxdWFscygicmVmcy9oZWFkcy9tYXN0ZXIiLCBtYXN0ZXIuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJIRUFEIiwgaGVhZC5nZXROYW1lKCkpOwogCQlhc3NlcnRUcnVlKCJpcyBzeW1ib2xpYyByZWZlcmVuY2UiLCBoZWFkLmlzU3ltYm9saWMoKSk7CkBAIC01NTcsOCArNTY3LDggQEAKIAkgKi8KIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWZzQ2FjaGVBZnRlclVwZGF0ZUxvb3NlT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBEbyBub3QgdXNlIHRoZSBkZWZhbHQgcmVwbyBmb3IgdGhpcyBjYXNlLgotCQlNYXA8U3RyaW5nLCBSZWY+IGFsbFJlZnMgPSBkYi5nZXRBbGxSZWZzKCk7CisJCS8vIERvIG5vdCB1c2UgdGhlIGRlZmF1bHQgcmVwbyBmb3IgdGhpcyBjYXNlLgorCQlMaXN0PFJlZj4gYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQlPYmplY3RJZCBvbGRWYWx1ZSA9IGRiLnJlc29sdmUoIkhFQUQiKTsKIAkJd3JpdGVTeW1yZWYoQ29uc3RhbnRzLkhFQUQsICJyZWZzL2hlYWRzL25ld3JlZiIpOwogCQlSZWZVcGRhdGUgdXBkYXRlUmVmID0gZGIudXBkYXRlUmVmKENvbnN0YW50cy5IRUFEKTsKQEAgLTU2Nyw5ICs1NzcsOSBAQAogCQlSZXN1bHQgdXBkYXRlID0gdXBkYXRlUmVmLnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0Lk5FVywgdXBkYXRlKTsKIAotCQlhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOwotCQlSZWYgaGVhZCA9IGFsbFJlZnMuZ2V0KCJIRUFEIik7Ci0JCVJlZiBuZXdyZWYgPSBhbGxSZWZzLmdldCgicmVmcy9oZWFkcy9uZXdyZWYiKTsKKwkJYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQlSZWYgaGVhZCA9IGdldFJlZihhbGxSZWZzLCAiSEVBRCIpLmdldCgpOworCQlSZWYgbmV3cmVmID0gZ2V0UmVmKGFsbFJlZnMsICJyZWZzL2hlYWRzL25ld3JlZiIpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbmV3cmVmIiwgbmV3cmVmLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiSEVBRCIsIGhlYWQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgc3ltYm9saWMgcmVmZXJlbmNlIiwgaGVhZC5pc1N5bWJvbGljKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVDAwMDNfQmFzaWNUZXN0LmphdmEKaW5kZXggZDc1MDVhZi4uZTExM2RiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1QwMDAzX0Jhc2ljVGVzdC5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTM3LDEwICsxMzcsMTAgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDBfb3BlbnJlcG9fZGVmYXVsdF9naXREaXJTZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHJlcG8xUGFyZW50ID0gbmV3IEZpbGUodHJhc2guZ2V0UGFyZW50RmlsZSgpLCAicjEiKTsKLQkJUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlyZXBvMWluaXRpYWwuY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQl9CiAKIAkJRmlsZSB0aGVEaXIgPSBuZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpOwogCQlGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkKQEAgLTE2MiwxMCArMTYyLDEwIEBACiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpckFuZFdvcmtUcmVlU2V0KCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwotCQlSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMTg3LDEwICsxODcsMTAgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDBfb3BlbnJlcG9fZGVmYXVsdF93b3JrRGlyU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSByZXBvMVBhcmVudCA9IG5ldyBGaWxlKHRyYXNoLmdldFBhcmVudEZpbGUoKSwgInIxIik7Ci0JCVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KG5ldyBGaWxlKHJlcG8xUGFyZW50LAotCQkJCUNvbnN0YW50cy5ET1RfR0lUKSk7Ci0JCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkoCisJCQkJbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKSkpIHsKKwkJCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yMTMsMTMgKzIxMywxMyBAQAogCQlGaWxlIHJlcG8xUGFyZW50ID0gbmV3IEZpbGUodHJhc2guZ2V0UGFyZW50RmlsZSgpLCAicjEiKTsKIAkJRmlsZSB3b3JrZGlyID0gbmV3IEZpbGUodHJhc2guZ2V0UGFyZW50RmlsZSgpLCAicnciKTsKIAkJRmlsZVV0aWxzLm1rZGlyKHdvcmtkaXIpOwotCQlGaWxlUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOwotCQljZmcuc2V0U3RyaW5nKCJjb3JlIiwgbnVsbCwgIndvcmt0cmVlIiwgd29ya2Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWNmZy5zYXZlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKEZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNmZyA9IHJlcG8xaW5pdGlhbC5nZXRDb25maWcoKTsKKwkJCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCB3b3JrZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCWNmZy5zYXZlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMjQyLDEzICsyNDIsMTMgQEAKIAkJRmlsZSByZXBvMVBhcmVudCA9IG5ldyBGaWxlKHRyYXNoLmdldFBhcmVudEZpbGUoKSwgInIxIik7CiAJCUZpbGUgd29ya2RpciA9IG5ldyBGaWxlKHRyYXNoLmdldFBhcmVudEZpbGUoKSwgInJ3Iik7CiAJCUZpbGVVdGlscy5ta2Rpcih3b3JrZGlyKTsKLQkJRmlsZVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KG5ldyBGaWxlKHJlcG8xUGFyZW50LAotCQkJCUNvbnN0YW50cy5ET1RfR0lUKSk7Ci0JCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKLQkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNmZyA9IHJlcG8xaW5pdGlhbC5nZXRDb25maWcoKTsKLQkJY2ZnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJ3b3JrdHJlZSIsICIuLi8uLi9ydyIpOwotCQljZmcuc2F2ZSgpOwotCQlyZXBvMWluaXRpYWwuY2xvc2UoKTsKKwkJdHJ5IChGaWxlUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkoCisJCQkJbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKSkpIHsKKwkJCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKKwkJCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjZmcgPSByZXBvMWluaXRpYWwuZ2V0Q29uZmlnKCk7CisJCQljZmcuc2V0U3RyaW5nKCJjb3JlIiwgbnVsbCwgIndvcmt0cmVlIiwgIi4uLy4uL3J3Iik7CisJCQljZmcuc2F2ZSgpOworCQl9CiAKIAkJRmlsZSB0aGVEaXIgPSBuZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpOwogCQlGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkKQEAgLTI3MywyNiArMjczLDI0IEBACiAJCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUodHJhc2gsICJpZHgiKTsKIAkJRmlsZSBvYmpEaXIgPSBuZXcgRmlsZSh0cmFzaCwgIi4uL29iaiIpOwogCQlGaWxlIGFsdE9iakRpciA9IGRiLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0RGlyZWN0b3J5KCk7Ci0JCVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KG5ldyBGaWxlKHJlcG8xUGFyZW50LAotCQkJCUNvbnN0YW50cy5ET1RfR0lUKSk7Ci0JCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkoCisJCQkJbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKSkpIHsKKwkJCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKLQkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpIC8vCisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpIC8vCiAJCQkJLnNldEdpdERpcih0aGVEaXIpLnNldE9iamVjdERpcmVjdG9yeShvYmpEaXIpIC8vCiAJCQkJLmFkZEFsdGVybmF0ZU9iamVjdERpcmVjdG9yeShhbHRPYmpEaXIpIC8vCiAJCQkJLnNldEluZGV4RmlsZShpbmRleEZpbGUpIC8vCi0JCQkJLmJ1aWxkKCk7Ci0JCWFzc2VydEVxdWFsc1BhdGgodGhlRGlyLCByLmdldERpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aCh0aGVEaXIuZ2V0UGFyZW50RmlsZSgpLCByLmdldFdvcmtUcmVlKCkpOwotCQlhc3NlcnRFcXVhbHNQYXRoKGluZGV4RmlsZSwgci5nZXRJbmRleEZpbGUoKSk7Ci0JCWFzc2VydEVxdWFsc1BhdGgob2JqRGlyLCByLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0RGlyZWN0b3J5KCkpOwotCQlhc3NlcnROb3ROdWxsKHIub3BlbihPYmplY3RJZAotCQkJCS5mcm9tU3RyaW5nKCI2ZGI5YzJlYmY3NTU5MGVlZjk3MzA4MTczNjczMGE5ZWExNjlhMGM0IikpKTsKLQkJLy8gTXVzdCBjbG9zZSBvciB0aGUgZGVmYXVsdCByZXBvIHBhY2sgZmlsZXMgY3JlYXRlZCBieSB0aGlzIHRlc3QgZ2V0cwotCQkvLyBsb2NrZWQgdmlhIHRoZSBhbHRlcm5hdGUgb2JqZWN0IGRpcmVjdG9yaWVzIG9uIFdpbmRvd3MuCi0JCXIuY2xvc2UoKTsKKwkJCQkuYnVpbGQoKSkgeworCQkJYXNzZXJ0RXF1YWxzUGF0aCh0aGVEaXIsIHIuZ2V0RGlyZWN0b3J5KCkpOworCQkJYXNzZXJ0RXF1YWxzUGF0aCh0aGVEaXIuZ2V0UGFyZW50RmlsZSgpLCByLmdldFdvcmtUcmVlKCkpOworCQkJYXNzZXJ0RXF1YWxzUGF0aChpbmRleEZpbGUsIHIuZ2V0SW5kZXhGaWxlKCkpOworCQkJYXNzZXJ0RXF1YWxzUGF0aChvYmpEaXIsIHIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKSk7CisJCQlhc3NlcnROb3ROdWxsKHIub3BlbihPYmplY3RJZAorCQkJCQkuZnJvbVN0cmluZygiNmRiOWMyZWJmNzU1OTBlZWY5NzMwODE3MzY3MzBhOWVhMTY5YTBjNCIpKSk7CisJCX0KIAl9CiAKIAlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHNQYXRoKEZpbGUgZXhwZWN0ZWQsIEZpbGUgYWN0dWFsKQpAQCAtMzA3LDcgKzMwNSw3IEBACiAJCS8vIG9iamVjdCAoYXMgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHBhY2spLgogCQkvLwogCQlmaW5hbCBSZXBvc2l0b3J5IG5ld2RiID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKLQkJdHJ5IChmaW5hbCBPYmplY3RJbnNlcnRlciBvaSA9IG5ld2RiLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBvaSA9IG5ld2RiLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCWZpbmFsIE9iamVjdElkIHRyZWVJZCA9IG9pLmluc2VydChuZXcgVHJlZUZvcm1hdHRlcigpKTsKIAkJCWFzc2VydEVxdWFscygiNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCIsCiAJCQkJCXRyZWVJZC5uYW1lKCkpOwpAQCAtMzc1LDcgKzM3Myw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDdfT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgRmlsZVJlcG9zaXRvcnkgZGIyID0gbmV3IEZpbGVSZXBvc2l0b3J5KGRiLmdldERpcmVjdG9yeSgpKSkgeworCQl0cnkgKEZpbGVSZXBvc2l0b3J5IGRiMiA9IG5ldyBGaWxlUmVwb3NpdG9yeShkYi5nZXREaXJlY3RvcnkoKSkpIHsKIAkJCWFzc2VydEVxdWFscyhkYi5nZXREaXJlY3RvcnkoKSwgZGIyLmdldERpcmVjdG9yeSgpKTsKIAkJCWFzc2VydEVxdWFscyhkYi5nZXRPYmplY3REYXRhYmFzZSgpLmdldERpcmVjdG9yeSgpLCBkYjIKIAkJCQkJLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0RGlyZWN0b3J5KCkpOwpAQCAtNDE3LDE0ICs0MTUsMTEgQEAKIAkJLy8gVmVyaWZ5IHRoZSBjb21taXQgd2UganVzdCB3cm90ZSBpcyBpbiB0aGUgY29ycmVjdCBmb3JtYXQuCiAJCU9iamVjdERhdGFiYXNlIG9kYiA9IGRiLmdldE9iamVjdERhdGFiYXNlKCk7CiAJCWFzc2VydFRydWUoImlzIE9iamVjdERpcmVjdG9yeSIsIG9kYiBpbnN0YW5jZW9mIE9iamVjdERpcmVjdG9yeSk7Ci0JCWZpbmFsIFhJbnB1dFN0cmVhbSB4aXMgPSBuZXcgWElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oCi0JCQkJKChPYmplY3REaXJlY3RvcnkpIG9kYikuZmlsZUZvcihjbXRpZCkpKTsKLQkJdHJ5IHsKKwkJdHJ5IChYSW5wdXRTdHJlYW0geGlzID0gbmV3IFhJbnB1dFN0cmVhbSgKKwkJCQluZXcgRmlsZUlucHV0U3RyZWFtKCgoT2JqZWN0RGlyZWN0b3J5KSBvZGIpLmZpbGVGb3IoY210aWQpKSkpIHsKIAkJCWFzc2VydEVxdWFscygweDc4LCB4aXMucmVhZFVJbnQ4KCkpOwogCQkJYXNzZXJ0RXF1YWxzKDB4OWMsIHhpcy5yZWFkVUludDgoKSk7CiAJCQlhc3NlcnRFcXVhbHMoMCwgMHg3ODljICUgMzEpOwotCQl9IGZpbmFsbHkgewotCQkJeGlzLmNsb3NlKCk7CiAJCX0KIAogCQkvLyBWZXJpZnkgd2UgY2FuIHJlYWQgaXQuCkBAIC01MjIsNyArNTE3LDcgQEAKIAkJCQk0Mjk0OTY3Mjk1MDAwTCwgNjApKTsKIAkJY29tbWl0LnNldENvbW1pdHRlcihuZXcgUGVyc29uSWRlbnQoIkpvZSBIYWNrZXIiLCAiam9lMkBleGFtcGxlLmNvbSIsCiAJCQkJNDI5NDk2NzI5NTAwMEwsIDYwKSk7Ci0JCWNvbW1pdC5zZXRFbmNvZGluZyhVVEZfOCk7CisJCWNvbW1pdC5zZXRFbmNvZGluZyhDSEFSU0VUKTsKIAkJY29tbWl0LnNldE1lc3NhZ2UoIlx1MDBkY2JlcmdlZWtzIik7CiAJCU9iamVjdElkIGNpZCA9IGluc2VydENvbW1pdChjb21taXQpOwogCQlhc3NlcnRFcXVhbHMoIjQ2ODA5MDgxMTI3Nzg3MThmMzdlNjg2Y2JlYmNjOTEyNzMwYjMxNTQiLCBjaWQubmFtZSgpKTsKQEAgLTU2Miw3ICs1NTcsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAyNl9DcmVhdGVDb21taXRNdWx0aXBsZXBhcmVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCB0cmVlSWQ7Ci0JCXRyeSAoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CiAJCQlmaW5hbCBPYmplY3RJZCBibG9iSWQgPSBvaS5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAogCQkJCQkiYW5kIHRoaXMgaXMgdGhlIGRhdGEgaW4gbWVcbiIuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJTRVQKIAkJCQkJCQkubmFtZSgpKSk7CkBAIC03NTIsNyArNzQ3LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0Q29tbWl0KGZpbmFsIENvbW1pdEJ1aWxkZXIgYnVpbGRlcikKKwlwcml2YXRlIE9iamVjdElkIGluc2VydENvbW1pdChDb21taXRCdWlsZGVyIGJ1aWxkZXIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogCQl0cnkgKE9iamVjdEluc2VydGVyIG9pID0gZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgewogCQkJT2JqZWN0SWQgaWQgPSBvaS5pbnNlcnQoYnVpbGRlcik7CkBAIC03NjksNyArNzY0LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0VGFnKGZpbmFsIFRhZ0J1aWxkZXIgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSBPYmplY3RJZCBpbnNlcnRUYWcoVGFnQnVpbGRlciB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogCQl0cnkgKE9iamVjdEluc2VydGVyIG9pID0gZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgewogCQkJT2JqZWN0SWQgaWQgPSBvaS5pbnNlcnQodGFnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0VGVzdC5qYXZhCmluZGV4IGM1YWI3NjYuLjk4ZmYwNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3RUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdFRlc3QuamF2YQpAQCAtMTMwLDE1ICsxMzAsMTUgQEAKIAkJYXNzZXJ0RmFsc2UoImlzIG5vdCBsYXJnZSIsIG9sLmlzTGFyZ2UoKSk7CiAJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YSwgb2wuZ2V0Q2FjaGVkQnl0ZXMoKSkpOwogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTE1MCwxMSArMTUwLDggQEAKIAogCQlPYmplY3RMb2FkZXIgb2w7CiAJCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKIAkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTE3MSwxNSArMTY4LDE1IEBACiAJCQkJCS5nZXRNZXNzYWdlKCkpOwogCQl9CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOworCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMzE2LDIzICszMTMsMTMgQEAKIAkJd3JpdGUoaWQsIGd6KTsKIAogCQlPYmplY3RMb2FkZXIgb2w7Ci0JCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKLQkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpKSB7CisJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwogCQl9CiAKLQkJdHJ5IHsKLQkJCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJSU8ucmVhZEZ1bGx5KGluLCB0bXAsIDAsIHRtcC5sZW5ndGgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfQorCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQl0cnkgKElucHV0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlJTy5yZWFkRnVsbHkoaW4sIHRtcCwgMCwgdG1wLmxlbmd0aCk7CiAJCQlmYWlsKCJEaWQgbm90IHRocm93IENvcnJ1cHRPYmplY3RFeGNlcHRpb24iKTsKIAkJfSBjYXRjaCAoQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiBjb2UpIHsKIAkJCWFzc2VydEVxdWFscyhNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5vYmplY3RJc0NvcnJ1cHQsCkBAIC0zNTQsMTYgKzM0MSwxMiBAQAogCQl3cml0ZShpZCwgdHIpOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAogCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGF0IHRoZSBjbG9zZSgpIG1ldGhvZCB0aHJvd3MKIAkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7CiAJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKIAkJdHJ5IHsKQEAgLTM4OSwxNiArMzcyLDEyIEBACiAJCXdyaXRlKGlkLCB0cik7CiAKIAkJT2JqZWN0TG9hZGVyIG9sOwotCQl7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKTsKLQkJCXRyeSB7Ci0JCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZnMuY2xvc2UoKTsKLQkJCX0KKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKSkgeworCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKIAkJfQogCiAJCWJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoYXQgdGhlIGNsb3NlKCkgbWV0aG9kIHRocm93cwogCQlJbnB1dFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKIAkJSU8ucmVhZEZ1bGx5KGluLCB0bXAsIDAsIHRtcC5sZW5ndGgpOwogCQl0cnkgewpAQCAtNDI2LDE0ICs0MDUsMTUgQEAKIAkJYXNzZXJ0RmFsc2UoImlzIG5vdCBsYXJnZSIsIG9sLmlzTGFyZ2UoKSk7CiAJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YSwgb2wuZ2V0Q2FjaGVkQnl0ZXMoKSkpOwogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLAorCQkJCQlBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC00NDQsMTMgKzQyNCw4IEBACiAJCXdyaXRlKGlkLCBjb21wcmVzc1BhY2tGb3JtYXQodHlwZSwgZGF0YSkpOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAogCQlhc3NlcnROb3ROdWxsKCJjcmVhdGVkIGxvYWRlciIsIG9sKTsKQEAgLTQ2NiwxNSArNDQxLDE1IEBACiAJCQkJCS5nZXRNZXNzYWdlKCkpOwogCQl9CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOworCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNTczLDExICs1NDgsOCBAQAogCXByaXZhdGUgdm9pZCB3cml0ZShPYmplY3RJZCBpZCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGF0aCA9IHBhdGgoaWQpOwogCQlGaWxlVXRpbHMubWtkaXJzKHBhdGguZ2V0UGFyZW50RmlsZSgpKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpKSB7CiAJCQlvdXQud3JpdGUoZGF0YSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXQuY2xvc2UoKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUdldFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVHZXRUZXN0LmphdmEKaW5kZXggY2MzNDgzOC4uODJhZDI4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUdldFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlR2V0VGVzdC5qYXZhCkBAIC03NCwxMSArNzQsMTAgQEAKIAkJc3VwZXIuc2V0VXAoKTsKIAogCQl0b0xvYWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAorCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKIAkJCQluZXcgRmlsZUlucHV0U3RyZWFtKEpHaXRUZXN0VXRpbAogCQkJCQkJLmdldFRlc3RSZXNvdXJjZUZpbGUoImFsbF9wYWNrZWRfb2JqZWN0cy50eHQiKSksCi0JCQkJQ29uc3RhbnRzLkNIQVJTRVQpKTsKLQkJdHJ5IHsKKwkJCQlDb25zdGFudHMuQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoIiB7MSx9Iik7CkBAIC05MCw4ICs4OSw2IEBACiAJCQkJLy8gcGFydHNbNF0gaXMgdGhlIG9mZnNldCBpbiB0aGUgcGFjawogCQkJCXRvTG9hZC5hZGQobyk7CiAJCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlici5jbG9zZSgpOwogCQl9CiAJCWFzc2VydEVxdWFscyg5NiwgdG9Mb2FkLnNpemUoKSk7CiAJfQpAQCAtMTI3LDcgKzEyNCw3IEBACiAJCWNoZWNrTGltaXRzKGNmZyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpbWl0cyhmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTGltaXRzKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlmaW5hbCBXaW5kb3dDYWNoZSBjYWNoZSA9IFdpbmRvd0NhY2hlLmdldEluc3RhbmNlKCk7CiAJCWFzc2VydFRydWUoY2FjaGUuZ2V0T3BlbkZpbGVzKCkgPD0gY2ZnLmdldFBhY2tlZEdpdE9wZW5GaWxlcygpKTsKIAkJYXNzZXJ0VHJ1ZShjYWNoZS5nZXRPcGVuQnl0ZXMoKSA8PSBjZmcuZ2V0UGFja2VkR2l0TGltaXQoKSk7CkBAIC0xMzYsNyArMTMzLDcgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgZG9DYWNoZVRlc3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBUZXN0T2JqZWN0IG8gOiB0b0xvYWQpIHsKKwkJZm9yIChUZXN0T2JqZWN0IG8gOiB0b0xvYWQpIHsKIAkJCWZpbmFsIE9iamVjdExvYWRlciBvciA9IGRiLm9wZW4oby5pZCwgby50eXBlKTsKIAkJCWFzc2VydE5vdE51bGwob3IpOwogCQkJYXNzZXJ0RXF1YWxzKG8udHlwZSwgb3IuZ2V0VHlwZSgpKTsKQEAgLTE0OCw3ICsxNDUsNyBAQAogCiAJCWludCB0eXBlOwogCi0JCXZvaWQgc2V0VHlwZShmaW5hbCBTdHJpbmcgdHlwZVN0cikgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCQl2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVTdHIpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJCWZpbmFsIGJ5dGVbXSB0eXBlUmF3ID0gQ29uc3RhbnRzLmVuY29kZSh0eXBlU3RyICsgIiAiKTsKIAkJCWZpbmFsIE11dGFibGVJbnRlZ2VyIHB0ciA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOwogCQkJdHlwZSA9IENvbnN0YW50cy5kZWNvZGVUeXBlU3RyaW5nKGlkLCB0eXBlUmF3LCAoYnl0ZSkgJyAnLCBwdHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvWElucHV0U3RyZWFtLmphdmEKaW5kZXggNDZmOWVlMy4uOTEwOTk5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1hJbnB1dFN0cmVhbS5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiBjbGFzcyBYSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtIHsKIAlwcml2YXRlIGZpbmFsIGJ5dGVbXSBpbnRidWYgPSBuZXcgYnl0ZVs4XTsKIAotCVhJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBzKSB7CisJWElucHV0U3RyZWFtKElucHV0U3RyZWFtIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC02Myw3ICs2Myw3IEBACiAJCXJldHVybiBiOwogCX0KIAotCXN5bmNocm9uaXplZCB2b2lkIHJlYWRGdWxseShmaW5hbCBieXRlW10gYiwgaW50IG8sIGludCBsZW4pCisJc3luY2hyb25pemVkIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBiLCBpbnQgbywgaW50IGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCByOwogCQl3aGlsZSAobGVuID4gMCAmJiAociA9IHJlYWQoYiwgbywgbGVuKSkgPiAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlVGVzdC5qYXZhCmluZGV4IDE2ODRhZmEuLmFlNTJhZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlVGVzdC5qYXZhCkBAIC02MzEsNyArNjMxLDcgQEAKIAkJCQluYW1lKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc3ltcmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZHN0KQorCXByaXZhdGUgdm9pZCBzeW1yZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBkc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb21taXQobmV3IEZ1bmN0aW9uKCkgewogCQkJQE92ZXJyaWRlCkBAIC02NDgsNyArNjQ4LDcgQEAKIAkJfSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0SWQgaWQpCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZShTdHJpbmcgbmFtZSwgT2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb21taXQobmV3IEZ1bmN0aW9uKCkgewogCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnlUZXN0LmphdmEKaW5kZXggYjcwMjdmMy4uOTY1ODk5ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwpAQCAtNDE4LDYgKzQxOCw2IEBACiAJCVJldk9iamVjdCBvYmogPSB0ci5nZXQocncucGFyc2VUcmVlKHRyZWVpc2gpLCBwYXRoKTsKIAkJYXNzZXJ0U2FtZShSZXZCbG9iLmNsYXNzLCBvYmouZ2V0Q2xhc3MoKSk7CiAJCU9iamVjdExvYWRlciBsb2FkZXIgPSBydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKG9iaik7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGxvYWRlci5nZXRDYWNoZWRCeXRlcygpLCBVVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKGxvYWRlci5nZXRDYWNoZWRCeXRlcygpLCBDSEFSU0VUKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnVGVzdC5qYXZhCmluZGV4IDg3YmIwODIuLjFlY2RmMjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnVGVzdC5qYXZhCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJYXNzZXJ0VHJ1ZShuZXcgQnJhbmNoQ29uZmlnKGMsICJ0cnVlIikuaXNSZWJhc2UoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKGZpbmFsIFN0cmluZyBjb250ZW50KSB7CisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KSB7CiAJCWZpbmFsIENvbmZpZyBjID0gbmV3IENvbmZpZyhudWxsKTsKIAkJdHJ5IHsKIAkJCWMuZnJvbVRleHQoY29udGVudCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCmluZGV4IDc4NjIwMDUuLmM0YzRkYTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCkBAIC05MTQsMTIgKzkxNCwxMiBAQAogCQlhc3NlcnRFcXVhbHMoZXhwLCBjLmdldExvbmcoInMiLCBudWxsLCAiYSIsIDBMKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKGZpbmFsIFN0cmluZyBjb250ZW50KQorCXByaXZhdGUgc3RhdGljIENvbmZpZyBwYXJzZShTdHJpbmcgY29udGVudCkKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHBhcnNlKGNvbnRlbnQsIG51bGwpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIENvbmZpZyBwYXJzZShmaW5hbCBTdHJpbmcgY29udGVudCwgQ29uZmlnIGJhc2VDb25maWcpCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50LCBDb25maWcgYmFzZUNvbmZpZykKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJZmluYWwgQ29uZmlnIGMgPSBuZXcgQ29uZmlnKGJhc2VDb25maWcpOwogCQljLmZyb21UZXh0KGNvbnRlbnQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCmluZGV4IDA0MTIyNDIuLmViODc4MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKQEAgLTc4LDggKzc4LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5LkJyYW5jaEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuV29ya2luZ1RyZWVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwpAQCAtMTkwNCw2ICsxOTA2LDExNyBAQAogCQlhc3NlcnRVcGRhdGVkKGxvbmdGaWxlTmFtZSk7CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZERpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGlnbm9yZSIsICJzcmMvaWdub3JlZCIpOworCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvc3ViL2Zvby50eHQiLCAiMSIpOworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgLmdpdGlnbm9yZSIpCisJCQkJCS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgiZm9vLnR4dCIsICIyIik7CisJCQl3cml0ZVRyYXNoRmlsZSgienp6LnR4dCIsICIzIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZvby50eHQiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkIGZpbGUiKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBub3QgaGF2ZSBlbnRlcmVkIGlnbm9yZWQgZGlyZWN0b3J5IiwgMSwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoY29tbWl0KSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkRGlyZWN0b3J5V2l0aFRyYWNrZWRDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIxIik7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGZvby50eHQiKS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGlnbm9yZSIsICJzcmMvaWdub3JlZCIpOworCQkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjIiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9vdGhlci9iYXIudHh0IiwgIjMiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIC5naXRpZ25vcmUiKQorCQkJCQkuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoImZvby50eHQiLCAiMiIpOworCQkJd3JpdGVUcmFzaEZpbGUoInp6ei50eHQiLCAiMyIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmb28udHh0IikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZCBmaWxlIikuY2FsbCgpOworCQkJRmlsZSBmaWxlID0gd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjMiKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgZW50ZXJlZCBpZ25vcmVkIGRpcmVjdG9yeSIsIDMsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGNvbW1pdCkpOworCQkJY2hlY2tGaWxlKGZpbGUsICIyIik7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNldFdpdGhDaGFuZ2VJbkdpdGlnbm9yZSgpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGlnbm9yZSIsICJzcmMvaWdub3JlZCIpOworCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvc3ViL2Zvby50eHQiLCAiMSIpOworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGluaXRpYWwgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCIpLmNhbGwoKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJzcmMvbmV3aWdub3JlZC9mb28udHh0IiwgIjIiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJzcmMvLmdpdGlnbm9yZSIsICJuZXdpZ25vcmVkIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm5ld2lnbm9yZWQiKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBub3QgaGF2ZSBlbnRlcmVkIHNyYy9uZXdpZ25vcmVkIGRpcmVjdG9yeSIsIDEsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGluaXRpYWwpKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAyLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChjb21taXQpKTsKKwkJCWRlbGV0ZVRyYXNoRmlsZSgic3JjLy5naXRpZ25vcmUiKTsKKwkJCWdpdC5ybSgpLmFkZEZpbGVwYXR0ZXJuKCJzcmMvLmdpdGlnbm9yZSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCB0b3AgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiVW5pZ25vcmUgbmV3aWdub3JlIikKKwkJCQkJLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAyLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChpbml0aWFsKSk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMiwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoY29tbWl0KSk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBub3QgaGF2ZSBlbnRlcmVkIHNyYy9uZXdpZ25vcmVkIGRpcmVjdG9yeSIsIDEsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KHRvcCkpOworCisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0RmlsZVRyZWVJdGVyYXRvciBleHRlbmRzIEZpbGVUcmVlSXRlcmF0b3IgeworCisJCS8vIEZvciBhc3NlcnRpb25zIG9ubHkKKwkJcHJpdmF0ZSBmaW5hbCBpbnRbXSBjb3VudDsKKworCQlwdWJsaWMgVGVzdEZpbGVUcmVlSXRlcmF0b3IoUmVwb3NpdG9yeSByZXBvLCBpbnRbXSBjb3VudCkgeworCQkJc3VwZXIocmVwbyk7CisJCQl0aGlzLmNvdW50ID0gY291bnQ7CisJCX0KKworCQlwcm90ZWN0ZWQgVGVzdEZpbGVUcmVlSXRlcmF0b3IoZmluYWwgV29ya2luZ1RyZWVJdGVyYXRvciBwLAorCQkJCWZpbmFsIEZpbGUgcm9vdCwgRlMgZnMsIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSwKKwkJCQlpbnRbXSBjb3VudCkgeworCQkJc3VwZXIocCwgcm9vdCwgZnMsIGZpbGVNb2RlU3RyYXRlZ3kpOworCQkJdGhpcy5jb3VudCA9IGNvdW50OworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvciBlbnRlclN1YnRyZWUoKSB7CisJCQljb3VudFswXSArPSAxOworCQkJcmV0dXJuIG5ldyBUZXN0RmlsZVRyZWVJdGVyYXRvcih0aGlzLAorCQkJCQkoKEZpbGVFbnRyeSkgY3VycmVudCgpKS5nZXRGaWxlKCksIGZzLCBmaWxlTW9kZVN0cmF0ZWd5LAorCQkJCQljb3VudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGludCByZXNldEhhcmRBbmRDb3VudChSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW50W10gY2FsbENvdW50ID0geyAwIH07CisJCURpckNhY2hlIGNhY2hlID0gZGIubG9ja0RpckNhY2hlKCk7CisJCUZpbGVUcmVlSXRlcmF0b3Igd29ya2luZ1RyZWVJdGVyYXRvciA9IG5ldyBUZXN0RmlsZVRyZWVJdGVyYXRvcihkYiwKKwkJCQljYWxsQ291bnQpOworCQl0cnkgeworCQkJRGlyQ2FjaGVDaGVja291dCBjaGVja291dCA9IG5ldyBEaXJDYWNoZUNoZWNrb3V0KGRiLCBudWxsLCBjYWNoZSwKKwkJCQkJY29tbWl0LmdldFRyZWUoKS5nZXRJZCgpLCB3b3JraW5nVHJlZUl0ZXJhdG9yKTsKKwkJCWNoZWNrb3V0LnNldEZhaWxPbkNvbmZsaWN0KGZhbHNlKTsKKwkJCWNoZWNrb3V0LmNoZWNrb3V0KCk7CisJCX0gZmluYWxseSB7CisJCQljYWNoZS51bmxvY2soKTsKKwkJfQorCQlyZXR1cm4gY2FsbENvdW50WzBdOworCX0KKwogCXB1YmxpYyB2b2lkIGFzc2VydFdvcmtEaXIoTWFwPFN0cmluZywgU3RyaW5nPiBpKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmVGVzdC5qYXZhCmluZGV4IDJjYjhmODYuLjU4MGIwOGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmVGVzdC5qYXZhCkBAIC00NzAsNyArNDcwLDggQEAKIAl9CiAKIAkvKioKLQkgKiBUZXN0IHRoYXQgaWdub3JlZCBmb2xkZXJzIGFyZW4ndCBsaXN0ZWQgYXMgdW50cmFja2VkCisJICogVGVzdCB0aGF0IGlnbm9yZWQgZm9sZGVycyBhcmVuJ3QgbGlzdGVkIGFzIHVudHJhY2tlZCwgYnV0IGFyZSBsaXN0ZWQgYXMKKwkgKiBpZ25vcmVkLgogCSAqCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KQEAgLTQ5OSw2ICs1MDAsOCBAQAogCQkJZGlmZi5kaWZmKCk7CiAJCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJzcmMiKSksCiAJCQkJCWRpZmYuZ2V0VW50cmFja2VkRm9sZGVycygpKTsKKwkJCWFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInNyIiwgInRhcmdldCIpKSwKKwkJCQkJZGlmZi5nZXRJZ25vcmVkTm90SW5JbmRleCgpKTsKIAogCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJzcmMiKS5jYWxsKCk7CiAJCQl3cml0ZVRyYXNoRmlsZSgic3IvY29tL1gxLmphdmEiLCAiIik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEKaW5kZXggZjFjNjJkNC4uYjhlOGExMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlci52YWx1ZU9mOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbC5jb25jYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JBRDsKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAJCVN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWVudHJ5KGIsICIxMDA2NDQgQSIpOwogCQllbnRyeShiLCAiMTAwNjQ0IGEiKTsKLQkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJY2hlY2tlci5zZXRTYWZlRm9yV2luZG93cyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTQ2OCw3ICsxNDY4LDcgQEAKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWVudHJ5KGIsICIxMDA2NDQgYSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTQ4Miw3ICsxNDgyLDcgQEAKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBcdTAwNjVcdTAzMDEiKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBcdTAwZTkiKTsKLQkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJY2hlY2tlci5zZXRTYWZlRm9yTWFjT1ModHJ1ZSk7CiAJCWFzc2VydENvcnJ1cHQoImR1cGxpY2F0ZSBlbnRyeSBuYW1lcyIsIE9CSl9UUkVFLCBkYXRhKTsKIAkJYXNzZXJ0U2tpcExpc3RBY2NlcHRzKE9CSl9UUkVFLCBkYXRhKTsKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAJCVN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWVudHJ5KGIsICIxMDA2NDQgQSIpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKLQkJY2hlY2tlci5jaGVja1RyZWUoYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWNoZWNrZXIuY2hlY2tUcmVlKGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogCiAJQFRlc3QKQEAgLTE2MDcsNyArMTYwNyw3IEBACiAJCWNoZWNrZXIuY2hlY2tUcmVlKGVuY29kZUFTQ0lJKGIudG9TdHJpbmcoKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgZW50cnkoU3RyaW5nQnVpbGRlciBiLCBmaW5hbCBTdHJpbmcgbW9kZU5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGVudHJ5KFN0cmluZ0J1aWxkZXIgYiwgU3RyaW5nIG1vZGVOYW1lKSB7CiAJCWIuYXBwZW5kKG1vZGVOYW1lKTsKIAkJYi5hcHBlbmQoJ1wwJyk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgT0JKRUNUX0lEX0xFTkdUSDsgaSsrKQpAQCAtMTY0Nyw3ICsxNjQ3LDcgQEAKIAkJY2hlY2tlci5zZXRTa2lwTGlzdChudWxsKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBPYmplY3RJZFNldCBzZXQoZmluYWwgT2JqZWN0SWQuLi4gaWRzKSB7CisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWRTZXQgc2V0KE9iamVjdElkLi4uIGlkcykgewogCQlyZXR1cm4gbmV3IE9iamVjdElkU2V0KCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCBvYmplY3RJZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmFjeUdpdFRlc3RzLmphdmEKaW5kZXggOTIzNmI0ZS4uOGQ5Y2NhYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JhY3lHaXRUZXN0cy5qYXZhCkBAIC0xNzYsMTIgKzE3Niw5IEBACiAKIAlwcml2YXRlIEZpbGUgYWRkVG9Xb3JrRGlyKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBmID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgcGF0aCk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkgewogCQkJZm9zLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwogCQkJcmV0dXJuIGY7Ci0JCX0gZmluYWxseSB7Ci0JCQlmb3MuY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKaW5kZXggN2ZiMzMwOS4uMjQ4MWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIApAQCAtMjUzLDExICsyNTQsMTEgQEAKIAkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKIAkJUmVmIHJlZiA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoU3RvcmFnZS5QQUNLRUQsIHJlZi5nZXRTdG9yYWdlKCkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksCi0JCQkJInJlZnMvaGVhZHMvbWFzdGVyIikpOwotCQlvcy53cml0ZShyZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkuZ2V0Qnl0ZXMoKSk7Ci0JCW9zLndyaXRlKCdcbicpOwotCQlvcy5jbG9zZSgpOworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgKKwkJCQluZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgInJlZnMvaGVhZHMvbWFzdGVyIikpKSB7CisJCQlvcy53cml0ZShyZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkuZ2V0Qnl0ZXMoKSk7CisJCQlvcy53cml0ZSgnXG4nKTsKKwkJfQogCiAJCXJlZiA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoU3RvcmFnZS5MT09TRSwgcmVmLmdldFN0b3JhZ2UoKSk7CkBAIC0zMDUsNCArMzA2LDI2IEBACiAJCWFzc2VydFNhbWUoZHN0LmdldFBlZWxlZE9iamVjdElkKCksIHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGRzdC5pc1BlZWxlZCgpLCByZWYuaXNQZWVsZWQoKSk7CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnRhaW5zUmVmKExpc3Q8UmVmPiBoYXlzdGFjaywgUmVmIG5lZWRsZSkgeworCQlmb3IgKFJlZiByZWYgOiBoYXlzdGFjaykgeworCQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKG5lZWRsZS5nZXROYW1lKCkpICYmCisJCQkJCXJlZi5nZXRPYmplY3RJZCgpLmVxdWFscyhuZWVkbGUuZ2V0T2JqZWN0SWQoKSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZmFpbCgibGlzdCAiICsgaGF5c3RhY2sgKyAiIGRvZXMgbm90IGNvbnRhaW4gcmVmICIgKyBuZWVkbGUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFJlZnNCeVByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUxpc3Q8UmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoInJlZnMvaGVhZHMvZyIpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVmcy5zaXplKCkpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL2ciKSk7CisJCWNoZWNrQ29udGFpbnNSZWYocmVmcywgZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvZ2l0bGluayIpKTsKKworCQlyZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoInJlZnMvaGVhZHMvcHJlZml4LyIpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVmcy5zaXplKCkpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL3ByZWZpeC9hIikpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKaW5kZXggMTEwN2MyYy4uNThiMDA1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKQEAgLTk0LDI0ICs5NCwyNSBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RmlsZUtleU9wZW5FeGlzdGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgcjsKKwkJdHJ5IChSZXBvc2l0b3J5IHIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkKKwkJCQkub3Blbih0cnVlKSkgeworCQkJYXNzZXJ0Tm90TnVsbChyKTsKKwkJCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOworCQl9CiAKLQkJciA9IG5ldyBGaWxlS2V5KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKS5vcGVuKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHIpOwotCQlhc3NlcnRFcXVhbHNGaWxlKGRiLmdldERpcmVjdG9yeSgpLCByLmdldERpcmVjdG9yeSgpKTsKLQkJci5jbG9zZSgpOwotCi0JCXIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkub3BlbihmYWxzZSk7Ci0JCWFzc2VydE5vdE51bGwocik7Ci0JCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlyLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByID0gbmV3IEZpbGVLZXkoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpCisJCQkJLm9wZW4oZmFsc2UpKSB7CisJCQlhc3NlcnROb3ROdWxsKHIpOworCQkJYXNzZXJ0RXF1YWxzRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgci5nZXREaXJlY3RvcnkoKSk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGaWxlS2V5T3Blbk5ldygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFJlcG9zaXRvcnkgbiA9IGNyZWF0ZVJlcG9zaXRvcnkodHJ1ZSwgZmFsc2UpOwotCQlmaW5hbCBGaWxlIGdpdGRpciA9IG4uZ2V0RGlyZWN0b3J5KCk7Ci0JCW4uY2xvc2UoKTsKKwkJRmlsZSBnaXRkaXI7CisJCXRyeSAoUmVwb3NpdG9yeSBuID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSkpIHsKKwkJCWdpdGRpciA9IG4uZ2V0RGlyZWN0b3J5KCk7CisJCX0KIAkJcmVjdXJzaXZlRGVsZXRlKGdpdGRpcik7CiAJCWFzc2VydEZhbHNlKGdpdGRpci5leGlzdHMoKSk7CiAKQEAgLTE0Myw2ICsxNDQsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENhY2hlT3BlbigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBGaWxlS2V5IGxvYyA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJZmluYWwgUmVwb3NpdG9yeSBkMiA9IFJlcG9zaXRvcnlDYWNoZS5vcGVuKGxvYyk7CiAJCWFzc2VydE5vdFNhbWUoZGIsIGQyKTsKIAkJYXNzZXJ0U2FtZShkMiwgUmVwb3NpdG9yeUNhY2hlLm9wZW4oRmlsZUtleS5leGFjdChsb2MuZ2V0RmlsZSgpLCBkYi5nZXRGUygpKSkpOwpAQCAtMTc2LDYgKzE3OCw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVzYWdlQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJRmlsZUtleSBsb2MgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgZDIgPSBSZXBvc2l0b3J5Q2FjaGUub3Blbihsb2MpOwogCQlhc3NlcnRFcXVhbHMoMSwgZDIudXNlQ250LmdldCgpKTsKIAkJUmVwb3NpdG9yeUNhY2hlLm9wZW4oRmlsZUtleS5leGFjdChsb2MuZ2V0RmlsZSgpLCBkYi5nZXRGUygpKSk7CkBAIC0xODksNiArMTkyLDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VXNhZ2VDb3VudFdpdGhSZWdpc3RlcmVkUmVwb3NpdG9yeSgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvID0gY3JlYXRlUmVwb3NpdG9yeShmYWxzZSwgZmFsc2UpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVwby51c2VDbnQuZ2V0KCkpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwbyk7CkBAIC0yMDAsNiArMjA0LDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5Tm90VW5yZWdpc3RlcmluZ1doZW5DbG9zaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUZpbGVLZXkgbG9jID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IGQyID0gUmVwb3NpdG9yeUNhY2hlLm9wZW4obG9jKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGQyLnVzZUNudC5nZXQoKSk7CiAJCWFzc2VydFRoYXQoUmVwb3NpdG9yeUNhY2hlLmdldFJlZ2lzdGVyZWRLZXlzKCksCkBAIC0yMTQsNiArMjE5LDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkQW5kVXNhZ2VDb3VudE5lZ2F0aXZlKCkKIAkJCXRocm93cyBFeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvQSA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CiAJCVJlcG9zaXRvcnlDYWNoZS5yZWdpc3RlcihyZXBvQSk7CiAKQEAgLTIzNCw3ICsyNDAsOSBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVucmVnaXN0ZXJpbmdXaGVuRXhwaXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvQSA9IGNyZWF0ZVJlcG9zaXRvcnkodHJ1ZSwgZmFsc2UpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvQiA9IGNyZWF0ZVJlcG9zaXRvcnkodHJ1ZSwgZmFsc2UpOwogCQlSZXBvc2l0b3J5IHJlcG9DID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKIAkJUmVwb3NpdG9yeUNhY2hlLnJlZ2lzdGVyKHJlcG9BKTsKQEAgLTI2OCw2ICsyNzYsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVjb25maWd1cmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgcmVwbyA9IGNyZWF0ZVJlcG9zaXRvcnkoZmFsc2UsIGZhbHNlKTsKIAkJUmVwb3NpdG9yeUNhY2hlLnJlZ2lzdGVyKHJlcG8pOwogCQlhc3NlcnRUcnVlKFJlcG9zaXRvcnlDYWNoZS5pc0NhY2hlZChyZXBvKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlSZXNvbHZlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5UmVzb2x2ZVRlc3QuamF2YQppbmRleCAxZDJhNGU5Li4wNWI3OGVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlSZXNvbHZlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEKQEAgLTMyNCw2ICszMjQsOCBAQAogCQlhc3NlcnRGYWxzZShSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKCJ4L2FcXGIiKSk7CiAJCWFzc2VydEZhbHNlKFJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUoIngvYVx1MDAwMCIpKTsKIAorCQlkYi5yZXNvbHZlKCJ4L2FAIik7CisKIAkJYXNzZXJ0VW5wYXJzZWFibGUoIi4iKTsKIAkJYXNzZXJ0VW5wYXJzZWFibGUoInhAezMiKTsKIAkJYXNzZXJ0VW5wYXJzZWFibGUoInhbYiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1NxdWFzaENvbW1pdE1zZ1Rlc3QuamF2YQppbmRleCAzYmNkNzg3Li4yMDNjMDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1NxdWFzaENvbW1pdE1zZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1NxdWFzaENvbW1pdE1zZ1Rlc3QuamF2YQpAQCAtNjYsMTIgKzY2LDkgQEAKIAkJZGIud3JpdGVTcXVhc2hDb21taXRNc2cobnVsbCk7CiAJCWFzc2VydEVxdWFscyhkYi5yZWFkU3F1YXNoQ29tbWl0TXNnKCksIG51bGwpOwogCQlhc3NlcnRGYWxzZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLlNRVUFTSF9NU0cpLmV4aXN0cygpKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwKLQkJCQlDb25zdGFudHMuU1FVQVNIX01TRykpOwotCQl0cnkgeworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisJCQkJbmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5TUVVBU0hfTVNHKSkpIHsKIAkJCWZvcy53cml0ZShzcXVhc2hNc2cuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwotCQl9IGZpbmFsbHkgewotCQkJZm9zLmNsb3NlKCk7CiAJCX0KIAkJYXNzZXJ0RXF1YWxzKGRiLnJlYWRTcXVhc2hDb21taXRNc2coKSwgc3F1YXNoTXNnKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVmFsaWRSZWZOYW1lVGVzdC5qYXZhCmluZGV4IGQ0MzFhODkuLjg3ZTkwMWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVmFsaWRSZWZOYW1lVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVmFsaWRSZWZOYW1lVGVzdC5qYXZhCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBWYWxpZFJlZk5hbWVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZhbGlkKGZpbmFsIGJvb2xlYW4gZXhwLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VmFsaWQoYm9vbGVhbiBleHAsIFN0cmluZyBuYW1lKSB7CiAJCVN5c3RlbVJlYWRlciBpbnN0YW5jZSA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpOwogCQl0cnkgewogCQkJc2V0VW5peFN5c3RlbVJlYWRlcigpOwpAQCAtODEsNyArODEsNyBAQAogCQl9KTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEludmFsaWRPbldpbmRvd3MoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEludmFsaWRPbldpbmRvd3MoU3RyaW5nIG5hbWUpIHsKIAkJU3lzdGVtUmVhZGVyIGluc3RhbmNlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCk7CiAJCXRyeSB7CiAJCQlzZXRVbml4U3lzdGVtUmVhZGVyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ2hlcnJ5UGlja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCmluZGV4IDQ5NDhiMzcuLjE5ZjZkY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJYXNzZXJ0RmFsc2UodHcubmV4dCgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RJZChmaW5hbCBEaXJDYWNoZSB0cmVlVCwgZmluYWwgVHJlZVdhbGsgdHcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RJZChEaXJDYWNoZSB0cmVlVCwgVHJlZVdhbGsgdHcpIHsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVULmdldEVudHJ5KHR3LmdldFBhdGhTdHJpbmcoKSkuZ2V0T2JqZWN0SWQoKSwgdHcKIAkJCQkuZ2V0T2JqZWN0SWQoMCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZWN1cnNpdmVNZXJnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ3Jpc3NDcm9zc01lcmdlVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZWN1cnNpdmVNZXJnZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKaW5kZXggMTkwMjI0YS4uYWFhMDhhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ3Jpc3NDcm9zc01lcmdlVGVzdC5qYXZhCkBAIC04Myw3ICs4Myw3IEBACiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBAUnVuV2l0aChUaGVvcmllcy5jbGFzcykKLXB1YmxpYyBjbGFzcyBSZWN1cnNpdmVNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKK3B1YmxpYyBjbGFzcyBDcmlzc0Nyb3NzTWVyZ2VUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlzdGF0aWMgaW50IGNvdW50ZXIgPSAwOwogCiAJQERhdGFQb2ludHMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNldEluZGV4KGZpbmFsIE9iamVjdElkIGlkLCBTdHJpbmcgcGF0aCkKKwlwcml2YXRlIHZvaWQgc2V0SW5kZXgoT2JqZWN0SWQgaWQsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgbG9ja2VkRGlyY2FjaGU7CiAJCURpckNhY2hlRWRpdG9yIGRjZWRpdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQppbmRleCA5MzIyYTQ3Li41ODA5M2EzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5tZXJnZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtOTEsMTkgKzkxLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludHM7CiBpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllcy5UaGVvcmllczsKIGltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLlRoZW9yeTsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBSdW5XaXRoKFRoZW9yaWVzLmNsYXNzKQotcHVibGljIGNsYXNzIFJlc29sdmVNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKK3B1YmxpYyBjbGFzcyBNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAotCUBEYXRhUG9pbnQKLQlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3kgcmVzb2x2ZSA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRTsKLQotCUBEYXRhUG9pbnQKLQlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3kgcmVjdXJzaXZlID0gTWVyZ2VTdHJhdGVneS5SRUNVUlNJVkU7CisJQERhdGFQb2ludHMKKwlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3lbXSBzdHJhdGVnaWVzVW5kZXJUZXN0ID0gbmV3IE1lcmdlU3RyYXRlZ3lbXSB7CisJCQlNZXJnZVN0cmF0ZWd5LlJFQ1VSU0lWRSwgTWVyZ2VTdHJhdGVneS5SRVNPTFZFIH07CiAKIAlAVGhlb3J5CiAJcHVibGljIHZvaWQgZmFpbGluZ0RlbGV0ZU9mRGlyZWN0b3J5V2l0aFVudHJhY2tlZENvbnRlbnQoCkBAIC03NTYsNyArNzU0LDcgQEAKIAkJfQogCQliaW5hcnlbNTBdID0gJ1wwJzsKIAotCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBVVEZfOCkpOworCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBDSEFSU0VUKSk7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKIAkJUmV2Q29tbWl0IGZpcnN0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGVkIGZpbGUiKS5jYWxsKCk7CiAKQEAgLTc2NCw3ICs3NjIsNyBAQAogCQlpbnQgaWR4ID0gTElORUxFTiAqIDEyMDAgKyAxOwogCQlieXRlIHNhdmUgPSBiaW5hcnlbaWR4XTsKIAkJYmluYXJ5W2lkeF0gPSAnQCc7Ci0JCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIFVURl84KSk7CisJCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIENIQVJTRVQpKTsKIAogCQliaW5hcnlbaWR4XSA9IHNhdmU7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKQEAgLTc3Myw3ICs3NzEsNyBAQAogCiAJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXRTdGFydFBvaW50KGZpcnN0KS5zZXROYW1lKCJzaWRlIikuY2FsbCgpOwogCQliaW5hcnlbTElORUxFTiAqIDE1MDAgKyAxXSA9ICchJzsKLQkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgVVRGXzgpKTsKKwkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgQ0hBUlNFVCkpOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUiKS5jYWxsKCk7CiAJCVJldkNvbW1pdCBzaWRlQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldEFsbCh0cnVlKQogCQkJLnNldE1lc3NhZ2UoIm1vZGlmaWVkIGZpbGUgbCAxNTAwIikuY2FsbCgpOwpAQCAtOTM1LDcgKzkzMyw3IEBACiAJCQltZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCkuZ2V0KCJmaWxlIik7CiAJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlmbXQuZm9ybWF0TWVyZ2Uob3V0LCBtZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCkuZ2V0KCJmaWxlIiksCi0JCQkJCQkiQkFTRSIsICJPVVJTIiwgIlRIRUlSUyIsIFVURl84Lm5hbWUoKSk7CisJCQkJCQkiQkFTRSIsICJPVVJTIiwgIlRIRUlSUyIsIENIQVJTRVQubmFtZSgpKTsKIAkJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiPDw8PDw8PCBPVVJTXG4iCiAJCQkJCQkrICIxbWFzdGVyXG4iCiAJCQkJCQkrICI9PT09PT09XG4iCkBAIC05NDMsNyArOTQxLDcgQEAKIAkJCQkJCSsgIj4+Pj4+Pj4gVEhFSVJTXG4iCiAJCQkJCQkrICIyXG4iCiAJCQkJCQkrICIzIjsKLQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksIFVURl84KSk7CisJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMDMzLDE5ICsxMDMxLDIxIEBACiAJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRlZCBjLnR4dCIpLmNhbGwoKTsKIAogCQkvLyBHZXQgYSBoYW5kbGUgdG8gdGhlIHRoZSBmaWxlIHNvIG9uIHdpbmRvd3MgaXQgY2FuJ3QgYmUgZGVsZXRlZC4KLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwKLQkJCQkiYi50eHQiKSk7Ci0JCU1lcmdlUmVzdWx0IG1lcmdlUmVzID0gZ2l0Lm1lcmdlKCkuc2V0U3RyYXRlZ3koc3RyYXRlZ3kpCi0JCQkJLmluY2x1ZGUobWFzdGVyQ29tbWl0KS5jYWxsKCk7Ci0JCWlmIChtZXJnZVJlcy5nZXRNZXJnZVN0YXR1cygpLmVxdWFscyhNZXJnZVN0YXR1cy5GQUlMRUQpKSB7Ci0JCQkvLyBwcm9iYWJseSB3aW5kb3dzCi0JCQlhc3NlcnRFcXVhbHMoMSwgbWVyZ2VSZXMuZ2V0RmFpbGluZ1BhdGhzKCkuc2l6ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhNZXJnZUZhaWx1cmVSZWFzb24uQ09VTERfTk9UX0RFTEVURSwgbWVyZ2VSZXMKLQkJCQkJLmdldEZhaWxpbmdQYXRocygpLmdldCgiYi50eHQiKSk7CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCisJCQkJbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImIudHh0IikpKSB7CisJCQlNZXJnZVJlc3VsdCBtZXJnZVJlcyA9IGdpdC5tZXJnZSgpLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KQorCQkJCQkuaW5jbHVkZShtYXN0ZXJDb21taXQpLmNhbGwoKTsKKwkJCWlmIChtZXJnZVJlcy5nZXRNZXJnZVN0YXR1cygpLmVxdWFscyhNZXJnZVN0YXR1cy5GQUlMRUQpKSB7CisJCQkJLy8gcHJvYmFibHkgd2luZG93cworCQkJCWFzc2VydEVxdWFscygxLCBtZXJnZVJlcy5nZXRGYWlsaW5nUGF0aHMoKS5zaXplKCkpOworCQkJCWFzc2VydEVxdWFscyhNZXJnZUZhaWx1cmVSZWFzb24uQ09VTERfTk9UX0RFTEVURSwKKwkJCQkJCW1lcmdlUmVzLmdldEZhaWxpbmdQYXRocygpLmdldCgiYi50eHQiKSk7CisJCQl9CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSJbYS50eHQsIG1vZGU6MTAwNjQ0LCBjb250ZW50Om1hc3Rlcl0iCisJCQkJCQkJKyAiW2MudHh0LCBtb2RlOjEwMDY0NCwgY29udGVudDpzaWRlXSIsCisJCQkJCWluZGV4U3RhdGUoQ09OVEVOVCkpOwogCQl9Ci0JCWFzc2VydEVxdWFscygiW2EudHh0LCBtb2RlOjEwMDY0NCwgY29udGVudDptYXN0ZXJdIgotCQkJCSsgIltjLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6c2lkZV0iLCBpbmRleFN0YXRlKENPTlRFTlQpKTsKLQkJZmlzLmNsb3NlKCk7CiAJfQogCiAJQFRoZW9yeQpAQCAtMTMyOCw2ICsxMzI4LDYgQEAKIAkJaWYgKG9iaiA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKG9iaiwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIFVURl84KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcocncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihvYmosIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBDSEFSU0VUKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEKaW5kZXggOTUxNTY4ZS4uZGQyYzJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1NpbXBsZU1lcmdlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TaW1wbGVNZXJnZVRlc3QuamF2YQpAQCAtNDAzLDcgKzQwMyw3IEBACiAJCWFzc2VydEZhbHNlKG1lcmdlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RJZChmaW5hbCBEaXJDYWNoZSB0cmVlVCwgZmluYWwgVHJlZVdhbGsgdHcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RJZChEaXJDYWNoZSB0cmVlVCwgVHJlZVdhbGsgdHcpIHsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVULmdldEVudHJ5KHR3LmdldFBhdGhTdHJpbmcoKSkuZ2V0T2JqZWN0SWQoKSwgdHcKIAkJCQkuZ2V0T2JqZWN0SWQoMCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FZGl0TGlzdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FZGl0TGlzdFRlc3QuamF2YQppbmRleCA2MDI3YWZmLi42YzEwN2Y5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRWRpdExpc3RUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhCkBAIC04OSw3ICs4OSw3IEBACiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgyMyAtIDEsIDI1IC0gMSwgMjIgLSAxLCAyOCAtIDEpLCBlLmdldCgyKSk7CiAJfQogCi0JcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKIAkJCWlmIChpbiA9PSBudWxsKSB7CiAJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXJUZXN0LmphdmEKaW5kZXggN2I0ZTAxNC4uMjRmYmRhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXJUZXN0LmphdmEKQEAgLTQzMywzMCArNDMzLDMwIEBACiAJCWFzc2VydFRydWUoT2JqZWN0SWQuZnJvbVN0cmluZyhuaWQpLnN0YXJ0c1dpdGgoZmguZ2V0TmV3SWQoKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UGFyc2UoZmluYWwgRmlsZUhlYWRlciBmaCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UGFyc2UoRmlsZUhlYWRlciBmaCkgewogCQlpbnQgcHRyID0gZmgucGFyc2VHaXRGaWxlTmFtZSgwLCBmaC5idWYubGVuZ3RoKTsKIAkJYXNzZXJ0VHJ1ZShwdHIgPiAwKTsKIAkJcHRyID0gZmgucGFyc2VHaXRIZWFkZXJzKHB0ciwgZmguYnVmLmxlbmd0aCk7CiAJCWFzc2VydFRydWUocHRyID4gMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkYXRhKGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZGF0YShTdHJpbmcgaW4pIHsKIAkJcmV0dXJuIG5ldyBGaWxlSGVhZGVyKENvbnN0YW50cy5lbmNvZGVBU0NJSShpbiksIDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgaGVhZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBoZWFkZXIoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGRhdGEoZ2l0TGluZShwYXRoKSArICItLS0gIiArIHBhdGggKyAiXG4iKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2l0TGluZShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnaXRMaW5lKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAiYS8iICsgcGF0aCArICIgYi8iICsgcGF0aCArICJcbiI7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkcUhlYWRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZHFIZWFkZXIoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGRhdGEoZHFHaXRMaW5lKHBhdGgpICsgIi0tLSAiICsgcGF0aCArICJcbiIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkcUdpdExpbmUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHFHaXRMaW5lKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAiXCJhLyIgKyBwYXRoICsgIlwiIFwiYi8iICsgcGF0aCArICJcIlxuIjsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvR2V0VGV4dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCmluZGV4IDY1Mzc1YzcuLjdiNTg2OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTgzLDcgKzgzLDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0X0NvbnZlcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBDaGFyc2V0IGNzT2xkID0gSVNPXzg4NTlfMTsKLQkJZmluYWwgQ2hhcnNldCBjc05ldyA9IFVURl84OworCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gQ0hBUlNFVDsKIAkJZmluYWwgUGF0Y2ggcCA9IHBhcnNlVGVzdFBhdGNoRmlsZSgpOwogCQlhc3NlcnRUcnVlKHAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dF9EaWZmQ2MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBDaGFyc2V0IGNzT2xkID0gSVNPXzg4NTlfMTsKLQkJZmluYWwgQ2hhcnNldCBjc05ldyA9IFVURl84OworCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gQ0hBUlNFVDsKIAkJZmluYWwgUGF0Y2ggcCA9IHBhcnNlVGVzdFBhdGNoRmlsZSgpOwogCQlhc3NlcnRUcnVlKHAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFN0cmluZyByZWFkVGVzdFBhdGNoRmlsZShmaW5hbCBDaGFyc2V0IGNzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIHJlYWRUZXN0UGF0Y2hGaWxlKENoYXJzZXQgY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgewogCQkJaWYgKGluID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjRXJyb3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY0Vycm9yVGVzdC5qYXZhCmluZGV4IGU0YjQzMTcuLjY5ODkzNDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjRXJyb3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YQpAQCAtOTYsMTcgKzk2LDE0IEBACiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NUZXN0LmphdmEKaW5kZXggODM3NDE0Yi4uNGEyNmQ1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NUZXN0LmphdmEKQEAgLTE5OSwxNyArMTk5LDE0IEBACiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCmluZGV4IDUyZTM4NzQuLjNiZGY4NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCkBAIC0xNzcsMTcgKzE3NywxNCBAQAogCiAJcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlID0gSkdpdFRlc3RVdGlsLmdldE5hbWUoKSArICIucGF0Y2giOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwotCQlpZiAoaW4gPT0gbnVsbCkgewotCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKLQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCi0JCX0KLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CisJCQlpZiAoaW4gPT0gbnVsbCkgeworCQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7CisJCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKKwkJCX0KIAkJCWZpbmFsIFBhdGNoIHAgPSBuZXcgUGF0Y2goKTsKIAkJCXAucGFyc2UoaW4pOwogCQkJcmV0dXJuIHA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoVGVzdC5qYXZhCmluZGV4IDlmNTdhYjkuLjZhMDlhNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEKQEAgLTM1NywxNyArMzU3LDE0IEBACiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZVRlc3QuamF2YQppbmRleCA4N2M4NTQ3Li5hZDgzMjdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmVUZXN0LmphdmEKQEAgLTM1Myw3ICszNTMsNyBAQAogCQlhc3NlcnRGYWxzZSgibm90IENDIiwgbGluZS5tYXRjaGVzKEZvb3RlcktleS5DQykpOwogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZDb21taXQgcGFyc2UoU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlidWYuYXBwZW5kKCJ0cmVlICIgKyBPYmplY3RJZC56ZXJvSWQoKS5uYW1lKCkgKyAiXG4iKTsKIAkJYnVmLmFwcGVuZCgiYXV0aG9yIEEuIFUuIFRob3IgPGFAZXhhbXBsZS5jb20+IDEgKzAwMDBcbiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRQYXJzZVRlc3QuamF2YQppbmRleCA4OGYyNDBiLi5jZmVmYWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRQYXJzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRQYXJzZVRlc3QuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKQEAgLTExNCw3ICsxMTQsNyBAQAogCQlhc3NlcnROdWxsKGMuZ2V0VHJlZSgpKTsKIAkJYXNzZXJ0TnVsbChjLnBhcmVudHMpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0VHJlZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRUcmVlKCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldFRyZWUoKSk7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJYXNzZXJ0RXF1YWxzKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiICsgY29tbWl0dGVyVGltZVpvbmUpLCBjQ29tbWl0dGVyLmdldFRpbWVab25lKCkpOwogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IGNyZWF0ZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJldkNvbW1pdCBjcmVhdGUoU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWIuYXBwZW5kKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIpOwogCQliLmFwcGVuZCgiYXV0aG9yIEEgVS4gVGhvciA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwotCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gYzsKIAl9CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlhc3NlcnRFcXVhbHMoIiIsIGMuZ2V0RnVsbE1lc3NhZ2UoKSk7CiAJCWFzc2VydEVxdWFscygiIiwgYy5nZXRTaG9ydE1lc3NhZ2UoKSk7CkBAIC0xNzYsNyArMTc2LDcgQEAKIAogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7Ci0JCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYXNzZXJ0RXF1YWxzKG5ldyBQZXJzb25JZGVudCgiIiwgImFfdV90aG9yQGV4YW1wbGUuY29tIiwgMTIxODEyMzM4NzAwMGwsIDcpLCBjLmdldEF1dGhvcklkZW50KCkpOwogCQlhc3NlcnRFcXVhbHMobmV3IFBlcnNvbklkZW50KCIiLCAiIiwgMTIxODEyMzM5MDAwMGwsIC01KSwgYy5nZXRDb21taXR0ZXJJZGVudCgpKTsKQEAgLTE4NSwxMyArMTg1LDEzIEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yMDUsMTMgKzIwNSwxMyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2ltcGxpY2l0X21peGVkX2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSkpOwotCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjYwLDE0ICsyNjAsMTQgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9leHBsaWNpdF9iYWRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIEVVQy1KUFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIEVVQy1KUFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOyAvLyBib2d1cyBpZAogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTI5MSwxNCArMjkxLDE0IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIElTTy04ODU5LTFcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzEzLDEzICszMTMsMTMgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW5jb3JyZWN0VXRmOE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgJ3V0ZjgnXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyAndXRmOCdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldkNvbW1pdCBjID0gbmV3IFJldkNvbW1pdCgKIAkJCQlpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKQEAgLTMzOCwxMiArMzM4LDEyIEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaWxsZWdhbEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldkNvbW1pdCBjID0gbmV3IFJldkNvbW1pdCgKIAkJCQlpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKQEAgLTM2NSwxMiArMzY1LDEyIEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfdW5zdXBwb3J0ZWRFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgaXRfSVQuVVRGOFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2Q29tbWl0IGMgPSBuZXcgUmV2Q29tbWl0KAogCQkJCWlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAJCWFzc2VydEVxdWFscyhzaG9ydE1zZywgYy5nZXRTaG9ydE1lc3NhZ2UoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWQoZmluYWwgU3RyaW5nIHN0cikgeworCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKFN0cmluZyBzdHIpIHsKIAkJcmV0dXJuIE9iamVjdElkLmZyb21TdHJpbmcoc3RyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEKaW5kZXggMTIyYTM5Ny4uOGUzODlhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdFRlc3QuamF2YQpAQCAtNzYsNyArNzYsNyBAQAogCiAJCWZpbmFsIFJldkNvbW1pdCBhMjsKIAkJZmluYWwgUmV2Q29tbWl0IGIyOwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncyID0gbmV3IFJldldhbGsoZGIpKSB7CisJCXRyeSAoUmV2V2FsayBydzIgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCWEyID0gcncyLnBhcnNlQ29tbWl0KGExKTsKIAkJCWIyID0gcncyLnBhcnNlQ29tbWl0KGIxKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnUGFyc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWdQYXJzZVRlc3QuamF2YQppbmRleCAzOGJkMzcxLi5lMTFjZWY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWdQYXJzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWdQYXJzZVRlc3QuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKQEAgLTgyLDcgKzgyLDcgQEAKIAkJdGVzdE9uZVR5cGUoQ29uc3RhbnRzLk9CSl9UQUcpOwogCX0KIAotCXByaXZhdGUgdm9pZCB0ZXN0T25lVHlwZShmaW5hbCBpbnQgdHlwZUNvZGUpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB0ZXN0T25lVHlwZShpbnQgdHlwZUNvZGUpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCBpZCA9IGlkKCI5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3Iik7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWIuYXBwZW5kKCJvYmplY3QgIiArIGlkLm5hbWUoKSArICJcbiIpOwpAQCAtOTgsNyArOTgsNyBAQAogCQlhc3NlcnROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnROdWxsKGMuZ2V0VGFnTmFtZSgpKTsKIAotCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChydywgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0Tm90TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGlkLCBjLmdldE9iamVjdCgpLmdldElkKCkpOwogCQlhc3NlcnRTYW1lKHJ3Lmxvb2t1cEFueShpZCwgdHlwZUNvZGUpLCBjLmdldE9iamVjdCgpKTsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCQlhc3NlcnROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnROdWxsKGMuZ2V0VGFnTmFtZSgpKTsKIAotCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0Tm90TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRPYmplY3QoKS5nZXRJZCgpKTsKIAkJYXNzZXJ0U2FtZShydy5sb29rdXBUcmVlKHRyZWVJZCksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCWFzc2VydE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdOYW1lKCkpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnRFcXVhbHModHJlZUlkLCBjLmdldE9iamVjdCgpLmdldElkKCkpOwogCQlhc3NlcnRTYW1lKHJ3Lmxvb2t1cFRyZWUodHJlZUlkKSwgYy5nZXRPYmplY3QoKSk7CkBAIC0yMDIsNyArMjAyLDcgQEAKIAkJYXNzZXJ0TnVsbChjLmdldFRhZ2dlcklkZW50KCkpOwogCX0KIAotCXByaXZhdGUgUmV2VGFnIGNyZWF0ZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJldlRhZyBjcmVhdGUoU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWIuYXBwZW5kKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIik7CiAJCWIuYXBwZW5kKCJ0eXBlIHRyZWVcbiIpOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwotCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gYzsKIAl9CiAKQEAgLTIyMSwxNyArMjIxLDE3IEBACiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2ltcGxpY2l0X1VURjhfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCWIKIAkJCQkud3JpdGUoInRhZ2dlciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIgotCQkJCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTI0NiwxNSArMjQ2LDE1IEBACiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2ltcGxpY2l0X21peGVkX2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYi53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCiAJCQkJLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldlRhZyBjOwogCQljID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0zMDcsMTcgKzMwNywxNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9leHBsaWNpdF9iYWRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliCiAJCQkJLndyaXRlKCJ0YWdnZXIgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIKIAkJCQkJCS5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIEVVQy1KUFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJlbmNvZGluZyBFVUMtSlBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldlRhZyBjOwogCQljID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0zNDIsMTcgKzM0MiwxNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9leHBsaWNpdF9iYWRfZW5jb2RlZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCi0JCQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgSVNPLTg4NTktMVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgSVNPLTg4NTktMVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTM2NSwxMyArMzY1LDEzIEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaWxsZWdhbEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgdXRmLThsb2dvdXRwdXRlbmNvZGluZz1nYmtcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZ2dlciB0IDx0QGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgdXRmLThsb2dvdXRwdXRlbmNvZGluZz1nYmtcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZUYWcgdCA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCXQucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzg0LDEzICszODQsMTMgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV91bnN1cHBvcnRlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgaXRfSVQuVVRGOFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2VGFnIHQgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQl0LnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCQlhc3NlcnRFcXVhbHMoc3JjLmdldE1lc3NhZ2UoKSwgcC5nZXRGdWxsTWVzc2FnZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBpZChmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWQoU3RyaW5nIHN0cikgewogCQlyZXR1cm4gT2JqZWN0SWQuZnJvbVN0cmluZyhzdHIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtGb2xsb3dGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrRm9sbG93RmlsdGVyVGVzdC5qYXZhCmluZGV4IGFiMjcwNWMuLjcwMDUwMjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtGb2xsb3dGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogCQlkaWZmQ29sbGVjdG9yID0gbmV3IERpZmZDb2xsZWN0b3IoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgRm9sbG93RmlsdGVyIGZvbGxvdyhmaW5hbCBTdHJpbmcgZm9sbG93UGF0aCkgeworCXByb3RlY3RlZCBGb2xsb3dGaWx0ZXIgZm9sbG93KFN0cmluZyBmb2xsb3dQYXRoKSB7CiAJCUZvbGxvd0ZpbHRlciBmb2xsb3dGaWx0ZXIgPQogCQkJRm9sbG93RmlsdGVyLmNyZWF0ZShmb2xsb3dQYXRoLCBuZXcgQ29uZmlnKCkuZ2V0KERpZmZDb25maWcuS0VZKSk7CiAJCWZvbGxvd0ZpbHRlci5zZXRSZW5hbWVDYWxsYmFjayhkaWZmQ29sbGVjdG9yKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyMVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyMVRlc3QuamF2YQppbmRleCA2ZWM1MjljLi5iNTVhNDVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjFUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBSZXZXYWxrUGF0aEZpbHRlcjFUZXN0IGV4dGVuZHMgUmV2V2Fsa1Rlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoU3RyaW5nIHBhdGgpIHsKIAkJcncuc2V0VHJlZUZpbHRlcihBbmRUcmVlRmlsdGVyLmNyZWF0ZShQYXRoRmlsdGVyR3JvdXAKIAkJCQkuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhdGgpKSwKIAkJCQlUcmVlRmlsdGVyLkFOWV9ESUZGKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjYwMTJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjYwMTJUZXN0LmphdmEKaW5kZXggNjMxZTM5NS4uY2VmNTUyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXI2MDEyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YQpAQCAtMTAyLDE3ICsxMDIsMTcgQEAKIAkJfQogCX0KIAotCXByb3RlY3RlZCB2b2lkIGNoZWNrKGZpbmFsIFJldkNvbW1pdC4uLiBvcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgY2hlY2soUmV2Q29tbWl0Li4uIG9yZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJbWFya1N0YXJ0KGkpOwogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGFjdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IHogOiBydykgeworCQlmb3IgKFJldkNvbW1pdCB6IDogcncpIHsKIAkJCWZpbmFsIFN0cmluZyBuYW1lID0gYnlOYW1lLmdldCh6KTsKIAkJCWFzc2VydE5vdE51bGwobmFtZSk7CiAJCQlhY3QuYXBwZW5kKG5hbWUpOwogCQkJYWN0LmFwcGVuZCgnICcpOwogCQl9CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgZXhwID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgeiA6IG9yZGVyKSB7CisJCWZvciAoUmV2Q29tbWl0IHogOiBvcmRlcikgewogCQkJZmluYWwgU3RyaW5nIG5hbWUgPSBieU5hbWUuZ2V0KHopOwogCQkJYXNzZXJ0Tm90TnVsbChuYW1lKTsKIAkJCWV4cC5hcHBlbmQobmFtZSk7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKGV4cC50b1N0cmluZygpLCBhY3QudG9TdHJpbmcoKSk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgZmlsdGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJvdGVjdGVkIHZvaWQgZmlsdGVyKFN0cmluZyBwYXRoKSB7CiAJCXJ3LnNldFRyZWVGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUoUGF0aEZpbHRlckdyb3VwCiAJCQkJLmNyZWF0ZUZyb21TdHJpbmdzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXRoKSksCiAJCQkJVHJlZUZpbHRlci5BTllfRElGRikpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1Rlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVGVzdENhc2UuamF2YQppbmRleCBmMTJjYzA4Li41NDQzOTgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVGVzdENhc2UuamF2YQpAQCAtNzQsMzggKzc0LDM4IEBACiAJCXJldHVybiB1dGlsLmdldERhdGUoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCB0aWNrKGZpbmFsIGludCBzZWNEZWx0YSkgeworCXByb3RlY3RlZCB2b2lkIHRpY2soaW50IHNlY0RlbHRhKSB7CiAJCXV0aWwudGljayhzZWNEZWx0YSk7CiAJfQogCi0JcHJvdGVjdGVkIFJldkJsb2IgYmxvYihmaW5hbCBTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFJldkJsb2IgYmxvYihTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmJsb2IoY29udGVudCk7CiAJfQogCi0JcHJvdGVjdGVkIERpckNhY2hlRW50cnkgZmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBibG9iKQorCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGZpbGUoU3RyaW5nIHBhdGgsIFJldkJsb2IgYmxvYikKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5maWxlKHBhdGgsIGJsb2IpOwogCX0KIAotCXByb3RlY3RlZCBSZXZUcmVlIHRyZWUoZmluYWwgRGlyQ2FjaGVFbnRyeS4uLiBlbnRyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2VHJlZSB0cmVlKERpckNhY2hlRW50cnkuLi4gZW50cmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLnRyZWUoZW50cmllcyk7CiAJfQogCi0JcHJvdGVjdGVkIFJldk9iamVjdCBnZXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlwcm90ZWN0ZWQgUmV2T2JqZWN0IGdldChSZXZUcmVlIHRyZWUsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmdldCh0cmVlLCBwYXRoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5jb21taXQocGFyZW50cyk7CiAJfQogCi0JcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChSZXZUcmVlIHRyZWUsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmNvbW1pdCh0cmVlLCBwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBpbnQgc2VjRGVsdGEsIGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQorCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGludCBzZWNEZWx0YSwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHNlY0RlbHRhLCBwYXJlbnRzKTsKIAl9CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHNlY0RlbHRhLCB0cmVlLCBwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2VGFnIHRhZyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUmV2T2JqZWN0IGRzdCkKKwlwcm90ZWN0ZWQgUmV2VGFnIHRhZyhTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IGRzdCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC50YWcobmFtZSwgZHN0KTsKIAl9CkBAIC0xMjUsMTkgKzEyNSwxOSBAQAogCQlyZXR1cm4gdXRpbC5jb21taXQoKTsKIAl9CiAKLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBSZXZPYmplY3Q+IFQgcGFyc2VCb2R5KGZpbmFsIFQgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShUIHQpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5wYXJzZUJvZHkodCk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgbWFya1N0YXJ0KGZpbmFsIFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIG1hcmtTdGFydChSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcncubWFya1N0YXJ0KGNvbW1pdCk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgbWFya1VuaW50ZXJlc3RpbmcoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgbWFya1VuaW50ZXJlc3RpbmcoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJ3Lm1hcmtVbmludGVyZXN0aW5nKGNvbW1pdCk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWl0KGZpbmFsIFJldkNvbW1pdCBleHAsIGZpbmFsIFJldkNvbW1pdCBhY3QpIHsKKwlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb21taXQoUmV2Q29tbWl0IGV4cCwgUmV2Q29tbWl0IGFjdCkgewogCQlhc3NlcnRTYW1lKGV4cCwgYWN0KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVXRpbHNSZWFjaGFibGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVXRpbHNSZWFjaGFibGVUZXN0LmphdmEKaW5kZXggMTBiZWEwYS4uYTI2YWUxMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtVdGlsc1JlYWNoYWJsZVRlc3QuamF2YQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlZiBicmFuY2goZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldkNvbW1pdCBkc3QpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmVmIGJyYW5jaChTdHJpbmcgbmFtZSwgUmV2Q29tbWl0IGRzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBHaXQud3JhcChkYikuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZShuYW1lKQogCQkJCS5zZXRTdGFydFBvaW50KGRzdC5uYW1lKCkpLmNhbGwoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCmluZGV4IDdmMGQ2MDIuLjBkZWE1Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscy5wYXRoVG9TdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVVEY4d2l0aG91dEJPTSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJZmluYWwgRmlsZSBmaWxlID0gY3JlYXRlRmlsZShDT05URU5UMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBuZXcgRmlsZUJhc2VkQ29uZmlnKGZpbGUsIEZTLkRFVEVDVEVEKTsKIAkJY29uZmlnLmxvYWQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFMSUNFLCBjb25maWcuZ2V0U3RyaW5nKFVTRVIsIG51bGwsIE5BTUUpKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQlib3MxLndyaXRlKDB4RUYpOwogCQlib3MxLndyaXRlKDB4QkIpOwogCQlib3MxLndyaXRlKDB4QkYpOwotCQlib3MxLndyaXRlKENPTlRFTlQxLmdldEJ5dGVzKFVURl84KSk7CisJCWJvczEud3JpdGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoYm9zMS50b0J5dGVBcnJheSgpKTsKIAkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IG5ldyBGaWxlQmFzZWRDb25maWcoZmlsZSwgRlMuREVURUNURUQpOwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJCWJvczIud3JpdGUoMHhFRik7CiAJCWJvczIud3JpdGUoMHhCQik7CiAJCWJvczIud3JpdGUoMHhCRik7Ci0JCWJvczIud3JpdGUoQ09OVEVOVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYm9zMi53cml0ZShDT05URU5UMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydEFycmF5RXF1YWxzKGJvczIudG9CeXRlQXJyYXkoKSwgSU8ucmVhZEZ1bGx5KGZpbGUpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlQWRkVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKaW5kZXggZjQyZGQwMi4uMWE2N2U0MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKQEAgLTEyOSwxMCArMTI5LDExIEBACiAJCQljb21tYW5kLnNldFBhdGgocGF0aCk7CiAJCQlTdHJpbmcgdXJpID0gZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpOwogCQkJY29tbWFuZC5zZXRVUkkodXJpKTsKLQkJCVJlcG9zaXRvcnkgcmVwbyA9IGNvbW1hbmQuY2FsbCgpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXBvKTsKLQkJCU9iamVjdElkIHN1YkNvbW1pdCA9IHJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCQlyZXBvLmNsb3NlKCk7CisJCQlPYmplY3RJZCBzdWJDb21taXQ7CisJCQl0cnkgKFJlcG9zaXRvcnkgcmVwbyA9IGNvbW1hbmQuY2FsbCgpKSB7CisJCQkJYXNzZXJ0Tm90TnVsbChyZXBvKTsKKwkJCQlzdWJDb21taXQgPSByZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOworCQkJfQogCiAJCQlTdWJtb2R1bGVXYWxrIGdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQkJYXNzZXJ0VHJ1ZShnZW5lcmF0b3IubmV4dCgpKTsKQEAgLTE0MSwxMCArMTQyLDEwIEBACiAJCQlhc3NlcnRFcXVhbHModXJpLCBnZW5lcmF0b3IuZ2V0TW9kdWxlc1VybCgpKTsKIAkJCWFzc2VydEVxdWFscyhwYXRoLCBnZW5lcmF0b3IuZ2V0TW9kdWxlc1BhdGgoKSk7CiAJCQlhc3NlcnRFcXVhbHModXJpLCBnZW5lcmF0b3IuZ2V0Q29uZmlnVXJsKCkpOwotCQkJUmVwb3NpdG9yeSBzdWJNb2RSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJCWFzc2VydE5vdE51bGwoc3ViTW9kUmVwbyk7Ci0JCQlhc3NlcnRFcXVhbHMoc3ViQ29tbWl0LCBjb21taXQpOwotCQkJc3ViTW9kUmVwby5jbG9zZSgpOworCQkJdHJ5IChSZXBvc2l0b3J5IHN1Yk1vZFJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJYXNzZXJ0Tm90TnVsbChzdWJNb2RSZXBvKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViQ29tbWl0LCBjb21taXQpOworCQkJfQogCiAJCQlTdGF0dXMgc3RhdHVzID0gR2l0LndyYXAoZGIpLnN0YXR1cygpLmNhbGwoKTsKIAkJCWFzc2VydFRydWUoc3RhdHVzLmdldEFkZGVkKCkuY29udGFpbnMoQ29uc3RhbnRzLkRPVF9HSVRfTU9EVUxFUykpOwpAQCAtMjA5LDE2ICsyMTAsMTQgQEAKIAkJCQlmdWxsVXJpID0gZnVsbFVyaS5yZXBsYWNlKCdcXCcsICcvJyk7CiAJCQl9CiAJCQlhc3NlcnRFcXVhbHMoZnVsbFVyaSwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJCVJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOwotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCQlmdWxsVXJpLAotCQkJCQlzdWJNb2RSZXBvCi0JCQkJCQkJLmdldENvbmZpZygpCi0JCQkJCQkJLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAotCQkJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCi0JCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKLQkJCXN1Yk1vZFJlcG8uY2xvc2UoKTsKKwkJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJCWFzc2VydE5vdE51bGwoc3ViTW9kUmVwbyk7CisJCQkJYXNzZXJ0RXF1YWxzKGZ1bGxVcmksCisJCQkJCQlzdWJNb2RSZXBvLmdldENvbmZpZygpLmdldFN0cmluZygKKwkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKKwkJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQkJfQogCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdCwgcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKSk7CiAKIAkJCVN0YXR1cyBzdGF0dXMgPSBHaXQud3JhcChkYikuc3RhdHVzKCkuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhCmluZGV4IDEzZGI0NGEuLjZmM2I1MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlU3luY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVN5bmNUZXN0LmphdmEKQEAgLTEzNSwxMiArMTM1LDE0IEBACiAJCWdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHModXJsLCBnZW5lcmF0b3IuZ2V0Q29uZmlnVXJsKCkpOwotCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdG9yZWRDb25maWcgc3VibW9kdWxlQ29uZmlnID0gc3ViTW9kUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKLQkJc3ViTW9kUmVwb3NpdG9yeS5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHModXJsLCBzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAotCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCi0JCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwb3NpdG9yeSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5LmdldENvbmZpZygpOworCQkJYXNzZXJ0RXF1YWxzKHVybCwKKwkJCQkJc3VibW9kdWxlQ29uZmlnLmdldFN0cmluZygKKwkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAorCQkJCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIwOCwxMSArMjEwLDEzIEBACiAJCWdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImdpdDovL3NlcnZlci9zdWIuZ2l0IiwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5MSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5MS5nZXRDb25maWcoKTsKLQkJc3ViTW9kUmVwb3NpdG9yeTEuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJnaXQ6Ly9zZXJ2ZXIvc3ViLmdpdCIsIHN1Ym1vZHVsZUNvbmZpZy5nZXRTdHJpbmcoCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKLQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5MSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5MS5nZXRDb25maWcoKTsKKwkJCWFzc2VydEVxdWFscygiZ2l0Oi8vc2VydmVyL3N1Yi5naXQiLAorCQkJCQlzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCisJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVVwZGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCmluZGV4IDcwNjRmNjAuLmJiY2U0MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCkBAIC0xMjEsMTAgKzEyMSwxMCBAQAogCiAJCVN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChkYik7CiAJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCWFzc2VydE5vdE51bGwoc3ViUmVwbyk7Ci0JCWFzc2VydEVxdWFscyhjb21taXQsIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOwotCQlzdWJSZXBvLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJYXNzZXJ0Tm90TnVsbChzdWJSZXBvKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQsIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOworCQl9CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggNjU4Yjk3MS4uZDMwYWM4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0xOTksNyArMTk5LDcgQEAKIAkJCVJlZiByZWYgPSByZXBvLmV4YWN0UmVmKHJlZk5hbWUpOwogCQkJYXNzZXJ0Tm90TnVsbChyZWYpOwogCQkJYXNzZXJ0RXF1YWxzKGlkLCByZWYuZ2V0T2JqZWN0SWQoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZGF0YSwgbmV3IFN0cmluZyhyZXBvLm9wZW4oaWQsIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBVVEZfOCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEsIG5ldyBTdHJpbmcocmVwby5vcGVuKGlkLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKSwgQ0hBUlNFVCkpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQ1Rlc3QuamF2YQppbmRleCAyZmVhOGE5Li40ZTVkNTZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIApAQCAtNzMsMTEgKzc0LDExIEBACiAJCWNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShob21lLCAiLm5ldHJjIik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZyhmaW5hbCBTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIGZ3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWdGaWxlKSwgIlVURi04Iik7Ci0JCWZ3LndyaXRlKGRhdGEpOwotCQlmdy5jbG9zZSgpOworCXByaXZhdGUgdm9pZCBjb25maWcoU3RyaW5nIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoT3V0cHV0U3RyZWFtV3JpdGVyIGZ3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKwkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWdGaWxlKSwgQ0hBUlNFVCkpIHsKKwkJCWZ3LndyaXRlKGRhdGEpOworCQl9CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YQppbmRleCBkNjA0NzUxLi5hYmY4MGVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtODksMTEgKzkwLDExIEBACiAJCW9zYyA9IG5ldyBPcGVuU3NoQ29uZmlnKGhvbWUsIGNvbmZpZ0ZpbGUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjb25maWcoZmluYWwgU3RyaW5nIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGNvbmZpZyhTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbG9uZyBsYXN0TXRpbWUgPSBjb25maWdGaWxlLmxhc3RNb2RpZmllZCgpOwogCQlkbyB7CiAJCQl0cnkgKGZpbmFsIE91dHB1dFN0cmVhbVdyaXRlciBmdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCAiVVRGLTgiKSkgeworCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWdGaWxlKSwgQ0hBUlNFVCkpIHsKIAkJCQlmdy53cml0ZShkYXRhKTsKIAkJCX0KIAkJfSB3aGlsZSAobGFzdE10aW1lID09IGNvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCmluZGV4IDVkOWJkYmQuLmI2ZDA2MTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKQEAgLTkzLDggKzkzLDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGFja0ZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0VGVzdFJlc291cmNlRmlsZSgicGFjay0zNGJlOTAzMmFjMjgyYjExZmE5YmFiZGMyYjJhOTNjYTk5NmM5YzJmLnBhY2siKTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tGaWxlKTsKLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja0ZpbGUpKSB7CiAJCQlPYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyIHAgPSAoT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlcikgaW5kZXgoaXMpOwogCQkJcC5wYXJzZShOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFKTsKIAkJCVBhY2tGaWxlIGZpbGUgPSBwLmdldFBhY2tGaWxlKCk7CkBAIC0xMDcsOCArMTA2LDYgQEAKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiOTAyZDU0NzZmYTI0OWI3YWJjOWQ4NGM2MTE1NzdhODEzODFmMDMyNyIpKSk7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoImFhYmYyZmZhZWM5YjQ5N2YwOTUwMzUyYjNlNTgyZDczMDM1YzIwMzUiKSkpOwogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCJjNTk3NTlmMTQzZmIxZmUyMWMxOTc5ODFkZjc1YTdlZTAwMjkwNzk5IikpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTEyMSw4ICsxMTgsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBwYWNrRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXRUZXN0UmVzb3VyY2VGaWxlKCJwYWNrLWRmMjk4MmYyODRiYmFiYjZiZGI1OWVlM2ZjYzZlYjA5ODNlMjAzNzEucGFjayIpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja0ZpbGUpOwotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSkpIHsKIAkJCU9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIgcCA9IChPYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyKSBpbmRleChpcyk7CiAJCQlwLnBhcnNlKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOwogCQkJUGFja0ZpbGUgZmlsZSA9IHAuZ2V0UGFja0ZpbGUoKTsKQEAgLTE0MCw4ICsxMzYsNiBAQAogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCIyMGE4YWRlNzc2Mzk0OTFlYTBiZDY2N2JmOTVkZThhYmYzYTQzNGM4IikpKTsKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiMjY3NTE4OGZkODY5NzhkNWJjNGQ3MjExNjk4YjIxMThhZTNiZjY1OCIpKSk7CiAJCQkvLyBhbmQgbG90cyBtb3JlLi4uCi0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVJblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluVGVzdC5qYXZhCmluZGV4IDEzZmM2OGQuLjhiMWQ4NjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluVGVzdC5qYXZhCkBAIC0xMTYsMTcgKzExNiw2IEBACiAJfQogCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ19MZW4wMDAxKCkgewotCQlpbml0KCIwMDAxIik7Ci0JCXRyeSB7Ci0JCQlpbi5yZWFkU3RyaW5nKCk7Ci0JCQlmYWlsKCJpbmNvcnJlY3RseSBhY2NlcHRlZCBpbnZhbGlkIHBhY2tldCBoZWFkZXIiKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHBhY2tldCBsaW5lIGhlYWRlcjogMDAwMSIsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfTGVuMDAwMigpIHsKIAkJaW5pdCgiMDAwMiIpOwogCQl0cnkgewpAQCAtMTY0LDYgKzE1MywxMyBAQAogCQlhc3NlcnRFT0YoKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0RlbGltKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdCgiMDAwMSIpOworCQlhc3NlcnRTYW1lKFBhY2tldExpbmVJbi5ERUxJTSwgaW4ucmVhZFN0cmluZygpKTsKKwkJYXNzZXJ0RU9GKCk7CisJfQorCiAJLy8gcmVhZFN0cmluZ05vTEYKIAogCUBUZXN0CkBAIC0zMzAsNyArMzI2LDcgQEAKIAogCS8vIHRlc3Qgc3VwcG9ydAogCi0JcHJpdmF0ZSB2b2lkIGluaXQoZmluYWwgU3RyaW5nIG1zZykgeworCXByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBtc2cpIHsKIAkJcmF3SW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oQ29uc3RhbnRzLmVuY29kZUFTQ0lJKG1zZykpOwogCQlpbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3SW4pOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dFRlc3QuamF2YQppbmRleCBlY2E1NDc1Li4zOTFhNzAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhCkBAIC0xMTMsNiArMTEzLDEyIEBACiAJCWFzc2VydEVxdWFscygxLCBmbHVzaENudFswXSk7CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0V3JpdGVEZWxpbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW91dC53cml0ZURlbGltKCk7CisJCWFzc2VydEJ1ZmZlcigiMDAwMSIpOworCX0KKwogCS8vIHdyaXRlUGFja2V0CiAKIAlAVGVzdApAQCAtMTY3LDcgKzE3Myw3IEBACiAJCWFzc2VydEVxdWFscygxLCBmbHVzaENudFswXSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihmaW5hbCBTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRCdWZmZXIoU3RyaW5nIGV4cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgbmV3IFN0cmluZyhyYXdPdXQudG9CeXRlQXJyYXkoKSwKIAkJCQlDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbm5lY3Rpb25UZXN0LmphdmEKaW5kZXggYzE2YzFiMi4uNjM0NzhmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC01MSwxMiArNTEsMTYgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC03Niw2ICs4MCw3IEBACiAJcHJpdmF0ZSBPYmplY3QgY3R4ID0gbmV3IE9iamVjdCgpOwogCXByaXZhdGUgSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjsKIAlwcml2YXRlIEluTWVtb3J5UmVwb3NpdG9yeSBjbGllbnQ7CisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJvY2Vzc2VkUmVmczsKIAlwcml2YXRlIE9iamVjdElkIG9iajE7CiAJcHJpdmF0ZSBPYmplY3RJZCBvYmoyOwogCXByaXZhdGUgT2JqZWN0SWQgb2JqMzsKQEAgLTg1LDYgKzkwLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzZXJ2ZXIgPSBuZXdSZXBvKCJzZXJ2ZXIiKTsKIAkJY2xpZW50ID0gbmV3UmVwbygiY2xpZW50Iik7CisJCXByb2Nlc3NlZFJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAogCQkJCW51bGwsCiAJCQkJbmV3IFJlY2VpdmVQYWNrRmFjdG9yeTxPYmplY3Q+KCkgewpAQCAtOTIsNyArOTgsMTggQEAKIAkJCQkJcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7Ci0JCQkJCQlyZXR1cm4gbmV3IFJlY2VpdmVQYWNrKGRiKTsKKwkJCQkJCVJlY2VpdmVQYWNrIHJwID0gbmV3IFJlY2VpdmVQYWNrKGRiKTsKKwkJCQkJCXJwLnNldFByZVJlY2VpdmVIb29rKAorCQkJCQkJCQluZXcgUHJlUmVjZWl2ZUhvb2soKSB7CisJCQkJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCQkJCXB1YmxpYyB2b2lkIG9uUHJlUmVjZWl2ZShSZWNlaXZlUGFjayByZWNlaXZlUGFjaywKKwkJCQkJCQkJCQkJQ29sbGVjdGlvbjxSZWNlaXZlQ29tbWFuZD4gY21kcykgeworCQkJCQkJCQkJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY21kcykgeworCQkJCQkJCQkJCQlwcm9jZXNzZWRSZWZzLmFkZChjbWQuZ2V0UmVmTmFtZSgpKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0pOworCQkJCQkJcmV0dXJuIHJwOwogCQkJCQl9CiAJCQkJfSk7CiAJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcik7CkBAIC0xOTYsNCArMjEzLDQ1IEBACiAJCQl9CiAJCX0KIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1hbmRPcmRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlUZXN0UmVwb3NpdG9yeTw/PiB0ciA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGNsaWVudCk7CisJCUxpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCS8vIEFyYml0cmFyeSBub24tc29ydGVkIG9yZGVyLgorCQlmb3IgKGludCBpID0gOTsgaSA+PSAwOyBpLS0pIHsKKwkJCVN0cmluZyBuYW1lID0gInJlZnMvaGVhZHMvYiIgKyBpOworCQkJdHIuYnJhbmNoKG5hbWUpLmNvbW1pdCgpLmNyZWF0ZSgpOworCQkJUmVtb3RlUmVmVXBkYXRlIHJydSA9IG5ldyBSZW1vdGVSZWZVcGRhdGUoY2xpZW50LCBuYW1lLCBuYW1lLCBmYWxzZSwgbnVsbCwKKwkJCQkJT2JqZWN0SWQuemVyb0lkKCkpOworCQkJdXBkYXRlcy5hZGQocnJ1KTsKKwkJfQorCisJCVB1c2hSZXN1bHQgcmVzdWx0OworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyIikpIHsKKwkJCXJlc3VsdCA9IHRuLnB1c2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwgdXBkYXRlcyk7CisJCX0KKworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSByZW1vdGVVcGRhdGUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSJ1cGRhdGUgc2hvdWxkIHN1Y2NlZWQgb24gIiArIHJlbW90ZVVwZGF0ZS5nZXRSZW1vdGVOYW1lKCksCisJCQkJCVJlbW90ZVJlZlVwZGF0ZS5TdGF0dXMuT0ssIHJlbW90ZVVwZGF0ZS5nZXRTdGF0dXMoKSk7CisJCX0KKworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSByZW1vdGVSZWZOYW1lcyh1cGRhdGVzKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJyZWYgbmFtZXMgcHJvY2Vzc2VkIGJ5IFJlY2VpdmVQYWNrIHNob3VsZCBtYXRjaCBpbnB1dCByZWYgbmFtZXMgaW4gb3JkZXIiLAorCQkJCWV4cGVjdGVkLCBwcm9jZXNzZWRSZWZzKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJyZW1vdGUgcmVmIG5hbWVzIHNob3VsZCBtYXRjaCBpbnB1dCByZWYgbmFtZXMgaW4gb3JkZXIiLAorCQkJCWV4cGVjdGVkLCByZW1vdGVSZWZOYW1lcyhyZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHJlbW90ZVJlZk5hbWVzKENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKSB7CisJCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKKwkJCXJlc3VsdC5hZGQodS5nZXRSZW1vdGVOYW1lKCkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKaW5kZXggMTA0YTY5Yy4uNjExY2QwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCkBAIC00MjIsNyArNDIyLDcgQEAKIAkJCVB1c2hDb25uZWN0aW9uIHsKIAkJTW9ja1B1c2hDb25uZWN0aW9uKCkgewogCQkJZmluYWwgTWFwPFN0cmluZywgUmVmPiByZWZzTWFwID0gbmV3IEhhc2hNYXA8PigpOwotCQkJZm9yIChmaW5hbCBSZWYgciA6IGFkdmVydGlzZWRSZWZzKQorCQkJZm9yIChSZWYgciA6IGFkdmVydGlzZWRSZWZzKQogCQkJCXJlZnNNYXAucHV0KHIuZ2V0TmFtZSgpLCByKTsKIAkJCWF2YWlsYWJsZShyZWZzTWFwKTsKIAkJfQpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJCXB1YmxpYyB2b2lkIHB1c2goUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAJCQkJTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWZzVG9VcGRhdGUpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZzVG9VcGRhdGUudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZnNUb1VwZGF0ZS52YWx1ZXMoKSkgewogCQkJCWFzc2VydEVxdWFscyhTdGF0dXMuTk9UX0FUVEVNUFRFRCwgcnJ1LmdldFN0YXR1cygpKTsKIAkJCQlycnUuc2V0U3RhdHVzKGNvbm5lY3Rpb25VcGRhdGVTdGF0dXMpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCmluZGV4IDhlZjg3Y2IuLmI3NzA0MjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQl0cnkgKFRyYW5zcG9ydExvY2FsIHQgPSBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLAogCQkJCWRzdC5nZXREaXJlY3RvcnkoKSkgewogCQkJQE92ZXJyaWRlCi0JCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7CiAJCQkJZGIuY2xvc2UoKTsKIAkJCQlkc3QuaW5jcmVtZW50T3BlbigpOwogCkBAIC0xOTksNiArMTk5LDIzIEBACiAJCWFzc2VydEZhbHNlKGhhdmVzLmdldCgpLmNvbnRhaW5zKFApKTsKIAl9CiAKKwlwcml2YXRlIFRyYW5zcG9ydExvY2FsIG5ld1RyYW5zcG9ydExvY2FsV2l0aFN0cmljdFZhbGlkYXRpb24oKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKKwkJCUBPdmVycmlkZQorCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgeworCQkJCWRiLmNsb3NlKCk7CisJCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKKworCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKKwkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKKwkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOworCQkJCXJwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBIaWRlUHJpdmF0ZUhvb2soKSk7CisJCQkJcmV0dXJuIHJwOworCQkJfQorCQl9OworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gTWFudWFsbHkgZm9yY2UgYSBkZWx0YSBvZiBhbiBvYmplY3Qgc28gd2UgcmV1c2UgaXQgbGF0ZXIuCkBAIC0yMzAsMTkgKzI0Nyw3IEBACiAKIAkJLy8gUHVzaCB0aGlzIG5ldyBjb250ZW50IHRvIHRoZSByZW1vdGUsIGRvaW5nIHN0cmljdCB2YWxpZGF0aW9uLgogCQkvLwotCQlUcmFuc3BvcnRMb2NhbCB0ID0gbmV3IFRyYW5zcG9ydExvY2FsKHNyYywgdXJpT2YoZHN0KSwgZHN0LmdldERpcmVjdG9yeSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKLQkJCQlkYi5jbG9zZSgpOwotCQkJCWRzdC5pbmNyZW1lbnRPcGVuKCk7Ci0KLQkJCQlmaW5hbCBSZWNlaXZlUGFjayBycCA9IHN1cGVyLmNyZWF0ZVJlY2VpdmVQYWNrKGRzdCk7Ci0JCQkJcnAuc2V0Q2hlY2tSZWNlaXZlZE9iamVjdHModHJ1ZSk7Ci0JCQkJcnAuc2V0Q2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZSh0cnVlKTsKLQkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgSGlkZVByaXZhdGVIb29rKCkpOwotCQkJCXJldHVybiBycDsKLQkJCX0KLQkJfTsKKwkJUHVzaFJlc3VsdCByOwogCQlSZW1vdGVSZWZVcGRhdGUgdSA9IG5ldyBSZW1vdGVSZWZVcGRhdGUoIC8vCiAJCQkJc3JjLCAvLwogCQkJCVJfTUFTVEVSLCAvLyBzcmMgbmFtZQpAQCAtMjUxLDEyICsyNTYsOSBAQAogCQkJCW51bGwsIC8vIGxvY2FsIHRyYWNraW5nIGJyYW5jaAogCQkJCW51bGwgLy8gZXhwZWN0ZWQgaWQKIAkJKTsKLQkJUHVzaFJlc3VsdCByOwotCQl0cnkgeworCQl0cnkgKFRyYW5zcG9ydExvY2FsIHQgPSBuZXdUcmFuc3BvcnRMb2NhbFdpdGhTdHJpY3RWYWxpZGF0aW9uKCkpIHsKIAkJCXQuc2V0UHVzaFRoaW4odHJ1ZSk7CiAJCQlyID0gdC5wdXNoKFBNLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24odSkpOwotCQl9IGZpbmFsbHkgewotCQkJdC5jbG9zZSgpOwogCQl9CiAKIAkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSByZXN1bHQiLCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWdUZXN0LmphdmEKaW5kZXggYTBjZjBkMi4uOWFhYmQ3MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWdUZXN0LmphdmEKQEAgLTY3LDEyICs2NywxMiBAQAogCQljb25maWcgPSBuZXcgQ29uZmlnKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25maWcoZmluYWwgU3RyaW5nIGRhdCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCByZWFkQ29uZmlnKFN0cmluZyBkYXQpIHRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJY29uZmlnID0gbmV3IENvbmZpZygpOwogCQljb25maWcuZnJvbVRleHQoZGF0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2hlY2tDb25maWcoZmluYWwgU3RyaW5nIGV4cCkgeworCXByaXZhdGUgdm9pZCBjaGVja0NvbmZpZyhTdHJpbmcgZXhwKSB7CiAJCWFzc2VydEVxdWFscyhleHAsIGNvbmZpZy50b1RleHQoKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA0NTcxNjE5Li40ZDNlMTYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTI1OSw3ICsyNTksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihmaW5hbCBTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRCdWZmZXIoU3RyaW5nIGV4cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgbmV3IFN0cmluZyhyYXdPdXQudG9CeXRlQXJyYXkoKSwKIAkJCQlDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFRlc3QuamF2YQppbmRleCBkNGM0N2QzLi5jMjM5OTIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFRlc3QuamF2YQpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCWFzc2VydEVxdWFscygxMiwgcmVzdWx0LnNpemUoKSk7CiAJCWJvb2xlYW4gZm91bmRBID0gZmFsc2U7CiAJCWJvb2xlYW4gZm91bmRCID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKIAkJCWlmICgicmVmcy9oZWFkcy9hIi5lcXVhbHMocnJ1LmdldFNyY1JlZigpKQogCQkJCQkmJiAicmVmcy9oZWFkcy90ZXN0L2EiLmVxdWFscyhycnUuZ2V0UmVtb3RlTmFtZSgpKSkKIAkJCQlmb3VuZEEgPSB0cnVlOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJCWFzc2VydEVxdWFscygyLCByZXN1bHQuc2l6ZSgpKTsKIAkJYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKIAkJYm9vbGVhbiBmb3VuZEMgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgewogCQkJaWYgKCJyZWZzL2hlYWRzL2EiLmVxdWFscyhycnUuZ2V0U3JjUmVmKCkpCiAJCQkJCSYmICJyZWZzL2hlYWRzL2IiLmVxdWFscyhycnUuZ2V0UmVtb3RlTmFtZSgpKSkKIAkJCQlmb3VuZEEgPSB0cnVlOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCWFzc2VydEVxdWFscygyLCByZXN1bHQuc2l6ZSgpKTsKIAkJYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKIAkJYm9vbGVhbiBmb3VuZEMgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgewogCQkJaWYgKCJyZWZzL2hlYWRzL2EiLmVxdWFscyhycnUuZ2V0U3JjUmVmKCkpCiAJCQkJCSYmICJyZWZzL2hlYWRzL2IiLmVxdWFscyhycnUuZ2V0UmVtb3RlTmFtZSgpKSkgewogCQkJCWZvdW5kQSA9IHRydWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEKaW5kZXggYTgxMjdhYi4uZWYwODNkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YQpAQCAtMSwyMiArMSw0MSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzSXRlbXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnRoZUluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlBhY2tQcm90b2NvbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNHYXJiYWdlQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU2V0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UZXh0UHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZCbG9iOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRhZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrLlJlcXVlc3RQb2xpY3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuVXBsb2FkUGFja0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMTcwLDQgKzE4OSw4OTkgQEAKIAkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhibG9iLm5hbWUoKSkpKTsKIAkJfQogCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aEJsb2JOb25lRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXIyID0gbmV3UmVwbygic2VydmVyMiIpOworCQlUZXN0UmVwb3NpdG9yeTxJbk1lbW9yeVJlcG9zaXRvcnk+IHJlbW90ZTIgPQorCQkJCW5ldyBUZXN0UmVwb3NpdG9yeTw+KHNlcnZlcjIpOworCQlSZXZCbG9iIGJsb2IxID0gcmVtb3RlMi5ibG9iKCJmb29iYXIiKTsKKwkJUmV2QmxvYiBibG9iMiA9IHJlbW90ZTIuYmxvYigiZm9vYmEiKTsKKwkJUmV2VHJlZSB0cmVlID0gcmVtb3RlMi50cmVlKHJlbW90ZTIuZmlsZSgiMSIsIGJsb2IxKSwKKwkJCQlyZW1vdGUyLmZpbGUoIjIiLCBibG9iMikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCgwKTsKKwkJCXRuLmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoY29tbWl0Lm5hbWUoKSkpKTsKKwkJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdCh0cmVlLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChibG9iMS50b09iamVjdElkKCkpKTsKKwkJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoYmxvYjIudG9PYmplY3RJZCgpKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZXRjaFdpdGhCbG9iTGltaXRGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgbG9uZ0Jsb2IgPSByZW1vdGUyLmJsb2IoImZvb2JhciIpOworCQlSZXZCbG9iIHNob3J0QmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmEiKTsKKwkJUmV2VHJlZSB0cmVlID0gcmVtb3RlMi50cmVlKHJlbW90ZTIuZmlsZSgiMSIsIGxvbmdCbG9iKSwKKwkJCQlyZW1vdGUyLmZpbGUoIjIiLCBzaG9ydEJsb2IpKTsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZTIuY29tbWl0KHRyZWUpOworCQlyZW1vdGUyLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKworCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCisJCQkJbmV3IFVwbG9hZFBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKKwkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCisJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCQkJCXJldHVybiB1cDsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIyKTsKKworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyMiIpKSB7CisJCQl0bi5zZXRGaWx0ZXJCbG9iTGltaXQoNSk7CisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGxvbmdCbG9iLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNob3J0QmxvYi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aEJsb2JMaW1pdEZpbHRlckFuZEJpdG1hcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgbG9uZ0Jsb2IgPSByZW1vdGUyLmJsb2IoImZvb2JhciIpOworCQlSZXZCbG9iIHNob3J0QmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmEiKTsKKwkJUmV2VHJlZSB0cmVlID0gcmVtb3RlMi50cmVlKHJlbW90ZTIuZmlsZSgiMSIsIGxvbmdCbG9iKSwKKwkJCQlyZW1vdGUyLmZpbGUoIjIiLCBzaG9ydEJsb2IpKTsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZTIuY29tbWl0KHRyZWUpOworCQlyZW1vdGUyLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKworCQkvLyBnZW5lcmF0ZSBiaXRtYXBzCisJCW5ldyBEZnNHYXJiYWdlQ29sbGVjdG9yKHNlcnZlcjIpLnBhY2sobnVsbCk7CisJCXNlcnZlcjIuc2NhbkZvclJlcG9DaGFuZ2VzKCk7CisKKwkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAorCQkJCW5ldyBVcGxvYWRQYWNrRmFjdG9yeTxPYmplY3Q+KCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFVwbG9hZFBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCisJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKKwkJCQkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQkJCQlyZXR1cm4gdXA7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyMik7CisKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlcjIiKSkgeworCQkJdG4uc2V0RmlsdGVyQmxvYkxpbWl0KDUpOworCQkJdG4uZmV0Y2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhjb21taXQubmFtZSgpKSkpOworCQkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChsb25nQmxvYi50b09iamVjdElkKCkpKTsKKwkJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChzaG9ydEJsb2IudG9PYmplY3RJZCgpKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZXRjaFdpdGhOb25TdXBwb3J0aW5nU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXIyID0gbmV3UmVwbygic2VydmVyMiIpOworCQlUZXN0UmVwb3NpdG9yeTxJbk1lbW9yeVJlcG9zaXRvcnk+IHJlbW90ZTIgPQorCQkJCW5ldyBUZXN0UmVwb3NpdG9yeTw+KHNlcnZlcjIpOworCQlSZXZCbG9iIGJsb2IgPSByZW1vdGUyLmJsb2IoImZvbyIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgYmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIGZhbHNlKTsKKworCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCisJCQkJbmV3IFVwbG9hZFBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKKwkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCisJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCQkJCXJldHVybiB1cDsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIyKTsKKworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyMiIpKSB7CisJCQl0bi5zZXRGaWx0ZXJCbG9iTGltaXQoMCk7CisKKwkJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJCXRocm93bi5leHBlY3RNZXNzYWdlKCJmaWx0ZXIgcmVxdWlyZXMgc2VydmVyIHRvIGFkdmVydGlzZSB0aGF0IGNhcGFiaWxpdHkiKTsKKworCQkJdG4uZmV0Y2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhjb21taXQubmFtZSgpKSkpOworCQl9CisJfQorCisJLyoKKwkgKiBJbnZva2VzIFVwbG9hZFBhY2sgd2l0aCBwcm90b2NvbCB2MiBhbmQgc2VuZHMgaXQgdGhlIGdpdmVuIGxpbmVzLAorCSAqIGFuZCByZXR1cm5zIFVwbG9hZFBhY2sncyBvdXRwdXQgc3RyZWFtLgorCSAqLworCXByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdXBsb2FkUGFja1YyU2V0dXAoUmVxdWVzdFBvbGljeSByZXF1ZXN0UG9saWN5LAorCQkJUmVmRmlsdGVyIHJlZkZpbHRlciwgU3RyaW5nLi4uIGlucHV0TGluZXMpIHRocm93cyBFeGNlcHRpb24geworCisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzZW5kID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KHNlbmQpOworCQlmb3IgKFN0cmluZyBsaW5lIDogaW5wdXRMaW5lcykgeworCQkJaWYgKGxpbmUgPT0gUGFja2V0TGluZUluLkVORCkgeworCQkJCXBja091dC5lbmQoKTsKKwkJCX0gZWxzZSBpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uREVMSU0pIHsKKwkJCQlwY2tPdXQud3JpdGVEZWxpbSgpOworCQkJfSBlbHNlIHsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcobGluZSk7CisJCQl9CisJCX0KKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0U3RyaW5nKCJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIiwgIjIiKTsKKwkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKHNlcnZlcik7CisJCWlmIChyZXF1ZXN0UG9saWN5ICE9IG51bGwpCisJCQl1cC5zZXRSZXF1ZXN0UG9saWN5KHJlcXVlc3RQb2xpY3kpOworCQlpZiAocmVmRmlsdGVyICE9IG51bGwpCisJCQl1cC5zZXRSZWZGaWx0ZXIocmVmRmlsdGVyKTsKKwkJdXAuc2V0RXh0cmFQYXJhbWV0ZXJzKFNldHMub2YoInZlcnNpb249MiIpKTsKKworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVjdiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJdXAudXBsb2FkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZW5kLnRvQnl0ZUFycmF5KCkpLCByZWN2LCBudWxsKTsKKworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlY3YudG9CeXRlQXJyYXkoKSk7CisJfQorCisJLyoKKwkgKiBJbnZva2VzIFVwbG9hZFBhY2sgd2l0aCBwcm90b2NvbCB2MiBhbmQgc2VuZHMgaXQgdGhlIGdpdmVuIGxpbmVzLgorCSAqIFJldHVybnMgVXBsb2FkUGFjaydzIG91dHB1dCBzdHJlYW0sIG5vdCBpbmNsdWRpbmcgdGhlIGNhcGFiaWxpdHkKKwkgKiBhZHZlcnRpc2VtZW50IGJ5IHRoZSBzZXJ2ZXIuCisJICovCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjIoUmVxdWVzdFBvbGljeSByZXF1ZXN0UG9saWN5LAorCQkJUmVmRmlsdGVyIHJlZkZpbHRlciwgU3RyaW5nLi4uIGlucHV0TGluZXMpIHRocm93cyBFeGNlcHRpb24geworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0KKwkJCXVwbG9hZFBhY2tWMlNldHVwKHJlcXVlc3RQb2xpY3ksIHJlZkZpbHRlciwgaW5wdXRMaW5lcyk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJLy8gZHJhaW4gY2FwYWJpbGl0aWVzCisJCXdoaWxlIChwY2tJbi5yZWFkU3RyaW5nKCkgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJLy8gZG8gbm90aGluZworCQl9CisJCXJldHVybiByZWN2U3RyZWFtOworCX0KKworCXByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdXBsb2FkUGFja1YyKFN0cmluZy4uLiBpbnB1dExpbmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHVwbG9hZFBhY2tWMihudWxsLCBudWxsLCBpbnB1dExpbmVzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkNhcGFiaWxpdGllcygpIHRocm93cyBFeGNlcHRpb24geworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0KKwkJCXVwbG9hZFBhY2tWMlNldHVwKG51bGwsIG51bGwsIFBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygidmVyc2lvbiAyIikpOworCQlhc3NlcnRUaGF0KAorCQkJQXJyYXlzLmFzTGlzdChwY2tJbi5yZWFkU3RyaW5nKCksIHBja0luLnJlYWRTdHJpbmcoKSksCisJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpIFRoaXMgY2hlY2sgaXMgd3JpdHRlbiB0aGlzIHdheQorCQkJLy8gdG8gbWFrZSBpdCBzaW1wbGUgdG8gc2VlIHRoYXQgd2UgZXhwZWN0IHRoaXMgbGlzdCBvZgorCQkJLy8gY2FwYWJpbGl0aWVzLCBidXQgcHJvYmFibHkgc2hvdWxkIGJlIGxvb3NlbmVkIHRvCisJCQkvLyBhbGxvdyBhZGRpdGlvbmFsIGNvbW1hbmRzIHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0LAorCQkJLy8gYW5kIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzIHRvIGJlIGFkZGVkIHRvIGV4aXN0aW5nCisJCQkvLyBjb21tYW5kcyB3aXRob3V0IHJlcXVpcmluZyB0ZXN0IGNoYW5nZXMuCisJCQloYXNJdGVtcygibHMtcmVmcyIsICJmZXRjaD1zaGFsbG93IikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkNhcGFiaWxpdGllc0FsbG93RmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNlcnZlci5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAobnVsbCwgbnVsbCwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJ2ZXJzaW9uIDIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlBcnJheXMuYXNMaXN0KHBja0luLnJlYWRTdHJpbmcoKSwgcGNrSW4ucmVhZFN0cmluZygpKSwKKwkJCS8vIFRPRE8oam9uYXRoYW50YW5teSkgVGhpcyBjaGVjayBvdmVyc3BlY2lmaWVzIHRoZQorCQkJLy8gb3JkZXIgb2YgdGhlIGNhcGFiaWxpdGllcyBvZiAiZmV0Y2giLgorCQkJaGFzSXRlbXMoImxzLXJlZnMiLCAiZmV0Y2g9ZmlsdGVyIHNoYWxsb3ciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJcHVibGljIHZvaWQgdGVzdFYyRW1wdHlSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoUGFja2V0TGluZUluLkVORCk7CisJCS8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgbW9yZSBhZnRlciB0aGUgY2FwYWJpbGl0eQorCQkvLyBhZHZlcnRpc2VtZW50LgorCQlhc3NlcnRUaGF0KHJlY3ZTdHJlYW0uYXZhaWxhYmxlKCksIGlzKDApKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKCJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1N5bXJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXNlcnZlci51cGRhdGVSZWYoIkhFQUQiKS5saW5rKCJyZWZzL2hlYWRzL21hc3RlciIpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uREVMSU0sICJzeW1yZWZzIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIHN5bXJlZi10YXJnZXQ6cmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNQZWVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlzZXJ2ZXIudXBkYXRlUmVmKCJIRUFEIikubGluaygicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkRFTElNLCAicGVlbCIsIFBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCXBja0luLnJlYWRTdHJpbmcoKSwKKwkJCWlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIHBlZWxlZDoiCisJCQkJKyB0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc011bHRpcGxlQ29tbWFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXNlcnZlci51cGRhdGVSZWYoIkhFQUQiKS5saW5rKCJyZWZzL2hlYWRzL21hc3RlciIpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgInN5bXJlZnMiLCAicGVlbCIsIFBhY2tldExpbmVJbi5FTkQsCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uREVMSU0sIFBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCBzeW1yZWYtdGFyZ2V0OnJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KAorCQkJcGNrSW4ucmVhZFN0cmluZygpLAorCQkJaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWcgcGVlbGVkOiIKKwkJCQkrIHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNSZWZQcmVmaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoIm90aGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgieWV0QW5vdGhlciIsIHRpcCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkicmVmLXByZWZpeCByZWZzL2hlYWRzL21hc3RlIiwKKwkJCSJyZWYtcHJlZml4IHJlZnMvaGVhZHMvb3RoZXIiLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL290aGVyIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1JlZlByZWZpeE5vU2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoIm90aGVyIiwgdGlwKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJyZWYtcHJlZml4IHJlZnMvaGVhZHMvbWFzdGUiLAorCQkJInJlZi1wcmVmaXggciIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvb3RoZXIiKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzVW5yZWNvZ25pemVkQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhyb3duLmV4cGVjdChQYWNrUHJvdG9jb2xFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgidW5leHBlY3RlZCBpbnZhbGlkLWFyZ3VtZW50Iik7CisJCXVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkiaW52YWxpZC1hcmd1bWVudFxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCS8qCisJICogUGFyc2UgbXVsdGlwbGV4ZWQgcGFja2ZpbGUgb3V0cHV0IGZyb20gdXBsb2FkLXBhY2sgdXNpbmcgcHJvdG9jb2wgVjIKKwkgKiBpbnRvIHRoZSBjbGllbnQgcmVwb3NpdG9yeS4KKwkgKi8KKwlwcml2YXRlIFJlY2VpdmVkUGFja1N0YXRpc3RpY3MgcGFyc2VQYWNrKEJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0pIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gcGFyc2VQYWNrKHJlY3ZTdHJlYW0sIE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOworCX0KKworCXByaXZhdGUgUmVjZWl2ZWRQYWNrU3RhdGlzdGljcyBwYXJzZVBhY2soQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSwgUHJvZ3Jlc3NNb25pdG9yIHBtKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNpZGVCYW5kSW5wdXRTdHJlYW0gc2IgPSBuZXcgU2lkZUJhbmRJbnB1dFN0cmVhbSgKKwkJCQlyZWN2U3RyZWFtLCBwbSwKKwkJCQluZXcgU3RyaW5nV3JpdGVyKCksIE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpOworCQlQYWNrUGFyc2VyIHBwID0gY2xpZW50Lm5ld09iamVjdEluc2VydGVyKCkubmV3UGFja1BhcnNlcihzYik7CisJCXBwLnBhcnNlKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOworCQlyZXR1cm4gcHAuZ2V0UmVjZWl2ZWRQYWNrU3RhdGlzdGljcygpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5QWR2ZXJ0aXNlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgYWR2ZXJ0aXplZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB1bmFkdmVydGl6ZWQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgYWR2ZXJ0aXplZCk7CisKKwkJLy8gVGhpcyB3b3JrcworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LkFEVkVSVElTRUQsCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYWR2ZXJ0aXplZC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisKKwkJLy8gVGhpcyBkb2Vzbid0CisJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoCisJCQkJCSJ3YW50ICIgKyB1bmFkdmVydGl6ZWQubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuQURWRVJUSVNFRCwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB1bmFkdmVydGl6ZWQubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5UmVhY2hhYmxlQ29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCByZWFjaGFibGUgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYWR2ZXJ0aXplZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KHJlYWNoYWJsZSkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB1bnJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBhZHZlcnRpemVkKTsKKworCQkvLyBUaGlzIHdvcmtzCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuUkVBQ0hBQkxFX0NPTU1JVCwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyByZWFjaGFibGUubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuUkVBQ0hBQkxFX0NPTU1JVCwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lUaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHBhcmVudE9mVGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KHBhcmVudE9mVGlwKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgic2VjcmV0IiwgdGlwKTsKKworCQkvLyBUaGlzIHdvcmtzCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdGlwLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKworCQkvLyBUaGlzIGRvZXNuJ3QKKwkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZShNYXRjaGVycy5jb250YWluc1N0cmluZygKKwkJCQkJIndhbnQgIiArIHBhcmVudE9mVGlwLm5hbWUoKSArICIgbm90IHZhbGlkIikpOworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlRJUCwKKwkJCW5ldyBSZWplY3RBbGxSZWZGaWx0ZXIoKSwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHBhcmVudE9mVGlwLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeVJlYWNoYWJsZUNvbW1pdFRpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50T2ZUaXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQocGFyZW50T2ZUaXApLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdW5yZWFjaGFibGUgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJzZWNyZXQiLCB0aXApOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlUX1RJUCwKKwkJCW5ldyBSZWplY3RBbGxSZWZGaWx0ZXIoKSwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHBhcmVudE9mVGlwLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKworCQkvLyBUaGlzIGRvZXNuJ3QKKwkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZShNYXRjaGVycy5jb250YWluc1N0cmluZygKKwkJCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICIgbm90IHZhbGlkIikpOworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlJFQUNIQUJMRV9DT01NSVRfVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5QW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB1bnJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisKKwkJLy8gRXhlcmNpc2UgdG8gbWFrZSBzdXJlIHRoYXQgZXZlbiB1bnJlYWNoYWJsZSBjb21taXRzIGNhbiBiZSBmZXRjaGVkCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuQU5ZLAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoU2VydmVyRG9lc05vdFN0b3BOZWdvdGlhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgZm9vUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0NoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQoZm9vUGFyZW50KS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhclBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KGJhclBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBmb29DaGlsZCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDIiLCBiYXJDaGlsZCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiYWNrbm93bGVkZ21lbnRzIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoIkFDSyAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5FTkQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoU2VydmVyU3RvcHNOZWdvdGlhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgZm9vUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0NoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQoZm9vUGFyZW50KS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhclBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KGJhclBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBmb29DaGlsZCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDIiLCBiYXJDaGlsZCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBiYXJQYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoImFja25vd2xlZGdtZW50cyIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCUFycmF5cy5hc0xpc3QocGNrSW4ucmVhZFN0cmluZygpLCBwY2tJbi5yZWFkU3RyaW5nKCkpLAorCQkJaGFzSXRlbXMoCisJCQkJIkFDSyAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCksCisJCQkJIkFDSyAiICsgYmFyUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJyZWFkeSIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5ERUxJTSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoZm9vUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoZm9vQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoYmFyUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaENsaWVudFN0b3BzTmVnb3RpYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGZvb1BhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBmb29DaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KGZvb1BhcmVudCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJQYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChiYXJQYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgZm9vQ2hpbGQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gyIiwgYmFyQ2hpbGQpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBmb29DaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJ3YW50ICIgKyBiYXJDaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChmb29QYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChmb29DaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGJhclBhcmVudC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGJhckNoaWxkLnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY29tbW9uSW5CbG9iID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKworCQlSZXZCbG9iIHBhcmVudEJsb2IgPSByZW1vdGUuYmxvYihjb21tb25JbkJsb2IgKyAiYSIpOworCQlSZXZDb21taXQgcGFyZW50ID0gcmVtb3RlLmNvbW1pdChyZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiZm9vIiwgcGFyZW50QmxvYikpKTsKKwkJUmV2QmxvYiBjaGlsZEJsb2IgPSByZW1vdGUuYmxvYihjb21tb25JbkJsb2IgKyAiYiIpOworCQlSZXZDb21taXQgY2hpbGQgPSByZW1vdGUuY29tbWl0KHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCJmb28iLCBjaGlsZEJsb2IpKSwgcGFyZW50KTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNoaWxkKTsKKworCQkvLyBQcmV0ZW5kIHRoYXQgd2UgaGF2ZSBwYXJlbnQgdG8gZ2V0IGEgdGhpbiBwYWNrIGJhc2VkIG9uIGl0LgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgcGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJInRoaW4tcGFja1xuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKworCQkvLyBWZXJpZnkgdGhhdCB3ZSByZWNlaXZlZCBhIHRoaW4gcGFjayBieSB0cnlpbmcgdG8gYXBwbHkgaXQKKwkJLy8gYWdhaW5zdCB0aGUgY2xpZW50IHJlcG8sIHdoaWNoIGRvZXMgbm90IGhhdmUgcGFyZW50LgorCQl0aHJvd24uZXhwZWN0KElPRXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoInBhY2sgaGFzIHVucmVzb2x2ZWQgZGVsdGFzIik7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoTm9Qcm9ncmVzcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNvbW1pdCk7CisKKwkJLy8gV2l0aG91dCBuby1wcm9ncmVzcywgcHJvZ3Jlc3MgaXMgcmVwb3J0ZWQuCisJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtLCBuZXcgVGV4dFByb2dyZXNzTW9uaXRvcihzdykpOworCQlhc3NlcnRGYWxzZShzdy50b1N0cmluZygpLmlzRW1wdHkoKSk7CisKKwkJLy8gV2l0aCBuby1wcm9ncmVzcywgcHJvZ3Jlc3MgaXMgbm90IHJlcG9ydGVkLgorCQlzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJuby1wcm9ncmVzc1xuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0sIG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKHN3KSk7CisJCWFzc2VydFRydWUoc3cudG9TdHJpbmcoKS5pc0VtcHR5KCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hJbmNsdWRlVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgY29tbWl0KTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNvbW1pdCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCS8vIFdpdGhvdXQgaW5jbHVkZS10YWcuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QodGFnLnRvT2JqZWN0SWQoKSkpOworCisJCS8vIFdpdGggdGFnLgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImluY2x1ZGUtdGFnXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdCh0YWcudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaE9mc0RlbHRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tb25JbkJsb2IgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCisJCVJldkJsb2IgcGFyZW50QmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJhIik7CisJCVJldkNvbW1pdCBwYXJlbnQgPSByZW1vdGUuY29tbWl0KHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCJmb28iLCBwYXJlbnRCbG9iKSkpOworCQlSZXZCbG9iIGNoaWxkQmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJiIik7CisJCVJldkNvbW1pdCBjaGlsZCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIGNoaWxkQmxvYikpLCBwYXJlbnQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vIFdpdGhvdXQgb2ZzLWRlbHRhLgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlSZWNlaXZlZFBhY2tTdGF0aXN0aWNzIHN0YXRzID0gcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKHN0YXRzLmdldE51bU9mc0RlbHRhKCkgPT0gMCk7CisKKwkJLy8gV2l0aCBvZnMtZGVsdGEuCisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJvZnMtZGVsdGFcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXN0YXRzID0gcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKHN0YXRzLmdldE51bU9mc0RlbHRhKCkgIT0gMCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFNoYWxsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1vblBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJwYXJlbnQiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0NoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQoY29tbW9uUGFyZW50KS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoY29tbW9uUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGJhckNoaWxkKTsKKworCQkvLyBXaXRob3V0IHNoYWxsb3csIHRoZSBzZXJ2ZXIgdGhpbmtzIHRoYXQgd2UgaGF2ZQorCQkvLyBjb21tb25QYXJlbnQsIHNvIGl0IGRvZXNuJ3Qgc2VuZCBpdC4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoY29tbW9uUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCisJCS8vIFdpdGggc2hhbGxvdywgdGhlIHNlcnZlciBrbm93cyB0aGF0IHdlIGRvbid0IGhhdmUKKwkJLy8gY29tbW9uUGFyZW50LCBzbyBpdCBzZW5kcyBpdC4KKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJInNoYWxsb3cgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChjb21tb25QYXJlbnQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaERlZXBlbkFuZERvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJwYXJlbnQiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNoaWxkKTsKKworCQkvLyAiZGVlcGVuIDEiIHNlbmRzIG9ubHkgdGhlIGNoaWxkLgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZGVlcGVuIDFcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInNoYWxsb3ctaW5mbyIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJzaGFsbG93ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCB0aGVJbnN0YW5jZShQYWNrZXRMaW5lSW4uREVMSU0pKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoY2hpbGQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QocGFyZW50LnRvT2JqZWN0SWQoKSkpOworCisJCS8vIFdpdGhvdXQgdGhhdCwgdGhlIHBhcmVudCBpcyBzZW50IHRvby4KKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChwYXJlbnQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaERlZXBlbldpdGhvdXREb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBwYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgicGFyZW50IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBjaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjaGlsZCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRlZXBlbiAxXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJLy8gVmVyaWZ5IHRoYXQgb25seSB0aGUgY29ycmVjdCBzZWN0aW9uIGlzIHNlbnQuICJzaGFsbG93LWluZm8iCisJCS8vIGlzIG5vdCBzZW50IGJlY2F1c2UsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiwgaXQgaXMKKwkJLy8gc2VudCBvbmx5IGlmIGEgcGFja2ZpbGUgaXMgc2VudC4KKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJhY2tub3dsZWRnbWVudHMiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiTkFLIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hVbnJlY29nbml6ZWRBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGludmFsaWQtYXJndW1lbnQiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkiaW52YWxpZC1hcmd1bWVudFxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2QmxvYiBiaWcgPSByZW1vdGUuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc21hbGwgPSByZW1vdGUuYmxvYigiZm9vYmEiKTsKKwkJUmV2VHJlZSB0cmVlID0gcmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoIjEiLCBiaWcpLAorCQkJCXJlbW90ZS5maWxlKCIyIiwgc21hbGwpKTsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZS5jb21taXQodHJlZSk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImZpbHRlciBibG9iOmxpbWl0PTVcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChiaWcudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChzbWFsbC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRmlsdGVyV2hlbk5vdEFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCIwIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCBmYWxzZSk7CisKKwkJdGhyb3duLmV4cGVjdChQYWNrUHJvdG9jb2xFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgidW5leHBlY3RlZCBmaWx0ZXIgYmxvYjpsaW1pdD01Iik7CisJCXVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJmaWx0ZXIgYmxvYjpsaW1pdD01XG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWplY3RBbGxSZWZGaWx0ZXIgaW1wbGVtZW50cyBSZWZGaWx0ZXIgeworCQlAT3ZlcnJpZGUKKwkJcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZmlsdGVyKE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgeworCQkJcmV0dXJuIG5ldyBIYXNoTWFwPD4oKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhCmluZGV4IGNiMDRmODMuLjMzZTI1MjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LldhbGtFbmNyeXB0aW9uVGVzdC5VdGlsLmNyeXB0b0NpcGhlckxpc3RQQkU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LldhbGtFbmNyeXB0aW9uVGVzdC5VdGlsLmNyeXB0b0NpcGhlckxpc3RUcmFuczsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuZm9sZGVyRGVsZXRlOwpAQCAtMzYwLDcgKzM2MCw3IEBACiAJCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJCSAqLwogCQlzdGF0aWMgU3RyaW5nIHRleHRSZWFkKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZyhGaWxlcy5yZWFkQWxsQnl0ZXMoZmlsZS50b1BhdGgoKSksIFVURl84KTsKKwkJCXJldHVybiBuZXcgU3RyaW5nKEZpbGVzLnJlYWRBbGxCeXRlcyhmaWxlLnRvUGF0aCgpKSwgQ0hBUlNFVCk7CiAJCX0KIAogCQkvKioKQEAgLTM3MSw3ICszNzEsNyBAQAogCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCQkgKi8KIAkJc3RhdGljIHZvaWQgdGV4dFdyaXRlKEZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkJRmlsZXMud3JpdGUoZmlsZS50b1BhdGgoKSwgdGV4dC5nZXRCeXRlcyhVVEZfOCkpOworCQkJRmlsZXMud3JpdGUoZmlsZS50b1BhdGgoKSwgdGV4dC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCX0KIAogCQlzdGF0aWMgdm9pZCB2ZXJpZnlGaWxlQ29udGVudChGaWxlIGZpbGVPbmUsIEZpbGUgZmlsZVR3bykKQEAgLTQxOSwxMiArNDE5LDkgQEAKIAkJCQlVUkxDb25uZWN0aW9uIGMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKIAkJCQljLnNldENvbm5lY3RUaW1lb3V0KDUwMCk7CiAJCQkJYy5zZXRSZWFkVGltZW91dCg1MDApOwotCQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjLmdldElucHV0U3RyZWFtKCkpKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGMuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CiAJCQkJCXJldHVybiByZWFkZXIucmVhZExpbmUoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlyZWFkZXIuY2xvc2UoKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiB8IFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewogCQkJCXJldHVybiAiQ2FuJ3QgcmVhY2ggaHR0cDovL2NoZWNraXAuYW1hem9uYXdzLmNvbSB0byIKQEAgLTY1NCw5ICs2NTEsOSBAQAogCQkJUHJvcGVydGllcyBwcm9wcyA9IFByb3BzLmRpc2NvdmVyKCk7CiAJCQlwcm9wcy5wdXQoQW1hem9uUzMuS2V5cy5QQVNTV09SRCwgSkdJVF9QQVNTKTsKIAkJCXByb3BzLnB1dChBbWF6b25TMy5LZXlzLkNSWVBUT19BTEcsIGFsZ29yaXRobSk7Ci0JCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpOwotCQkJcHJvcHMuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJCXdyaXRlci5jbG9zZSgpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpKSB7CisJCQkJcHJvcHMuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJCX0KIAkJfQogCiAJCS8qKgpAQCAtNjY4LDkgKzY2NSw5IEBACiAJCXN0YXRpYyB2b2lkIGNvbmZpZ0NyZWF0ZShQcm9wZXJ0aWVzIHNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlQcm9wZXJ0aWVzIHRhcmdldCA9IFByb3BzLmRpc2NvdmVyKCk7CiAJCQl0YXJnZXQucHV0QWxsKHNvdXJjZSk7Ci0JCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpOwotCQkJdGFyZ2V0LnN0b3JlKHdyaXRlciwgIkpHSVQgUzMgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuIik7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKKwkJCXRyeSAoUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKEpHSVRfQ09ORl9GSUxFKSkgeworCQkJCXRhcmdldC5zdG9yZSh3cml0ZXIsICJKR0lUIFMzIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiBmaWxlLiIpOworCQkJfQogCQl9CiAKIAkJLyoqCkBAIC03NDEsNyArNzM4LDcgQEAKIAkJCUFtYXpvblMzIHMzID0gbmV3IEFtYXpvblMzKHByb3BzKTsKIAkJCVN0cmluZyBmaWxlID0gSkdJVF9VU0VSICsgIi0iICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKIAkJCVN0cmluZyBwYXRoID0gSkdJVF9SRU1PVEVfRElSICsgIi8iICsgZmlsZTsKLQkJCXMzLnB1dChidWNrZXQsIHBhdGgsIGZpbGUuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCXMzLnB1dChidWNrZXQsIHBhdGgsIGZpbGUuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJczMuZGVsZXRlKGJ1Y2tldCwgcGF0aCk7CiAJCX0KIApAQCAtODM2LDEwICs4MzMsMTAgQEAKIAkJCXsKIAkJCQlieXRlW10gb3JpZ2luID0gc291cmNlVGV4dC5nZXRCeXRlcyhjaGFyc2V0KTsKIAkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdGFyZ2V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCU91dHB1dFN0cmVhbSBzb3VyY2UgPSBjcnlwdG8uZW5jcnlwdCh0YXJnZXQpOwotCQkJCXNvdXJjZS53cml0ZShvcmlnaW4pOwotCQkJCXNvdXJjZS5mbHVzaCgpOwotCQkJCXNvdXJjZS5jbG9zZSgpOworCQkJCXRyeSAoT3V0cHV0U3RyZWFtIHNvdXJjZSA9IGNyeXB0by5lbmNyeXB0KHRhcmdldCkpIHsKKwkJCQkJc291cmNlLndyaXRlKG9yaWdpbik7CisJCQkJCXNvdXJjZS5mbHVzaCgpOworCQkJCX0KIAkJCQljaXBoZXJUZXh0ID0gdGFyZ2V0LnRvQnl0ZUFycmF5KCk7CiAJCQl9CiAJCQl7CkBAIC0xMDc0LDEwICsxMDcxLDEwIEBACiAJCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOwogCQkJCWNvbmZpZy5zYXZlKCk7CiAKLQkJCQlHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKTsKLQkJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7Ci0JCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUocmVtb3RlKS5zZXRSZWZTcGVjcyhzcGVjcykuY2FsbCgpOwotCQkJCWdpdC5jbG9zZSgpOworCQkJCXRyeSAoR2l0IGdpdCA9IEdpdC5vcGVuKGRpck9uZSkpIHsKKwkJCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7CisJCQkJfQogCiAJCQkJRmlsZSBmaWxlU3RhdGljID0gbmV3IEZpbGUoZGlyT25lLCBuYW1lU3RhdGljKTsKIAkJCQlhc3NlcnRUcnVlKCJQcm92aWRlZCBieSBzZXR1cCIsIGZpbGVTdGF0aWMuZXhpc3RzKCkpOwpAQCAtMTA4OSwxMSArMTA4NiwxMSBAQAogCQkJCUZpbGUgZmlsZVN0YXRpYyA9IG5ldyBGaWxlKGRpclR3bywgbmFtZVN0YXRpYyk7CiAJCQkJYXNzZXJ0RmFsc2UoIk5vdCBQcm92aWRlZCBieSBzZXR1cCIsIGZpbGVTdGF0aWMuZXhpc3RzKCkpOwogCi0JCQkJR2l0IGdpdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkodXJpKS5zZXREaXJlY3RvcnkoZGlyVHdvKQotCQkJCQkJLmNhbGwoKTsKLQkJCQlnaXQuY2xvc2UoKTsKKwkJCQl0cnkgKEdpdCBnaXQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKHVyaSkKKwkJCQkJCS5zZXREaXJlY3RvcnkoZGlyVHdvKS5jYWxsKCkpIHsKKwkJCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgY2xvbmUiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKKwkJCQl9CiAKLQkJCQlhc3NlcnRUcnVlKCJQcm92aWRlZCBieSBjbG9uZSIsIGZpbGVTdGF0aWMuZXhpc3RzKCkpOwogCQkJfQogCiAJCQl7IC8vIFZlcmlmeSBzdGF0aWMgZmlsZSBjb250ZW50LgpAQCAtMTExMSwxMSArMTEwOCwxMSBAQAogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNyZWF0ZSIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAkJCQlhc3NlcnRUcnVlKCJOZWVkIGNvbnRlbnQgdG8gZW5jcnlwdCIsIGZpbGVEeW5hbWljLmxlbmd0aCgpID4gMCk7CiAKLQkJCQlHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKTsKLQkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obmFtZUR5bmFtaWMpLmNhbGwoKTsKLQkJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuYW1lRHluYW1pYykuY2FsbCgpOwotCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKLQkJCQlnaXQuY2xvc2UoKTsKKwkJCQl0cnkgKEdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpKSB7CisJCQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihuYW1lRHluYW1pYykuY2FsbCgpOworCQkJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuYW1lRHluYW1pYykuY2FsbCgpOworCQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7CisJCQkJfQogCiAJCQl9CiAKQEAgLTExMjQsOSArMTEyMSw5IEBACiAJCQkJRmlsZSBmaWxlRHluYW1pYyA9IG5ldyBGaWxlKGRpclR3bywgbmFtZUR5bmFtaWMpOwogCQkJCWFzc2VydEZhbHNlKCJOb3QgUHJvdmlkZWQgYnkgc2V0dXAiLCBmaWxlRHluYW1pYy5leGlzdHMoKSk7CiAKLQkJCQlHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyVHdvKTsKLQkJCQlnaXQucHVsbCgpLmNhbGwoKTsKLQkJCQlnaXQuY2xvc2UoKTsKKwkJCQl0cnkgKEdpdCBnaXQgPSBHaXQub3BlbihkaXJUd28pKSB7CisJCQkJCWdpdC5wdWxsKCkuY2FsbCgpOworCQkJCX0KIAogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IHB1bGwiLCBmaWxlRHluYW1pYy5leGlzdHMoKSk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyVGVzdC5qYXZhCmluZGV4IGY1ZTk3YzIuLjYxOTVlNjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyVGVzdC5qYXZhCkBAIC05MSw5ICs5MSw5IEBACiAJCQkJaGFzaF9zb21ldHJlZSksIGVudHJ5KG02NDQsICJmb28iLCBoYXNoX2ZvbykpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBta3RyZWUoZmluYWwgYnl0ZVtdLi4uIGRhdGEpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBta3RyZWUoYnl0ZVtdLi4uIGRhdGEpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlmb3IgKGZpbmFsIGJ5dGVbXSBlIDogZGF0YSkKKwkJZm9yIChieXRlW10gZSA6IGRhdGEpCiAJCQlvdXQud3JpdGUoZSk7CiAJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yVGVzdC5qYXZhCmluZGV4IGUzNGNiOTcuLjBlMDA5YjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yVGVzdC5qYXZhCkBAIC04MjEsNyArODIxLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKHNoYTFzdHJpbmcsIHR3LmdldE9iamVjdElkKDEpLmdldE5hbWUoKSAvKiAxPWZpbGV0cmVlIGhlcmUgKi8pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lT2YoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lT2YoQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSkgewogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIGkucGF0aCwgMCwgaS5wYXRoTGVuKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YQppbmRleCA3MTdhMmYzLi5mYzc5ZDQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKKwlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpIHsKIAkJcmV0dXJuIG5ldyBGaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sKHRoaXMsCiAJCQkJKChGaWxlRW50cnkpIGN1cnJlbnQoKSkuZ2V0RmlsZSgpLCBmcywgbW9kVGltZXMpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Qb3N0T3JkZXJUcmVlV2Fsa1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Qb3N0T3JkZXJUcmVlV2Fsa1Rlc3QuamF2YQppbmRleCA2YWQ0N2MyLi4yMzI0MjJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1Bvc3RPcmRlclRyZWVXYWxrVGVzdC5qYXZhCkBAIC02MCwxNCArNjAsMTQgQEAKIHB1YmxpYyBjbGFzcyBQb3N0T3JkZXJUcmVlV2Fsa1Rlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVfTm9Qb3N0T3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCWFzc2VydEZhbHNlKHR3LmlzUG9zdE9yZGVyVHJhdmVyc2FsKCkpOwogCQl9CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZV9Ub2dnbGVQb3N0T3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCWFzc2VydEZhbHNlKHR3LmlzUG9zdE9yZGVyVHJhdmVyc2FsKCkpOwogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKHRydWUpOwogCQkJYXNzZXJ0VHJ1ZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKQEAgLTc4LDcgKzc4LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlc2V0RG9lc05vdEFmZmVjdFBvc3RPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKHRydWUpOwogCQkJYXNzZXJ0VHJ1ZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJCXR3LnJlc2V0KCk7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKGZhbHNlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xMzIsNyArMTMyLDcgQEAKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKHRydWUpOwogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcih0cmVlKSk7CiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQliLmZpbmlzaCgpOwogCQlhc3NlcnRFcXVhbHMoNCwgdHJlZS5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwodHJ1ZSk7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKHRyZWUpKTsKIApAQCAtMTgwLDcgKzE4MCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIERpckNhY2hlRW50cnkgbWFrZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgRGlyQ2FjaGVFbnRyeSBtYWtlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjcmVhdGVFbnRyeShwYXRoLCBSRUdVTEFSX0ZJTEUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbHdheXNDbG9uZVRyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEKaW5kZXggOGUyY2NhNC4uZDljZmI2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbHdheXNDbG9uZVRyZWVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0Fsd2F5c0Nsb25lVHJlZUZpbHRlci5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXJUZXN0LmphdmEKaW5kZXggZjdhN2ZiOC4uYzYzODlmYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YQpAQCAtNTcsMTIgKzU3LDEzIEBACiBwdWJsaWMgY2xhc3MgTm90VHJlZUZpbHRlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFdyYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpOwotCQlmaW5hbCBUcmVlRmlsdGVyIGEgPSBUcmVlRmlsdGVyLkFMTDsKLQkJZmluYWwgVHJlZUZpbHRlciBuID0gTm90VHJlZUZpbHRlci5jcmVhdGUoYSk7Ci0JCWFzc2VydE5vdE51bGwobik7Ci0JCWFzc2VydFRydWUoYS5pbmNsdWRlKHR3KSk7Ci0JCWFzc2VydEZhbHNlKG4uaW5jbHVkZSh0dykpOworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQkJZmluYWwgVHJlZUZpbHRlciBhID0gVHJlZUZpbHRlci5BTEw7CisJCQlmaW5hbCBUcmVlRmlsdGVyIG4gPSBOb3RUcmVlRmlsdGVyLmNyZWF0ZShhKTsKKwkJCWFzc2VydE5vdE51bGwobik7CisJCQlhc3NlcnRUcnVlKGEuaW5jbHVkZSh0dykpOworCQkJYXNzZXJ0RmFsc2Uobi5pbmNsdWRlKHR3KSk7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXBUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cFRlc3QuamF2YQppbmRleCBkOTIxYWFiLi43MWEyZjMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cFRlc3QuamF2YQpAQCAtMjU0LDcgKzI1NCw3IEBACiAJCX0KIAl9CiAKLQlUcmVlV2FsayBmYWtlV2FsayhmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlUcmVlV2FsayBmYWtlV2FsayhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJRGlyQ2FjaGVFZGl0b3IgZGNlID0gZGMuZWRpdG9yKCk7CiAJCWRjZS5hZGQobmV3IERpckNhY2hlRWRpdG9yLlBhdGhFZGl0KHBhdGgpIHsKQEAgLTI3NCw3ICsyNzQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCVRyZWVXYWxrIGZha2VXYWxrQXRTdWJ0cmVlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCVRyZWVXYWxrIGZha2VXYWxrQXRTdWJ0cmVlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlEaXJDYWNoZUVkaXRvciBkY2UgPSBkYy5lZGl0b3IoKTsKIAkJZGNlLmFkZChuZXcgRGlyQ2FjaGVFZGl0b3IuUGF0aEVkaXQocGF0aCArICIvUkVBRE1FIikgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyVGVzdC5qYXZhCmluZGV4IDM4YWRkYTMuLjE0OGQ1YWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXJUZXN0LmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdQYXRocyhTdHJpbmcgc3VmZml4RmlsdGVyLAogCQkJZmluYWwgT2JqZWN0SWQgdHJlZUlkLCBib29sZWFuIHJlY3Vyc2l2ZVdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRGaWx0ZXIoUGF0aFN1ZmZpeEZpbHRlci5jcmVhdGUoc3VmZml4RmlsdGVyKSk7CiAJCQl0dy5zZXRSZWN1cnNpdmUocmVjdXJzaXZlV2Fsayk7CiAJCQl0dy5hZGRUcmVlKHRyZWVJZCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEKaW5kZXggYzM0MjNiNi4uODY4NmM0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlclRlc3QuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogcHVibGljIGNsYXNzIFRyZWVGaWx0ZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBTExfSW5jbHVkZXNBbnl0aGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7CiAJCQlhc3NlcnRUcnVlKFRyZWVGaWx0ZXIuQUxMLmluY2x1ZGUodHcpKTsKIAkJfQpAQCAtNzMsNyArNzMsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Tm90QUxMX0luY2x1ZGVzTm90aGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7CiAJCQlhc3NlcnRGYWxzZShUcmVlRmlsdGVyLkFMTC5uZWdhdGUoKS5pbmNsdWRlKHR3KSk7CiAJCX0KQEAgLTgxLDcgKzgxLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEFOWV9ESUZGX0luY2x1ZGVzU2luZ2xlVHJlZUNhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwogCQkJYXNzZXJ0VHJ1ZShUcmVlRmlsdGVyLkFOWV9ESUZGLmluY2x1ZGUodHcpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2hhbmdlSWRVdGlsVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2hhbmdlSWRVdGlsVGVzdC5qYXZhCmluZGV4IDZmZWQyMzMuLjgxNDY3YzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DaGFuZ2VJZFV0aWxUZXN0LmphdmEKQEAgLTY4MCwxNSArNjgwLDE1IEBACiAJCQkJIlxuIikpOwogCX0KIAotCXByaXZhdGUgdm9pZCBob29rRG9lc05vdE1vZGlmeShmaW5hbCBTdHJpbmcgaW4pIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBob29rRG9lc05vdE1vZGlmeShTdHJpbmcgaW4pIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoaW4sIGNhbGwoaW4pKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBjYWxsKGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFN0cmluZyBjYWxsKFN0cmluZyBib2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNhbGwoYm9keSwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGNhbGwoZmluYWwgU3RyaW5nIGJvZHksIGJvb2xlYW4gcmVwbGFjZUV4aXN0aW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFN0cmluZyBjYWxsKFN0cmluZyBib2R5LCBib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdElkIGNvbXB1dGVDaGFuZ2VJZCA9IENoYW5nZUlkVXRpbC5jb21wdXRlQ2hhbmdlSWQodHJlZUlkMSwKIAkJCQlwYXJlbnRJZDEsIGF1dGhvciwgY29tbWl0dGVyLCBib2R5KTsKIAkJaWYgKGNvbXB1dGVDaGFuZ2VJZCA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEKaW5kZXggYTY4MGVmOS4uZTM0YzNjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhCkBAIC0yNDEsNyArMjQxLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcml2YXRlIEZpbGUgd3JpdGVIb29rRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpICsgIi8uZ2l0L2hvb2tzLyIsIG5hbWUpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUocGF0aCwgZGF0YSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9OQlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCmluZGV4IGQyZDQ0ZmYuLjgzMGYyMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJYXNzZXJ0T3V0cHV0KGIoMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiksIG91dCwgMyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlT3V0cHV0KGZpbmFsIGJ5dGVbXSBidWYpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXBhcmVPdXRwdXQoYnl0ZVtdIGJ1ZikgewogCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykKIAkJCWJ1ZltpXSA9IChieXRlKSAoMHg3NyArIGkpOwogCX0KQEAgLTM1MywxMSArMzUzLDExIEBACiAJCQlhc3NlcnRFcXVhbHMoKGJ5dGUpICgweDc3ICsgaSksIGJ1ZltpXSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGIoZmluYWwgaW50IGEsIGZpbmFsIGludCBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGIoaW50IGEsIGludCBiKSB7CiAJCXJldHVybiBuZXcgYnl0ZVtdIHsgKGJ5dGUpIGEsIChieXRlKSBiIH07CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHBhZGIoZmluYWwgaW50IGxlbiwgZmluYWwgaW50IGEsIGZpbmFsIGludCBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHBhZGIoaW50IGxlbiwgaW50IGEsIGludCBiKSB7CiAJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbbGVuICsgMl07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCQlyW2ldID0gKGJ5dGUpIDB4YWY7CkBAIC0zNzAsNyArMzcwLDcgQEAKIAkJcmV0dXJuIG5ldyBieXRlW10geyAoYnl0ZSkgYSwgKGJ5dGUpIGIsIChieXRlKSBjIH07CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGIoZmluYWwgaW50IGEsIGZpbmFsIGludCBiLCBmaW5hbCBpbnQgYywgZmluYWwgaW50IGQpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYihpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgewogCQlyZXR1cm4gbmV3IGJ5dGVbXSB7IChieXRlKSBhLCAoYnl0ZSkgYiwgKGJ5dGUpIGMsIChieXRlKSBkIH07CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVTdHlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdC5qYXZhCmluZGV4IDY1MDc4NzYuLjQ5YWQ1NWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdC5qYXZhCkBAIC01MiwxNCArNTIsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFF1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShmaW5hbCBTdHJpbmcgaW4sIGZpbmFsIFN0cmluZyBleHApIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKFN0cmluZyBpbiwgU3RyaW5nIGV4cCkgewogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORS5xdW90ZShpbik7CiAJCWFzc2VydE5vdFNhbWUoaW4sIHIpOwogCQlhc3NlcnRGYWxzZShpbi5lcXVhbHMocikpOwogCQlhc3NlcnRFcXVhbHMoJ1wnJyArIGV4cCArICdcJycsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoU3RyaW5nIGV4cCwgU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZSgnXCcnICsgaW4gKyAnXCcnKTsKIAkJZmluYWwgU3RyaW5nIHIgPSBCT1VSTkUuZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJCWFzc2VydEVxdWFscyhleHAsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0LmphdmEKaW5kZXggNzQ2MzUyOC4uMTdmMWI3NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhCkBAIC01MiwxNCArNTIsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFF1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKGZpbmFsIFN0cmluZyBpbiwgZmluYWwgU3RyaW5nIGV4cCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoU3RyaW5nIGluLCBTdHJpbmcgZXhwKSB7CiAJCWZpbmFsIFN0cmluZyByID0gQk9VUk5FX1VTRVJfUEFUSC5xdW90ZShpbik7CiAJCWFzc2VydE5vdFNhbWUoaW4sIHIpOwogCQlhc3NlcnRGYWxzZShpbi5lcXVhbHMocikpOwogCQlhc3NlcnRFcXVhbHMoJ1wnJyArIGV4cCArICdcJycsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoU3RyaW5nIGV4cCwgU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZSgnXCcnICsgaW4gKyAnXCcnKTsKIAkJZmluYWwgU3RyaW5nIHIgPSBCT1VSTkVfVVNFUl9QQVRILmRlcXVvdGUoYiwgMCwgYi5sZW5ndGgpOwogCQlhc3NlcnRFcXVhbHMoZXhwLCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QuamF2YQppbmRleCBhNmYzMzQ1Li45YTBjOTZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhCkBAIC01NCwxNCArNTQsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFF1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QgewotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoZmluYWwgU3RyaW5nIGV4cCwgZmluYWwgU3RyaW5nIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgU3RyaW5nIHIgPSBHSVRfUEFUSC5xdW90ZShpbik7CiAJCWFzc2VydE5vdFNhbWUoaW4sIHIpOwogCQlhc3NlcnRGYWxzZShpbi5lcXVhbHMocikpOwogCQlhc3NlcnRFcXVhbHMoJyInICsgZXhwICsgJyInLCByKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoZmluYWwgU3RyaW5nIGV4cCwgZmluYWwgU3RyaW5nIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKFN0cmluZyBleHAsIFN0cmluZyBpbikgewogCQlmaW5hbCBieXRlW10gYiA9ICgnIicgKyBpbiArICciJykuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSk7CiAJCWZpbmFsIFN0cmluZyByID0gR0lUX1BBVEguZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJCWFzc2VydEVxdWFscyhleHAsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19IZXhQYXJzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfSGV4UGFyc2VUZXN0LmphdmEKaW5kZXggZjViNTZlNy4uZjNjMDQ2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19IZXhQYXJzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAJCWFzc2VydE5vdEhleCgnLicpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Tm90SGV4KGZpbmFsIGNoYXIgYykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Tm90SGV4KGNoYXIgYykgewogCQl0cnkgewogCQkJUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDQoKGJ5dGUpIGMpOwogCQkJZmFpbCgiSW5jb3JyZWN0bHkgYWNjY2VwdGVkICIgKyBjKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QuamF2YQppbmRleCAwMjQzNzk4Li43NjMwYzExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhCkBAIC00NywxOCArNDcsMjUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQmluYXJ5QmxvYkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBSYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0IHsKKwlAUnVsZQorCXB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiBleGNlcHRpb24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKwogCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgeworCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBJbnRMaXN0IG1hcCA9IFJhd1BhcnNlVXRpbHMubGluZU1hcChuZXcgYnl0ZVtdIHt9LCAwLCAwKTsKIAkJYXNzZXJ0Tm90TnVsbChtYXApOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgaW50W117SW50ZWdlci5NSU5fVkFMVUUsIDB9LCBhc0ludHMobWFwKSk7CiAJfQogCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0T25lQmxhbmtMaW5lKCkgeworCXB1YmxpYyB2b2lkIHRlc3RPbmVCbGFua0xpbmUoKSB0aHJvd3MgRXhjZXB0aW9uICB7CiAJCWZpbmFsIEludExpc3QgbWFwID0gUmF3UGFyc2VVdGlscy5saW5lTWFwKG5ldyBieXRlW10geyAnXG4nIH0sIDAsIDEpOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgaW50W117SW50ZWdlci5NSU5fVkFMVUUsIDAsIDF9LCBhc0ludHMobWFwKSk7CiAJfQpAQCAtODUsNiArOTIsMTMgQEAKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RMaW5lTWFwT3JCaW5hcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZmluYWwgYnl0ZVtdIGJ1ZiA9ICJ4eHhmb29cbmJcMGFyIi5nZXRCeXRlcyhJU09fODg1OV8xKTsKKwkJZXhjZXB0aW9uLmV4cGVjdChCaW5hcnlCbG9iRXhjZXB0aW9uLmNsYXNzKTsKKwkJUmF3UGFyc2VVdGlscy5saW5lTWFwT3JCaW5hcnkoYnVmLCAzLCBidWYubGVuZ3RoKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGb3VyTGluZUJsYW5rcygpIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9ICJmb29cblxuXG5iYXJcbiIuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSk7CiAJCWZpbmFsIEludExpc3QgbWFwID0gUmF3UGFyc2VVdGlscy5saW5lTWFwKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVyblRlc3QuamF2YQppbmRleCBlODU2NmQyLi5hNzQ4YjUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIApAQCAtOTMsNyArOTMsNyBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSByYXcoU3RyaW5nIHRleHQpIHsKLQkJYnl0ZVtdIGJ5dGVzID0gdGV4dC5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBieXRlcyA9IHRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCXJldHVybiBuZXcgUmF3Q2hhclNlcXVlbmNlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZkxpc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZMaXN0VGVzdC5qYXZhCmluZGV4IDVhMTQ2OGEuLmQxMjRkNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZkxpc3RUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YQpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJCXJldHVybiBiLnRvUmVmTGlzdCgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFJlZiBuZXdSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoUmVmLlN0b3JhZ2UuTE9PU0UsIG5hbWUsIElEKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXJUZXN0LmphdmEKaW5kZXggZDk3ODgwNC4uZWRjY2UxMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlclRlc3QuamF2YQpAQCAtNjEsNiArNjEsNyBAQAogcHVibGljIGNsYXNzIFRlbXBvcmFyeUJ1ZmZlclRlc3QgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJdHJ5IHsKIAkJCWIuY2xvc2UoKTsKQEAgLTc1LDYgKzc2LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlIHRlc3QgPSAoYnl0ZSkgbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKS5uZXh0SW50KCk7CiAJCXRyeSB7CkBAIC04NywxMCArODksOCBAQAogCQkJCWFzc2VydEVxdWFscygxLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QsIHJbMF0pOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKDEsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdCwgclswXSk7CkBAIC0xMDIsNiArMTAyLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkJsb2NrLlNaKTsKQEAgLTExOCwxMCArMTE5LDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMTMzLDYgKzEzMiw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfQnVsa1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1ogKiAzIC8gMik7CkBAIC0xNDksMTAgKzE0OSw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTE2NCw2ICsxNjIsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1ogKiAzIC8gMik7CkBAIC0xNzgsMTAgKzE3Nyw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTE5Myw2ICsxOTAsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0NvcHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5CbG9jay5TWiAqIDMgLyAyKTsKQEAgLTIwOCwxMCArMjA2LDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMjIzLDYgKzIxOSw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RMYXJnZV9TaW5nbGVXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkRFRkFVTFRfSU5fQ09SRV9MSU1JVCAqIDMpOwpAQCAtMjM2LDEwICsyMzMsOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0yNTMsMTggKzI0OCwxOCBAQAogCXB1YmxpYyB2b2lkIHRlc3RJbkNvcmVJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBjbnQgPSAyNTY7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKS5uZXh0Qnl0ZXMoY250KTsKLQkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChjbnQgKyA0KTsKLQkJYi53cml0ZSh0ZXN0KTsKLQkJYi5jbG9zZSgpOwotCi0JCUlucHV0U3RyZWFtIGluID0gYi5vcGVuSW5wdXRTdHJlYW0oKTsKLQkJYnl0ZVtdIGFjdCA9IG5ldyBieXRlW2NudF07Ci0JCUlPLnJlYWRGdWxseShpbiwgYWN0LCAwLCBjbnQpOwotCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCBhY3QpOworCQl0cnkgKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoY250ICsgNCkpIHsKKwkJCWIud3JpdGUodGVzdCk7CisJCQlJbnB1dFN0cmVhbSBpbiA9IGIub3BlbklucHV0U3RyZWFtKCk7CisJCQlieXRlW10gYWN0ID0gbmV3IGJ5dGVbY250XTsKKwkJCUlPLnJlYWRGdWxseShpbiwgYWN0LCAwLCBjbnQpOworCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgYWN0KTsKKwkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaE9uQXBwZW5kQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkRFRkFVTFRfSU5fQ09SRV9MSU1JVCArIDEpOwpAQCAtMjc5LDEwICsyNzQsOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0yOTQsNiArMjg3LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAzKTsKQEAgLTMwOCwxMCArMzAyLDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMzIzLDYgKzMxNSw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hPbkNvcHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAyKTsKQEAgLTM0MCwxMCArMzMzLDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMzU1LDcgKzM0Niw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZXN0cm95V2hpbGVPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCXRyeSB7CiAJCQliLndyaXRlKG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKQEAgLTM2Nyw2ICszNTgsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmFuZG9tV3JpdGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgVGVzdFJuZyBybmcgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpOwogCQlmaW5hbCBpbnQgbWF4ID0gVGVtcG9yYXJ5QnVmZmVyLkRFRkFVTFRfSU5fQ09SRV9MSU1JVCAqIDI7CkBAIC0zOTksMTAgKzM5MSw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyhleHBlY3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyhleHBlY3QsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCBhNzJkMzNjLi4wNjU1ODI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtOTYsMzIgKzk2LDMxIEBACiAJCWZvciAoaW50IGkgPSAtNDsgaSA8IDU7ICsraSkgewogCQkJaW50IHNpemUgPSBNYXRoLmFicyhpKTsKIAkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluYnl0ZXMpOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQXV0b0NSTEZPdXRwdXRTdHJlYW0oYm9zKTsKLQkJCWlmIChpID4gMCkgewotCQkJCWludCBuOwotCQkJCXdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPj0gMCkgewotCQkJCQlvdXQud3JpdGUoYnVmLCAwLCBuKTsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5ieXRlcyk7CisJCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQXV0b0NSTEZPdXRwdXRTdHJlYW0oYm9zKSkgeworCQkJCWlmIChpID4gMCkgeworCQkJCQlpbnQgbjsKKwkJCQkJd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+PSAwKSB7CisJCQkJCQlvdXQud3JpdGUoYnVmLCAwLCBuKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoaSA8IDApIHsKKwkJCQkJaW50IG47CisJCQkJCXdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtuXTsKKwkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBiLCAwLCBuKTsKKwkJCQkJCW91dC53cml0ZShiKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWludCBjOworCQkJCQl3aGlsZSAoKGMgPSBpbi5yZWFkKCkpICE9IC0xKQorCQkJCQkJb3V0LndyaXRlKGMpOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoaSA8IDApIHsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKLQkJCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtuXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShidWYsIDAsIGIsIDAsIG4pOwotCQkJCQlvdXQud3JpdGUoYik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbnQgYzsKLQkJCQl3aGlsZSAoKGMgPSBpbi5yZWFkKCkpICE9IC0xKQotCQkJCQlvdXQud3JpdGUoYyk7CisJCQkJb3V0LmZsdXNoKCk7CisJCQkJYnl0ZVtdIGFjdHVhbEJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7CisJCQkJQXNzZXJ0LmFzc2VydEVxdWFscygiYnVmc2l6ZT0iICsgc2l6ZSwgZW5jb2RlKGV4cGVjdEJ5dGVzKSwKKwkJCQkJCWVuY29kZShhY3R1YWxCeXRlcykpOwogCQkJfQotCQkJb3V0LmZsdXNoKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCQlieXRlW10gYWN0dWFsQnl0ZXMgPSBib3MudG9CeXRlQXJyYXkoKTsKLQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoImJ1ZnNpemU9IiArIHNpemUsIGVuY29kZShleHBlY3RCeXRlcyksCi0JCQkJCWVuY29kZShhY3R1YWxCeXRlcykpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDM4MTk5ZDguLjUwNTgxNjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTk3LDM4ICs5Nyw0MSBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0KGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIGV4cGVjdGVkLAogCQkJYm9vbGVhbiBkZXRlY3RCaW5hcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGJpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBjaXMxID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczEsIGRldGVjdEJpbmFyeSk7Ci0JCWludCBpbmRleDEgPSAwOwotCQlmb3IgKGludCBiID0gY2lzMS5yZWFkKCk7IGIgIT0gLTE7IGIgPSBjaXMxLnJlYWQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2luZGV4MV0sIChieXRlKSBiKTsKLQkJCWluZGV4MSsrOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgaW5kZXgxKTsKLQotCQlmb3IgKGludCBidWZmZXJTaXplID0gMTsgYnVmZmVyU2l6ZSA8IDEwOyBidWZmZXJTaXplKyspIHsKLQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOwotCQkJZmluYWwgSW5wdXRTdHJlYW0gY2lzMiA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMyLCBkZXRlY3RCaW5hcnkpOwotCi0JCQlpbnQgcmVhZCA9IDA7Ci0JCQlmb3IgKGludCByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7IHJlYWROb3cgIT0gLTEKLQkJCQkJJiYgcmVhZCA8IGV4cGVjdGVkLmxlbmd0aDsgcmVhZE5vdyA9IGNpczIucmVhZChidWZmZXIsIDAsCi0JCQkJCWJ1ZmZlci5sZW5ndGgpKSB7Ci0JCQkJZm9yIChpbnQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVhZE5vdzsgaW5kZXgyKyspIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW3JlYWQgKyBpbmRleDJdLCBidWZmZXJbaW5kZXgyXSk7Ci0JCQkJfQotCQkJCXJlYWQgKz0gcmVhZE5vdzsKKwkJdHJ5IChJbnB1dFN0cmVhbSBiaXMxID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKKwkJCQlJbnB1dFN0cmVhbSBjaXMxID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczEsIGRldGVjdEJpbmFyeSkpIHsKKwkJCWludCBpbmRleDEgPSAwOworCQkJZm9yIChpbnQgYiA9IGNpczEucmVhZCgpOyBiICE9IC0xOyBiID0gY2lzMS5yZWFkKCkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbaW5kZXgxXSwgKGJ5dGUpIGIpOworCQkJCWluZGV4MSsrOwogCQkJfQogCi0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkKTsKLQkJCWNpczIuY2xvc2UoKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGluZGV4MSk7CisKKwkJCWZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDwgMTA7IGJ1ZmZlclNpemUrKykgeworCQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKKwkJCQl0cnkgKElucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOworCQkJCQkJSW5wdXRTdHJlYW0gY2lzMiA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMyLAorCQkJCQkJCQlkZXRlY3RCaW5hcnkpKSB7CisKKwkJCQkJaW50IHJlYWQgPSAwOworCQkJCQlmb3IgKGludCByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwKKwkJCQkJCQlidWZmZXIubGVuZ3RoKTsgcmVhZE5vdyAhPSAtMQorCQkJCQkJCQkJJiYgcmVhZCA8IGV4cGVjdGVkLmxlbmd0aDsgcmVhZE5vdyA9IGNpczIKKwkJCQkJCQkJCQkJLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgeworCQkJCQkJZm9yIChpbnQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVhZE5vdzsgaW5kZXgyKyspIHsKKwkJCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbcmVhZCArIGluZGV4Ml0sCisJCQkJCQkJCQlidWZmZXJbaW5kZXgyXSk7CisJCQkJCQl9CisJCQkJCQlyZWFkICs9IHJlYWROb3c7CisJCQkJCX0KKworCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkKTsKKwkJCQl9CisJCQl9CiAJCX0KLQkJY2lzMS5jbG9zZSgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBhc0J5dGVzKFN0cmluZyBpbikgewotCQlyZXR1cm4gaW4uZ2V0Qnl0ZXMoVVRGXzgpOworCQlyZXR1cm4gaW4uZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNmI1ZWY3ZS4uYjgyNGZhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC01OCwxMyArNTgsMTMgQEAKIHB1YmxpYyBjbGFzcyBVbmlvbklucHV0U3RyZWFtVGVzdCB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpOwotCQlhc3NlcnRUcnVlKHUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKG5ldyBieXRlWzFdLCAwLCAxKSk7Ci0JCWFzc2VydEVxdWFscygwLCB1LmF2YWlsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHUuc2tpcCgxKSk7Ci0JCXUuY2xvc2UoKTsKKwkJdHJ5IChVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpKSB7CisJCQlhc3NlcnRUcnVlKHUuaXNFbXB0eSgpKTsKKwkJCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKCkpOworCQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQobmV3IGJ5dGVbMV0sIDAsIDEpKTsKKwkJCWFzc2VydEVxdWFscygwLCB1LmF2YWlsYWJsZSgpKTsKKwkJCWFzc2VydEVxdWFscygwLCB1LnNraXAoMSkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIxMSwyNSArMjExLDI0IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDbG9zZUR1cmluZ0Nsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKTsKIAkJZmluYWwgYm9vbGVhbiBjbG9zZWRbXSA9IG5ldyBib29sZWFuWzJdOwotCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDEgfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJCQljbG9zZWRbMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAyIH0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJY2xvc2VkWzFdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7CisJCXRyeSAoVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKSkgeworCQkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJCQkJY2xvc2VkWzBdID0gdHJ1ZTsKKwkJCQl9CisJCQl9KTsKKwkJCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMiB9KSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQkJCWNsb3NlZFsxXSA9IHRydWU7CisJCQkJfQorCQkJfSk7CiAKLQkJYXNzZXJ0RmFsc2UoY2xvc2VkWzBdKTsKLQkJYXNzZXJ0RmFsc2UoY2xvc2VkWzFdKTsKLQotCQl1LmNsb3NlKCk7CisJCQlhc3NlcnRGYWxzZShjbG9zZWRbMF0pOworCQkJYXNzZXJ0RmFsc2UoY2xvc2VkWzFdKTsKKwkJfQogCiAJCWFzc2VydFRydWUoY2xvc2VkWzBdKTsKIAkJYXNzZXJ0VHJ1ZShjbG9zZWRbMV0pOwpAQCAtMjM3LDYgKzIzNiw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25EdXJpbmdDbG9zZSgpIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCWZpbmFsIFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCk7CiAJCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMSB9KSB7CiAJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMVRlc3QuamF2YQppbmRleCBlNjA0NWE5Li4zYzYxMmUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTFUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwpAQCAtOTUsMTUgKzk1LDE1IEBACiAJCQkJLmZyb21TdHJpbmcoImE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQiKTsKIAogCQlNZXNzYWdlRGlnZXN0IG0gPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMSIpOwotCQltLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhVVEZfOCkpOworCQltLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIG0xID0gT2JqZWN0SWQuZnJvbVJhdyhtLmRpZ2VzdCgpKTsKIAogCQlTSEExIHMgPSBTSEExLm5ld0luc3RhbmNlKCk7Ci0JCXMudXBkYXRlKFRFU1QxLmdldEJ5dGVzKFVURl84KSk7CisJCXMudXBkYXRlKFRFU1QxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgczEgPSBPYmplY3RJZC5mcm9tUmF3KHMuZGlnZXN0KCkpOwogCiAJCXMucmVzZXQoKTsKLQkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBzMiA9IHMudG9PYmplY3RJZCgpOwogCiAJCWFzc2VydEVxdWFscyhtMSwgczEpOwpAQCAtMTE3LDE1ICsxMTcsMTUgQEAKIAkJCQkuZnJvbVN0cmluZygiODQ5ODNlNDQxYzNiZDI2ZWJhYWU0YWExZjk1MTI5ZTVlNTQ2NzBmMSIpOwogCiAJCU1lc3NhZ2VEaWdlc3QgbSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0xIik7Ci0JCW0udXBkYXRlKFRFU1QyLmdldEJ5dGVzKFVURl84KSk7CisJCW0udXBkYXRlKFRFU1QyLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgbTEgPSBPYmplY3RJZC5mcm9tUmF3KG0uZGlnZXN0KCkpOwogCiAJCVNIQTEgcyA9IFNIQTEubmV3SW5zdGFuY2UoKTsKLQkJcy51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcy51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBzMSA9IE9iamVjdElkLmZyb21SYXcocy5kaWdlc3QoKSk7CiAKIAkJcy5yZXNldCgpOwotCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMyID0gcy50b09iamVjdElkKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKG0xLCBzMSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAwMWJlMjQ2Li43NjY3YWY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTQsMTQgKzQsMTQgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC51aQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC51aQotQnVuZGxlLVZlcnNpb246IDQuMTEuMy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNC4xMS4zIgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuMyw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS4zLDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjMsNC4xMi4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249IjUuMC40IgorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKaW5kZXggMThjMWQ5MC4uN2QxMGMwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbApAQCAtNTIsNyArNTIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnVpPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9BV1RQbG90UmVuZGVyZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQVdUUGxvdFJlbmRlcmVyLmphdmEKaW5kZXggYmNjZjBjMC4uYjFmZmZkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9BV1RQbG90UmVuZGVyZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhCkBAIC02NiwxMSArNjYsMTEgQEAKIAogCXRyYW5zaWVudCBHcmFwaGljczJEIGc7CiAKLQlBV1RQbG90UmVuZGVyZXIoZmluYWwgR3JhcGhDZWxsUmVuZGVyIGMpIHsKKwlBV1RQbG90UmVuZGVyZXIoR3JhcGhDZWxsUmVuZGVyIGMpIHsKIAkJY2VsbCA9IGM7CiAJfQogCi0Jdm9pZCBwYWludChmaW5hbCBHcmFwaGljcyBpbiwgZmluYWwgUGxvdENvbW1pdDxTd2luZ0xhbmU+IGNvbW1pdCkgeworCXZvaWQgcGFpbnQoR3JhcGhpY3MgaW4sIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjb21taXQpIHsKIAkJZyA9IChHcmFwaGljczJEKSBpbi5jcmVhdGUoKTsKIAkJdHJ5IHsKIAkJCWZpbmFsIGludCBoID0gY2VsbC5nZXRIZWlnaHQoKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VGV4dChmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHkpIHsKKwlwcm90ZWN0ZWQgdm9pZCBkcmF3VGV4dChTdHJpbmcgbXNnLCBpbnQgeCwgaW50IHkpIHsKIAkJZmluYWwgaW50IHRleHRoID0gZy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwogCQlmaW5hbCBpbnQgeTAgPSAoeSAtIHRleHRoKSAvIDIgKyAoY2VsbC5nZXRIZWlnaHQoKSAtIHRleHRoKSAvIDI7CiAJCWcuc2V0Q29sb3IoY2VsbC5nZXRGb3JlZ3JvdW5kKCkpOwpAQCAtMTM0LDExICsxMzQsMTEgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbG9yIGxhbmVDb2xvcihmaW5hbCBTd2luZ0xhbmUgbXlMYW5lKSB7CisJcHJvdGVjdGVkIENvbG9yIGxhbmVDb2xvcihTd2luZ0xhbmUgbXlMYW5lKSB7CiAJCXJldHVybiBteUxhbmUgIT0gbnVsbCA/IG15TGFuZS5jb2xvciA6IENvbG9yLmJsYWNrOwogCX0KIAotCXZvaWQgcGFpbnRUcmlhbmdsZURvd24oZmluYWwgaW50IGN4LCBmaW5hbCBpbnQgeSwgZmluYWwgaW50IGgpIHsKKwl2b2lkIHBhaW50VHJpYW5nbGVEb3duKGludCBjeCwgaW50IHksIGludCBoKSB7CiAJCWZpbmFsIGludCB0aXBYID0gY3g7CiAJCWZpbmFsIGludCB0aXBZID0geSArIGg7CiAJCWZpbmFsIGludCBiYXNlWDEgPSBjeCAtIDEwIC8gMjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQ29tbWl0R3JhcGhQYW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhCmluZGV4IGQxMjJhNzcuLjk0M2EzMjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQ29tbWl0R3JhcGhQYW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Db21taXRHcmFwaFBhbmUuamF2YQpAQCAtMTE0LDcgKzExNCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKGZpbmFsIFRhYmxlTW9kZWwgZGF0YU1vZGVsKSB7CisJcHVibGljIHZvaWQgc2V0TW9kZWwoVGFibGVNb2RlbCBkYXRhTW9kZWwpIHsKIAkJaWYgKGRhdGFNb2RlbCAhPSBudWxsICYmICEoZGF0YU1vZGVsIGluc3RhbmNlb2YgQ29tbWl0VGFibGVNb2RlbCkpCiAJCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFVJVGV4dC5nZXQoKS5tdXN0QmVTcGVjaWFsVGFibGVNb2RlbCk7CiAJCXN1cGVyLnNldE1vZGVsKGRhdGFNb2RlbCk7CkBAIC0xNjEsNyArMTYxLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoZmluYWwgaW50IHJvd0luZGV4LCBmaW5hbCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7CiAJCQlmaW5hbCBQbG90Q29tbWl0PFN3aW5nTGFuZT4gYyA9IGFsbENvbW1pdHMuZ2V0KHJvd0luZGV4KTsKIAkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKIAkJCWNhc2UgMDoKQEAgLTE3NSw3ICsxNzUsNyBAQAogCQkJfQogCQl9CiAKLQkJUGVyc29uSWRlbnQgYXV0aG9yRm9yKGZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjKSB7CisJCVBlcnNvbklkZW50IGF1dGhvckZvcihQbG90Q29tbWl0PFN3aW5nTGFuZT4gYykgewogCQkJaWYgKGMgIT0gbGFzdENvbW1pdCkgewogCQkJCWxhc3RDb21taXQgPSBjOwogCQkJCWxhc3RBdXRob3IgPSBjLmdldEF1dGhvcklkZW50KCk7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChmaW5hbCBHcmFwaGljcyBpbnB1dEdyYXBoaWNzKSB7CisJCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGlucHV0R3JhcGhpY3MpIHsKIAkJCWlmIChpbnB1dEdyYXBoaWNzID09IG51bGwpCiAJCQkJcmV0dXJuOwogCQkJcmVuZGVyZXIucGFpbnQoaW5wdXRHcmFwaGljcywgY29tbWl0KTsKQEAgLTI1OSw3ICsyNTksNyBAQAogCQkJc3Ryb2tlQ2FjaGVbaV0gPSBuZXcgQmFzaWNTdHJva2UoaSk7CiAJfQogCi0Jc3RhdGljIFN0cm9rZSBzdHJva2UoZmluYWwgaW50IHdpZHRoKSB7CisJc3RhdGljIFN0cm9rZSBzdHJva2UoaW50IHdpZHRoKSB7CiAJCWlmICh3aWR0aCA8IHN0cm9rZUNhY2hlLmxlbmd0aCkKIAkJCXJldHVybiBzdHJva2VDYWNoZVt3aWR0aF07CiAJCXJldHVybiBuZXcgQmFzaWNTdHJva2Uod2lkdGgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvU3dpbmdDb21taXRMaXN0LmphdmEKaW5kZXggNzQzZWI3OC4uMTA1MTljYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL1N3aW5nQ29tbWl0TGlzdC5qYXZhCkBAIC03OSw3ICs3OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlY3ljbGVMYW5lKGZpbmFsIFN3aW5nTGFuZSBsYW5lKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVjeWNsZUxhbmUoU3dpbmdMYW5lIGxhbmUpIHsKIAkJY29sb3JzLmFkZChsYW5lLmNvbG9yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwppbmRleCBlNmUzMzA5Li5lN2VhMjIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0zLDE3ICszLDE0IEBACiAgICAgPHJlc291cmNlIHBhdGg9Ik1FVEEtSU5GL01BTklGRVNULk1GIj4KICAgICAgICAgPGZpbHRlciBpZD0iOTI0ODQ0MDM5Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMS4yIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEuMCIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAuMyIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAuMCIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMiPgotICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KKyAgICAgICAgPGZpbHRlciBpZD0iOTI0ODQ0MDM5Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTE9DS19TVUZGSVgiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wLjQiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wLjAiLz4KICAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgIDwvZmlsdGVyPgogICAgIDwvcmVzb3VyY2U+CkBAIC0yMSw3ICsxOCw3IEBACiAgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDE4OTkyNjYiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjciLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAiLz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlTmV3RmlsZUF0b21pYyhGaWxlKSIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CkBAIC0zMCw3ICsyNyw3IEBACiAgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDE4OTkyNjYiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjciLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAiLz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9ja1Rva2VuIi8+CiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDhhMjZkNDEuLmE4MTE0ZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMiArMywxMiBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS4zLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjQuMTEuMyIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iNC4xMS4zIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKQEAgLTIyLDUyICsyMiw1MiBAQAogICAgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI0LjExLjMiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycyIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249IjQuMTEuMyIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249IjQuMTEuMyI7Cisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucGF0Y2gsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249IjQuMTEuMyI7Cisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iNC4xMS4zIjt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSI0LjExLjMiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAorIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuYXBpLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcueG1sLnNheC5oZWxwZXJzLAogICAgb3JnLnhtbC5zYXgiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjMiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSI0LjExLjMiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNC4xMS4zIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZS5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjMiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjMiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249IjQuMTEuMyI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmtldGNoO3ZlcnNpb249IjQuMTEuMyI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNC4xMS4zIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNS4wLjQiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjUuMC40IjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cCwKQEAgLTc1LDEyICs3NSwxMiBAQAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSwKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSI0LjExLjMiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI0LjExLjMiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iNC4xMS4zIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSI0LjExLjMiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCkBAIC05MCwzMyArOTAsMzMgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjMiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSI0LjExLjMiOworIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSI0LjExLjMiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iNC4xMS4zIjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249IjQuMTEuMyI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249IjQuMTEuMyI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249IjQuMTEuMyI7Cisgb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249IjQuMTEuMyI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayxvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249IjQuMTEuMyI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNC4xMS4zIjt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249IjQuMTEuMyI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjQuMTEuMyI7Cisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayxvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2ssCkBAIC0xMjgsMjQgKzEyOCwyNCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLAogICAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2siLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNC4xMS4zIjt1c2VzOj0iamF2YXgubmV0LnNzbCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iNC4xMS4zIjt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iNC4xMS4zIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0iamF2YXgubmV0LnNzbCIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iNC4xMS4zIjt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249IjQuMTEuMyI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUsCiAgICBvcmcuaWV0Zi5qZ3NzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iNC4xMS4zIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSI0LjExLjMiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249IjQuMTEuMyIKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSI1LjAuNCIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogY29tLmdvb2dsZWNvZGUuamF2YWV3YWg7dmVyc2lvbj0iWzEuMS42LDIuMC4wKSIsCiAgY29tLmpjcmFmdC5qc2NoO3ZlcnNpb249IlswLjEuMzcsMC4yLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggYzA3YzkyYi4uYjJkNjk0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjMucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdDt2ZXJzaW9uPSI0LjExLjMucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0O3ZlcnNpb249IjUuMC40LnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKaW5kZXggMWY0YWM0MS4uMmI1NmQwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbApAQCAtNTMsNyArNTMsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS4zLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCmluZGV4IGM1ZDAzYmEuLmM4YjI0ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKQEAgLTIyNiw2ICsyMjYsOCBAQAogY3JlZGVudGlhbFVzZXJuYW1lPVVzZXJuYW1lCiBkYWVtb25BbHJlYWR5UnVubmluZz1EYWVtb24gYWxyZWFkeSBydW5uaW5nCiBkYXlzQWdvPXswfSBkYXlzIGFnbworZGVlcGVuTm90V2l0aERlZXBlbj1DYW5ub3QgY29tYmluZSBkZWVwZW4gd2l0aCBkZWVwZW4tbm90CitkZWVwZW5TaW5jZVdpdGhEZWVwZW49Q2Fubm90IGNvbWJpbmUgZGVlcGVuIHdpdGggZGVlcGVuLXNpbmNlCiBkZWxldGVCcmFuY2hVbmV4cGVjdGVkUmVzdWx0PURlbGV0ZSBicmFuY2ggcmV0dXJuZWQgdW5leHBlY3RlZCByZXN1bHQgezB9CiBkZWxldGVGaWxlRmFpbGVkPUNvdWxkIG5vdCBkZWxldGUgZmlsZSB7MH0KIGRlbGV0ZVJlcXVpcmVzWmVyb05ld0lkPURlbGV0ZSByZXF1aXJlcyBuZXcgSUQgdG8gYmUgemVybwpAQCAtMzExLDYgKzMxMyw3IEBACiBmaWxlTW9kZU5vdFNldEZvclBhdGg9RmlsZU1vZGUgbm90IHNldCBmb3IgcGF0aCB7MH0KIGZpbHRlckV4ZWN1dGlvbkZhaWxlZD1FeGVjdXRpb24gb2YgZmlsdGVyIGNvbW1hbmQgJyd7MH0nJyBvbiBmaWxlICcnezF9JycgZmFpbGVkCiBmaWx0ZXJFeGVjdXRpb25GYWlsZWRSYz1FeGVjdXRpb24gb2YgZmlsdGVyIGNvbW1hbmQgJyd7MH0nJyBvbiBmaWxlICcnezF9JycgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgJyd7Mn0nJywgbWVzc2FnZSBvbiBzdGRlcnI6ICcnezN9JycKK2ZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eT1maWx0ZXIgcmVxdWlyZXMgc2VydmVyIHRvIGFkdmVydGlzZSB0aGF0IGNhcGFiaWxpdHkKIGZpbmRpbmdHYXJiYWdlPUZpbmRpbmcgZ2FyYmFnZQogZmxhZ0lzRGlzcG9zZWQ9ezB9IGlzIGRpc3Bvc2VkLgogZmxhZ05vdEZyb21UaGlzPXswfSBub3QgZnJvbSB0aGlzLgpAQCAtMzYyLDYgKzM2NSw3IEBACiBpbnZhbGlkRGVwdGg9SW52YWxpZCBkZXB0aDogezB9CiBpbnZhbGlkRW5jcnlwdGlvbj1JbnZhbGlkIGVuY3J5cHRpb24KIGludmFsaWRFeHBhbmRXaWxkY2FyZD1FeHBhbmRGcm9tU291cmNlIG9uIGEgcmVmc3BlYyB0aGF0IGNhbiBoYXZlIG1pc21hdGNoZWQgd2lsZGNhcmRzIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCitpbnZhbGlkRmlsdGVyPUludmFsaWQgZmlsdGVyOiB7MH0KIGludmFsaWRHaXRkaXJSZWYgPSBJbnZhbGlkIC5naXQgcmVmZXJlbmNlIGluIGZpbGUgJyd7MH0nJwogaW52YWxpZEdpdFR5cGU9aW52YWxpZCBnaXQgdHlwZTogezB9CiBpbnZhbGlkSWQ9SW52YWxpZCBpZDogezB9CkBAIC0zOTYsNiArNDAwLDcgQEAKIGludmFsaWRTeXN0ZW1Qcm9wZXJ0eT1JbnZhbGlkIHN5c3RlbSBwcm9wZXJ0eSAnJ3swfScnOiAnJ3sxfScnOyB1c2luZyBkZWZhdWx0IHZhbHVlIHsyfQogaW52YWxpZFRhZ09wdGlvbj1JbnZhbGlkIHRhZyBvcHRpb246IHswfQogaW52YWxpZFRpbWVvdXQ9SW52YWxpZCB0aW1lb3V0OiB7MH0KK2ludmFsaWRUaW1lc3RhbXA9SW52YWxpZCB0aW1lc3RhbXAgaW4gezB9CiBpbnZhbGlkVGltZVVuaXRWYWx1ZTI9SW52YWxpZCB0aW1lIHVuaXQgdmFsdWU6IHswfS57MX09ezJ9CiBpbnZhbGlkVGltZVVuaXRWYWx1ZTM9SW52YWxpZCB0aW1lIHVuaXQgdmFsdWU6IHswfS57MX0uezJ9PXszfQogaW52YWxpZFRyZWVaZXJvTGVuZ3RoTmFtZT1DYW5ub3QgYXBwZW5kIGEgdHJlZSBlbnRyeSB3aXRoIHplcm8tbGVuZ3RoIG5hbWUKQEAgLTYyNyw2ICs2MzIsNyBAQAogc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0PVNvdXJjZSByZWYgezB9IGRvZXNuJyd0IHJlc29sdmUgdG8gYW55IG9iamVjdC4KIHNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWM9U291cmNlIHJlZiBub3Qgc3BlY2lmaWVkIGZvciByZWZzcGVjOiB7MH0KIHNxdWFzaENvbW1pdE5vdFVwZGF0aW5nSEVBRD1TcXVhc2ggY29tbWl0IC0tIG5vdCB1cGRhdGluZyBIRUFECitzc2hDb21tYW5kRmFpbGVkPUV4ZWN1dGlvbiBvZiBzc2ggY29tbWFuZCAnJ3swfScnIGZhaWxlZCB3aXRoIGVycm9yICcnezF9JycKIHNzaFVzZXJOYW1lRXJyb3I9SnNjaCBlcnJvcjogZmFpbGVkIHRvIHNldCBTU0ggdXNlciBuYW1lIGNvcnJlY3RseSB0byAnJ3swfScnOyB1c2luZyAnJ3sxfScnIHBpY2tlZCB1cCBmcm9tIFNTSCBjb25maWcgZmlsZS4KIHNzbEZhaWx1cmVFeGNlcHRpb25NZXNzYWdlPVNlY3VyZSBjb25uZWN0aW9uIHRvIHswfSBjb3VsZCBub3QgYmUgc3RhYmxpc2hlZCBiZWNhdXNlIG9mIFNTTCBwcm9ibGVtcwogc3NsRmFpbHVyZUluZm89QSBzZWN1cmUgY29ubmVjdGlvbiB0byB7MH1cbmNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCBiZWNhdXNlIHRoZSBzZXJ2ZXInJ3MgY2VydGlmaWNhdGUgY291bGQgbm90IGJlIHZhbGlkYXRlZC4KQEAgLTY2OCw2ICs2NzQsNyBAQAogdGltZUlzVW5jZXJ0YWluPVRpbWUgaXMgdW5jZXJ0YWluCiB0aW1lckFscmVhZHlUZXJtaW5hdGVkPVRpbWVyIGFscmVhZHkgdGVybWluYXRlZAogdG9vTWFueUNvbW1hbmRzPVRvbyBtYW55IGNvbW1hbmRzCit0b29NYW55RmlsdGVycz1Ub28gbWFueSAiZmlsdGVyIiBsaW5lcyBpbiByZXF1ZXN0CiB0b29NYW55SW5jbHVkZVJlY3Vyc2lvbnM9VG9vIG1hbnkgcmVjdXJzaW9uczsgY2lyY3VsYXIgaW5jbHVkZXMgaW4gY29uZmlnIGZpbGUocyk/CiB0b3BvbG9naWNhbFNvcnRSZXF1aXJlZD1Ub3BvbG9naWNhbCBzb3J0IHJlcXVpcmVkLgogdHJhbnNhY3Rpb25BYm9ydGVkPXRyYW5zYWN0aW9uIGFib3J0ZWQKQEAgLTcxMCw2ICs3MTcsNyBAQAogdW5leHBlY3RlZEVvZkluUGFjaz1VbmV4cGVjdGVkIEVPRiBpbiBwYXJ0aWFsbHkgY3JlYXRlZCBwYWNrCiB1bmV4cGVjdGVkSHVua1RyYWlsZXI9VW5leHBlY3RlZCBodW5rIHRyYWlsZXIKIHVuZXhwZWN0ZWRPZGRSZXN1bHQ9b2RkOiB7MH0gKyB7MX0gLSB7Mn0KK3VuZXhwZWN0ZWRQYWNrZXRMaW5lPXVuZXhwZWN0ZWQgezB9CiB1bmV4cGVjdGVkUmVmUmVwb3J0PXswfTogdW5leHBlY3RlZCByZWYgcmVwb3J0OiB7MX0KIHVuZXhwZWN0ZWRSZXBvcnRMaW5lPXVuZXhwZWN0ZWQgcmVwb3J0IGxpbmU6IHswfQogdW5leHBlY3RlZFJlcG9ydExpbmUyPXswfSB1bmV4cGVjdGVkIHJlcG9ydCBsaW5lOiB7MX0KQEAgLTcyNCw2ICs3MzIsNyBAQAogdW5rbm93bk9iamVjdFR5cGUyPXVua25vd24KIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0PVVua25vd24gcmVwb3NpdG9yeSBmb3JtYXQKIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0Mj1Vbmtub3duIHJlcG9zaXRvcnkgZm9ybWF0ICJ7MH0iOyBleHBlY3RlZCAiMCIuCit1bmtub3duVHJhbnNwb3J0Q29tbWFuZD11bmtub3duIGNvbW1hbmQgezB9CiB1bmtub3duWmxpYkVycm9yPVVua25vd24gemxpYiBlcnJvci4KIHVubG9ja0xvY2tGaWxlRmFpbGVkPVVubG9ja2luZyBMb2NrRmlsZSAnJ3swfScnIGZhaWxlZAogdW5tZXJnZWRQYXRoPVVubWVyZ2VkIHBhdGg6IHswfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kLmphdmEKaW5kZXggMTAzOTdmOC4uMjdiYjVhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhCkBAIC0xNTcsMzAgKzE1Nyw2IEBACiAJCSAqCiAJCSAqIEBwYXJhbSBvdXQKIAkJICogICAgICAgICAgICBhcmNoaXZlIG9iamVjdCBmcm9tIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0KLQkJICogQHBhcmFtIHBhdGgKLQkJICogICAgICAgICAgICBmdWxsIGZpbGVuYW1lIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBhcmNoaXZlICh3aXRoCi0JCSAqICAgICAgICAgICAgdHJhaWxpbmcgJy8nIGZvciBkaXJlY3RvcmllcykKLQkJICogQHBhcmFtIG1vZGUKLQkJICogICAgICAgICAgICBtb2RlIChmb3IgZXhhbXBsZSBGaWxlTW9kZS5SRUdVTEFSX0ZJTEUgb3IKLQkJICogICAgICAgICAgICBGaWxlTW9kZS5TWU1MSU5LKQotCQkgKiBAcGFyYW0gbG9hZGVyCi0JCSAqICAgICAgICAgICAgYmxvYiBvYmplY3Qgd2l0aCBkYXRhIGZvciB0aGlzIGVudHJ5IChudWxsIGZvcgotCQkgKiAgICAgICAgICAgIGRpcmVjdG9yaWVzKQotCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JCSAqICAgICAgICAgICAgIHRocm93biBieSB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZvciBJL08gZXJyb3JzCi0JCSAqIEBkZXByZWNhdGVkIHVzZQotCQkgKiAgICAgICAgICAgICB7QGxpbmsgI3B1dEVudHJ5KENsb3NlYWJsZSwgT2JqZWN0SWQsIFN0cmluZywgRmlsZU1vZGUsIE9iamVjdExvYWRlcil9Ci0JCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkJICovCi0JCUBEZXByZWNhdGVkCi0JCXZvaWQgcHV0RW50cnkoVCBvdXQsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLAotCQkJCQkgIE9iamVjdExvYWRlciBsb2FkZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCQkvKioKLQkJICogV3JpdGUgYW4gZW50cnkgdG8gYW4gYXJjaGl2ZS4KLQkJICoKLQkJICogQHBhcmFtIG91dAotCQkgKiAgICAgICAgICAgIGFyY2hpdmUgb2JqZWN0IGZyb20gY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbQogCQkgKiBAcGFyYW0gdHJlZQogCQkgKiAgICAgICAgICAgIHRoZSB0YWcsIGNvbW1pdCwgb3IgdHJlZSBvYmplY3QgdG8gcHJvZHVjZSBhbiBhcmNoaXZlIGZvcgogCQkgKiBAcGFyYW0gcGF0aApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKaW5kZXggZjQ1ZTM5ZS4uNjViNzJmNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCkBAIC0yODgsNyArMjg4LDcgQEAKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqIEBzaW5jZSAzLjEKIAkgKi8KLQlwdWJsaWMgQ2hlcnJ5UGlja0NvbW1hbmQgc2V0UmVmbG9nUHJlZml4KGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwlwdWJsaWMgQ2hlcnJ5UGlja0NvbW1hbmQgc2V0UmVmbG9nUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKIAkJdGhpcy5yZWZsb2dQcmVmaXggPSBwcmVmaXg7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2xvbmVDb21tYW5kLmphdmEKaW5kZXggNzliMGVmYi4uNWMwNmJhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2xvbmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2xvbmVDb21tYW5kLmphdmEKQEAgLTE5MSwxMiArMTkxLDEyIEBACiAJCQl0aHJvdyBuZXcgSW52YWxpZFJlbW90ZUV4Y2VwdGlvbigKIAkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFVSTCwgdXJpKSk7CiAJCX0KLQkJUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbnVsbDsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQ2xvc2VkIGJ5IGNhbGxlcgorCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBpbml0KCk7CiAJCUZldGNoUmVzdWx0IGZldGNoUmVzdWx0ID0gbnVsbDsKIAkJVGhyZWFkIGNsZWFudXBIb29rID0gbmV3IFRocmVhZCgoKSAtPiBjbGVhbnVwKCkpOwogCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2soY2xlYW51cEhvb2spOwogCQl0cnkgewotCQkJcmVwb3NpdG9yeSA9IGluaXQoKTsKIAkJCWZldGNoUmVzdWx0ID0gZmV0Y2gocmVwb3NpdG9yeSwgdSk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogCQkJaWYgKHJlcG9zaXRvcnkgIT0gbnVsbCkgewpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCXJldHVybiBjb21tYW5kLmNhbGwoKTsKIAl9CiAKLQlwcml2YXRlIExpc3Q8UmVmU3BlYz4gY2FsY3VsYXRlUmVmU3BlY3MoZmluYWwgU3RyaW5nIGRzdCkgeworCXByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhTdHJpbmcgZHN0KSB7CiAJCVJlZlNwZWMgd2NycyA9IG5ldyBSZWZTcGVjKCk7CiAJCXdjcnMgPSB3Y3JzLnNldEZvcmNlVXBkYXRlKHRydWUpOwogCQl3Y3JzID0gd2Nycy5zZXRTb3VyY2VEZXN0aW5hdGlvbihDb25zdGFudHMuUl9IRUFEUyArICIqIiwgZHN0KTsgLy8kTk9OLU5MUy0xJApAQCAtMzE1LDcgKzMxNSw3IEBACiAJCQlzcGVjcy5hZGQod2Nycyk7CiAJCWVsc2UgaWYgKGJyYW5jaGVzVG9DbG9uZSAhPSBudWxsCiAJCQkJJiYgYnJhbmNoZXNUb0Nsb25lLnNpemUoKSA+IDApIHsKLQkJCWZvciAoZmluYWwgU3RyaW5nIHNlbGVjdGVkUmVmIDogYnJhbmNoZXNUb0Nsb25lKQorCQkJZm9yIChTdHJpbmcgc2VsZWN0ZWRSZWYgOiBicmFuY2hlc1RvQ2xvbmUpCiAJCQkJaWYgKHdjcnMubWF0Y2hTb3VyY2Uoc2VsZWN0ZWRSZWYpKQogCQkJCQlzcGVjcy5hZGQod2Nycy5leHBhbmRGcm9tU291cmNlKHNlbGVjdGVkUmVmKSk7CiAJCX0KQEAgLTM4NiwxMiArMzg2LDkgQEAKIAkJaWYgKCF1cGRhdGUuY2FsbCgpLmlzRW1wdHkoKSkgewogCQkJU3VibW9kdWxlV2FsayB3YWxrID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChjbG9uZWRSZXBvKTsKIAkJCXdoaWxlICh3YWxrLm5leHQoKSkgewotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IHdhbGsuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IHdhbGsuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKIAkJCQkJCWNsb25lU3VibW9kdWxlcyhzdWJSZXBvKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTQxMyw3ICs0MTAsNyBAQAogCQl9CiAKIAkJUmVmIGZvdW5kQnJhbmNoID0gbnVsbDsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHJlc3VsdC5nZXRBZHZlcnRpc2VkUmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiByZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZnMoKSkgewogCQkJZmluYWwgU3RyaW5nIG4gPSByLmdldE5hbWUoKTsKIAkJCWlmICghbi5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkKIAkJCQljb250aW51ZTsKQEAgLTQ0MywxMSArNDQwLDExIEBACiAJCWNsb25lZFJlcG8uZ2V0Q29uZmlnKCkuc2F2ZSgpOwogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KGZpbmFsIFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgZmluYWwgUmVmIHJlZikKKwlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChSZXBvc2l0b3J5IGNsb25lZFJlcG8sIFJlZiByZWYpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2Q29tbWl0IGNvbW1pdDsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsoY2xvbmVkUmVwbykpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsoY2xvbmVkUmVwbykpIHsKIAkJCWNvbW1pdCA9IHJ3LnBhcnNlQ29tbWl0KHJlZi5nZXRPYmplY3RJZCgpKTsKIAkJfQogCQlyZXR1cm4gY29tbWl0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCmluZGV4IGYyNTcyODMuLmQwNzUzMmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5BYm9ydGVkQnlIb29rRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Db25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXRweUNvbW1pdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuRW1wdHlDb21taXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Ob0ZpbGVwYXR0ZXJuRXhjZXB0aW9uOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJCQkJCVJldkNvbW1pdCBoZWFkQ29tbWl0ID0gcncucGFyc2VDb21taXQoaGVhZElkKTsKIAkJCQkJaGVhZENvbW1pdC5nZXRUcmVlKCk7CiAJCQkJCWlmIChpbmRleFRyZWVJZC5lcXVhbHMoaGVhZENvbW1pdC5nZXRUcmVlKCkpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgRW10cHlDb21taXRFeGNlcHRpb24oCisJCQkJCQl0aHJvdyBuZXcgRW1wdHlDb21taXRFeGNlcHRpb24oCiAJCQkJCQkJCUpHaXRUZXh0LmdldCgpLmVtcHR5Q29tbWl0KTsKIAkJCQkJfQogCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NyZWF0ZUJyYW5jaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NyZWF0ZUJyYW5jaENvbW1hbmQuamF2YQppbmRleCAyOWJhZjRjLi5iYTZmM2YxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhCkBAIC00Myw2ICs0Myw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX0hFQURTOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIApAQCAtNzgsNyArODEsNyBAQAogCiAJcHJpdmF0ZSBTZXR1cFVwc3RyZWFtTW9kZSB1cHN0cmVhbU1vZGU7CiAKLQlwcml2YXRlIFN0cmluZyBzdGFydFBvaW50ID0gQ29uc3RhbnRzLkhFQUQ7CisJcHJpdmF0ZSBTdHJpbmcgc3RhcnRQb2ludCA9IEhFQUQ7CiAKIAlwcml2YXRlIFJldkNvbW1pdCBzdGFydENvbW1pdDsKIApAQCAtMTIxLDcgKzEyNCw3IEBACiAJCXRyeSAoUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsocmVwbykpIHsKIAkJCVJlZiByZWZUb0NoZWNrID0gcmVwby5maW5kUmVmKG5hbWUpOwogCQkJYm9vbGVhbiBleGlzdHMgPSByZWZUb0NoZWNrICE9IG51bGwKLQkJCQkJJiYgcmVmVG9DaGVjay5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUyk7CisJCQkJCSYmIHJlZlRvQ2hlY2suZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoUl9IRUFEUyk7CiAJCQlpZiAoIWZvcmNlICYmIGV4aXN0cykKIAkJCQl0aHJvdyBuZXcgUmVmQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLnJlZkFscmVhZHlFeGlzdHMxLCBuYW1lKSk7CkBAIC0xNTMsNyArMTU2LDcgQEAKIAkJCQllbHNlCiAJCQkJCXJlZkxvZ01lc3NhZ2UgPSAiYnJhbmNoOiBDcmVhdGVkIGZyb20gY29tbWl0ICIgKyBiYXNlQ29tbWl0OyAvLyROT04tTkxTLTEkCiAKLQkJCX0gZWxzZSBpZiAoc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpCisJCQl9IGVsc2UgaWYgKHN0YXJ0UG9pbnRGdWxsTmFtZS5zdGFydHNXaXRoKFJfSEVBRFMpCiAJCQkJCXx8IHN0YXJ0UG9pbnRGdWxsTmFtZS5zdGFydHNXaXRoKENvbnN0YW50cy5SX1JFTU9URVMpKSB7CiAJCQkJYmFzZUJyYW5jaCA9IHN0YXJ0UG9pbnRGdWxsTmFtZTsKIAkJCQlpZiAoZXhpc3RzKQpAQCAtMTcxLDcgKzE3NCw3IEBACiAJCQkJCQkJKyBzdGFydFBvaW50RnVsbE5hbWU7CiAJCQl9CiAKLQkJCVJlZlVwZGF0ZSB1cGRhdGVSZWYgPSByZXBvLnVwZGF0ZVJlZihDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpOworCQkJUmVmVXBkYXRlIHVwZGF0ZVJlZiA9IHJlcG8udXBkYXRlUmVmKFJfSEVBRFMgKyBuYW1lKTsKIAkJCXVwZGF0ZVJlZi5zZXROZXdPYmplY3RJZChzdGFydEF0KTsKIAkJCXVwZGF0ZVJlZi5zZXRSZWZMb2dNZXNzYWdlKHJlZkxvZ01lc3NhZ2UsIGZhbHNlKTsKIAkJCVJlc3VsdCB1cGRhdGVSZXN1bHQ7CkBAIC0yNzksMTcgKzI4MiwzNCBAQAogCX0KIAogCXByaXZhdGUgU3RyaW5nIGdldFN0YXJ0UG9pbnRPckhlYWQoKSB7Ci0JCXJldHVybiBzdGFydFBvaW50ICE9IG51bGwgPyBzdGFydFBvaW50IDogQ29uc3RhbnRzLkhFQUQ7CisJCXJldHVybiBzdGFydFBvaW50ICE9IG51bGwgPyBzdGFydFBvaW50IDogSEVBRDsKIAl9CiAKIAlwcml2YXRlIHZvaWQgcHJvY2Vzc09wdGlvbnMoKSB0aHJvd3MgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gewogCQlpZiAobmFtZSA9PSBudWxsCi0JCQkJfHwgIVJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUoQ29uc3RhbnRzLlJfSEVBRFMgKyBuYW1lKSkKKwkJCQl8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShSX0hFQURTICsgbmFtZSkKKwkJCQl8fCAhaXNWYWxpZEJyYW5jaE5hbWUobmFtZSkpCiAJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQKIAkJCQkJLmdldCgpLmJyYW5jaE5hbWVJbnZhbGlkLCBuYW1lID09IG51bGwgPyAiPG51bGw+IiA6IG5hbWUpKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCS8qKgorCSAqIENoZWNrIGlmIHRoZSBnaXZlbiBicmFuY2ggbmFtZSBpcyB2YWxpZAorCSAqCisJICogQHBhcmFtIGJyYW5jaE5hbWUKKwkgKiAgICAgICAgICAgIGJyYW5jaCBuYW1lIHRvIGNoZWNrCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGJyYW5jaCBuYW1lIGlzIHZhbGlkCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRCcmFuY2hOYW1lKFN0cmluZyBicmFuY2hOYW1lKSB7CisJCWlmIChIRUFELmVxdWFscyhicmFuY2hOYW1lKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAhYnJhbmNoTmFtZS5zdGFydHNXaXRoKCItIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKIAkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIG5ldyBicmFuY2gKIAkgKgogCSAqIEBwYXJhbSBuYW1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhCmluZGV4IDAxZmU0YWEuLjRkNWU0OTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhCkBAIC0xMDQsNiArMTA0LDExIEBACiAJcHJpdmF0ZSBMaXN0PElNYXRjaGVyPiBtYXRjaGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJLyoqCisJICogV2hldGhlciB0byB1c2UgYWxsIHRhZ3MgKGluY2wuIGxpZ2h0d2VpZ2h0KSBvciBub3QKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdXNlVGFncyA9IGZhbHNlOworCisJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIERlc2NyaWJlQ29tbWFuZC4KIAkgKgogCSAqIEBwYXJhbSByZXBvCkBAIC0xNzMsNiArMTc4LDIyIEBACiAJCXJldHVybiB0aGlzOwogCX0KIAorCS8qKgorCSAqIEluc3RlYWQgb2YgdXNpbmcgb25seSB0aGUgYW5ub3RhdGVkIHRhZ3MsIHVzZSBhbnkgdGFnIGZvdW5kIGluIHJlZnMvdGFncworCSAqIG5hbWVzcGFjZS4gVGhpcyBvcHRpb24gZW5hYmxlcyBtYXRjaGluZyBsaWdodHdlaWdodCAobm9uLWFubm90YXRlZCkgdGFncworCSAqIG9yIG5vdC4KKwkgKgorCSAqIEBwYXJhbSB0YWdzCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBlbmFibGVzIG1hdGNoaW5nIGxpZ2h0d2VpZ2h0IChub24tYW5ub3RhdGVkKQorCSAqICAgICAgICAgICAgdGFncyBsaWtlIHNldHRpbmcgb3B0aW9uIC0tdGFncyBpbiBjIGdpdAorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0VGFncyhib29sZWFuIHRhZ3MpIHsKKwkJdGhpcy51c2VUYWdzID0gdGFnczsKKwkJcmV0dXJuIHRoaXM7CisJfQorCiAJcHJpdmF0ZSBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKFJlZiB0YWcsIGludCBkZXB0aCwgT2JqZWN0SWQgdGlwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIFN0cmluZy5mb3JtYXQoCkBAIC0yMjQsMTIgKzI0NSwxNiBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBPYmplY3RJZCBnZXRPYmplY3RJZEZyb21SZWYoUmVmIHIpIHsKLQkJT2JqZWN0SWQga2V5ID0gcmVwby5wZWVsKHIpLmdldFBlZWxlZE9iamVjdElkKCk7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJa2V5ID0gci5nZXRPYmplY3RJZCgpOworCXByaXZhdGUgT2JqZWN0SWQgZ2V0T2JqZWN0SWRGcm9tUmVmKFJlZiByKSB0aHJvd3MgSkdpdEludGVybmFsRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCU9iamVjdElkIGtleSA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHIpLmdldFBlZWxlZE9iamVjdElkKCk7CisJCQlpZiAoa2V5ID09IG51bGwpIHsKKwkJCQlrZXkgPSByLmdldE9iamVjdElkKCk7CisJCQl9CisJCQlyZXR1cm4ga2V5OworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSkdpdEludGVybmFsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJfQotCQlyZXR1cm4ga2V5OwogCX0KIAogCS8qKgpAQCAtMjQyLDEyICsyNjcsMTQgQEAKIAlwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWNoZWNrQ2FsbGFibGUoKTsKLQotCQkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJaWYgKHRhcmdldCA9PSBudWxsKSB7CiAJCQkJc2V0VGFyZ2V0KENvbnN0YW50cy5IRUFEKTsKKwkJCX0KIAotCQkJQ29sbGVjdGlvbjxSZWY+IHRhZ0xpc3QgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhSX1RBR1MpLnZhbHVlcygpOworCQkJQ29sbGVjdGlvbjxSZWY+IHRhZ0xpc3QgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkJLmdldFJlZnNCeVByZWZpeChSX1RBR1MpOwogCQkJTWFwPE9iamVjdElkLCBMaXN0PFJlZj4+IHRhZ3MgPSB0YWdMaXN0LnN0cmVhbSgpCisJCQkJCS5maWx0ZXIodGhpczo6ZmlsdGVyTGlnaHR3ZWlnaHRUYWdzKQogCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkodGhpczo6Z2V0T2JqZWN0SWRGcm9tUmVmKSk7CiAKIAkJCS8vIGNvbWJpbmVkIGZsYWdzIG9mIGFsbCB0aGUgY2FuZGlkYXRlIGluc3RhbmNlcwpAQCAtMzcxLDQgKzM5OCwyMiBAQAogCQkJdy5jbG9zZSgpOwogCQl9CiAJfQorCisJLyoqCisJICogV2hldGhlciB3ZSB1c2UgbGlnaHR3ZWlnaHQgdGFncyBvciBub3QgZm9yIGRlc2NyaWJlIENhbmRpZGF0ZXMKKwkgKgorCSAqIEBwYXJhbSByZWYKKwkgKiAgICAgICAgICAgIHJlZmVyZW5jZSB1bmRlciBpbnNwZWN0aW9uCisJICogQHJldHVybiB0cnVlIGlmIGl0IHNob3VsZCBiZSB1c2VkIGZvciBkZXNjcmliZSBvciBub3QgcmVnYXJkaW5nCisJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5hcGkuRGVzY3JpYmVDb21tYW5kI3VzZVRhZ3N9CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoIm51bGwiKQorCXByaXZhdGUgYm9vbGVhbiBmaWx0ZXJMaWdodHdlaWdodFRhZ3MoUmVmIHJlZikgeworCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMudXNlVGFncyB8fCAoaWQgIT0gbnVsbCAmJiAody5wYXJzZVRhZyhpZCkgIT0gbnVsbCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCmluZGV4IDVkMTc4YmMuLjczZTkzYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCkBAIC0xMDUsNiArMTA1LDggQEAKIAogCXByaXZhdGUgQ2FsbGJhY2sgY2FsbGJhY2s7CiAKKwlwcml2YXRlIGJvb2xlYW4gaXNGb3JjZVVwZGF0ZTsKKwogCS8qKgogCSAqIENhbGxiYWNrIGZvciBzdGF0dXMgb2YgZmV0Y2ggb3BlcmF0aW9uLgogCSAqCkBAIC0xOTgsNyArMjAwLDggQEAKIAkJCQkJCQkJLnNldFRhZ09wdCh0YWdPcHRpb24pCiAJCQkJCQkJCS5zZXRDaGVja0ZldGNoZWRPYmplY3RzKGNoZWNrRmV0Y2hlZE9iamVjdHMpCiAJCQkJCQkJCS5zZXRSZW1vdmVEZWxldGVkUmVmcyhpc1JlbW92ZURlbGV0ZWRSZWZzKCkpCi0JCQkJCQkJCS5zZXRUaGluKHRoaW4pLnNldFJlZlNwZWNzKHJlZlNwZWNzKQorCQkJCQkJCQkuc2V0VGhpbih0aGluKQorCQkJCQkJCQkuc2V0UmVmU3BlY3MoYXBwbHlPcHRpb25zKHJlZlNwZWNzKSkKIAkJCQkJCQkJLnNldERyeVJ1bihkcnlSdW4pCiAJCQkJCQkJCS5zZXRSZWN1cnNlU3VibW9kdWxlcyhyZWN1cnNlTW9kZSk7CiAJCQkJCQljb25maWd1cmUoZik7CkBAIC0yMzcsOCArMjQwLDggQEAKIAkJCQl0cmFuc3BvcnQuc2V0VGFnT3B0KHRhZ09wdGlvbik7CiAJCQl0cmFuc3BvcnQuc2V0RmV0Y2hUaGluKHRoaW4pOwogCQkJY29uZmlndXJlKHRyYW5zcG9ydCk7Ci0KLQkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IHRyYW5zcG9ydC5mZXRjaChtb25pdG9yLCByZWZTcGVjcyk7CisJCQlGZXRjaFJlc3VsdCByZXN1bHQgPSB0cmFuc3BvcnQuZmV0Y2gobW9uaXRvciwKKwkJCQkJYXBwbHlPcHRpb25zKHJlZlNwZWNzKSk7CiAJCQlpZiAoIXJlcG8uaXNCYXJlKCkpIHsKIAkJCQlmZXRjaFN1Ym1vZHVsZXMocmVzdWx0KTsKIAkJCX0KQEAgLTI2MSw2ICsyNjQsMTcgQEAKIAogCX0KIAorCXByaXZhdGUgTGlzdDxSZWZTcGVjPiBhcHBseU9wdGlvbnMoTGlzdDxSZWZTcGVjPiByZWZTcGVjczIpIHsKKwkJaWYgKCFpc0ZvcmNlVXBkYXRlKCkpIHsKKwkJCXJldHVybiByZWZTcGVjczI7CisJCX0KKwkJTGlzdDxSZWZTcGVjPiB1cGRhdGVkID0gbmV3IEFycmF5TGlzdDw+KDMpOworCQlmb3IgKFJlZlNwZWMgcmVmU3BlYyA6IHJlZlNwZWNzMikgeworCQkJdXBkYXRlZC5hZGQocmVmU3BlYy5zZXRGb3JjZVVwZGF0ZSh0cnVlKSk7CisJCX0KKwkJcmV0dXJuIHVwZGF0ZWQ7CisJfQorCiAJLyoqCiAJICogU2V0IHRoZSBtb2RlIHRvIGJlIHVzZWQgZm9yIHJlY3Vyc2luZyBpbnRvIHN1Ym1vZHVsZXMuCiAJICoKQEAgLTUxNyw0ICs1MzEsMjcgQEAKIAkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogCQlyZXR1cm4gdGhpczsKIAl9CisKKwkvKioKKwkgKiBXaGV0aGVyIGZldGNoIC0tZm9yY2Ugb3B0aW9uIGlzIGVuYWJsZWQKKwkgKgorCSAqIEByZXR1cm4gd2hldGhlciByZWZzIGFmZmVjdGVkIGJ5IHRoZSBmZXRjaCBhcmUgdXBkYXRlZCBmb3JjZWZ1bGx5CisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRm9yY2VVcGRhdGUoKSB7CisJCXJldHVybiB0aGlzLmlzRm9yY2VVcGRhdGU7CisJfQorCisJLyoqCisJICogU2V0IGZldGNoIC0tZm9yY2Ugb3B0aW9uCisJICoKKwkgKiBAcGFyYW0gZm9yY2UKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gdXBkYXRlIHJlZnMgYWZmZWN0ZWQgYnkgdGhlIGZldGNoIGZvcmNlZnVsbHkKKwkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgRmV0Y2hDb21tYW5kIHNldEZvcmNlVXBkYXRlKGJvb2xlYW4gZm9yY2UpIHsKKwkJdGhpcy5pc0ZvcmNlVXBkYXRlID0gZm9yY2U7CisJCXJldHVybiB0aGlzOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RCcmFuY2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhCmluZGV4IGNkYWU3ODIuLjI4YTI3YTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RCcmFuY2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YQpAQCAtMTg3LDYgKzE4Nyw2IEBACiAJfQogCiAJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZ2V0UmVmcyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMocHJlZml4KS52YWx1ZXMoKTsKKwkJcmV0dXJuIHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocHJlZml4KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdFRhZ0NvbW1hbmQuamF2YQppbmRleCA5MTYxMjExLi4wMWMxOTkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEKQEAgLTQ3LDcgKzQ3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTc4LDExICs3NywxMSBAQAogCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0PFJlZj4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQljaGVja0NhbGxhYmxlKCk7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmTGlzdDsKIAkJTGlzdDxSZWY+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IChSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhyZXBvKSkgewotCQkJcmVmTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKENvbnN0YW50cy5SX1RBR1MpOwotCQkJZm9yIChSZWYgcmVmIDogcmVmTGlzdC52YWx1ZXMoKSkgeworCQkJTGlzdDxSZWY+IHJlZkxpc3QgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9UQUdTKTsKKwkJCWZvciAoUmVmIHJlZiA6IHJlZkxpc3QpIHsKIAkJCQl0YWdzLmFkZChyZWYpOwogCQkJfQogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kLmphdmEKaW5kZXggZmQ2YzFmYS4uY2YzZDM1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YQpAQCAtNDIsMTMgKzQyLDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CkBAIC0yNzUsMTAgKzI3Miw5IEBACiAJICogICAgICAgICAgICAgdGhlIHJlZmVyZW5jZXMgY291bGQgbm90IGJlIGFjY2Vzc2VkCiAJICovCiAJcHVibGljIExvZ0NvbW1hbmQgYWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQlmb3IgKFJlZiByZWYgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHJlZiA6IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJaWYoIXJlZi5pc1BlZWxlZCgpKQotCQkJCXJlZiA9IGdldFJlcG9zaXRvcnkoKS5wZWVsKHJlZik7CisJCQkJcmVmID0gZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCiAJCQlPYmplY3RJZCBvYmplY3RJZCA9IHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJaWYgKG9iamVjdElkID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhCmluZGV4IGNkNTBjYWUuLmI4ZmE3NGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhCkBAIC0xMTIsNiArMTEyLDggQEAKIAogCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CiAKKwlwcml2YXRlIGJvb2xlYW4gaW5zZXJ0Q2hhbmdlSWQ7CisKIAlwcml2YXRlIFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKIAogCS8qKgpAQCAtMjUzLDcgKzI1NSw3IEBACiAJCQlyZWZMb2dNZXNzYWdlLmFwcGVuZChyZWYuZ2V0TmFtZSgpKTsKIAogCQkJLy8gaGFuZGxlIGFubm90YXRlZCB0YWdzCi0JCQlyZWYgPSByZXBvLnBlZWwocmVmKTsKKwkJCXJlZiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAJCQlPYmplY3RJZCBvYmplY3RJZCA9IHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJaWYgKG9iamVjdElkID09IG51bGwpCiAJCQkJb2JqZWN0SWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKQEAgLTM5Miw2ICszOTQsNyBAQAogCQkJCQkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChnZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQkJCQkJbmV3SGVhZElkID0gZ2l0LmNvbW1pdCgpCiAJCQkJCQkJCQkuc2V0UmVmbG9nQ29tbWVudChyZWZMb2dNZXNzYWdlLnRvU3RyaW5nKCkpCisJCQkJCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQoaW5zZXJ0Q2hhbmdlSWQpCiAJCQkJCQkJCQkuY2FsbCgpLmdldElkKCk7CiAJCQkJCQl9CiAJCQkJCQltZXJnZVN0YXR1cyA9IE1lcmdlU3RhdHVzLk1FUkdFRDsKQEAgLTYxOSw2ICs2MjIsMjMgQEAKIAl9CiAKIAkvKioKKwkgKiBJZiBzZXQgdG8gdHJ1ZSBhIGNoYW5nZSBpZCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbW1pdCBtZXNzYWdlCisJICoKKwkgKiBBbiBleGlzdGluZyBjaGFuZ2UgaWQgaXMgbm90IHJlcGxhY2VkLiBBbiBpbml0aWFsIGNoYW5nZSBpZCAoSTAwMC4uLikKKwkgKiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjaGFuZ2UgaWQuCisJICoKKwkgKiBAcGFyYW0gaW5zZXJ0Q2hhbmdlSWQKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gaW5zZXJ0IGEgY2hhbmdlIGlkCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIE1lcmdlQ29tbWFuZCBzZXRJbnNlcnRDaGFuZ2VJZChib29sZWFuIGluc2VydENoYW5nZUlkKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5pbnNlcnRDaGFuZ2VJZCA9IGluc2VydENoYW5nZUlkOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRpZmYgb3BlcmF0aW9uLiBCeSBkZWZhdWx0LCB0aGlzCiAJICogaXMgc2V0IHRvIDxjb2RlPk51bGxQcm9ncmVzc01vbml0b3I8L2NvZGU+CiAJICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL05hbWVSZXZDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhCmluZGV4IGE5ZDk3NTkuLmEyYjIwMDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL05hbWVSZXZDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YQpAQCAtMjUxLDggKzI1MSw3IEBACiAJICogcHJlZml4IGFkZGVkIGJ5IHtAbGluayAjYWRkUHJlZml4KFN0cmluZyl9LgogCSAqCiAJICogQHBhcmFtIHByZWZpeAotCSAqICAgICAgICAgICAgcHJlZml4IHRvIGFkZDsgc2VlCi0JICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UjZ2V0UmVmcyhTdHJpbmcpfQorCSAqICAgICAgICAgICAgcHJlZml4IHRvIGFkZDsgdGhlIHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgc2xhc2gKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBOYW1lUmV2Q29tbWFuZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewpAQCAtMjc5LDcgKzI3OCw4IEBACiAJCWlmIChyZWZzID09IG51bGwpCiAJCQlyZWZzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSB7Ci0JCQlmb3IgKFJlZiByZWYgOiByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhDb25zdGFudHMuUl9UQUdTKS52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpCisJCQkJCS5nZXRSZWZzQnlQcmVmaXgoQ29uc3RhbnRzLlJfVEFHUykpIHsKIAkJCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQkJCWlmIChpZCAhPSBudWxsICYmICh3YWxrLnBhcnNlQW55KGlkKSBpbnN0YW5jZW9mIFJldlRhZykpCiAJCQkJCWFkZFJlZihyZWYpOwpAQCAtMzI1LDcgKzMyNSw3IEBACiAKIAlwcml2YXRlIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBub25Db21taXRzLAogCQkJRklGT1JldlF1ZXVlIHBlbmRpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKHByZWZpeCkudmFsdWVzKCkpCisJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocHJlZml4KSkKIAkJCWFkZFJlZihyZWYsIG5vbkNvbW1pdHMsIHBlbmRpbmcpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKaW5kZXggMTliZGQzNS4uNDU5NDUxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCkBAIC0xNTMsNyArMTUzLDggQEAKIAogCQkJZmluYWwgTGlzdDxUcmFuc3BvcnQ+IHRyYW5zcG9ydHM7CiAJCQl0cmFuc3BvcnRzID0gVHJhbnNwb3J0Lm9wZW5BbGwocmVwbywgcmVtb3RlLCBUcmFuc3BvcnQuT3BlcmF0aW9uLlBVU0gpOwotCQkJZm9yIChmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0IDogdHJhbnNwb3J0cykgeworCQkJZm9yIChAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBFeHBsaWNpdGx5IGNsb3NlZCBpbiBmaW5hbGx5CisJCQkJCWZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQgOiB0cmFuc3BvcnRzKSB7CiAJCQkJdHJhbnNwb3J0LnNldFB1c2hUaGluKHRoaW4pOwogCQkJCXRyYW5zcG9ydC5zZXRQdXNoQXRvbWljKGF0b21pYyk7CiAJCQkJaWYgKHJlY2VpdmVQYWNrICE9IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKaW5kZXggZGExZmYwNi4uOThjMTZiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQpAQCAtMTczNCwyMyArMTczNCwxNyBAQAogCQkJCVN0cmluZyBjb250ZW50KQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXJlbnREaXIsIG5hbWUpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpIHsKIAkJCQlmb3Mud3JpdGUoY29udGVudC5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQkJZm9zLndyaXRlKCdcbicpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCiAJCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kVG9GaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgdHJ1ZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUsIHRydWUpKSB7CiAJCQkJZm9zLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwogCQkJCWZvcy53cml0ZSgnXG4nKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZm9zLmNsb3NlKCk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZW1vdGVBZGRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZW1vdGVBZGRDb21tYW5kLmphdmEKaW5kZXggYzQzYzVjNi4uYThmZGNkMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVtb3RlQWRkQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YQpAQCAtODYsOSArODYsMTIgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lCiAJICogICAgICAgICAgICBhIHJlbW90ZSBuYW1lCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgUmVtb3RlQWRkQ29tbWFuZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAJCXRoaXMubmFtZSA9IG5hbWU7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpAQCAtOTYsOSArOTksMTIgQEAKIAkgKgogCSAqIEBwYXJhbSB1cmkKIAkgKiAgICAgICAgICAgIGFuIFVSTCBmb3IgdGhlIHJlbW90ZQorCSAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZQorCSAqIEBzaW5jZSA1LjAKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoVVJJaXNoIHVyaSkgeworCXB1YmxpYyBSZW1vdGVBZGRDb21tYW5kIHNldFVyaShVUklpc2ggdXJpKSB7CiAJCXRoaXMudXJpID0gdXJpOworCQlyZXR1cm4gdGhpczsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEKaW5kZXggYmU0NDZmOS4uMTNjZTRlNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEKQEAgLTI0NSw3ICsyNDUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgT2JqZWN0SWQgY29tbWl0SWQpIHsKKwlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChPYmplY3RJZCBjb21taXRJZCkgewogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZXBvKSkgewogCQkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGNvbW1pdElkKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtMzYwLDcgKzM2MCw3IEBACiAKIAlwcml2YXRlIHZvaWQgcmVzZXRJbmRleEZvclBhdGhzKE9iamVjdElkIGNvbW1pdFRyZWUpIHsKIAkJRGlyQ2FjaGUgZGMgPSBudWxsOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKHJlcG8pKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKIAkJCWRjID0gcmVwby5sb2NrRGlyQ2FjaGUoKTsKIAkJCURpckNhY2hlQnVpbGRlciBidWlsZGVyID0gZGMuYnVpbGRlcigpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SbUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhCmluZGV4IDA4OGFhMTUuLmQyZjRiZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJRGlyQ2FjaGUgZGMgPSBudWxsOwogCiAJCUxpc3Q8U3RyaW5nPiBhY3R1YWxseURlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKHJlcG8pKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKIAkJCWRjID0gcmVwby5sb2NrRGlyQ2FjaGUoKTsKIAkJCURpckNhY2hlQnVpbGRlciBidWlsZGVyID0gZGMuYnVpbGRlcigpOwogCQkJdHcucmVzZXQoKTsgLy8gZHJvcCB0aGUgZmlyc3QgZW1wdHkgdHJlZSwgd2hpY2ggd2UgZG8gbm90IG5lZWQgaGVyZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hBcHBseUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEKaW5kZXggNWY3OTI4ZC4uMDFkMDcwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hBcHBseUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhCkBAIC0xMTEsNyArMTExLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gdG8gYXBwbHkgdGhlIHN0YXNoCiAJICogICAgICAgICAgICB0bwogCSAqLwotCXB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBzdGFzaCB7QGNvZGUgUmVmfSB0byBhcHBseQogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIFN0YXNoQXBwbHlDb21tYW5kIHNldFN0YXNoUmVmKGZpbmFsIFN0cmluZyBzdGFzaFJlZikgeworCXB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZCBzZXRTdGFzaFJlZihTdHJpbmcgc3Rhc2hSZWYpIHsKIAkJdGhpcy5zdGFzaFJlZiA9IHN0YXNoUmVmOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhCmluZGV4IDM0OTVmZjguLmMzMjg5MGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIsCiAJCQlmaW5hbCBPYmplY3RJZCBoZWFkSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVhZGVyKSkgeworCQl0cnkgKFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlYWRlcikpIHsKIAkJCXJldHVybiB3YWxrLnBhcnNlQ29tbWl0KGhlYWRJZCk7CiAJCX0KIAl9CkBAIC0zMDMsMTIgKzMwMyw5IEBACiAJCQkJCQllbnRyeS5zZXRMYXN0TW9kaWZpZWQod3RJdGVyLmdldEVudHJ5TGFzdE1vZGlmaWVkKCkpOwogCQkJCQkJZW50cnkuc2V0RmlsZU1vZGUod3RJdGVyLmdldEVudHJ5RmlsZU1vZGUoKSk7CiAJCQkJCQlsb25nIGNvbnRlbnRMZW5ndGggPSB3dEl0ZXIuZ2V0RW50cnlDb250ZW50TGVuZ3RoKCk7Ci0JCQkJCQlJbnB1dFN0cmVhbSBpbiA9IHd0SXRlci5vcGVuRW50cnlTdHJlYW0oKTsKLQkJCQkJCXRyeSB7CisJCQkJCQl0cnkgKElucHV0U3RyZWFtIGluID0gd3RJdGVyLm9wZW5FbnRyeVN0cmVhbSgpKSB7CiAJCQkJCQkJZW50cnkuc2V0T2JqZWN0SWQoaW5zZXJ0ZXIuaW5zZXJ0KAogCQkJCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CLCBjb250ZW50TGVuZ3RoLCBpbikpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlpbi5jbG9zZSgpOwogCQkJCQkJfQogCiAJCQkJCQlpZiAoaW5kZXhJdGVyID09IG51bGwgJiYgaGVhZEl0ZXIgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoRHJvcENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoRHJvcENvbW1hbmQuamF2YQppbmRleCBjZDhmOGU2Li43ZjAyYWFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaERyb3BDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBzdGFzaCByZWZlcmVuY2UKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldFN0YXNoUmVmKGZpbmFsIGludCBzdGFzaFJlZikgeworCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldFN0YXNoUmVmKGludCBzdGFzaFJlZikgewogCQlpZiAoc3Rhc2hSZWYgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkgKiAgICAgICAgICAgIHtAbGluayAjc2V0U3Rhc2hSZWYoaW50KX0KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldEFsbChmaW5hbCBib29sZWFuIGFsbCkgeworCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldEFsbChib29sZWFuIGFsbCkgewogCQl0aGlzLmFsbCA9IGFsbDsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlZlVwZGF0ZSBjcmVhdGVSZWZVcGRhdGUoZmluYWwgUmVmIHN0YXNoUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmVmVXBkYXRlIGNyZWF0ZVJlZlVwZGF0ZShSZWYgc3Rhc2hSZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZlVwZGF0ZSB1cGRhdGUgPSByZXBvLnVwZGF0ZVJlZihSX1NUQVNIKTsKIAkJdXBkYXRlLmRpc2FibGVSZWZMb2coKTsKIAkJdXBkYXRlLnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoc3Rhc2hSZWYuZ2V0T2JqZWN0SWQoKSk7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJcmV0dXJuIHVwZGF0ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZGVsZXRlUmVmKGZpbmFsIFJlZiBzdGFzaFJlZikgeworCXByaXZhdGUgdm9pZCBkZWxldGVSZWYoUmVmIHN0YXNoUmVmKSB7CiAJCXRyeSB7CiAJCQlSZXN1bHQgcmVzdWx0ID0gY3JlYXRlUmVmVXBkYXRlKHN0YXNoUmVmKS5kZWxldGUoKTsKIAkJCWlmIChSZXN1bHQuRk9SQ0VEICE9IHJlc3VsdCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoTGlzdENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoTGlzdENvbW1hbmQuamF2YQppbmRleCA2NDUxYjcwLi5mMzE2YjIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaExpc3RDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhCkBAIC03Miw3ICs3Miw3IEBACiAJICoKIAkgKiBAcGFyYW0gcmVwbyBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN0YXNoTGlzdENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN0YXNoTGlzdENvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlQWRkQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlQWRkQ29tbWFuZC5qYXZhCmluZGV4IDFhYTA1MGYuLjk1MzhkMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXRoaXMucGF0aCA9IHBhdGg7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0VVJJKGZpbmFsIFN0cmluZyB1cmkpIHsKKwlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRVUkkoU3RyaW5nIHVyaSkgewogCQl0aGlzLnVyaSA9IHVyaTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTI1LDcgKzEyNSw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3J9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFByb2dyZXNzTW9uaXRvcihmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFByb2dyZXNzTW9uaXRvcihQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVJbml0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlSW5pdENvbW1hbmQuamF2YQppbmRleCA2YWYyN2Q3Li4yZGIxMmI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVJbml0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZUluaXRDb21tYW5kIGFkZFBhdGgoU3RyaW5nIHBhdGgpIHsKIAkJcGF0aHMuYWRkKHBhdGgpOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTdGF0dXNDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTdGF0dXNDb21tYW5kLmphdmEKaW5kZXggOTdhZTY2OC4uMDYwNmM1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN0YXR1c0NvbW1hbmQuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVTdGF0dXNDb21tYW5kIGFkZFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlU3RhdHVzQ29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTMwLDE2ICsxMzAsMTQgQEAKIAkJCQkJaWQpOwogCiAJCS8vIFJlcG9ydCB1bmluaXRpYWxpemVkIGlmIG5vIHN1Ym1vZHVsZSByZXBvc2l0b3J5Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN1Ym1vZHVsZVN0YXR1cyhTdWJtb2R1bGVTdGF0dXNUeXBlLlVOSU5JVElBTElaRUQsIHBhdGgsCi0JCQkJCWlkKTsKKwkJT2JqZWN0SWQgaGVhZElkID0gbnVsbDsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlpZiAoc3ViUmVwbyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBTdWJtb2R1bGVTdGF0dXMoU3VibW9kdWxlU3RhdHVzVHlwZS5VTklOSVRJQUxJWkVELAorCQkJCQkJcGF0aCwgaWQpOworCQkJfQogCi0JCU9iamVjdElkIGhlYWRJZDsKLQkJdHJ5IHsKIAkJCWhlYWRJZCA9IHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAogCQkvLyBSZXBvcnQgdW5pbml0aWFsaXplZCBpZiBubyBIRUFEIGNvbW1pdCBpbiBzdWJtb2R1bGUgcmVwb3NpdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN5bmNDb21tYW5kLmphdmEKaW5kZXggZDIyZDgyMC4uN2NmNGI3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTeW5jQ29tbWFuZC5qYXZhCkBAIC03OSw3ICs3OSw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVN5bmNDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC05MSw3ICs5MSw3IEBACiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJICogQHJldHVybiBzaG9ydGVuZWQgYnJhbmNoIG5hbWUsIG51bGwgb24gZmFpbHVyZXMKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRCcmFuY2goZmluYWwgUmVwb3NpdG9yeSBzdWJSZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZEJyYW5jaChSZXBvc2l0b3J5IHN1YlJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZiBoZWFkID0gc3ViUmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CiAJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpCiAJCQlyZXR1cm4gUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShoZWFkLmdldExlYWYoKS5nZXROYW1lKCkpOwpAQCAtMTMyLDMwICsxMzIsMzEgQEAKIAkJCQkJCXBhdGgsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCwgcmVtb3RlVXJsKTsKIAkJCQlzeW5jZWQucHV0KHBhdGgsIHJlbW90ZVVybCk7CiAKLQkJCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOworCQkJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJCQlpZiAoc3ViUmVwbyA9PSBudWxsKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQogCi0JCQkJU3RvcmVkQ29uZmlnIHN1YkNvbmZpZzsKLQkJCQlTdHJpbmcgYnJhbmNoOwotCQkJCXRyeSB7CisJCQkJCVN0b3JlZENvbmZpZyBzdWJDb25maWc7CisJCQkJCVN0cmluZyBicmFuY2g7CisKIAkJCQkJc3ViQ29uZmlnID0gc3ViUmVwby5nZXRDb25maWcoKTsKIAkJCQkJLy8gR2V0IG5hbWUgb2YgcmVtb3RlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGJyYW5jaCBhbmQKIAkJCQkJLy8gZmFsbCBiYWNrIHRvIGRlZmF1bHQgcmVtb3RlIG5hbWUgYXMgbGFzdCByZXNvcnQKIAkJCQkJYnJhbmNoID0gZ2V0SGVhZEJyYW5jaChzdWJSZXBvKTsKIAkJCQkJU3RyaW5nIHJlbW90ZSA9IG51bGw7Ci0JCQkJCWlmIChicmFuY2ggIT0gbnVsbCkKKwkJCQkJaWYgKGJyYW5jaCAhPSBudWxsKSB7CiAJCQkJCQlyZW1vdGUgPSBzdWJDb25maWcuZ2V0U3RyaW5nKAogCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0JSQU5DSF9TRUNUSU9OLCBicmFuY2gsCiAJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1JFTU9URSk7Ci0JCQkJCWlmIChyZW1vdGUgPT0gbnVsbCkKKwkJCQkJfQorCQkJCQlpZiAocmVtb3RlID09IG51bGwpIHsKIAkJCQkJCXJlbW90ZSA9IENvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworCQkJCQl9CiAKIAkJCQkJc3ViQ29uZmlnLnNldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAogCQkJCQkJCXJlbW90ZSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLCByZW1vdGVVcmwpOwogCQkJCQlzdWJDb25maWcuc2F2ZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQl9CiAJCQl9CiAJCQlpZiAoIXN5bmNlZC5pc0VtcHR5KCkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVVcGRhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVVcGRhdGVDb21tYW5kLmphdmEKaW5kZXggMzM2MmQ0Ni4uMzk4ZjIxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlVXBkYXRlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtMTMyLDcgKzEzMiw3IEBACiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKiBAc2luY2UgNC45CiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgc2V0RmV0Y2goZmluYWwgYm9vbGVhbiBmZXRjaCkgeworCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kIHNldEZldGNoKGJvb2xlYW4gZmV0Y2gpIHsKIAkJdGhpcy5mZXRjaCA9IGZldGNoOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xNDQsMTEgKzE0NCw0MyBAQAogCSAqICAgICAgICAgICAgKHdpdGggPGNvZGU+LzwvY29kZT4gYXMgc2VwYXJhdG9yKQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kIGFkZFBhdGgoU3RyaW5nIHBhdGgpIHsKIAkJcGF0aHMuYWRkKHBhdGgpOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKKwlwcml2YXRlIFJlcG9zaXRvcnkgZ2V0T3JDbG9uZVN1Ym1vZHVsZShTdWJtb2R1bGVXYWxrIGdlbmVyYXRvciwgU3RyaW5nIHVybCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKKwkJUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKKwkJaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgeworCQkJaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKKwkJCQljYWxsYmFjay5jbG9uaW5nU3VibW9kdWxlKGdlbmVyYXRvci5nZXRQYXRoKCkpOworCQkJfQorCQkJQ2xvbmVDb21tYW5kIGNsb25lID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpOworCQkJY29uZmlndXJlKGNsb25lKTsKKwkJCWNsb25lLnNldFVSSSh1cmwpOworCQkJY2xvbmUuc2V0RGlyZWN0b3J5KGdlbmVyYXRvci5nZXREaXJlY3RvcnkoKSk7CisJCQljbG9uZS5zZXRHaXREaXIoCisJCQkJCW5ldyBGaWxlKG5ldyBGaWxlKHJlcG8uZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NT0RVTEVTKSwKKwkJCQkJCQlnZW5lcmF0b3IuZ2V0UGF0aCgpKSk7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQkJY2xvbmUuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOworCQkJfQorCQkJcmVwb3NpdG9yeSA9IGNsb25lLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7CisJCX0gZWxzZSBpZiAodGhpcy5mZXRjaCkgeworCQkJaWYgKGZldGNoQ2FsbGJhY2sgIT0gbnVsbCkgeworCQkJCWZldGNoQ2FsbGJhY2suZmV0Y2hpbmdTdWJtb2R1bGUoZ2VuZXJhdG9yLmdldFBhdGgoKSk7CisJCQl9CisJCQlGZXRjaENvbW1hbmQgZmV0Y2hDb21tYW5kID0gR2l0LndyYXAocmVwb3NpdG9yeSkuZmV0Y2goKTsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQlmZXRjaENvbW1hbmQuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOworCQkJfQorCQkJY29uZmlndXJlKGZldGNoQ29tbWFuZCk7CisJCQlmZXRjaENvbW1hbmQuY2FsbCgpOworCQl9CisJCXJldHVybiByZXBvc2l0b3J5OworCX0KKwogCS8qKgogCSAqIHtAaW5oZXJpdERvY30KIAkgKgpAQCAtMTc1LDM0ICsyMDcsOCBAQAogCQkJCWlmICh1cmwgPT0gbnVsbCkKIAkJCQkJY29udGludWU7CiAKLQkJCQlSZXBvc2l0b3J5IHN1Ym1vZHVsZVJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCS8vIENsb25lIHJlcG9zaXRvcnkgaWYgbm90IHByZXNlbnQKLQkJCQlpZiAoc3VibW9kdWxlUmVwbyA9PSBudWxsKSB7Ci0JCQkJCWlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0JCQkJCQljYWxsYmFjay5jbG9uaW5nU3VibW9kdWxlKGdlbmVyYXRvci5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJCUNsb25lQ29tbWFuZCBjbG9uZSA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKTsKLQkJCQkJY29uZmlndXJlKGNsb25lKTsKLQkJCQkJY2xvbmUuc2V0VVJJKHVybCk7Ci0JCQkJCWNsb25lLnNldERpcmVjdG9yeShnZW5lcmF0b3IuZ2V0RGlyZWN0b3J5KCkpOwotCQkJCQljbG9uZS5zZXRHaXREaXIobmV3IEZpbGUobmV3IEZpbGUocmVwby5nZXREaXJlY3RvcnkoKSwKLQkJCQkJCQlDb25zdGFudHMuTU9EVUxFUyksIGdlbmVyYXRvci5nZXRQYXRoKCkpKTsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJCWNsb25lLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJCQkJc3VibW9kdWxlUmVwbyA9IGNsb25lLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLmZldGNoKSB7Ci0JCQkJCWlmIChmZXRjaENhbGxiYWNrICE9IG51bGwpIHsKLQkJCQkJCWZldGNoQ2FsbGJhY2suZmV0Y2hpbmdTdWJtb2R1bGUoZ2VuZXJhdG9yLmdldFBhdGgoKSk7Ci0JCQkJCX0KLQkJCQkJRmV0Y2hDb21tYW5kIGZldGNoQ29tbWFuZCA9IEdpdC53cmFwKHN1Ym1vZHVsZVJlcG8pLmZldGNoKCk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWZldGNoQ29tbWFuZC5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY29uZmlndXJlKGZldGNoQ29tbWFuZCk7Ci0JCQkJCWZldGNoQ29tbWFuZC5jYWxsKCk7Ci0JCQkJfQotCi0JCQkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhzdWJtb2R1bGVSZXBvKSkgeworCQkJCXRyeSAoUmVwb3NpdG9yeSBzdWJtb2R1bGVSZXBvID0gZ2V0T3JDbG9uZVN1Ym1vZHVsZShnZW5lcmF0b3IsCisJCQkJCQl1cmwpOyBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhzdWJtb2R1bGVSZXBvKSkgewogCQkJCQlSZXZDb21taXQgY29tbWl0ID0gd2FsawogCQkJCQkJCS5wYXJzZUNvbW1pdChnZW5lcmF0b3IuZ2V0T2JqZWN0SWQoKSk7CiAKQEAgLTIzNyw4ICsyNDMsNiBAQAogCQkJCQkJCQkJZ2VuZXJhdG9yLmdldFBhdGgoKSk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdWJtb2R1bGVSZXBvLmNsb3NlKCk7CiAJCQkJfQogCQkJCXVwZGF0ZWQuYWRkKGdlbmVyYXRvci5nZXRQYXRoKCkpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhCmluZGV4IDljOTE1MzcuLmQzNGJiNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1RyYW5zcG9ydENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UcmFuc3BvcnRDb21tYW5kLmphdmEKQEAgLTgwLDcgKzgwLDcgQEAKIAkgKgogCSAqIEBwYXJhbSByZXBvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNwb3J0Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwcm90ZWN0ZWQgVHJhbnNwb3J0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXNldENyZWRlbnRpYWxzUHJvdmlkZXIoQ3JlZGVudGlhbHNQcm92aWRlci5nZXREZWZhdWx0KCkpOwogCX0KQEAgLTE0Nyw3ICsxNDcsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNwb3J0fSBvYmplY3QuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwcm90ZWN0ZWQgQyBjb25maWd1cmUoZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAJCWlmIChjcmVkZW50aWFsc1Byb3ZpZGVyICE9IG51bGwpCiAJCQl0cmFuc3BvcnQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKIAkJdHJhbnNwb3J0LnNldFRpbWVvdXQodGltZW91dCk7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuYXBpLlRyYW5zcG9ydENvbW1hbmR9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShmaW5hbCBUcmFuc3BvcnRDb21tYW5kIGNoaWxkQ29tbWFuZCkgeworCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShUcmFuc3BvcnRDb21tYW5kIGNoaWxkQ29tbWFuZCkgewogCQljaGlsZENvbW1hbmQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKIAkJY2hpbGRDb21tYW5kLnNldFRpbWVvdXQodGltZW91dCk7CiAJCWNoaWxkQ29tbWFuZC5zZXRUcmFuc3BvcnRDb25maWdDYWxsYmFjayh0cmFuc3BvcnRDb25maWdDYWxsYmFjayk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0Fib3J0ZWRCeUhvb2tFeGNlcHRpb24uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXB0eUNvbW1pdEV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXRweUNvbW1pdEV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQppbmRleCBlYTBlNzE4Li44N2UxYTZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQpAQCAtNDAsMzAgKzQwLDMwIEBACiAvKioKICAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIG5ld2x5IGNyZWF0ZWQgY29tbWl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGNoYW5nZXMKICAqCi0gKiBAc2luY2UgNC4yCisgKiBAc2luY2UgNS4wCiAgKi8KLXB1YmxpYyBjbGFzcyBFbXRweUNvbW1pdEV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7IC8vIFRPRE86IENvcnJlY3Qgc3BlbGxpbmcgb2YgdGhpcyBjbGFzcyBuYW1lIGluIDUuMAorcHVibGljIGNsYXNzIEVtcHR5Q29tbWl0RXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbXRweUNvbW1pdEV4Y2VwdGlvbgorCSAqIENvbnN0cnVjdG9yIGZvciBFbXB0eUNvbW1pdEV4Y2VwdGlvbgogCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGV9CiAJICovCi0JcHVibGljIEVtdHB5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgRW1wdHlDb21taXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAJfQogCiAJLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtdHB5Q29tbWl0RXhjZXB0aW9uLgorCSAqIENvbnN0cnVjdG9yIGZvciBFbXB0eUNvbW1pdEV4Y2VwdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCiAJICovCi0JcHVibGljIEVtdHB5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIEVtcHR5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CiAJCXN1cGVyKG1lc3NhZ2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9TdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKaW5kZXggNTE3YjUxMi4uYjEyYzAzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKQEAgLTI2LDcgKzI2LDcgQEAKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBTdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyBTdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YQppbmRleCAyZWIzMTNmLi4xMDY3Mzc4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL1JldmVyc2VXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9SZXZlcnNlV2Fsay5qYXZhCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJCXJldHVybiBjaGlsZHJlbi5sZW5ndGg7CiAJCX0KIAotCQlSZXZlcnNlQ29tbWl0IGdldENoaWxkKGZpbmFsIGludCBudGgpIHsKKwkJUmV2ZXJzZUNvbW1pdCBnZXRDaGlsZChpbnQgbnRoKSB7CiAJCQlyZXR1cm4gY2hpbGRyZW5bbnRoXTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhCmluZGV4IDA2M2NlZmYuLjIxZGNhNmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZDb25maWcuamF2YQpAQCAtNzYsNyArNzYsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBpbnQgcmVuYW1lTGltaXQ7CiAKLQlwcml2YXRlIERpZmZDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBEaWZmQ29uZmlnKENvbmZpZyByYykgewogCQlub1ByZWZpeCA9IHJjLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGX1NFQ1RJT04sCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfTk9QUkVGSVgsIGZhbHNlKTsKIAkJcmVuYW1lRGV0ZWN0aW9uVHlwZSA9IHBhcnNlUmVuYW1lRGV0ZWN0aW9uVHlwZShyYy5nZXRTdHJpbmcoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQppbmRleCAyZTI5YjgxLi43YWFhNTAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKQEAgLTIyMiw3ICsyMjIsNyBAQAogCSAqICAgICAgICAgICAgbW9kaWZpY2F0aW9uIGFuZCBhZnRlciB0aGUgbGFzdCBtb2RpZmljYXRpb24gd2l0aGluIGEgaHVuayBvZgogCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIGZpbGUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChmaW5hbCBpbnQgbGluZUNvdW50KSB7CisJcHVibGljIHZvaWQgc2V0Q29udGV4dChpbnQgbGluZUNvdW50KSB7CiAJCWlmIChsaW5lQ291bnQgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuY29udGV4dE11c3RCZU5vbk5lZ2F0aXZlKTsKQEAgLTIzNSw3ICsyMzUsNyBAQAogCSAqIEBwYXJhbSBjb3VudAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGRpZ2l0cyB0byBzaG93IGluIGFuIE9iamVjdElkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEFiYnJldmlhdGlvbkxlbmd0aChmaW5hbCBpbnQgY291bnQpIHsKKwlwdWJsaWMgdm9pZCBzZXRBYmJyZXZpYXRpb25MZW5ndGgoaW50IGNvdW50KSB7CiAJCWlmIChjb3VudCA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5hYmJyZXZpYXRpb25MZW5ndGhNdXN0QmVOb25OZWdhdGl2ZSk7CkBAIC03NDIsNyArNzQyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB3cml0aW5nIHRvIHRoZSBzdXBwbGllZCBzdHJlYW0gZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChmaW5hbCBGaWxlSGVhZGVyIGhlYWQsIGZpbmFsIFJhd1RleHQgYSwgZmluYWwgUmF3VGV4dCBiKQorCXB1YmxpYyB2b2lkIGZvcm1hdChGaWxlSGVhZGVyIGhlYWQsIFJhd1RleHQgYSwgUmF3VGV4dCBiKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gUmV1c2UgdGhlIGV4aXN0aW5nIEZpbGVIZWFkZXIgYXMtaXMgYnkgYmxpbmRseSBjb3B5aW5nIGl0cwogCQkvLyBoZWFkZXIgbGluZXMsIGJ1dCBhdm9pZGluZyBpdHMgaHVua3MuIEluc3RlYWQgd2UgcmVjcmVhdGUKQEAgLTc2OCw3ICs3NjgsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHRleHQgQiB3aGljaCB3YXMgY29tcGFyZWQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoZmluYWwgRWRpdExpc3QgZWRpdHMsIGZpbmFsIFJhd1RleHQgYSwgZmluYWwgUmF3VGV4dCBiKQorCXB1YmxpYyB2b2lkIGZvcm1hdChFZGl0TGlzdCBlZGl0cywgUmF3VGV4dCBhLCBSYXdUZXh0IGIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmb3IgKGludCBjdXJJZHggPSAwOyBjdXJJZHggPCBlZGl0cy5zaXplKCk7KSB7CiAJCQlFZGl0IGN1ckVkaXQgPSBlZGl0cy5nZXQoY3VySWR4KTsKQEAgLTgxNiwxMiArODE2LDEyIEBACiAJICogICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2l0aGluIHRleHQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnRleHRMaW5lKGZpbmFsIFJhd1RleHQgdGV4dCwgZmluYWwgaW50IGxpbmUpCisJcHJvdGVjdGVkIHZvaWQgd3JpdGVDb250ZXh0TGluZShSYXdUZXh0IHRleHQsIGludCBsaW5lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd3JpdGVMaW5lKCcgJywgdGV4dCwgbGluZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VuZE9mTGluZU1pc3NpbmcoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbmRPZkxpbmVNaXNzaW5nKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpIHsKIAkJcmV0dXJuIGxpbmUgKyAxID09IHRleHQuc2l6ZSgpICYmIHRleHQuaXNNaXNzaW5nTmV3bGluZUF0RW5kKCk7CiAJfQogCkBAIC04MzQsNyArODM0LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlQWRkZWRMaW5lKGZpbmFsIFJhd1RleHQgdGV4dCwgZmluYWwgaW50IGxpbmUpCisJcHJvdGVjdGVkIHZvaWQgd3JpdGVBZGRlZExpbmUoUmF3VGV4dCB0ZXh0LCBpbnQgbGluZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlTGluZSgnKycsIHRleHQsIGxpbmUpOwogCX0KQEAgLTg0OCw3ICs4NDgsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdpdGhpbiB0ZXh0CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVSZW1vdmVkTGluZShmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKQorCXByb3RlY3RlZCB2b2lkIHdyaXRlUmVtb3ZlZExpbmUoUmF3VGV4dCB0ZXh0LCBpbnQgbGluZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlTGluZSgnLScsIHRleHQsIGxpbmUpOwogCX0KQEAgLTg3OCw3ICs4NzgsNyBAQAogCQlvdXQud3JpdGUoJ1xuJyk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHdyaXRlUmFuZ2UoZmluYWwgY2hhciBwcmVmaXgsIGZpbmFsIGludCBiZWdpbiwgZmluYWwgaW50IGNudCkKKwlwcml2YXRlIHZvaWQgd3JpdGVSYW5nZShjaGFyIHByZWZpeCwgaW50IGJlZ2luLCBpbnQgY250KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0LndyaXRlKCcgJyk7CiAJCW91dC53cml0ZShwcmVmaXgpOwpAQCAtMTIxMyw3ICsxMjEzLDcgQEAKIAkJby53cml0ZShlbmNvZGUoIisrKyAiICsgbmV3cCArICJcbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBpbnQgZmluZENvbWJpbmVkRW5kKGZpbmFsIExpc3Q8RWRpdD4gZWRpdHMsIGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBpbnQgZmluZENvbWJpbmVkRW5kKExpc3Q8RWRpdD4gZWRpdHMsIGludCBpKSB7CiAJCWludCBlbmQgPSBpICsgMTsKIAkJd2hpbGUgKGVuZCA8IGVkaXRzLnNpemUoKQogCQkJCSYmIChjb21iaW5lQShlZGl0cywgZW5kKSB8fCBjb21iaW5lQihlZGl0cywgZW5kKSkpCkBAIC0xMjIxLDE1ICsxMjIxLDE1IEBACiAJCXJldHVybiBlbmQgLSAxOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQShmaW5hbCBMaXN0PEVkaXQ+IGUsIGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVBKExpc3Q8RWRpdD4gZSwgaW50IGkpIHsKIAkJcmV0dXJuIGUuZ2V0KGkpLmdldEJlZ2luQSgpIC0gZS5nZXQoaSAtIDEpLmdldEVuZEEoKSA8PSAyICogY29udGV4dDsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gY29tYmluZUIoZmluYWwgTGlzdDxFZGl0PiBlLCBmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQihMaXN0PEVkaXQ+IGUsIGludCBpKSB7CiAJCXJldHVybiBlLmdldChpKS5nZXRCZWdpbkIoKSAtIGUuZ2V0KGkgLSAxKS5nZXRFbmRCKCkgPD0gMiAqIGNvbnRleHQ7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmQoZmluYWwgRWRpdCBlZGl0LCBmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuZChFZGl0IGVkaXQsIGludCBhLCBpbnQgYikgewogCQlyZXR1cm4gZWRpdC5nZXRFbmRBKCkgPD0gYSAmJiBlZGl0LmdldEVuZEIoKSA8PSBiOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9FZGl0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRWRpdC5qYXZhCmluZGV4IDc3NWQxMWEuLjVjODc2ZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9FZGl0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YQpAQCAtOTQsNyArOTQsNyBAQAogCSAqIEBwYXJhbSBicwogCSAqICAgICAgICAgICAgYmVnaW5COiBzdGFydCBhbmQgZW5kIG9mIHJlZ2lvbiBpbiBzZXF1ZW5jZSBCOyAwIGJhc2VkLgogCSAqLwotCXB1YmxpYyBFZGl0KGZpbmFsIGludCBhcywgZmluYWwgaW50IGJzKSB7CisJcHVibGljIEVkaXQoaW50IGFzLCBpbnQgYnMpIHsKIAkJdGhpcyhhcywgYXMsIGJzLCBicyk7CiAJfQogCkBAIC0xMTAsNyArMTEwLDcgQEAKIAkgKiBAcGFyYW0gYmUKIAkgKiAgICAgICAgICAgIGVuZEI6IGVuZCBvZiByZWdpb24gaW4gc2VxdWVuY2UgQjsgbXVzdCBiZSAmZ3Q7ID0gYnMuCiAJICovCi0JcHVibGljIEVkaXQoZmluYWwgaW50IGFzLCBmaW5hbCBpbnQgYWUsIGZpbmFsIGludCBicywgZmluYWwgaW50IGJlKSB7CisJcHVibGljIEVkaXQoaW50IGFzLCBpbnQgYWUsIGludCBicywgaW50IGJlKSB7CiAJCWJlZ2luQSA9IGFzOwogCQllbmRBID0gYWU7CiAKQEAgLTI3OSw3ICsyNzksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJaWYgKG8gaW5zdGFuY2VvZiBFZGl0KSB7CiAJCQlmaW5hbCBFZGl0IGUgPSAoRWRpdCkgbzsKIAkJCXJldHVybiB0aGlzLmJlZ2luQSA9PSBlLmJlZ2luQSAmJiB0aGlzLmVuZEEgPT0gZS5lbmRBCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvSGlzdG9ncmFtRGlmZkluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvSGlzdG9ncmFtRGlmZkluZGV4LmphdmEKaW5kZXggMDRjNzlmYy4uM2Y4MTNkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9IaXN0b2dyYW1EaWZmSW5kZXguamF2YQpAQCAtMjMwLDcgKzIzMCw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgaW50IHRyeUxvbmdlc3RDb21tb25TZXF1ZW5jZShmaW5hbCBpbnQgYlB0cikgeworCXByaXZhdGUgaW50IHRyeUxvbmdlc3RDb21tb25TZXF1ZW5jZShpbnQgYlB0cikgewogCQlpbnQgYk5leHQgPSBiUHRyICsgMTsKIAkJaW50IHJJZHggPSB0YWJsZVtoYXNoKGIsIGJQdHIpXTsKIAkJZm9yIChsb25nIHJlYzsgcklkeCAhPSAwOyBySWR4ID0gcmVjTmV4dChyZWMpKSB7CkBAIC0zMjgsNyArMzI4LDcgQEAKIAkJcmV0dXJuICgoaW50KSByZWMpICYgUkVDX0NOVF9NQVNLOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZUJpdHMoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhpbnQgc3opIHsKIAkJaW50IGJpdHMgPSAzMSAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3Moc3opOwogCQlpZiAoYml0cyA9PSAwKQogCQkJYml0cyA9IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvTXllcnNEaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvTXllcnNEaWZmLmphdmEKaW5kZXggNjQ2ZjI2NC4uY2FhZmZlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL015ZXJzRGlmZi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YQpAQCAtMzU5LDcgKzM1OSw3IEBACiAJCQlhYnN0cmFjdCBpbnQgZ2V0TGVmdChpbnQgeCk7CiAJCQlhYnN0cmFjdCBpbnQgZ2V0UmlnaHQoaW50IHgpOwogCQkJYWJzdHJhY3QgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KTsKLQkJCWFic3RyYWN0IHZvaWQgYWRqdXN0TWluTWF4SyhmaW5hbCBpbnQgaywgZmluYWwgaW50IHgpOworCQkJYWJzdHJhY3Qgdm9pZCBhZGp1c3RNaW5NYXhLKGludCBrLCBpbnQgeCk7CiAJCQlhYnN0cmFjdCBib29sZWFuIG1lZXRzKGludCBkLCBpbnQgaywgaW50IHgsIGxvbmcgc25ha2UpOwogCiAJCQlmaW5hbCBsb25nIG5ld1NuYWtlKGludCBrLCBpbnQgeCkgewpAQCAtNDY5LDIyICs0NjksMjIgQEAKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBpbnQgZ2V0TGVmdChmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgaW50IGdldExlZnQoaW50IHgpIHsKIAkJCQlyZXR1cm4geDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBpbnQgZ2V0UmlnaHQoZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIGludCBnZXRSaWdodChpbnQgeCkgewogCQkJCXJldHVybiB4ICsgMTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBib29sZWFuIGlzQmV0dGVyKGZpbmFsIGludCBsZWZ0LCBmaW5hbCBpbnQgcmlnaHQpIHsKKwkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoaW50IGxlZnQsIGludCByaWdodCkgewogCQkJCXJldHVybiBsZWZ0ID4gcmlnaHQ7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgdm9pZCBhZGp1c3RNaW5NYXhLKGZpbmFsIGludCBrLCBmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgdm9pZCBhZGp1c3RNaW5NYXhLKGludCBrLCBpbnQgeCkgewogCQkJCWlmICh4ID49IGVuZEEgfHwgayArIHggPj0gZW5kQikgewogCQkJCQlpZiAoayA+IGJhY2t3YXJkLm1pZGRsZUspCiAJCQkJCQltYXhLID0gazsKQEAgLTUxNywyMiArNTE3LDIyIEBACiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgaW50IGdldExlZnQoZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIGludCBnZXRMZWZ0KGludCB4KSB7CiAJCQkJcmV0dXJuIHggLSAxOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRSaWdodChmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgaW50IGdldFJpZ2h0KGludCB4KSB7CiAJCQkJcmV0dXJuIHg7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihmaW5hbCBpbnQgbGVmdCwgZmluYWwgaW50IHJpZ2h0KSB7CisJCQlmaW5hbCBib29sZWFuIGlzQmV0dGVyKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKIAkJCQlyZXR1cm4gbGVmdCA8IHJpZ2h0OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIHZvaWQgYWRqdXN0TWluTWF4SyhmaW5hbCBpbnQgaywgZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIHZvaWQgYWRqdXN0TWluTWF4SyhpbnQgaywgaW50IHgpIHsKIAkJCQlpZiAoeCA8PSBiZWdpbkEgfHwgayArIHggPD0gYmVnaW5CKSB7CiAJCQkJCWlmIChrID4gZm9yd2FyZC5taWRkbGVLKQogCQkJCQkJbWF4SyA9IGs7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQppbmRleCBlYzg4Y2U0Li5iZDQxZDkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKQEAgLTg4LDEyICs4OCwyOSBAQAogCSAqIFRoZSBlbnRpcmUgYXJyYXkgKGluZGV4ZXMgMCB0aHJvdWdoIGxlbmd0aC0xKSBpcyB1c2VkIGFzIHRoZSBjb250ZW50LgogCSAqCiAJICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICB0aGUgY29udGVudCBhcnJheS4gVGhlIGFycmF5IGlzIG5ldmVyIG1vZGlmaWVkLCBzbyBwYXNzaW5nCi0JICogICAgICAgICAgICB0aHJvdWdoIGNhY2hlZCBhcnJheXMgaXMgc2FmZS4KKwkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IGFycmF5LiBUaGUgb2JqZWN0IHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhpcworCSAqICAgICAgICAgICAgYXJyYXksIHNvIGl0IHNob3VsZCBiZSBpbW11dGFibGUuCiAJICovCi0JcHVibGljIFJhd1RleHQoZmluYWwgYnl0ZVtdIGlucHV0KSB7CisJcHVibGljIFJhd1RleHQoYnl0ZVtdIGlucHV0KSB7CisJCXRoaXMoaW5wdXQsIFJhd1BhcnNlVXRpbHMubGluZU1hcChpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHNlcXVlbmNlIGZyb20gdGhlIGV4aXN0aW5nIGNvbnRlbnQgYnl0ZSBhcnJheSBhbmQgdGhlIGxpbmUKKwkgKiBtYXAgaW5kaWNhdGluZyBsaW5lIGJvdW5kYXJpZXMuCisJICoKKwkgKiBAcGFyYW0gaW5wdXQKKwkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IGFycmF5LiBUaGUgb2JqZWN0IHJldGFpbnMgYSByZWZlcmVuY2UgdG8gdGhpcworCSAqICAgICAgICAgICAgYXJyYXksIHNvIGl0IHNob3VsZCBiZSBpbW11dGFibGUuCisJICogQHBhcmFtIGxpbmVNYXAKKwkgKiAgICAgICAgICAgIGFuIGFycmF5IHdpdGggMS1iYXNlZCBvZmZzZXRzIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBsaW5lLgorCSAqICAgICAgICAgICAgVGhlIGZpcnN0IGFuZCBsYXN0IGVudHJpZXMgc2hvdWxkIGJlIHtAbGluayBJbnRlZ2VyI01JTl9WQUxVRX0KKwkgKiAgICAgICAgICAgIGFuZCBhbiBvZmZzZXQgb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGFzdCBsaW5lLCByZXNwZWN0aXZlbHkuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBSYXdUZXh0KGJ5dGVbXSBpbnB1dCwgSW50TGlzdCBsaW5lTWFwKSB7CiAJCWNvbnRlbnQgPSBpbnB1dDsKLQkJbGluZXMgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAoY29udGVudCwgMCwgY29udGVudC5sZW5ndGgpOworCQlsaW5lcyA9IGxpbmVNYXA7CiAJfQogCiAJLyoqCkBAIC0xNDcsNyArMTY0LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRlIG9wZXJhdGlvbiBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGVMaW5lKGZpbmFsIE91dHB1dFN0cmVhbSBvdXQsIGZpbmFsIGludCBpKQorCXB1YmxpYyB2b2lkIHdyaXRlTGluZShPdXRwdXRTdHJlYW0gb3V0LCBpbnQgaSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCBzdGFydCA9IGdldFN0YXJ0KGkpOwogCQlpbnQgZW5kID0gZ2V0RW5kKGkpOwpAQCAtMjIxLDExICsyMzgsMTEgQEAKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKGNvbnRlbnQsIHN0YXJ0LCBlbmQpOwogCX0KIAotCXByaXZhdGUgaW50IGdldFN0YXJ0KGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBpbnQgZ2V0U3RhcnQoaW50IGkpIHsKIAkJcmV0dXJuIGxpbmVzLmdldChpICsgMSk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0RW5kKGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBpbnQgZ2V0RW5kKGludCBpKSB7CiAJCXJldHVybiBsaW5lcy5nZXQoaSArIDIpOwogCX0KIApAQCAtMzI1LDcgKzM0Miw4IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgdGhlIGlucHV0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmF3VGV4dCBsb2FkKE9iamVjdExvYWRlciBsZHIsIGludCB0aHJlc2hvbGQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQmluYXJ5QmxvYkV4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBSYXdUZXh0IGxvYWQoT2JqZWN0TG9hZGVyIGxkciwgaW50IHRocmVzaG9sZCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQmluYXJ5QmxvYkV4Y2VwdGlvbiB7CiAJCWxvbmcgc3ogPSBsZHIuZ2V0U2l6ZSgpOwogCiAJCWlmIChzeiA+IHRocmVzaG9sZCkgewpAQCAtMzY5LDcgKzM4Nyw3IEBACiAKIAkJCVN5c3RlbS5hcnJheWNvcHkoaGVhZCwgMCwgZGF0YSwgMCwgaGVhZC5sZW5ndGgpOwogCQkJSU8ucmVhZEZ1bGx5KHN0cmVhbSwgZGF0YSwgb2ZmLCAoaW50KSAoc3otb2ZmKSk7Ci0JCQlyZXR1cm4gbmV3IFJhd1RleHQoZGF0YSk7CisJCQlyZXR1cm4gbmV3IFJhd1RleHQoZGF0YSwgUmF3UGFyc2VVdGlscy5saW5lTWFwT3JCaW5hcnkoZGF0YSwgMCwgKGludCkgc3opKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0Q29tcGFyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKaW5kZXggZWQyZWViYi4uMWU2OGMyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZm9yICg7IHB0ciA8IGVuZDsgcHRyKyspCiAJCQkJaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgKHJhd1twdHJdICYgMHhmZik7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJcHRyID0gdHJpbUxlYWRpbmdXaGl0ZXNwYWNlKHJhdywgcHRyLCBlbmQpOwogCQkJZm9yICg7IHB0ciA8IGVuZDsgcHRyKyspCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZW5kID0gdHJpbVRyYWlsaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKKwkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKIAkJCWludCBoYXNoID0gNTM4MTsKIAkJCWVuZCA9IHRyaW1UcmFpbGluZ1doaXRlc3BhY2UocmF3LCBwdHIsIGVuZCk7CiAJCQl3aGlsZSAocHRyIDwgZW5kKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4LmphdmEKaW5kZXggOGI0ZDJlYy4uNTg5N2ZmYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YQpAQCAtMTQ3LDIzICsxNDcsMTcgQEAKIAogCXByaXZhdGUgdm9pZCBoYXNoTGFyZ2VPYmplY3QoT2JqZWN0TG9hZGVyIG9iaikgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJVGFibGVGdWxsRXhjZXB0aW9uIHsKLQkJT2JqZWN0U3RyZWFtIGluMSA9IG9iai5vcGVuU3RyZWFtKCk7CiAJCWJvb2xlYW4gdGV4dDsKLQkJdHJ5IHsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4xID0gb2JqLm9wZW5TdHJlYW0oKSkgewogCQkJdGV4dCA9ICFSYXdUZXh0LmlzQmluYXJ5KGluMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbjEuY2xvc2UoKTsKIAkJfQogCi0JCU9iamVjdFN0cmVhbSBpbjIgPSBvYmoub3BlblN0cmVhbSgpOwotCQl0cnkgeworCQl0cnkgKE9iamVjdFN0cmVhbSBpbjIgPSBvYmoub3BlblN0cmVhbSgpKSB7CiAJCQloYXNoKGluMiwgaW4yLmdldFNpemUoKSwgdGV4dCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbjIuY2xvc2UoKTsKIAkJfQogCX0KIAotCXZvaWQgaGFzaChieXRlW10gcmF3LCBpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB0aHJvd3MgVGFibGVGdWxsRXhjZXB0aW9uIHsKKwl2b2lkIGhhc2goYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgdGhyb3dzIFRhYmxlRnVsbEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGJvb2xlYW4gdGV4dCA9ICFSYXdUZXh0LmlzQmluYXJ5KHJhdyk7CiAJCWhhc2hlZENudCA9IDA7CiAJCXdoaWxlIChwdHIgPCBlbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvQmFzZURpckNhY2hlRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0Jhc2VEaXJDYWNoZUVkaXRvci5qYXZhCmluZGV4IDAyMjhmNGQuLmFhMjI5ZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvQmFzZURpckNhY2hlRWRpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YQpAQCAtODUsNyArODUsNyBAQAogCSAqICAgICAgICAgICAgZXN0aW1hdGVkIG51bWJlciBvZiBlbnRyaWVzIHRoZSBlZGl0b3Igd2lsbCBoYXZlIHVwb24KIAkgKiAgICAgICAgICAgIGNvbXBsZXRpb24uIFRoaXMgc2l6ZXMgdGhlIGluaXRpYWwgZW50cnkgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIEJhc2VEaXJDYWNoZUVkaXRvcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgQmFzZURpckNhY2hlRWRpdG9yKERpckNhY2hlIGRjLCBpbnQgZWNudCkgewogCQljYWNoZSA9IGRjOwogCQllbnRyaWVzID0gbmV3IERpckNhY2hlRW50cnlbZWNudF07CiAJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJICogQHBhcmFtIG5ld0VudHJ5CiAJICogICAgICAgICAgICB0aGUgbmV3IGVudHJ5IHRvIGFkZC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmYXN0QWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmYXN0QWRkKERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkJaWYgKGVudHJpZXMubGVuZ3RoID09IGVudHJ5Q250KSB7CiAJCQlmaW5hbCBEaXJDYWNoZUVudHJ5W10gbiA9IG5ldyBEaXJDYWNoZUVudHJ5WyhlbnRyeUNudCArIDE2KSAqIDMgLyAyXTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgMCwgbiwgMCwgZW50cnlDbnQpOwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJICogQHBhcmFtIGNudAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgdG8gY29weS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmYXN0S2VlcChmaW5hbCBpbnQgcG9zLCBpbnQgY250KSB7CisJcHJvdGVjdGVkIHZvaWQgZmFzdEtlZXAoaW50IHBvcywgaW50IGNudCkgewogCQlpZiAoZW50cnlDbnQgKyBjbnQgPiBlbnRyaWVzLmxlbmd0aCkgewogCQkJZmluYWwgaW50IG0xID0gKGVudHJ5Q250ICsgMTYpICogMyAvIDI7CiAJCQlmaW5hbCBpbnQgbTIgPSBlbnRyeUNudCArIGNudDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGUuamF2YQppbmRleCBjYzQzMWRiLi4xNDY1M2ZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhCkBAIC00NSwxNiArNDUsMTYgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlOwogCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOworCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtODcsNiArODcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5NdXRhYmxlSW50ZWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuTkI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlRlbXBvcmFyeUJ1ZmZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiAvKioKICAqIFN1cHBvcnQgZm9yIHRoZSBHaXQgZGlyY2FjaGUgKGFrYSBpbmRleCBmaWxlKS4KQEAgLTExMiw3ICsxMTMsNyBAQAogCiAJc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8RGlyQ2FjaGVFbnRyeT4gRU5UX0NNUCA9IG5ldyBDb21wYXJhdG9yPERpckNhY2hlRW50cnk+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIERpckNhY2hlRW50cnkgbzEsIGZpbmFsIERpckNhY2hlRW50cnkgbzIpIHsKKwkJcHVibGljIGludCBjb21wYXJlKERpckNhY2hlRW50cnkgbzEsIERpckNhY2hlRW50cnkgbzIpIHsKIAkJCWZpbmFsIGludCBjciA9IGNtcChvMSwgbzIpOwogCQkJaWYgKGNyICE9IDApCiAJCQkJcmV0dXJuIGNyOwpAQCAtMTIwLDExICsxMjEsMTEgQEAKIAkJfQogCX07CiAKLQlzdGF0aWMgaW50IGNtcChmaW5hbCBEaXJDYWNoZUVudHJ5IGEsIGZpbmFsIERpckNhY2hlRW50cnkgYikgeworCXN0YXRpYyBpbnQgY21wKERpckNhY2hlRW50cnkgYSwgRGlyQ2FjaGVFbnRyeSBiKSB7CiAJCXJldHVybiBjbXAoYS5wYXRoLCBhLnBhdGgubGVuZ3RoLCBiKTsKIAl9CiAKLQlzdGF0aWMgaW50IGNtcChmaW5hbCBieXRlW10gYVBhdGgsIGZpbmFsIGludCBhTGVuLCBmaW5hbCBEaXJDYWNoZUVudHJ5IGIpIHsKKwlzdGF0aWMgaW50IGNtcChieXRlW10gYVBhdGgsIGludCBhTGVuLCBEaXJDYWNoZUVudHJ5IGIpIHsKIAkJcmV0dXJuIGNtcChhUGF0aCwgYUxlbiwgYi5wYXRoLCBiLnBhdGgubGVuZ3RoKTsKIAl9CiAKQEAgLTE4OCw3ICsxODksNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGlzIHVzaW5nIGEgZm9ybWF0IG9yIGV4dGVuc2lvbiB0aGF0IHRoaXMKIAkgKiAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBEaXJDYWNoZSByZWFkKGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkKKwlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoUmVwb3NpdG9yeSByZXBvc2l0b3J5KQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgYyA9IHJlYWQocmVwb3NpdG9yeS5nZXRJbmRleEZpbGUoKSwgcmVwb3NpdG9yeS5nZXRGUygpKTsKIAkJYy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKQEAgLTIxNSw3ICsyMTYsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGlzIHVzaW5nIGEgZm9ybWF0IG9yIGV4dGVuc2lvbiB0aGF0IHRoaXMKIAkgKiAgICAgICAgICAgICBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBEaXJDYWNoZSByZWFkKGZpbmFsIEZpbGUgaW5kZXhMb2NhdGlvbiwgZmluYWwgRlMgZnMpCisJcHVibGljIHN0YXRpYyBEaXJDYWNoZSByZWFkKEZpbGUgaW5kZXhMb2NhdGlvbiwgRlMgZnMpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBjID0gbmV3IERpckNhY2hlKGluZGV4TG9jYXRpb24sIGZzKTsKIAkJYy5yZWFkKCk7CkBAIC0yNDQsNyArMjQ1LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBpcyB1c2luZyBhIGZvcm1hdCBvciBleHRlbnNpb24gdGhhdCB0aGlzCiAJICogICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgbG9jayhmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgbG9jayhGaWxlIGluZGV4TG9jYXRpb24sIEZTIGZzKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgYyA9IG5ldyBEaXJDYWNoZShpbmRleExvY2F0aW9uLCBmcyk7CiAJCWlmICghYy5sb2NrKCkpCkBAIC0zNzIsNyArMzczLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCiAJICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCiAJICovCi0JcHVibGljIERpckNhY2hlKGZpbmFsIEZpbGUgaW5kZXhMb2NhdGlvbiwgZmluYWwgRlMgZnMpIHsKKwlwdWJsaWMgRGlyQ2FjaGUoRmlsZSBpbmRleExvY2F0aW9uLCBGUyBmcykgewogCQlsaXZlRmlsZSA9IGluZGV4TG9jYXRpb247CiAJCWNsZWFyKCk7CiAJfQpAQCAtNDAzLDcgKzQwNCw3IEBACiAJCXJldHVybiBuZXcgRGlyQ2FjaGVFZGl0b3IodGhpcywgZW50cnlDbnQgKyAxNik7CiAJfQogCi0Jdm9pZCByZXBsYWNlKGZpbmFsIERpckNhY2hlRW50cnlbXSBlLCBmaW5hbCBpbnQgY250KSB7CisJdm9pZCByZXBsYWNlKERpckNhY2hlRW50cnlbXSBlLCBpbnQgY250KSB7CiAJCXNvcnRlZEVudHJpZXMgPSBlOwogCQllbnRyeUNudCA9IGNudDsKIAkJdHJlZSA9IG51bGw7CkBAIC00MjksMTggKzQzMCwxMCBAQAogCQlpZiAoIWxpdmVGaWxlLmV4aXN0cygpKQogCQkJY2xlYXIoKTsKIAkJZWxzZSBpZiAoc25hcHNob3QgPT0gbnVsbCB8fCBzbmFwc2hvdC5pc01vZGlmaWVkKGxpdmVGaWxlKSkgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxpdmVGaWxlKTsKLQkJCQl0cnkgewotCQkJCQljbGVhcigpOwotCQkJCQlyZWFkRnJvbShpblN0cmVhbSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKLQkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgZmFpbHVyZXMuCi0JCQkJCX0KLQkJCQl9CisJCQl0cnkgKFNpbGVudEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0oCisJCQkJCWxpdmVGaWxlKSkgeworCQkJCWNsZWFyKCk7CisJCQkJcmVhZEZyb20oaW5TdHJlYW0pOwogCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKIAkJCQlpZiAobGl2ZUZpbGUuZXhpc3RzKCkpIHsKIAkJCQkJLy8gUGFuaWM6IHRoZSBpbmRleCBmaWxlIGV4aXN0cyBidXQgd2UgY2FuJ3QgcmVhZCBpdApAQCAtNDgwLDcgKzQ3Myw3IEBACiAJCXJlYWRJbmRleENoZWNrc3VtID0gTk9fQ0hFQ0tTVU07CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSB2b2lkIHJlYWRGcm9tKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluU3RyZWFtKTsKIAkJZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7CkBAIC01ODgsMTIgKzU4MSwxMSBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEV4dGVuc2lvbk5hbWUoZmluYWwgYnl0ZVtdIGhkcikKLQkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuICInIiArIG5ldyBTdHJpbmcoaGRyLCAwLCA0LCAiSVNPLTg4NTktMSIpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRFeHRlbnNpb25OYW1lKGJ5dGVbXSBoZHIpIHsKKwkJcmV0dXJuICInIiArIG5ldyBTdHJpbmcoaGRyLCAwLCA0LCBJU09fODg1OV8xKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc19ESVJDKGZpbmFsIGJ5dGVbXSBoZHIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzX0RJUkMoYnl0ZVtdIGhkcikgewogCQlpZiAoaGRyLmxlbmd0aCA8IFNJR19ESVJDLmxlbmd0aCkKIAkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdfRElSQy5sZW5ndGg7IGkrKykKQEAgLTY1Niw3ICs2NDgsNyBAQAogCQl9CiAJfQogCi0Jdm9pZCB3cml0ZVRvKEZpbGUgZGlyLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZVRvKEZpbGUgZGlyLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgZm9vdCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7CiAJCWZpbmFsIERpZ2VzdE91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGlnZXN0T3V0cHV0U3RyZWFtKG9zLCBmb290KTsKIApAQCAtNzEwLDYgKzcwMiw4IEBACiAJCX0KIAogCQlpZiAod3JpdGVUcmVlKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBFeHBsaWNpdGx5IGNsb3NlZCBpbiB0cnkgYmxvY2ssIGFuZAorCQkJCQkJCQkJCQkvLyBkZXN0cm95ZWQgaW4gZmluYWxseQogCQkJVGVtcG9yYXJ5QnVmZmVyIGJiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUoZGlyLCA1IDw8IDIwKTsKIAkJCXRyeSB7CiAJCQkJdHJlZS53cml0ZSh0bXAsIGJiKTsKQEAgLTc0MywxNiArNzM3LDE4IEBACiAJCWZpbmFsIExvY2tGaWxlIHRtcCA9IG15TG9jazsKIAkJcmVxdWlyZUxvY2tlZCh0bXApOwogCQlteUxvY2sgPSBudWxsOwotCQlpZiAoIXRtcC5jb21taXQoKSkKKwkJaWYgKCF0bXAuY29tbWl0KCkpIHsKIAkJCXJldHVybiBmYWxzZTsKKwkJfQogCQlzbmFwc2hvdCA9IHRtcC5nZXRDb21taXRTbmFwc2hvdCgpOwogCQlpZiAoaW5kZXhDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmICFBcnJheXMuZXF1YWxzKHJlYWRJbmRleENoZWNrc3VtLCB3cml0ZUluZGV4Q2hlY2tzdW0pKQotCQkJaW5kZXhDaGFuZ2VkTGlzdGVuZXIub25JbmRleENoYW5nZWQobmV3IEluZGV4Q2hhbmdlZEV2ZW50KCkpOworCQkJCSYmICFBcnJheXMuZXF1YWxzKHJlYWRJbmRleENoZWNrc3VtLCB3cml0ZUluZGV4Q2hlY2tzdW0pKSB7CisJCQlpbmRleENoYW5nZWRMaXN0ZW5lci5vbkluZGV4Q2hhbmdlZChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQodHJ1ZSkpOworCQl9CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgdm9pZCByZXF1aXJlTG9ja2VkKGZpbmFsIExvY2tGaWxlIHRtcCkgeworCXByaXZhdGUgdm9pZCByZXF1aXJlTG9ja2VkKExvY2tGaWxlIHRtcCkgewogCQlpZiAobGl2ZUZpbGUgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuZGlyQ2FjaGVJc05vdExvY2tlZCk7CiAJCWlmICh0bXAgPT0gbnVsbCkKQEAgLTc4Myw3ICs3NzksNyBAQAogCSAqICAgICAgICAgdGhlIGluZGV4OyBwYXNzIHRvIHtAbGluayAjZ2V0RW50cnkoaW50KX0gdG8gb2J0YWluIHRoZSBlbnRyeQogCSAqICAgICAgICAgaW5mb3JtYXRpb24uIElmICZsdDsgMCB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGluZGV4LgogCSAqLwotCXB1YmxpYyBpbnQgZmluZEVudHJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIGludCBmaW5kRW50cnkoU3RyaW5nIHBhdGgpIHsKIAkJZmluYWwgYnl0ZVtdIHAgPSBDb25zdGFudHMuZW5jb2RlKHBhdGgpOwogCQlyZXR1cm4gZmluZEVudHJ5KHAsIHAubGVuZ3RoKTsKIAl9CkBAIC04MzksNyArODM1LDcgQEAKIAkgKiAgICAgICAgICAgIGVudHJ5IHBvc2l0aW9uIG9mIHRoZSBwYXRoIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQuCiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgbmV4dCBlbnRyeSB3aG9zZSBwYXRoIGlzIGFmdGVyIHRoZSBpbnB1dC4KIAkgKi8KLQlwdWJsaWMgaW50IG5leHRFbnRyeShmaW5hbCBpbnQgcG9zaXRpb24pIHsKKwlwdWJsaWMgaW50IG5leHRFbnRyeShpbnQgcG9zaXRpb24pIHsKIAkJRGlyQ2FjaGVFbnRyeSBsYXN0ID0gc29ydGVkRW50cmllc1twb3NpdGlvbl07CiAJCWludCBuZXh0SWR4ID0gcG9zaXRpb24gKyAxOwogCQl3aGlsZSAobmV4dElkeCA8IGVudHJ5Q250KSB7CkBAIC04NTIsNyArODQ4LDcgQEAKIAkJcmV0dXJuIG5leHRJZHg7CiAJfQogCi0JaW50IG5leHRFbnRyeShmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4sIGludCBuZXh0SWR4KSB7CisJaW50IG5leHRFbnRyeShieXRlW10gcCwgaW50IHBMZW4sIGludCBuZXh0SWR4KSB7CiAJCXdoaWxlIChuZXh0SWR4IDwgZW50cnlDbnQpIHsKIAkJCWZpbmFsIERpckNhY2hlRW50cnkgbmV4dCA9IHNvcnRlZEVudHJpZXNbbmV4dElkeF07CiAJCQlpZiAoIURpckNhY2hlVHJlZS5wZXEocCwgbmV4dC5wYXRoLCBwTGVuKSkKQEAgLTg4Niw3ICs4ODIsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gb2YgdGhlIGVudHJ5IHRvIGdldC4KIAkgKiBAcmV0dXJuIHRoZSBlbnRyeSBhdCBwb3NpdGlvbiA8Y29kZT5pPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShmaW5hbCBpbnQgaSkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGdldEVudHJ5KGludCBpKSB7CiAJCXJldHVybiBzb3J0ZWRFbnRyaWVzW2ldOwogCX0KIApAQCAtODk3LDcgKzg5Myw3IEBACiAJICogICAgICAgICAgICB0aGUgcGF0aCB0byBzZWFyY2ggZm9yLgogCSAqIEByZXR1cm4gdGhlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gPGNvZGU+cGF0aDwvY29kZT4uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShTdHJpbmcgcGF0aCkgewogCQlmaW5hbCBpbnQgaSA9IGZpbmRFbnRyeShwYXRoKTsKIAkJcmV0dXJuIGkgPCAwID8gbnVsbCA6IHNvcnRlZEVudHJpZXNbaV07CiAJfQpAQCAtOTQ2LDcgKzk0Miw3IEBACiAJICogQHJldHVybiB0aGUgY2FjaGUgdHJlZTsgbnVsbCBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGNhY2hlIHRyZWUgYXZhaWxhYmxlCiAJICogICAgICAgICBhbmQgPGNvZGU+YnVpbGQ8L2NvZGU+IHdhcyBmYWxzZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENhY2hlVHJlZShmaW5hbCBib29sZWFuIGJ1aWxkKSB7CisJcHVibGljIERpckNhY2hlVHJlZSBnZXRDYWNoZVRyZWUoYm9vbGVhbiBidWlsZCkgewogCQlpZiAoYnVpbGQpIHsKIAkJCWlmICh0cmVlID09IG51bGwpCiAJCQkJdHJlZSA9IG5ldyBEaXJDYWNoZVRyZWUoKTsKQEAgLTk3Miw3ICs5NjgsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd3JpdGluZyB0byB0aGUgb2JqZWN0IHN0b3JlLgogCSAqLwotCXB1YmxpYyBPYmplY3RJZCB3cml0ZVRyZWUoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgb3cpCisJcHVibGljIE9iamVjdElkIHdyaXRlVHJlZShPYmplY3RJbnNlcnRlciBvdykKIAkJCXRocm93cyBVbm1lcmdlZFBhdGhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldENhY2hlVHJlZSh0cnVlKS53cml0ZVRyZWUoc29ydGVkRW50cmllcywgMCwgMCwgb3cpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRJdGVyYXRvci5qYXZhCmluZGV4IDZlMzY4MmEuLmU4MDU0NGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YQpAQCAtOTYsNyArOTYsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGNhY2hlIGJ1aWxkZXIgZm9yIHRoZSBjYWNoZSB0byB3YWxrLiBUaGUgY2FjaGUgbXVzdCBiZQogCSAqICAgICAgICAgICAgYWxyZWFkeSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JcHVibGljIERpckNhY2hlQnVpbGRJdGVyYXRvcihmaW5hbCBEaXJDYWNoZUJ1aWxkZXIgZGNiKSB7CisJcHVibGljIERpckNhY2hlQnVpbGRJdGVyYXRvcihEaXJDYWNoZUJ1aWxkZXIgZGNiKSB7CiAJCXN1cGVyKGRjYi5nZXREaXJDYWNoZSgpKTsKIAkJYnVpbGRlciA9IGRjYjsKIAl9CkBAIC0xMDksNyArMTA5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjdXJyZW50U3VidHJlZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZ2V0RW50cnlPYmplY3RJZCgpLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVyLmphdmEKaW5kZXggMmZmN2JiOS4uYzVmZjlhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhCkBAIC04Myw3ICs4Myw3IEBACiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGJ1aWxkZXIgd2lsbCBoYXZlIHVwb24KIAkgKiAgICAgICAgICAgIGNvbXBsZXRpb24uIFRoaXMgc2l6ZXMgdGhlIGluaXRpYWwgZW50cnkgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIERpckNhY2hlQnVpbGRlcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVCdWlsZGVyKERpckNhY2hlIGRjLCBpbnQgZWNudCkgewogCQlzdXBlcihkYywgZWNudCk7CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBJZiB0aGUgRmlsZU1vZGUgb2YgdGhlIGVudHJ5IHdhcyBub3Qgc2V0IGJ5IHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKKwlwdWJsaWMgdm9pZCBhZGQoRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgewogCQlpZiAobmV3RW50cnkuZ2V0UmF3TW9kZSgpID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5maWxlTW9kZU5vdFNldEZvclBhdGgsCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkgKiBAcGFyYW0gY250CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5LgogCSAqLwotCXB1YmxpYyB2b2lkIGtlZXAoZmluYWwgaW50IHBvcywgaW50IGNudCkgeworCXB1YmxpYyB2b2lkIGtlZXAoaW50IHBvcywgaW50IGNudCkgewogCQliZWZvcmVBZGQoY2FjaGUuZ2V0RW50cnkocG9zKSk7CiAJCWZhc3RLZWVwKHBvcywgY250KTsKIAl9CkBAIC0yMjcsNyArMjI3LDcgQEAKIAkJcmVwbGFjZSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBiZWZvcmVBZGQoZmluYWwgRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgeworCXByaXZhdGUgdm9pZCBiZWZvcmVBZGQoRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgewogCQlpZiAoc29ydGVkICYmIGVudHJ5Q250ID4gMCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeSBsYXN0RW50cnkgPSBlbnRyaWVzW2VudHJ5Q250IC0gMV07CiAJCQlmaW5hbCBpbnQgY3IgPSBEaXJDYWNoZS5jbXAobGFzdEVudHJ5LCBuZXdFbnRyeSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRWRpdG9yLmphdmEKaW5kZXggMzBlM2EzYy4uNzRiYTk3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVkaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogcHVibGljIGNsYXNzIERpckNhY2hlRWRpdG9yIGV4dGVuZHMgQmFzZURpckNhY2hlRWRpdG9yIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFBhdGhFZGl0PiBFRElUX0NNUCA9IG5ldyBDb21wYXJhdG9yPFBhdGhFZGl0PigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYXRoRWRpdCBvMSwgZmluYWwgUGF0aEVkaXQgbzIpIHsKKwkJcHVibGljIGludCBjb21wYXJlKFBhdGhFZGl0IG8xLCBQYXRoRWRpdCBvMikgewogCQkJZmluYWwgYnl0ZVtdIGEgPSBvMS5wYXRoOwogCQkJZmluYWwgYnl0ZVtdIGIgPSBvMi5wYXRoOwogCQkJcmV0dXJuIGNtcChhLCBhLmxlbmd0aCwgYiwgYi5sZW5ndGgpOwpAQCAtOTYsNyArOTYsNyBAQAogCSAqICAgICAgICAgICAgZXN0aW1hdGVkIG51bWJlciBvZiBlbnRyaWVzIHRoZSBlZGl0b3Igd2lsbCBoYXZlIHVwb24KIAkgKiAgICAgICAgICAgIGNvbXBsZXRpb24uIFRoaXMgc2l6ZXMgdGhlIGluaXRpYWwgZW50cnkgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIERpckNhY2hlRWRpdG9yKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgeworCXByb3RlY3RlZCBEaXJDYWNoZUVkaXRvcihEaXJDYWNoZSBkYywgaW50IGVjbnQpIHsKIAkJc3VwZXIoZGMsIGVjbnQpOwogCQllZGl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqIEBwYXJhbSBlZGl0CiAJICogICAgICAgICAgICBhbm90aGVyIGVkaXQgY29tbWFuZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUGF0aEVkaXQgZWRpdCkgeworCXB1YmxpYyB2b2lkIGFkZChQYXRoRWRpdCBlZGl0KSB7CiAJCWVkaXRzLmFkZChlZGl0KTsKIAl9CiAKQEAgLTMwNCw3ICszMDQsNyBAQAogCQkgKiBAcGFyYW0gZW50cnlQYXRoCiAJCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlIHJlcG9zaXRvcnkuCiAJCSAqLwotCQlwdWJsaWMgUGF0aEVkaXQoZmluYWwgU3RyaW5nIGVudHJ5UGF0aCkgeworCQlwdWJsaWMgUGF0aEVkaXQoU3RyaW5nIGVudHJ5UGF0aCkgewogCQkJcGF0aCA9IENvbnN0YW50cy5lbmNvZGUoZW50cnlQYXRoKTsKIAkJfQogCkBAIC0zMTksNyArMzE5LDcgQEAKIAkJICogICAgICAgICAgICBlbnRyeSBpbnN0YW5jZSB0byBtYXRjaCBwYXRoIG9mLiBPbmx5IHRoZSBwYXRoIG9mIHRoaXMKIAkJICogICAgICAgICAgICBlbnRyeSBpcyBhY3R1YWxseSBjb25zaWRlcmVkIGR1cmluZyBjb21tYW5kIGV2YWx1YXRpb24uCiAJCSAqLwotCQlwdWJsaWMgUGF0aEVkaXQoZmluYWwgRGlyQ2FjaGVFbnRyeSBlbnQpIHsKKwkJcHVibGljIFBhdGhFZGl0KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQlwYXRoID0gZW50LnBhdGg7CiAJCX0KIApAQCAtMzc0LDcgKzM3NCw3IEBACiAJCSAqIEBwYXJhbSBlbnRyeVBhdGgKIAkJICogICAgICAgICAgICBwYXRoIG9mIHRoZSBmaWxlIHdpdGhpbiB0aGUgcmVwb3NpdG9yeS4KIAkJICovCi0JCXB1YmxpYyBEZWxldGVQYXRoKGZpbmFsIFN0cmluZyBlbnRyeVBhdGgpIHsKKwkJcHVibGljIERlbGV0ZVBhdGgoU3RyaW5nIGVudHJ5UGF0aCkgewogCQkJc3VwZXIoZW50cnlQYXRoKTsKIAkJfQogCkBAIC0zODUsMTIgKzM4NSwxMiBAQAogCQkgKiAgICAgICAgICAgIGVudHJ5IGluc3RhbmNlIHRvIHJlbW92ZS4gT25seSB0aGUgcGF0aCBvZiB0aGlzIGVudHJ5IGlzCiAJCSAqICAgICAgICAgICAgYWN0dWFsbHkgY29uc2lkZXJlZCBkdXJpbmcgY29tbWFuZCBldmFsdWF0aW9uLgogCQkgKi8KLQkJcHVibGljIERlbGV0ZVBhdGgoZmluYWwgRGlyQ2FjaGVFbnRyeSBlbnQpIHsKKwkJcHVibGljIERlbGV0ZVBhdGgoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCXN1cGVyKGVudCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYXBwbHkoZmluYWwgRGlyQ2FjaGVFbnRyeSBlbnQpIHsKKwkJcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5ub0FwcGx5SW5EZWxldGUpOwogCQl9CiAJfQpAQCAtNDQwLDcgKzQ0MCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYXBwbHkoZmluYWwgRGlyQ2FjaGVFbnRyeSBlbnQpIHsKKwkJcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5ub0FwcGx5SW5EZWxldGUpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnkuamF2YQppbmRleCA3YzAzYzY0Li5mZWU5ZjUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnkuamF2YQpAQCAtMjI3LDcgKzIyNyw3IEBACiAJICogICAgICAgICAgICAgIlwwIi4gVGhlc2Ugc2VxdWVuY2VzIGFyZSBub3QgcGVybWl0dGVkIGluIGEgZ2l0IHRyZWUgb2JqZWN0CiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KFN0cmluZyBuZXdQYXRoKSB7CiAJCXRoaXMoQ29uc3RhbnRzLmVuY29kZShuZXdQYXRoKSwgU1RBR0VfMCk7CiAJfQogCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkgKiAgICAgICAgICAgICBvciBEaXJDYWNoZSBmaWxlLiAgT3IgaWYge0Bjb2RlIHN0YWdlfSBpcyBvdXRzaWRlIG9mIHRoZQogCSAqICAgICAgICAgICAgIHJhbmdlIDAuLjMsIGluY2x1c2l2ZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCwgZmluYWwgaW50IHN0YWdlKSB7CisJcHVibGljIERpckNhY2hlRW50cnkoU3RyaW5nIG5ld1BhdGgsIGludCBzdGFnZSkgewogCQl0aGlzKENvbnN0YW50cy5lbmNvZGUobmV3UGF0aCksIHN0YWdlKTsKIAl9CiAKQEAgLTI1OCw3ICsyNTgsNyBAQAogCSAqICAgICAgICAgICAgICJcMCIuIFRoZXNlIHNlcXVlbmNlcyBhcmUgbm90IHBlcm1pdHRlZCBpbiBhIGdpdCB0cmVlIG9iamVjdAogCSAqICAgICAgICAgICAgIG9yIERpckNhY2hlIGZpbGUuCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgYnl0ZVtdIG5ld1BhdGgpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeShieXRlW10gbmV3UGF0aCkgewogCQl0aGlzKG5ld1BhdGgsIFNUQUdFXzApOwogCX0KIApAQCAtMjc2LDcgKzI3Niw3IEBACiAJICogICAgICAgICAgICAgcmFuZ2UgMC4uMywgaW5jbHVzaXZlLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQotCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBwYXRoLCBmaW5hbCBpbnQgc3RhZ2UpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeShieXRlW10gcGF0aCwgaW50IHN0YWdlKSB7CiAJCWNoZWNrUGF0aChwYXRoKTsKIAkJaWYgKHN0YWdlIDwgMCB8fCAzIDwgc3RhZ2UpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KApAQCAtMzEyLDcgKzMxMiw3IEBACiAJCVN5c3RlbS5hcnJheWNvcHkoc3JjLmluZm8sIHNyYy5pbmZvT2Zmc2V0LCBpbmZvLCAwLCBJTkZPX0xFTik7CiAJfQogCi0Jdm9pZCB3cml0ZShmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBsZW4gPSBpc0V4dGVuZGVkKCkgPyBJTkZPX0xFTl9FWFRFTkRFRCA6IElORk9fTEVOOwogCQlmaW5hbCBpbnQgcGF0aExlbiA9IHBhdGgubGVuZ3RoOwogCQlvcy53cml0ZShpbmZvLCBpbmZvT2Zmc2V0LCBsZW4pOwpAQCAtMzQzLDcgKzM0Myw3IEBACiAJICogICAgICAgICAgICBuYW5vc2Vjb25kcyBjb21wb25lbnQgb2YgdGhlIGluZGV4J3MgbGFzdCBtb2RpZmllZCB0aW1lLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRyYSBjYXJlZnVsIGNoZWNrcyBzaG91bGQgYmUgdXNlZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBtaWdodEJlUmFjaWx5Q2xlYW4oZmluYWwgaW50IHNtdWRnZV9zLCBmaW5hbCBpbnQgc211ZGdlX25zKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gbWlnaHRCZVJhY2lseUNsZWFuKGludCBzbXVkZ2VfcywgaW50IHNtdWRnZV9ucykgewogCQkvLyBJZiB0aGUgaW5kZXggaGFzIGEgbW9kaWZpY2F0aW9uIHRpbWUgdGhlbiBpdCBjYW1lIGZyb20gZGlzawogCQkvLyBhbmQgd2FzIG5vdCBnZW5lcmF0ZWQgZnJvbSBzY3JhdGNoIGluIG1lbW9yeS4gSW4gc3VjaCBjYXNlcwogCQkvLyB0aGUgZW50cnkgaXMgJ3JhY2lseSBjbGVhbicgaWYgdGhlIGVudHJ5J3MgY2FjaGVkIG1vZGlmaWNhdGlvbgpAQCAtNDIwLDcgKzQyMCw3IEBACiAJICogICAgICAgICAgICB0cnVlIHRvIGlnbm9yZSBhcHBhcmVudCBtb2RpZmljYXRpb25zOyBmYWxzZSB0byBsb29rIGF0IGxhc3QKIAkgKiAgICAgICAgICAgIG1vZGlmaWVkIHRvIGRldGVjdCBmaWxlIG1vZGlmaWNhdGlvbnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QXNzdW1lVmFsaWQoZmluYWwgYm9vbGVhbiBhc3N1bWUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBc3N1bWVWYWxpZChib29sZWFuIGFzc3VtZSkgewogCQlpZiAoYXNzdW1lKQogCQkJaW5mb1tpbmZvT2Zmc2V0ICsgUF9GTEFHU10gfD0gQVNTVU1FX1ZBTElEOwogCQllbHNlCkBAIC01MTgsNyArNTE4LDcgQEAKIAkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGUjVFJFRX0sIG9yIGFueSBvdGhlciB0eXBlCiAJICogICAgICAgICAgICAgY29kZSBub3QgcGVybWl0dGVkIGluIGEgdHJlZSBvYmplY3QuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU1vZGUoZmluYWwgRmlsZU1vZGUgbW9kZSkgeworCXB1YmxpYyB2b2lkIHNldEZpbGVNb2RlKEZpbGVNb2RlIG1vZGUpIHsKIAkJc3dpdGNoIChtb2RlLmdldEJpdHMoKSAmIEZpbGVNb2RlLlRZUEVfTUFTSykgewogCQljYXNlIEZpbGVNb2RlLlRZUEVfTUlTU0lORzoKIAkJY2FzZSBGaWxlTW9kZS5UWVBFX1RSRUU6CkBAIC01NDgsNyArNTQ4LDcgQEAKIAkgKiBAcGFyYW0gd2hlbgogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBjcmVhdGlvbiB0aW1lIG9mIHRoZSBmaWxlLCBpbiBtaWxsaXNlY29uZHMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKGZpbmFsIGxvbmcgd2hlbikgeworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShsb25nIHdoZW4pIHsKIAkJZW5jb2RlVFMoUF9DVElNRSwgd2hlbik7CiAJfQogCkBAIC01NzIsNyArNTcyLDcgQEAKIAkgKiBAcGFyYW0gd2hlbgogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZmlsZSwgaW4gbWlsbGlzZWNvbmRzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChmaW5hbCBsb25nIHdoZW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyB3aGVuKSB7CiAJCWVuY29kZVRTKFBfTVRJTUUsIHdoZW4pOwogCX0KIApAQCAtNjA0LDcgKzYwNCw3IEBACiAJICogICAgICAgICAgICBuZXcgY2FjaGVkIHNpemUgb2YgdGhlIGZpbGUsIGFzIGJ5dGVzLiBJZiB0aGUgZmlsZSBpcyBsYXJnZXIKIAkgKiAgICAgICAgICAgIHRoYW4gMkcsIGNhc3QgaXQgdG8gKGludCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGZpbmFsIGludCBzeikgeworCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgc3opIHsKIAkJTkIuZW5jb2RlSW50MzIoaW5mbywgaW5mb09mZnNldCArIFBfU0laRSwgc3opOwogCX0KIApAQCAtNjE0LDcgKzYxNCw3IEBACiAJICogQHBhcmFtIHN6CiAJICogICAgICAgICAgICBuZXcgY2FjaGVkIHNpemUgb2YgdGhlIGZpbGUsIGFzIGJ5dGVzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChmaW5hbCBsb25nIHN6KSB7CisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKGxvbmcgc3opIHsKIAkJc2V0TGVuZ3RoKChpbnQpIHN6KTsKIAl9CiAKQEAgLTYzOCw3ICs2MzgsNyBAQAogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkI3plcm9JZCgpfSB0byByZW1vdmUgdGhlCiAJICogICAgICAgICAgICBjdXJyZW50IGlkZW50aWZpZXIuCiAJICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0SWQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChBbnlPYmplY3RJZCBpZCkgewogCQlpZC5jb3B5UmF3VG8oaWRCdWZmZXIoKSwgaWRPZmZzZXQoKSk7CiAJfQogCkBAIC02NTEsNyArNjUxLDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0SWRGcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZEZyb21SYXcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlmaW5hbCBpbnQgbiA9IENvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIOwogCQlTeXN0ZW0uYXJyYXljb3B5KGJzLCBwLCBpZEJ1ZmZlcigpLCBpZE9mZnNldCgpLCBuKTsKIAl9CkBAIC03MDQsNyArNzA0LDcgQEAKIAkgKiBAcGFyYW0gc3JjCiAJICogICAgICAgICAgICB0aGUgZW50cnkgdG8gY29weSBPYmplY3RJZCBhbmQgbWV0YSBmaWVsZHMgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5TWV0YURhdGEoZmluYWwgRGlyQ2FjaGVFbnRyeSBzcmMpIHsKKwlwdWJsaWMgdm9pZCBjb3B5TWV0YURhdGEoRGlyQ2FjaGVFbnRyeSBzcmMpIHsKIAkJY29weU1ldGFEYXRhKHNyYywgZmFsc2UpOwogCX0KIApAQCAtNzE5LDcgKzcxOSw3IEBACiAJICogQHBhcmFtIGtlZXBTdGFnZQogCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIHN0YWdlIGF0dHJpYnV0ZSB3aWxsIG5vdCBiZSBjb3BpZWQKIAkgKi8KLQl2b2lkIGNvcHlNZXRhRGF0YShmaW5hbCBEaXJDYWNoZUVudHJ5IHNyYywgYm9vbGVhbiBrZWVwU3RhZ2UpIHsKKwl2b2lkIGNvcHlNZXRhRGF0YShEaXJDYWNoZUVudHJ5IHNyYywgYm9vbGVhbiBrZWVwU3RhZ2UpIHsKIAkJaW50IG9yaWdmbGFncyA9IE5CLmRlY29kZVVJbnQxNihpbmZvLCBpbmZvT2Zmc2V0ICsgUF9GTEFHUyk7CiAJCWludCBuZXdmbGFncyA9IE5CLmRlY29kZVVJbnQxNihzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQgKyBQX0ZMQUdTKTsKIAkJU3lzdGVtLmFycmF5Y29weShzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQsIGluZm8sIGluZm9PZmZzZXQsIElORk9fTEVOKTsKQEAgLTc0MSwxNCArNzQxLDE0IEBACiAJCXJldHVybiAoaW5mb1tpbmZvT2Zmc2V0ICsgUF9GTEFHU10gJiBFWFRFTkRFRCkgIT0gMDsKIAl9CiAKLQlwcml2YXRlIGxvbmcgZGVjb2RlVFMoZmluYWwgaW50IHBJZHgpIHsKKwlwcml2YXRlIGxvbmcgZGVjb2RlVFMoaW50IHBJZHgpIHsKIAkJZmluYWwgaW50IGJhc2UgPSBpbmZvT2Zmc2V0ICsgcElkeDsKIAkJZmluYWwgaW50IHNlYyA9IE5CLmRlY29kZUludDMyKGluZm8sIGJhc2UpOwogCQlmaW5hbCBpbnQgbXMgPSBOQi5kZWNvZGVJbnQzMihpbmZvLCBiYXNlICsgNCkgLyAxMDAwMDAwOwogCQlyZXR1cm4gMTAwMEwgKiBzZWMgKyBtczsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZW5jb2RlVFMoZmluYWwgaW50IHBJZHgsIGZpbmFsIGxvbmcgd2hlbikgeworCXByaXZhdGUgdm9pZCBlbmNvZGVUUyhpbnQgcElkeCwgbG9uZyB3aGVuKSB7CiAJCWZpbmFsIGludCBiYXNlID0gaW5mb09mZnNldCArIHBJZHg7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGJhc2UsIChpbnQpICh3aGVuIC8gMTAwMCkpOwogCQlOQi5lbmNvZGVJbnQzMihpbmZvLCBiYXNlICsgNCwgKChpbnQpICh3aGVuICUgMTAwMCkpICogMTAwMDAwMCk7CkBAIC03NzEsNyArNzcxLDcgQEAKIAkJfQogCX0KIAotCXN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgYnl0ZVtdIHBhdGgpIHsKKwlzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGJ5dGVbXSBwYXRoKSB7CiAJCXJldHVybiBDb25zdGFudHMuQ0hBUlNFVC5kZWNvZGUoQnl0ZUJ1ZmZlci53cmFwKHBhdGgpKS50b1N0cmluZygpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3IuamF2YQppbmRleCBkNzY4MjE2Li4xOWM5MTZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3IuamF2YQpAQCAtMTE0LDcgKzExNCw3IEBACiAJICogQHBhcmFtIGRjCiAJICogICAgICAgICAgICB0aGUgY2FjaGUgdG8gd2Fsay4gSXQgbXVzdCBiZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVJdGVyYXRvcihmaW5hbCBEaXJDYWNoZSBkYykgeworCXB1YmxpYyBEaXJDYWNoZUl0ZXJhdG9yKERpckNhY2hlIGRjKSB7CiAJCWNhY2hlID0gZGM7CiAJCXRyZWUgPSBkYy5nZXRDYWNoZVRyZWUodHJ1ZSk7CiAJCXRyZWVTdGFydCA9IDA7CkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCXBhcnNlRW50cnkoKTsKIAl9CiAKLQlEaXJDYWNoZUl0ZXJhdG9yKGZpbmFsIERpckNhY2hlSXRlcmF0b3IgcCwgZmluYWwgRGlyQ2FjaGVUcmVlIGRjdCkgeworCURpckNhY2hlSXRlcmF0b3IoRGlyQ2FjaGVJdGVyYXRvciBwLCBEaXJDYWNoZVRyZWUgZGN0KSB7CiAJCXN1cGVyKHAsIHAucGF0aCwgcC5wYXRoTGVuICsgMSk7CiAJCWNhY2hlID0gcC5jYWNoZTsKIAkJdHJlZSA9IGRjdDsKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGN1cnJlbnRTdWJ0cmVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihnZXRFbnRyeU9iamVjdElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZVRyZWUuamF2YQppbmRleCBkYzgyNWQ0Li5iNjA1ZjNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVUcmVlLmphdmEKQEAgLTgyLDcgKzgyLDcgQEAKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8RGlyQ2FjaGVUcmVlPiBUUkVFX0NNUCA9IG5ldyBDb21wYXJhdG9yPERpckNhY2hlVHJlZT4oKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgRGlyQ2FjaGVUcmVlIG8xLCBmaW5hbCBEaXJDYWNoZVRyZWUgbzIpIHsKKwkJcHVibGljIGludCBjb21wYXJlKERpckNhY2hlVHJlZSBvMSwgRGlyQ2FjaGVUcmVlIG8yKSB7CiAJCQlmaW5hbCBieXRlW10gYSA9IG8xLmVuY29kZWROYW1lOwogCQkJZmluYWwgYnl0ZVtdIGIgPSBvMi5lbmNvZGVkTmFtZTsKIAkJCWZpbmFsIGludCBhTGVuID0gYS5sZW5ndGg7CkBAIC0xODUsNyArMTg1LDcgQEAKIAkJY2hpbGRDbnQgPSBzdWJjbnQ7CiAJfQogCi0Jdm9pZCB3cml0ZShmaW5hbCBieXRlW10gdG1wLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZShieXRlW10gdG1wLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCBwdHIgPSB0bXAubGVuZ3RoOwogCQl0bXBbLS1wdHJdID0gJ1xuJzsKIAkJcHRyID0gUmF3UGFyc2VVdGlscy5mb3JtYXRCYXNlMTAodG1wLCBwdHIsIGNoaWxkQ250KTsKQEAgLTI0OCw3ICsyNDgsNyBAQAogCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNoaWxkIHRvIG9idGFpbi4KIAkgKiBAcmV0dXJuIHRoZSBjaGlsZCB0cmVlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZVRyZWUgZ2V0Q2hpbGQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENoaWxkKGludCBpKSB7CiAJCXJldHVybiBjaGlsZHJlbltpXTsKIAl9CiAKQEAgLTM4OSw3ICszODksNyBAQAogCQlyZXR1cm4gc2l6ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXBwZW5kTmFtZShmaW5hbCBTdHJpbmdCdWlsZGVyIHIpIHsKKwlwcml2YXRlIHZvaWQgYXBwZW5kTmFtZShTdHJpbmdCdWlsZGVyIHIpIHsKIAkJaWYgKHBhcmVudCAhPSBudWxsKSB7CiAJCQlwYXJlbnQuYXBwZW5kTmFtZShyKTsKIAkJCXIuYXBwZW5kKGdldE5hbWVTdHJpbmcoKSk7CkBAIC00MDQsNyArNDA0LDcgQEAKIAkJcmV0dXJuIGVuY29kZWROYW1lLmxlbmd0aDsKIAl9CiAKLQlmaW5hbCBib29sZWFuIGNvbnRhaW5zKGZpbmFsIGJ5dGVbXSBhLCBpbnQgYU9mZiwgZmluYWwgaW50IGFMZW4pIHsKKwlmaW5hbCBib29sZWFuIGNvbnRhaW5zKGJ5dGVbXSBhLCBpbnQgYU9mZiwgaW50IGFMZW4pIHsKIAkJZmluYWwgYnl0ZVtdIGUgPSBlbmNvZGVkTmFtZTsKIAkJZmluYWwgaW50IGVMZW4gPSBlLmxlbmd0aDsKIAkJZm9yIChpbnQgZU9mZiA9IDA7IGVPZmYgPCBlTGVuICYmIGFPZmYgPCBhTGVuOyBlT2ZmKyssIGFPZmYrKykKQEAgLTUwMyw3ICs1MDMsNyBAQAogCQkJcmVtb3ZlQ2hpbGQoY2hpbGRDbnQgLSAxKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0Q2hpbGQoZmluYWwgaW50IHN0SWR4LCBmaW5hbCBEaXJDYWNoZVRyZWUgc3QpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0Q2hpbGQoaW50IHN0SWR4LCBEaXJDYWNoZVRyZWUgc3QpIHsKIAkJZmluYWwgRGlyQ2FjaGVUcmVlW10gYyA9IGNoaWxkcmVuOwogCQlpZiAoY2hpbGRDbnQgKyAxIDw9IGMubGVuZ3RoKSB7CiAJCQlpZiAoc3RJZHggPCBjaGlsZENudCkKQEAgLTUyNCwxNCArNTI0LDE0IEBACiAJCWNoaWxkQ250Kys7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkKGZpbmFsIGludCBzdElkeCkgeworCXByaXZhdGUgdm9pZCByZW1vdmVDaGlsZChpbnQgc3RJZHgpIHsKIAkJZmluYWwgaW50IG4gPSAtLWNoaWxkQ250OwogCQlpZiAoc3RJZHggPCBuKQogCQkJU3lzdGVtLmFycmF5Y29weShjaGlsZHJlbiwgc3RJZHggKyAxLCBjaGlsZHJlbiwgc3RJZHgsIG4gLSBzdElkeCk7CiAJCWNoaWxkcmVuW25dID0gbnVsbDsKIAl9CiAKLQlzdGF0aWMgYm9vbGVhbiBwZXEoZmluYWwgYnl0ZVtdIGEsIGZpbmFsIGJ5dGVbXSBiLCBpbnQgYUxlbikgeworCXN0YXRpYyBib29sZWFuIHBlcShieXRlW10gYSwgYnl0ZVtdIGIsIGludCBhTGVuKSB7CiAJCWlmIChiLmxlbmd0aCA8IGFMZW4pCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZvciAoYUxlbi0tOyBhTGVuID49IDA7IGFMZW4tLSkKQEAgLTU0MCw3ICs1NDAsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbmFtZWNtcChmaW5hbCBieXRlW10gYSwgaW50IGFQb3MsIGZpbmFsIERpckNhY2hlVHJlZSBjdCkgeworCXByaXZhdGUgc3RhdGljIGludCBuYW1lY21wKGJ5dGVbXSBhLCBpbnQgYVBvcywgRGlyQ2FjaGVUcmVlIGN0KSB7CiAJCWlmIChjdCA9PSBudWxsKQogCQkJcmV0dXJuIC0xOwogCQlmaW5hbCBieXRlW10gYiA9IGN0LmVuY29kZWROYW1lOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJCXJldHVybiBhTGVuIC0gYkxlbjsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgc2xhc2goZmluYWwgYnl0ZVtdIGEsIGludCBhUG9zKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHNsYXNoKGJ5dGVbXSBhLCBpbnQgYVBvcykgewogCQlmaW5hbCBpbnQgYUxlbiA9IGEubGVuZ3RoOwogCQlmb3IgKDsgYVBvcyA8IGFMZW47IGFQb3MrKykKIAkJCWlmIChhW2FQb3NdID09ICcvJykKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbXBvdW5kRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db21wb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDYyZmY5OTAuLjFkZjcwZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbXBvdW5kRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YQpAQCAtNTYsMTAgKzU2LDEwIEBACiBwdWJsaWMgY2xhc3MgQ29tcG91bmRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBDb2xsZWN0aW9uPFRocm93YWJsZT4gY2F1c2VzKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChDb2xsZWN0aW9uPFRocm93YWJsZT4gY2F1c2VzKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJbXNnLmFwcGVuZChKR2l0VGV4dC5nZXQoKS5mYWlsdXJlRHVlVG9PbmVPZlRoZUZvbGxvd2luZyk7Ci0JCWZvciAoZmluYWwgVGhyb3dhYmxlIGMgOiBjYXVzZXMpIHsKKwkJZm9yIChUaHJvd2FibGUgYyA6IGNhdXNlcykgewogCQkJbXNnLmFwcGVuZCgiICAiKTsgLy8kTk9OLU5MUy0xJAogCQkJbXNnLmFwcGVuZChjLmdldE1lc3NhZ2UoKSk7CiAJCQltc2cuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCkBAIC03NSw3ICs3NSw3IEBACiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgVHdvIG9yIG1vcmUgZXhjZXB0aW9ucyB0aGF0IG1heSBoYXZlIGJlZW4gdGhlIHByb2JsZW0uCiAJICovCi0JcHVibGljIENvbXBvdW5kRXhjZXB0aW9uKGZpbmFsIENvbGxlY3Rpb248VGhyb3dhYmxlPiB3aHkpIHsKKwlwdWJsaWMgQ29tcG91bmRFeGNlcHRpb24oQ29sbGVjdGlvbjxUaHJvd2FibGU+IHdoeSkgewogCQlzdXBlcihmb3JtYXQod2h5KSk7CiAJCWNhdXNlTGlzdCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDw+KHdoeSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCBhN2UxZDAyLi4yNGY0M2NmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIHdoeSB0aGUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgogCSAqLwotCXB1YmxpYyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKIAkJc3VwZXIobWVzc2FnZSk7CiAJfQogCkBAIC02Nyw3ICs2Nyw3IEBACiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICByb290IGNhdXNlIG9mIHRoZSBlcnJvci4KIAkgKi8KLQlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvRW50cnlFeGlzdHNFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0VudHJ5RXhpc3RzRXhjZXB0aW9uLmphdmEKaW5kZXggOGRkMGQ1My4uYjk3ZDIzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvRW50cnlFeGlzdHNFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAJICoKIAkgKiBAcGFyYW0gbmFtZSB3b3JrZGlyIHJlbGF0aXZlIGZpbGUgbmFtZQogCSAqLwotCXB1YmxpYyBFbnRyeUV4aXN0c0V4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBFbnRyeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgbmFtZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS50cmVlRW50cnlBbHJlYWR5RXhpc3RzLCBuYW1lKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24uamF2YQppbmRleCBhNjQ3MTIxLi43ODVjYjk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24uamF2YQpAQCAtNTYsNyArNTYsNyBAQAogCSAqIEBwYXJhbSBtc2cKIAkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uKGZpbmFsIFN0cmluZyBtc2cpIHsKKwlwdWJsaWMgSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uKFN0cmluZyBtc2cpIHsKIAkJc3VwZXIobXNnKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLmphdmEKaW5kZXggN2JhM2EwMC4uNWFiZDBjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YQpAQCAtNzAsNyArNzAsNyBAQAogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyB0eXBlKSB7CisJcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oT2JqZWN0SWQgaWQsIFN0cmluZyB0eXBlKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm9iamVjdElzTm90QSwgaWQubmFtZSgpLCB0eXBlKSk7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBACiAJICogQHBhcmFtIGlkIFNIQS0xCiAJICogQHBhcmFtIHR5cGUgb2JqZWN0IHR5cGUKIAkgKi8KLQlwdWJsaWMgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihmaW5hbCBPYmplY3RJZCBpZCwgZmluYWwgaW50IHR5cGUpIHsKKwlwdWJsaWMgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihPYmplY3RJZCBpZCwgaW50IHR5cGUpIHsKIAkJdGhpcyhpZCwgQ29uc3RhbnRzLnR5cGVTdHJpbmcodHlwZSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhSZWFkRXhjZXB0aW9uLmphdmEKaW5kZXggNzBmNjUwZC4uZTA3ZDMwOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhSZWFkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhSZWFkRXhjZXB0aW9uLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBJbmRleFJlYWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIApAQCAtNzUsNyArNzUsNyBAQAogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGRlMTljMDYuLjM0ZmQ3YTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4V3JpdGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFdyaXRlRXhjZXB0aW9uLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkgKgogCSAqIEBwYXJhbSBzIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgSW5kZXhXcml0ZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBJbmRleFdyaXRlRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIApAQCAtNzAsNyArNzAsNyBAQAogCSAqIEBwYXJhbSBzIG1lc3NhZ2UKIAkgKiBAcGFyYW0gY2F1c2Ugcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgSW5kZXhXcml0ZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uLmphdmEKaW5kZXggMDliYjRhOS4uYjM3ZDIwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24uamF2YQpAQCAtNTYsMTAgKzU2LDEwIEBACiBwdWJsaWMgY2xhc3MgTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbiBleHRlbmRzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KGZpbmFsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nQ29tbWl0cykgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXQoTWFwPE9iamVjdElkLCBTdHJpbmc+IG1pc3NpbmdDb21taXRzKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCXIuYXBwZW5kKEpHaXRUZXh0LmdldCgpLm1pc3NpbmdQcmVyZXF1aXNpdGVDb21taXRzKTsKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8T2JqZWN0SWQsIFN0cmluZz4gZSA6IG1pc3NpbmdDb21taXRzLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChNYXAuRW50cnk8T2JqZWN0SWQsIFN0cmluZz4gZSA6IG1pc3NpbmdDb21taXRzLmVudHJ5U2V0KCkpIHsKIAkJCXIuYXBwZW5kKCJcbiAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCXIuYXBwZW5kKGUuZ2V0S2V5KCkubmFtZSgpKTsKIAkJCWlmIChlLmdldFZhbHVlKCkgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdPYmplY3RFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdPYmplY3RFeGNlcHRpb24uamF2YQppbmRleCBmNmFhMDkyLi5jNmM0N2Y5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ09iamVjdEV4Y2VwdGlvbi5qYXZhCkBAIC02OSw3ICs2OSw3IEBACiAJICogQHBhcmFtIGlkIFNIQS0xCiAJICogQHBhcmFtIHR5cGUgb2JqZWN0IHR5cGUKIAkgKi8KLQlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihmaW5hbCBPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKwlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihPYmplY3RJZCBpZCwgU3RyaW5nIHR5cGUpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubWlzc2luZ09iamVjdCwgdHlwZSwgaWQubmFtZSgpKSk7CiAJCW1pc3NpbmcgPSBpZC5jb3B5KCk7CiAJfQpAQCAtODEsNyArODEsNyBAQAogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXRoaXMoaWQsIENvbnN0YW50cy50eXBlU3RyaW5nKHR5cGUpKTsKIAl9CiAKQEAgLTk0LDcgKzk0LDcgQEAKIAkgKiBAcGFyYW0gdHlwZQogCSAqICAgICAgICAgICAgb2JqZWN0IHR5cGUKIAkgKi8KLQlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGlkLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKEFiYnJldmlhdGVkT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm1pc3NpbmdPYmplY3QsIENvbnN0YW50cwogCQkJCS50eXBlU3RyaW5nKHR5cGUpLCBpZC5uYW1lKCkpKTsKIAkJbWlzc2luZyA9IG51bGw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUGFja1NpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDI4ZTk3ODguLjhjMmU4NzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUGFja1NpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUGFja1NpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgZXJyb3IuCiAJICovCi0JcHVibGljIE5vUGFja1NpZ25hdHVyZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgd2h5KSB7CisJcHVibGljIE5vUGFja1NpZ25hdHVyZUV4Y2VwdGlvbihTdHJpbmcgd2h5KSB7CiAJCXN1cGVyKHdoeSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24uamF2YQppbmRleCBmZTA3M2Q1Li41MjQ5NjhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24uamF2YQpAQCAtNTksNyArNTksNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbihmaW5hbCBVUklpc2ggdXJpLCBmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpLCBzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDEyNDY4MGUuLjExNGU2NjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJICoKIAkgKiBAcGFyYW0gcyBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGlzc3VlCiAJICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC03MCw3ICs3MCw3IEBACiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgYSBsb3dlciBsZXZlbCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpc3N1ZS4KIAkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgd2h5KSB7CisJcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIHdoeSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKHdoeSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbi5qYXZhCmluZGV4IDhhZjE5OTEuLmJiZWU0MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9PYmplY3RXcml0aW5nRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBzIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIApAQCAtNjgsNyArNjgsNyBAQAogCSAqIEBwYXJhbSBzIG1lc3NhZ2UKIAkgKiBAcGFyYW0gY2F1c2Ugcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIE9iamVjdFdyaXRpbmdFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrSW52YWxpZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCA5ODg2ZTE1Li5hODNkZTA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrSW52YWxpZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIAkgKiBAcGFyYW0gcGF0aAogCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgaW52YWxpZCBwYWNrIGZpbGUuCiAJICovCi0JcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIEZpbGUgcGF0aCkgeworCXB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihGaWxlIHBhdGgpIHsKIAkJdGhpcyhwYXRoLmdldEFic29sdXRlUGF0aCgpKTsKIAl9CiAKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiBAcGFyYW0gcGF0aAogCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgaW52YWxpZCBwYWNrIGZpbGUuCiAJICovCi0JcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBwYXRoKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnBhY2tGaWxlSW52YWxpZCwgcGF0aCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKaW5kZXggNWI5YTRiOS4uZWExZTY1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvci4KIAkgKi8KLQlwdWJsaWMgUGFja01pc21hdGNoRXhjZXB0aW9uKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgUGFja01pc21hdGNoRXhjZXB0aW9uKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDQ0YmMxNjQuLmRkMTM3NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UsIHdoaWNoIG1heSBiZSBzaG93biB0byBhbiBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmkgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTg4LDcgKzg4LDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZSwgd2hpY2ggbWF5IGJlIHNob3duIHRvIGFuIGVuZC11c2VyLgogCSAqLwotCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIApAQCAtMTAwLDcgKzEwMCw3IEBACiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGFhYmI0NmEuLjA0ZmQ4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAJICogQHBhcmFtIGxvY2F0aW9uCiAJICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSBub3QgZm91bmQsIHVzdWFsbHkgZmlsZSBwYXRoLgogCSAqLwotCXB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oZmluYWwgRmlsZSBsb2NhdGlvbikgeworCXB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oRmlsZSBsb2NhdGlvbikgewogCQl0aGlzKGxvY2F0aW9uLmdldFBhdGgoKSk7CiAJfQogCkBAIC03Miw3ICs3Miw3IEBACiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgd2h5IHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IGV4aXN0LgogCSAqLwotCXB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oZmluYWwgRmlsZSBsb2NhdGlvbiwgVGhyb3dhYmxlIHdoeSkgeworCXB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oRmlsZSBsb2NhdGlvbiwgVGhyb3dhYmxlIHdoeSkgewogCQl0aGlzKGxvY2F0aW9uLmdldFBhdGgoKSwgd2h5KTsKIAl9CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAkgKiBAcGFyYW0gbG9jYXRpb24KIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5IG5vdCBmb3VuZCwgdXN1YWxseSBmaWxlIHBhdGguCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBsb2NhdGlvbikgewogCQlzdXBlcihtZXNzYWdlKGxvY2F0aW9uKSk7CiAJfQogCkBAIC05OCw3ICs5OCw3IEBACiAJCXN1cGVyKG1lc3NhZ2UobG9jYXRpb24pLCB3aHkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlKFN0cmluZyBsb2NhdGlvbikgewogCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkucmVwb3NpdG9yeU5vdEZvdW5kLCBsb2NhdGlvbik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhCmluZGV4IDgyNjU0ZTguLmY2ODUyYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JldldhbGtFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXZXYWxrRXhjZXB0aW9uLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHRoZSBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGRlc2NyaWJlcyB3aHkgdGhlIHdhbGsgZmFpbGVkLgogCSAqLwotCXB1YmxpYyBSZXZXYWxrRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBSZXZXYWxrRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihKR2l0VGV4dC5nZXQoKS53YWxrRmFpbHVyZSwgY2F1c2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDhmYTE0YzcuLjYxMWZkNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24uamF2YQpAQCAtNTYsMjEgKzU2LDYgQEAKIAkgKgogCSAqIEBwYXJhbSBvdHAKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2hvc2UgY3VycmVudCByZXByZXNlbnRhdGlvbiBpcyBubyBsb25nZXIgcHJlc2VudC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgI1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uKE9iamVjdFRvUGFjaywgVGhyb3dhYmxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbihPYmplY3RUb1BhY2sgb3RwKSB7Ci0JCS8vIERvIG5vdGhpbmcuCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVycm9yIGZvciBhbiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gb3RwCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHdob3NlIGN1cnJlbnQgcmVwcmVzZW50YXRpb24gaXMgbm8gbG9uZ2VyIHByZXNlbnQuCiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICBjYXVzZQogCSAqIEBzaW5jZSA0LjEwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQppbmRleCA2MGQ3YWEwLi5kYzU5YzhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBzIG5hbWUgb2YgbGluayBpbiB0cmVlIG9yIHdvcmtkaXIKIAkgKi8KLQlwdWJsaWMgU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9UcmFuc3BvcnRFeGNlcHRpb24uamF2YQppbmRleCA4NmRlYTgyLi41ZmVjZjBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9UcmFuc3BvcnRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9UcmFuc3BvcnRFeGNlcHRpb24uamF2YQpAQCAtNjQsNyArNjQsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBVUklpc2ggdXJpLCBmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpLnNldFBhc3MobnVsbCkgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTkwLDcgKzkwLDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIApAQCAtMTAyLDcgKzEwMiw3IEBACiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1VubWVyZ2VkUGF0aEV4Y2VwdGlvbi5qYXZhCmluZGV4IDRmYzUzNGIuLjZkZTkxNTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1VubWVyZ2VkUGF0aEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1VubWVyZ2VkUGF0aEV4Y2VwdGlvbi5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAJICogQHBhcmFtIGRjZQogCSAqICAgICAgICAgICAgdGhlIGZpcnN0IG5vbi16ZXJvIHN0YWdlIG9mIHRoZSB1bm1lcmdlZCBwYXRoLgogCSAqLwotCXB1YmxpYyBVbm1lcmdlZFBhdGhFeGNlcHRpb24oZmluYWwgRGlyQ2FjaGVFbnRyeSBkY2UpIHsKKwlwdWJsaWMgVW5tZXJnZWRQYXRoRXhjZXB0aW9uKERpckNhY2hlRW50cnkgZGNlKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVubWVyZ2VkUGF0aCwgZGNlLmdldFBhdGhTdHJpbmcoKSkpOwogCQllbnRyeSA9IGRjZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtLmphdmEKaW5kZXggODhjMmVmNi4uOWJhYjY4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0uamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIFVuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0oZmluYWwgVVJJaXNoIHVyaSwgZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbShVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmkuc2V0UGFzcyhudWxsKSArICI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMGI3Y2NmNS4uMGE0ZmVmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAcGFyYW0gdmVyc2lvbgogCSAqICAgICAgICAgICAgcGFjayBpbmRleCB2ZXJzaW9uCiAJICovCi0JcHVibGljIFVuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbihmaW5hbCBpbnQgdmVyc2lvbikgeworCXB1YmxpYyBVbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24oaW50IHZlcnNpb24pIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uLAogCQkJCUludGVnZXIudmFsdWVPZih2ZXJzaW9uKSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24uamF2YQppbmRleCAyMzYxMTg2Li5jYmY4ZjNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQHBhcmFtIHZlcnNpb24KIAkgKiAgICAgICAgICAgIHBhY2sgdmVyc2lvbgogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uKGZpbmFsIGxvbmcgdmVyc2lvbikgeworCXB1YmxpYyBVbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uKGxvbmcgdmVyc2lvbikgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnN1cHBvcnRlZFBhY2tWZXJzaW9uLAogCQkJCUxvbmcudmFsdWVPZih2ZXJzaW9uKSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXZlbnRzL0luZGV4Q2hhbmdlZEV2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2V2ZW50cy9JbmRleENoYW5nZWRFdmVudC5qYXZhCmluZGV4IDY0N2VjOGEuLmRjY2U4NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXZlbnRzL0luZGV4Q2hhbmdlZEV2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YQpAQCAtNDcsNiArNDcsMjggQEAKICAqIERlc2NyaWJlcyBhIGNoYW5nZSB0byBvbmUgb3IgbW9yZSBwYXRocyBpbiB0aGUgaW5kZXggZmlsZS4KICAqLwogcHVibGljIGNsYXNzIEluZGV4Q2hhbmdlZEV2ZW50IGV4dGVuZHMgUmVwb3NpdG9yeUV2ZW50PEluZGV4Q2hhbmdlZExpc3RlbmVyPiB7CisJcHJpdmF0ZSBib29sZWFuIGludGVybmFsOworCisJLyoqCisJICogTm90aWZ5IHRoYXQgdGhlIGluZGV4IGNoYW5nZWQKKwkgKgorCSAqIEBwYXJhbSBpbnRlcm5hbAorCSAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBpbmRleCB3YXMgY2hhbmdlZCBieSB0aGUgc2FtZQorCSAqICAgICAgICAgICAgICAgICAgICAgSkdpdCBwcm9jZXNzCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBJbmRleENoYW5nZWRFdmVudChib29sZWFuIGludGVybmFsKSB7CisJCXRoaXMuaW50ZXJuYWwgPSBpbnRlcm5hbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5kZXggd2FzIGNoYW5nZWQgYnkgdGhlIHNhbWUgSkdpdCBwcm9jZXNzCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZXJuYWwoKSB7CisJCXJldHVybiBpbnRlcm5hbDsKKwl9CisKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBDbGFzczxJbmRleENoYW5nZWRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJUeXBlKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0NoYXJhY3RlckhlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9DaGFyYWN0ZXJIZWFkLmphdmEKaW5kZXggOThhZWUwZS4uNzAzOWMzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0NoYXJhY3RlckhlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhCkBAIC01MywxNCArNTMsMTQgQEAKIAkgKiBAcGFyYW0gZXhwZWN0ZWRDaGFyYWN0ZXIKIAkgKiAgICAgICAgICAgIGV4cGVjdGVkIHtAY29kZSBjaGFyfQogCSAqLwotCXByb3RlY3RlZCBDaGFyYWN0ZXJIZWFkKGZpbmFsIGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXIpIHsKKwlwcm90ZWN0ZWQgQ2hhcmFjdGVySGVhZChjaGFyIGV4cGVjdGVkQ2hhcmFjdGVyKSB7CiAJCXN1cGVyKGZhbHNlKTsKIAkJdGhpcy5leHBlY3RlZENoYXJhY3RlciA9IGV4cGVjdGVkQ2hhcmFjdGVyOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gYyA9PSBleHBlY3RlZENoYXJhY3RlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YQppbmRleCA1NjYzMDM5Li5iZmNjNTgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvRmlsZU5hbWVNYXRjaGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0ZpbGVOYW1lTWF0Y2hlci5qYXZhCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkgKiBAcGFyYW0gaGVhZHNTdGFydFZhbHVlCiAJICogICAgICAgICAgICBtdXN0IGJlIGEgbGlzdCB3aGljaCB3aWxsIG5ldmVyIGJlIG1vZGlmaWVkLgogCSAqLwotCXByaXZhdGUgRmlsZU5hbWVNYXRjaGVyKGZpbmFsIExpc3Q8SGVhZD4gaGVhZHNTdGFydFZhbHVlKSB7CisJcHJpdmF0ZSBGaWxlTmFtZU1hdGNoZXIoTGlzdDxIZWFkPiBoZWFkc1N0YXJ0VmFsdWUpIHsKIAkJdGhpcyhoZWFkc1N0YXJ0VmFsdWUsIGhlYWRzU3RhcnRWYWx1ZSk7CiAJfQogCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkgKiBAcGFyYW0gYyBuZXcgY2hhcmFjdGVyIHRvIGFwcGVuZAogCSAqIEByZXR1cm4gdHJ1ZSB0byBjb250aW51ZSwgZmFsc2UgaWYgdGhlIG1hdGNoZXIgY2FuIHN0b3AgYXBwZW5kaW5nCiAJICovCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihmaW5hbCBjaGFyIGMpIHsKKwlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kU3RyaW5nVG9NYXRjaEJ5T25lQ2hhcmFjdGVyKGNoYXIgYykgewogCQlmaW5hbCBMaXN0PEhlYWQ+IG5ld0hlYWRzID0gbGlzdEZvckxvY2FsVXNlYWdlOwogCQluZXdIZWFkcy5jbGVhcigpOwogCQlMaXN0PEhlYWQ+IGxhc3RBZGRlZEhlYWRzID0gbnVsbDsKQEAgLTM1Nyw3ICszNTcsNyBAQAogCSAqICAgICAgICAgICAgZXh0ZW5kcyB0aGUgc3RyaW5nIHdoaWNoIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgcGF0dGVybnMgb2YKIAkgKiAgICAgICAgICAgIHRoaXMgY2xhc3MuCiAJICovCi0JcHVibGljIHZvaWQgYXBwZW5kKGZpbmFsIFN0cmluZyBzdHJpbmdUb01hdGNoKSB7CisJcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBzdHJpbmdUb01hdGNoKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nVG9NYXRjaC5sZW5ndGgoKTsgaSsrKSB7CiAJCQlmaW5hbCBjaGFyIGMgPSBzdHJpbmdUb01hdGNoLmNoYXJBdChpKTsKIAkJCWlmICghZXh0ZW5kU3RyaW5nVG9NYXRjaEJ5T25lQ2hhcmFjdGVyKGMpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0dyb3VwSGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0dyb3VwSGVhZC5qYXZhCmluZGV4IDk2NWQ5MDAuLjFkYzU5MzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvR3JvdXBIZWFkLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIAogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpbnZlcnNlOwogCi0JR3JvdXBIZWFkKFN0cmluZyBwYXR0ZXJuLCBmaW5hbCBTdHJpbmcgd2hvbGVQYXR0ZXJuKQorCUdyb3VwSGVhZChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHdob2xlUGF0dGVybikKIAkJCXRocm93cyBJbnZhbGlkUGF0dGVybkV4Y2VwdGlvbiB7CiAJCXN1cGVyKGZhbHNlKTsKIAkJdGhpcy5jaGFyYWN0ZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC0xMzIsNyArMTMyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlmb3IgKENoYXJhY3RlclBhdHRlcm4gcGF0dGVybiA6IGNoYXJhY3RlckNsYXNzZXMpIHsKIAkJCWlmIChwYXR0ZXJuLm1hdGNoZXMoYykpIHsKIAkJCQlyZXR1cm4gIWludmVyc2U7CkBAIC0yMTQsNyArMjE0LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPbmVDaGFyYWN0ZXJQYXR0ZXJuIGltcGxlbWVudHMgQ2hhcmFjdGVyUGF0dGVybiB7CiAJCXByaXZhdGUgY2hhciBleHBlY3RlZENoYXJhY3RlcjsKIAotCQlPbmVDaGFyYWN0ZXJQYXR0ZXJuKGZpbmFsIGNoYXIgYykgeworCQlPbmVDaGFyYWN0ZXJQYXR0ZXJuKGNoYXIgYykgewogCQkJdGhpcy5leHBlY3RlZENoYXJhY3RlciA9IGM7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1Jlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEKaW5kZXggYzEzMmUyOC4uNDVlNmVkMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1Jlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvUmVzdHJpY3RlZFdpbGRDYXJkSGVhZC5qYXZhCkBAIC00NywxNCArNDcsMTQgQEAKIGZpbmFsIGNsYXNzIFJlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQgZXh0ZW5kcyBBYnN0cmFjdEhlYWQgewogCXByaXZhdGUgZmluYWwgY2hhciBleGNsdWRlZENoYXJhY3RlcjsKIAotCVJlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQoZmluYWwgY2hhciBleGNsdWRlZENoYXJhY3RlciwgZmluYWwgYm9vbGVhbiBzdGFyKSB7CisJUmVzdHJpY3RlZFdpbGRDYXJkSGVhZChjaGFyIGV4Y2x1ZGVkQ2hhcmFjdGVyLCBib29sZWFuIHN0YXIpIHsKIAkJc3VwZXIoc3Rhcik7CiAJCXRoaXMuZXhjbHVkZWRDaGFyYWN0ZXIgPSBleGNsdWRlZENoYXJhY3RlcjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoZmluYWwgY2hhciBjKSB7CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMpIHsKIAkJcmV0dXJuIGMgIT0gZXhjbHVkZWRDaGFyYWN0ZXI7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvV2lsZENhcmRIZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvV2lsZENhcmRIZWFkLmphdmEKaW5kZXggYzgwNmUyMy4uMDczNjJhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9XaWxkQ2FyZEhlYWQuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIGNoYXIgYykgeworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKaW5kZXggOGI4ZGY4Ny4uODBmZDNjZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKQEAgLTQxMyw3ICs0MTMsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yfQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFJlcG9Db21tYW5kIHNldFByb2dyZXNzTW9uaXRvcihmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAJICogICAgICAgICAgICB0aGUgYXV0aG9yJ3Mge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50fQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFJlcG9Db21tYW5kIHNldEF1dGhvcihmaW5hbCBQZXJzb25JZGVudCBhdXRob3IpIHsKKwlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0QXV0aG9yKFBlcnNvbklkZW50IGF1dGhvcikgewogCQl0aGlzLmF1dGhvciA9IGF1dGhvcjsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJICogICAgICAgICAgICBvYmplY3QuCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVtb3RlUmVhZGVyKGZpbmFsIFJlbW90ZVJlYWRlciBjYWxsYmFjaykgeworCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZW1vdGVSZWFkZXIoUmVtb3RlUmVhZGVyIGNhbGxiYWNrKSB7CiAJCXRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Qcm9qZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb1Byb2plY3QuamF2YQppbmRleCBlODI3NjEyLi43YmE4M2M3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb1Byb2plY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb1Byb2plY3QuamF2YQpAQCAtMTMxLDE4ICsxMzEsMTAgQEAKIAkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHJlcG8uZ2V0V29ya1RyZWUoKSwKIAkJCQkJcGF0aCArICIvIiArIHNyYyk7IC8vJE5PTi1OTFMtMSQKIAkJCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShyZXBvLmdldFdvcmtUcmVlKCksIGRlc3QpOwotCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKLQkJCXRyeSB7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZUNoYW5uZWwgY2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCQkJb3V0cHV0LmdldENoYW5uZWwoKS50cmFuc2ZlckZyb20oCi0JCQkJCQkJY2hhbm5lbCwgMCwgY2hhbm5lbC5zaXplKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5wdXQuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKKwkJCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpIHsKKwkJCQlGaWxlQ2hhbm5lbCBjaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOworCQkJCW91dHB1dC5nZXRDaGFubmVsKCkudHJhbnNmZXJGcm9tKGNoYW5uZWwsIDAsIGNoYW5uZWwuc2l6ZSgpKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvR2l0SG9vay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKaW5kZXggYWQ0M2UyYy4uOGE2MWQxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJCVByaW50U3RyZWFtIGhvb2tFcnJSZWRpcmVjdCA9IG51bGw7CiAJCXRyeSB7CiAJCQlob29rRXJyUmVkaXJlY3QgPSBuZXcgUHJpbnRTdHJlYW0oZXJyb3JCeXRlQXJyYXksIGZhbHNlLAotCQkJCQlVVEZfOC5uYW1lKCkpOworCQkJCQlDSEFSU0VULm5hbWUoKSk7CiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJLy8gVVRGLTggaXMgZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUKIAkJfQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQkJaG9va0VyclJlZGlyZWN0LCBnZXRTdGRpbkFyZ3MoKSk7CiAJCWlmIChyZXN1bHQuaXNFeGVjdXRlZFdpdGhFcnJvcigpKSB7CiAJCQl0aHJvdyBuZXcgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbigKLQkJCQkJbmV3IFN0cmluZyhlcnJvckJ5dGVBcnJheS50b0J5dGVBcnJheSgpLCBVVEZfOCksCisJCQkJCW5ldyBTdHJpbmcoZXJyb3JCeXRlQXJyYXkudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCksCiAJCQkJCWdldEhvb2tOYW1lKCksIHJlc3VsdC5nZXRFeGl0Q29kZSgpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvSG9va3MuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvSG9va3MuamF2YQppbmRleCA3OTM5NWVkLi5iODAxZDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0hvb2tzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhCkBAIC0xMTUsNyArMTE1LDExIEBACiAJCQkJCW91dHB1dFN0cmVhbSk7CiAJCQlpZiAoaG9vayAhPSBudWxsKSB7CiAJCQkJaWYgKGhvb2suaXNOYXRpdmVIb29rUHJlc2VudCgpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQlQcmludFN0cmVhbSBwcyA9IG91dHB1dFN0cmVhbTsKKwkJCQkJaWYgKHBzID09IG51bGwpIHsKKwkJCQkJCXBzID0gU3lzdGVtLm91dDsKKwkJCQkJfQorCQkJCQlwcy5wcmludGxuKE1lc3NhZ2VGb3JtYXQKIAkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmxmc0hvb2tDb25mbGljdCwgcmVwbykpOwogCQkJCX0KIAkJCQlyZXR1cm4gaG9vazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YQppbmRleCAxMjI0ZGY0Li5kNTcwZmRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZS5qYXZhCkBAIC0xNjMsMzUgKzE2Myw2IEBACiAJICogICAgICAgICAgICAodXNlcyAnLycgYW5kIG5vdCAnXCcpLgogCSAqIEBwYXJhbSBpc0RpcmVjdG9yeQogCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGl0ZW0gaXMgYSBkaXJlY3RvcnkuCi0JICogQHBhcmFtIG5lZ2F0ZUZpcnN0TWF0Y2gKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGZpcnN0IG1hdGNoIHNob3VsZCBiZSBuZWdhdGVkCi0JICogQGRlcHJlY2F0ZWQgbmVnYXRlRmlyc3RNYXRjaCBpcyBub3QgaG9ub3JlZCBhbnltb3JlCi0JICogQHJldHVybiBzdGF0dXMgb2YgdGhlIHBhdGguCi0JICogQHNpbmNlIDMuNgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIE1hdGNoUmVzdWx0IGlzSWdub3JlZChTdHJpbmcgZW50cnlQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5LAotCQkJYm9vbGVhbiBuZWdhdGVGaXJzdE1hdGNoKSB7Ci0JCWZpbmFsIEJvb2xlYW4gcmVzdWx0ID0gY2hlY2tJZ25vcmVkKGVudHJ5UGF0aCwgaXNEaXJlY3RvcnkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJldHVybiBuZWdhdGVGaXJzdE1hdGNoCi0JCQkJCT8gTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5UX05FR0FURV9GSVJTVF9NQVRDSAotCQkJCQk6IE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVDsKLQkJfQotCi0JCXJldHVybiByZXN1bHQuYm9vbGVhblZhbHVlKCkgPyBNYXRjaFJlc3VsdC5JR05PUkVECi0JCQkJOiBNYXRjaFJlc3VsdC5OT1RfSUdOT1JFRDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYW4gZW50cnkgcGF0aCBtYXRjaGVzIGFuIGlnbm9yZSBydWxlLgotCSAqCi0JICogQHBhcmFtIGVudHJ5UGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGVzdC4gVGhlIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byB0aGlzIGlnbm9yZQotCSAqICAgICAgICAgICAgbm9kZSdzIG93biByZXBvc2l0b3J5IHBhdGgsIGFuZCBpbiByZXBvc2l0b3J5IHBhdGggZm9ybWF0Ci0JICogICAgICAgICAgICAodXNlcyAnLycgYW5kIG5vdCAnXCcpLgotCSAqIEBwYXJhbSBpc0RpcmVjdG9yeQotCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGl0ZW0gaXMgYSBkaXJlY3RvcnkuCiAJICogQHJldHVybiBCb29sZWFuLlRSVUUsIGlmIHRoZSBlbnRyeSBpcyBpZ25vcmVkOyBCb29sZWFuLkZBTFNFLCBpZiB0aGUKIAkgKiAgICAgICAgIGVudHJ5IGlzIGZvcmNlZCB0byBiZSBub3QgaWdub3JlZCAobmVnYXRlZCBtYXRjaCk7IG9yIG51bGwsIGlmCiAJICogICAgICAgICB1bmRldGVybWluZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQppbmRleCA2ZjMwNmI4Li45NGI0ZTAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCkBAIC0yODcsNiArMjg3LDggQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNyZWRlbnRpYWxVc2VybmFtZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRhZW1vbkFscmVhZHlSdW5uaW5nOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGF5c0FnbzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRlZXBlbk5vdFdpdGhEZWVwZW47CisJLyoqKi8gcHVibGljIFN0cmluZyBkZWVwZW5TaW5jZVdpdGhEZWVwZW47CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVCcmFuY2hVbmV4cGVjdGVkUmVzdWx0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlRmlsZUZhaWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZVJlcXVpcmVzWmVyb05ld0lkOwpAQCAtMzcyLDYgKzM3NCw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWxlTW9kZU5vdFNldEZvclBhdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJFeGVjdXRpb25GYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJFeGVjdXRpb25GYWlsZWRSYzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbmRpbmdHYXJiYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmxhZ0lzRGlzcG9zZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmbGFnTm90RnJvbVRoaXM7CkBAIC00MjMsNiArNDI2LDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWREZXB0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRFbmNyeXB0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEV4cGFuZFdpbGRjYXJkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEZpbHRlcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRHaXRkaXJSZWY7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0VHlwZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRJZDsKQEAgLTQ1Niw2ICs0NjAsNyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFN5c3RlbVByb3BlcnR5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRhZ09wdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lb3V0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRpbWVzdGFtcDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lVW5pdFZhbHVlMjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lVW5pdFZhbHVlMzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUcmVlWmVyb0xlbmd0aE5hbWU7CkBAIC02ODgsNiArNjkzLDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNvdXJjZVJlZkRvZXNudFJlc29sdmVUb0FueU9iamVjdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzcXVhc2hDb21taXROb3RVcGRhdGluZ0hFQUQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBzc2hDb21tYW5kRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoVXNlck5hbWVFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzbEZhaWx1cmVFeGNlcHRpb25NZXNzYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NsRmFpbHVyZUluZm87CkBAIC03MzAsNiArNzM2LDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVJc1VuY2VydGFpbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55Q29tbWFuZHM7CisJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55RmlsdGVyczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvb01hbnlJbmNsdWRlUmVjdXJzaW9uczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvcG9sb2dpY2FsU29ydFJlcXVpcmVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdHJhbnNwb3J0RXhjZXB0aW9uQmFkUmVmOwpAQCAtNzcxLDYgKzc3OCw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkRW9mSW5QYWNrOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZEh1bmtUcmFpbGVyOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZE9kZFJlc3VsdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRQYWNrZXRMaW5lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZFJlZlJlcG9ydDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRSZXBvcnRMaW5lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZFJlcG9ydExpbmUyOwpAQCAtNzg1LDYgKzc5Myw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duT2JqZWN0VHlwZTI7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duUmVwb3NpdG9yeUZvcm1hdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0MjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25UcmFuc3BvcnRDb21tYW5kOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blpsaWJFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVubG9ja0xvY2tGaWxlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5tZXJnZWRQYXRoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhCmluZGV4IDE5MDhkNmMuLmQxZDRmNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvS2V0Y2hTeXN0ZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEKQEAgLTI2MCw3ICsyNjAsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBmb2xsb3dlciBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIFVSSS4KIAkgKi8KLQlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykKKwlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKFJlcG9zaXRvcnkgcmVwbykKIAkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQlLZXRjaExlYWRlciBsZWFkZXIgPSBuZXcgS2V0Y2hMZWFkZXIodGhpcykgewogCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9Mb2NhbFJlcGxpY2EuamF2YQppbmRleCA5YzM3YTkwLi43ZGRkZTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvTG9jYWxSZXBsaWNhLmphdmEKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvUmVtb3RlR2l0UmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKaW5kZXggNjc0ZGExZi4uYjYxMjc0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKaW5kZXggMTRkYzgwZi4uNDY4Nzk1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQAogCXByaXZhdGUgUmVmIGNsb2NrSGFuZDsKIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRGZzQmxvY2tDYWNoZShmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgRGZzQmxvY2tDYWNoZShEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgewogCQl0YWJsZVNpemUgPSB0YWJsZVNpemUoY2ZnKTsKIAkJaWYgKHRhYmxlU2l6ZSA8IDEpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRTaXplTXVzdEJlR3JlYXRlck9yRXF1YWwxKTsKQEAgLTMzMCw3ICszMzAsNyBAQAogCQlyZXR1cm4gYmxvY2tTaXplOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoZmluYWwgRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCWZpbmFsIGludCB3c3ogPSBjZmcuZ2V0QmxvY2tTaXplKCk7CiAJCWZpbmFsIGxvbmcgbGltaXQgPSBjZmcuZ2V0QmxvY2tMaW1pdCgpOwogCQlpZiAod3N6IDw9IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCmluZGV4IGNkNzkwMWIuLmRkN2NiODkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiAgICAgICAgICAgIHBhY2sgZmlsZSBkYXRhOyBtdXN0IGJlIHBvc2l0aXZlLgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0QmxvY2tMaW1pdChmaW5hbCBsb25nIG5ld0xpbWl0KSB7CisJcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0QmxvY2tMaW1pdChsb25nIG5ld0xpbWl0KSB7CiAJCWlmIChuZXdMaW1pdCA8PSAwKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5ibG9ja0xpbWl0Tm90UG9zaXRpdmUsCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShmaW5hbCBpbnQgbmV3U2l6ZSkgeworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShpbnQgbmV3U2l6ZSkgewogCQlpbnQgc2l6ZSA9IE1hdGgubWF4KDUxMiwgbmV3U2l6ZSk7CiAJCWlmICgoc2l6ZSAmIChzaXplIC0gMSkpICE9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCkBAIC0yMDYsNyArMjA2LDcgQEAKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gcmVhZCBwcm9wZXJ0aWVzIGZyb20uCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCWxvbmcgY2ZnQmxvY2tMaW1pdCA9IHJjLmdldExvbmcoCiAJCQkJQ09ORklHX0NPUkVfU0VDVElPTiwKIAkJCQlDT05GSUdfREZTX1NFQ1RJT04sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhCmluZGV4IDY5OTg5YTQuLmNhMTFmYjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhCkBAIC00MDMsNyArNDAzLDcgQEAKIAl9CiAKIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBnZXRBbGxSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVmZGIuZ2V0UmVmcygpOwogCQlMaXN0PFJlZj4gYWRkbCA9IHJlZmRiLmdldEFkZGl0aW9uYWxSZWZzKCk7CiAJCWlmICghYWRkbC5pc0VtcHR5KCkpIHsKIAkJCUxpc3Q8UmVmPiBhbGwgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkgKyBhZGRsLnNpemUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEKaW5kZXggZWIwYTUyNy4uMGQ5ZTJjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YQpAQCAtNjgsNiArNjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTGFyZ2VPYmplY3RFeGNlcHRpb247CkBAIC0zMDksNiArMzEwLDE1IEBACiAJCUNvbGxlY3Rpb25zLnNvcnQob2JqZWN0TGlzdCk7CiAJfQogCisJQE51bGxhYmxlCisJcHJpdmF0ZSBUZW1wb3JhcnlCdWZmZXIuSGVhcCBtYXliZUdldFRlbXBvcmFyeUJ1ZmZlcigKKwkJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCkgeworCQlpZiAobGlzdC5zaXplKCkgPD0gNTgwMDApIHsKKwkJCXJldHVybiBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoMiA8PCAyMCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCiAJUGFja0luZGV4IHdyaXRlUGFja0luZGV4KERmc1BhY2tEZXNjcmlwdGlvbiBwYWNrLCBieXRlW10gcGFja0hhc2gsCiAJCQlMaXN0PFBhY2tlZE9iamVjdEluZm8+IGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXBhY2suc2V0SW5kZXhWZXJzaW9uKElOREVYX1ZFUlNJT04pOwpAQCAtMzE3LDI3ICszMjcsMjAgQEAKIAkJLy8gSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiA1OCwwMDAgb2JqZWN0cywgdGhlIGVudGlyZSBpbmRleCBmaXRzIGluIHVuZGVyCiAJCS8vIDIgTWlCLiBDYWxsZXJzIHdpbGwgcHJvYmFibHkgbmVlZCB0aGUgaW5kZXggaW1tZWRpYXRlbHksIHNvIGJ1ZmZlcgogCQkvLyB0aGUgaW5kZXggaW4gcHJvY2VzcyBhbmQgbG9hZCBmcm9tIHRoZSBidWZmZXIuCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9IG51bGw7CiAJCVBhY2tJbmRleCBwYWNrSW5kZXggPSBudWxsOwotCQlpZiAobGlzdC5zaXplKCkgPD0gNTgwMDApIHsKLQkJCWJ1ZiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKLQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOwotCQkJcGFja0luZGV4ID0gUGFja0luZGV4LnJlYWQoYnVmLm9wZW5JbnB1dFN0cmVhbSgpKTsKLQkJfQotCi0JCXRyeSAoRGZzT3V0cHV0U3RyZWFtIG9zID0gZGIud3JpdGVGaWxlKHBhY2ssIElOREVYKSkgewotCQkJQ291bnRpbmdPdXRwdXRTdHJlYW0gY250ID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG9zKTsKLQkJCWlmIChidWYgIT0gbnVsbCkKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPSBtYXliZUdldFRlbXBvcmFyeUJ1ZmZlcihsaXN0KTsKKwkJCQlEZnNPdXRwdXRTdHJlYW0gb3MgPSBkYi53cml0ZUZpbGUocGFjaywgSU5ERVgpOworCQkJCUNvdW50aW5nT3V0cHV0U3RyZWFtIGNudCA9IG5ldyBDb3VudGluZ091dHB1dFN0cmVhbShvcykpIHsKKwkJCWlmIChidWYgIT0gbnVsbCkgeworCQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOworCQkJCXBhY2tJbmRleCA9IFBhY2tJbmRleC5yZWFkKGJ1Zi5vcGVuSW5wdXRTdHJlYW0oKSk7CiAJCQkJYnVmLndyaXRlVG8oY250LCBudWxsKTsKLQkJCWVsc2UKKwkJCX0gZWxzZSB7CiAJCQkJaW5kZXgoY250LCBwYWNrSGFzaCwgbGlzdCk7CisJCQl9CiAJCQlwYWNrLmFkZEZpbGVFeHQoSU5ERVgpOwogCQkJcGFjay5zZXRCbG9ja1NpemUoSU5ERVgsIG9zLmJsb2NrU2l6ZSgpKTsKIAkJCXBhY2suc2V0RmlsZVNpemUoSU5ERVgsIGNudC5nZXRDb3VudCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWJ1Zi5jbG9zZSgpOwotCQkJfQogCQl9CiAJCXJldHVybiBwYWNrSW5kZXg7CiAJfQpAQCAtNDAzLDcgKzQwNiw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaGRyQnVmWzBdID0gKGJ5dGUpIGI7CiAJCQl3cml0ZShoZHJCdWYsIDAsIDEpOwogCQl9CkBAIC02NjYsNiArNjY5LDcgQEAKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGJlbG93CiAJCQlmaW5hbCBEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7CiAJCQlpZiAoc3JjUGFjayAhPSBwYWNrS2V5KSB7CiAJCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YQppbmRleCA0MmIxYTQ3Li5jYTU0ZWUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iakRhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmpEYXRhYmFzZS5qYXZhCkBAIC00OTcsNyArNDk3LDcgQEAKIAkJfSB3aGlsZSAoIXBhY2tMaXN0LmNvbXBhcmVBbmRTZXQobywgbikpOwogCX0KIAotCVBhY2tMaXN0IHNjYW5QYWNrcyhmaW5hbCBQYWNrTGlzdCBvcmlnaW5hbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlQYWNrTGlzdCBzY2FuUGFja3MoUGFja0xpc3Qgb3JpZ2luYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVBhY2tMaXN0IG8sIG47CiAJCXN5bmNocm9uaXplZCAocGFja0xpc3QpIHsKIAkJCWRvIHsKQEAgLTU0Niw3ICs1NDYsNyBAQAogCQkJfQogCQl9CiAKLQkJaWYgKG5ld1BhY2tzLmlzRW1wdHkoKSkKKwkJaWYgKG5ld1BhY2tzLmlzRW1wdHkoKSAmJiBuZXdSZWZ0YWJsZXMuaXNFbXB0eSgpKQogCQkJcmV0dXJuIG5ldyBQYWNrTGlzdEltcGwoTk9fUEFDS1MucGFja3MsIE5PX1BBQ0tTLnJlZnRhYmxlcyk7CiAJCWlmICghZm91bmROZXcpIHsKIAkJCW9sZC5jbGVhckRpcnR5KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YQppbmRleCAzYTA0ZDcwLi41ZjRkZWUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqZWN0VG9QYWNrLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkvKiogTGVuZ3RoIG9mIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIG9iamVjdC4gKi8KIAlsb25nIGxlbmd0aDsKIAotCURmc09iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGZpbmFsIGludCB0eXBlKSB7CisJRGZzT2JqZWN0VG9QYWNrKEFueU9iamVjdElkIHNyYywgaW50IHR5cGUpIHsKIAkJc3VwZXIoc3JjLCB0eXBlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEKaW5kZXggYWI3NjMzMi4uYjQzYjliMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEKQEAgLTI2OCw4ICsyNjgsNyBAQAogCQlwYy5zZXRSZXVzZURlbHRhcyh0cnVlKTsKIAkJcGMuc2V0UmV1c2VPYmplY3RzKHRydWUpOwogCi0JCVBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihwYywgY3R4KTsKLQkJdHJ5IHsKKwkJdHJ5IChQYWNrV3JpdGVyIHB3ID0gbmV3IFBhY2tXcml0ZXIocGMsIGN0eCkpIHsKIAkJCXB3LnNldERlbHRhQmFzZUFzT2Zmc2V0KHRydWUpOwogCQkJcHcuc2V0UmV1c2VEZWx0YUNvbW1pdHMoZmFsc2UpOwogCkBAIC0yODUsOCArMjg0LDYgQEAKIAkJCQl3cml0ZUluZGV4KG9iamRiLCBvdXREZXNjLCBwdyk7CiAKIAkJCQlQYWNrU3RhdGlzdGljcyBzdGF0cyA9IHB3LmdldFN0YXRpc3RpY3MoKTsKLQkJCQlwdy5jbG9zZSgpOwotCQkJCXB3ID0gbnVsbDsKIAogCQkJCW91dERlc2Muc2V0UGFja1N0YXRzKHN0YXRzKTsKIAkJCQluZXdTdGF0cyA9IHN0YXRzOwpAQCAtMjk2LDEwICsyOTMsNiBAQAogCQkJCQlvYmpkYi5yb2xsYmFja1BhY2soQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvdXREZXNjKSk7CiAJCQkJfQogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB3ICE9IG51bGwpIHsKLQkJCQlwdy5jbG9zZSgpOwotCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKaW5kZXggN2UzNjA0Mi4uMDViOGY2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQpAQCAtMjA5LDggKzIwOSw3IEBACiAJCQl0cnkgewogCQkJCWN0eC5zdGF0cy5yZWFkSWR4Kys7CiAJCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwotCQkJCVJlYWRhYmxlQ2hhbm5lbCByYyA9IGN0eC5kYi5vcGVuRmlsZShkZXNjLCBJTkRFWCk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKFJlYWRhYmxlQ2hhbm5lbCByYyA9IGN0eC5kYi5vcGVuRmlsZShkZXNjLCBJTkRFWCkpIHsKIAkJCQkJSW5wdXRTdHJlYW0gaW4gPSBDaGFubmVscy5uZXdJbnB1dFN0cmVhbShyYyk7CiAJCQkJCWludCB3YW50U2l6ZSA9IDgxOTI7CiAJCQkJCWludCBicyA9IHJjLmJsb2NrU2l6ZSgpOwpAQCAtMjIxLDcgKzIyMCw2IEBACiAJCQkJCWlkeCA9IFBhY2tJbmRleC5yZWFkKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluLCBicykpOwogCQkJCQljdHguc3RhdHMucmVhZElkeEJ5dGVzICs9IHJjLnBvc2l0aW9uKCk7CiAJCQkJfSBmaW5hbGx5IHsKLQkJCQkJcmMuY2xvc2UoKTsKIAkJCQkJY3R4LnN0YXRzLnJlYWRJZHhNaWNyb3MgKz0gZWxhcHNlZE1pY3JvcyhzdGFydCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKQEAgLTI3NiwxMCArMjc0LDkgQEAKIAogCQkJbG9uZyBzaXplOwogCQkJUGFja0JpdG1hcEluZGV4IGlkeDsKLQkJCXRyeSB7Ci0JCQkJY3R4LnN0YXRzLnJlYWRCaXRtYXArKzsKLQkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIEJJVE1BUF9JTkRFWCk7CisJCQljdHguc3RhdHMucmVhZEJpdG1hcCsrOworCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJdHJ5IChSZWFkYWJsZUNoYW5uZWwgcmMgPSBjdHguZGIub3BlbkZpbGUoZGVzYywgQklUTUFQX0lOREVYKSkgewogCQkJCXRyeSB7CiAJCQkJCUlucHV0U3RyZWFtIGluID0gQ2hhbm5lbHMubmV3SW5wdXRTdHJlYW0ocmMpOwogCQkJCQlpbnQgd2FudFNpemUgPSA4MTkyOwpAQCAtMjkzLDcgKzI5MCw2IEBACiAJCQkJCQkJaW4sIGlkeChjdHgpLCBnZXRSZXZlcnNlSWR4KGN0eCkpOwogCQkJCX0gZmluYWxseSB7CiAJCQkJCXNpemUgPSByYy5wb3NpdGlvbigpOwotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeEJ5dGVzICs9IHNpemU7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4TWljcm9zICs9IGVsYXBzZWRNaWNyb3Moc3RhcnQpOwogCQkJCX0KQEAgLTQ0Myw2ICs0MzksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIGNvcHlQYWNrVGhyb3VnaENhY2hlKFBhY2tPdXRwdXRTdHJlYW0gb3V0LCBEZnNSZWFkZXIgY3R4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gRXhwbGljaXRseSBjbG9zZWQgaW4gZmluYWxseSBibG9jawogCQlSZWFkYWJsZUNoYW5uZWwgcmMgPSBudWxsOwogCQl0cnkgewogCQkJbG9uZyBwb3NpdGlvbiA9IDEyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQppbmRleCBiZjE0ZDE4Li4yZWE1YzM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQpAQCAtMTE1LDcgKzExNSw3IEBACiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0U3RyZWFtfS4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNSZWFkZXJPcHRpb25zIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CisJcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChpbnQgbmV3TGltaXQpIHsKIAkJc3RyZWFtRmlsZVRocmVzaG9sZCA9IE1hdGgubWF4KDAsIG5ld0xpbWl0KTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQppbmRleCAxOTc2ODE2Li41MTY5ZTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTMzLDcgKzEzMyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKKwlwdWJsaWMgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoYm9vbGVhbiBpbnRlcm5hbCkgewogCQkvLyBEbyBub3Qgc2VuZCBub3RpZmljYXRpb25zLgogCQkvLyBUaGVyZSBpcyBubyBpbmRleCwgYXMgdGhlcmUgaXMgbm8gd29ya2luZyB0cmVlLgogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1N0cmVhbUtleS5qYXZhCmluZGV4IDg3OTNkODMuLmMxMWY2OTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNTdHJlYW1LZXkuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTY3LDcgKzY3LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIERmc1N0cmVhbUtleSBvZihEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24gcmVwbywgU3RyaW5nIG5hbWUsCiAJCQlATnVsbGFibGUgUGFja0V4dCBleHQpIHsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlEZnNTdHJlYW1LZXkocmVwbywgbmFtZS5nZXRCeXRlcyhVVEZfOCksIGV4dCk7CisJCXJldHVybiBuZXcgQnl0ZUFycmF5RGZzU3RyZWFtS2V5KHJlcG8sIG5hbWUuZ2V0Qnl0ZXMoQ0hBUlNFVCksIGV4dCk7CiAJfQogCiAJZmluYWwgaW50IGhhc2g7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCmluZGV4IGZhMmM1MjkuLjM3ZDhkMWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCkBAIC0xMDQsMzEgKzEwNCwzNCBAQAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJUGFja0lucHV0U3RyZWFtIHBhY2tJbjsKKwkJLy8gY3R4IGlzIGNsb3NlZCBieSBQYWNrSW5wdXRTdHJlYW0sIG9yIGV4cGxpY2l0bHkgaW4gdGhlIGZpbmFsbHkgYmxvY2sKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAkJRGZzUmVhZGVyIGN0eCA9IGRiLm5ld1JlYWRlcigpOwotCQlJbnB1dFN0cmVhbSBpbjsKIAkJdHJ5IHsKLQkJCWluID0gbmV3IFBhY2tJbnB1dFN0cmVhbShwYWNrLCBvYmplY3RPZmZzZXQgKyBoZWFkZXJMZW5ndGgsIGN0eCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHBhY2tHb25lKSB7Ci0JCQkvLyBJZiB0aGUgcGFjayBmaWxlIGNhbm5vdCBiZSBwaW5uZWQgaW50byB0aGUgY3Vyc29yLCBpdAotCQkJLy8gcHJvYmFibHkgd2FzIHJlcGFja2VkIHJlY2VudGx5LiBHbyBmaW5kIHRoZSBvYmplY3QKLQkJCS8vIGFnYWluIGFuZCBvcGVuIHRoZSBzdHJlYW0gZnJvbSB0aGF0IGxvY2F0aW9uIGluc3RlYWQuCi0JCQkvLwogCQkJdHJ5IHsKKwkJCQlwYWNrSW4gPSBuZXcgUGFja0lucHV0U3RyZWFtKAorCQkJCQkJcGFjaywgb2JqZWN0T2Zmc2V0ICsgaGVhZGVyTGVuZ3RoLCBjdHgpOworCQkJCWN0eCA9IG51bGw7IC8vIG93bmVkIGJ5IHBhY2tJbgorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcGFja0dvbmUpIHsKKwkJCQkvLyBJZiB0aGUgcGFjayBmaWxlIGNhbm5vdCBiZSBwaW5uZWQgaW50byB0aGUgY3Vyc29yLCBpdAorCQkJCS8vIHByb2JhYmx5IHdhcyByZXBhY2tlZCByZWNlbnRseS4gR28gZmluZCB0aGUgb2JqZWN0CisJCQkJLy8gYWdhaW4gYW5kIG9wZW4gdGhlIHN0cmVhbSBmcm9tIHRoYXQgbG9jYXRpb24gaW5zdGVhZC4KIAkJCQlPYmplY3RJZCBvYmogPSBwYWNrLmdldFJldmVyc2VJZHgoY3R4KS5maW5kT2JqZWN0KG9iamVjdE9mZnNldCk7CiAJCQkJcmV0dXJuIGN0eC5vcGVuKG9iaiwgdHlwZSkub3BlblN0cmVhbSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQljdHguY2xvc2UoKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKLQkJCWN0eC5jbG9zZSgpOworCQkJaWYgKGN0eCAhPSBudWxsKSB7CisJCQkJY3R4LmNsb3NlKCk7CisJCQl9CiAJCX0KIAogCQkvLyBBbGlnbiBidWZmZXIgdG8gaW5mbGF0ZXIgc2l6ZSwgYXQgYSBsYXJnZXIgdGhhbiBkZWZhdWx0IGJsb2NrLgogCQkvLyBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb250ZXh0IHN3aXRjaGVzIGZyb20gdGhlCiAJCS8vIGNhbGxlciBkb3duIGludG8gdGhlIHBhY2sgc3RyZWFtIGluZmxhdGlvbi4KIAkJaW50IGJ1ZnN6ID0gODE5MjsKLQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLQkJCQluZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShpbiwgY3R4LmluZmxhdGVyKCksIGJ1ZnN6KSwKKwkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKwkJCQluZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShwYWNrSW4sIHBhY2tJbi5jdHguaW5mbGF0ZXIoKSwgYnVmc3opLAogCQkJCWJ1ZnN6KTsKIAkJcmV0dXJuIG5ldyBPYmplY3RTdHJlYW0uRmlsdGVyKHR5cGUsIHNpemUsIGluKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YQppbmRleCBkODgwMTFjLi5iODU5ZDlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvUGFja0lucHV0U3RyZWFtLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBmaW5hbCBjbGFzcyBQYWNrSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBmaW5hbCBEZnNSZWFkZXIgY3R4OworCWZpbmFsIERmc1JlYWRlciBjdHg7CiAKIAlwcml2YXRlIGZpbmFsIERmc1BhY2tGaWxlIHBhY2s7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEKaW5kZXggNmFkZTQzOC4uMWRhNDMwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEKQEAgLTIxMywyMiArMjEzLDYgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBhZGQoQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlKSB7Ci0JCQlpbnQgcG9zaXRpb24gPSBiaXRtYXBJbmRleC5maW5kT3JJbnNlcnQob2JqZWN0SWQsIHR5cGUpOwotCQkJaWYgKGJpdHNldC5jb250YWlucyhwb3NpdGlvbikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlCaXRtYXAgZW50cnkgPSBiaXRtYXBJbmRleC5nZXRCaXRtYXAob2JqZWN0SWQpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlvcihlbnRyeSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQliaXRzZXQuc2V0KHBvc2l0aW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKEFueU9iamVjdElkIG9iamVjdElkKSB7CiAJCQlpbnQgcG9zaXRpb24gPSBiaXRtYXBJbmRleC5maW5kUG9zaXRpb24ob2JqZWN0SWQpOwogCQkJcmV0dXJuIDAgPD0gcG9zaXRpb24gJiYgYml0c2V0LmNvbnRhaW5zKHBvc2l0aW9uKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEKaW5kZXggMzM4ZGY0YS4uYzZmZGViMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEKQEAgLTU4LDE0ICs1OCwxNCBAQAogZmluYWwgY2xhc3MgQnl0ZUFycmF5V2luZG93IGV4dGVuZHMgQnl0ZVdpbmRvdyB7CiAJcHJpdmF0ZSBmaW5hbCBieXRlW10gYXJyYXk7CiAKLQlCeXRlQXJyYXlXaW5kb3coZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBvLCBmaW5hbCBieXRlW10gYikgeworCUJ5dGVBcnJheVdpbmRvdyhQYWNrRmlsZSBwYWNrLCBsb25nIG8sIGJ5dGVbXSBiKSB7CiAJCXN1cGVyKHBhY2ssIG8sIGIubGVuZ3RoKTsKIAkJYXJyYXkgPSBiOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CisJcHJvdGVjdGVkIGludCBjb3B5KGludCBwLCBieXRlW10gYiwgaW50IG8sIGludCBuKSB7CiAJCW4gPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSBwLCBuKTsKIAkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgcCwgYiwgbywgbik7CiAJCXJldHVybiBuOwpAQCAtNzMsNyArNzMsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IHNldElucHV0KGZpbmFsIGludCBwb3MsIGZpbmFsIEluZmxhdGVyIGluZikKKwlwcm90ZWN0ZWQgaW50IHNldElucHV0KGludCBwb3MsIEluZmxhdGVyIGluZikKIAkJCXRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJaW50IG4gPSBhcnJheS5sZW5ndGggLSBwb3M7CiAJCWluZi5zZXRJbnB1dChhcnJheSwgcG9zLCBuKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YQppbmRleCA0ZGNmMTMzLi44ZTc5MDRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQnVmZmVyV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhCkBAIC02MCwxNCArNjAsMTQgQEAKIGZpbmFsIGNsYXNzIEJ5dGVCdWZmZXJXaW5kb3cgZXh0ZW5kcyBCeXRlV2luZG93IHsKIAlwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOwogCi0JQnl0ZUJ1ZmZlcldpbmRvdyhmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG8sIGZpbmFsIEJ5dGVCdWZmZXIgYikgeworCUJ5dGVCdWZmZXJXaW5kb3coUGFja0ZpbGUgcGFjaywgbG9uZyBvLCBCeXRlQnVmZmVyIGIpIHsKIAkJc3VwZXIocGFjaywgbywgYi5jYXBhY2l0eSgpKTsKIAkJYnVmZmVyID0gYjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgY29weShmaW5hbCBpbnQgcCwgZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvLCBpbnQgbikgeworCXByb3RlY3RlZCBpbnQgY29weShpbnQgcCwgYnl0ZVtdIGIsIGludCBvLCBpbnQgbikgewogCQlmaW5hbCBCeXRlQnVmZmVyIHMgPSBidWZmZXIuc2xpY2UoKTsKIAkJcy5wb3NpdGlvbihwKTsKIAkJbiA9IE1hdGgubWluKHMucmVtYWluaW5nKCksIG4pOwpAQCAtOTIsNyArOTIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IHNldElucHV0KGZpbmFsIGludCBwb3MsIGZpbmFsIEluZmxhdGVyIGluZikKKwlwcm90ZWN0ZWQgaW50IHNldElucHV0KGludCBwb3MsIEluZmxhdGVyIGluZikKIAkJCXRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUJ1ZmZlciBzID0gYnVmZmVyLnNsaWNlKCk7CiAJCXMucG9zaXRpb24ocG9zKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YQppbmRleCA3OTYzY2VhLi42MDA3M2YzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZVdpbmRvdy5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHNpemUgb2YgdGhlIGJ5dGUgd2luZG93CiAJICovCi0JcHJvdGVjdGVkIEJ5dGVXaW5kb3coZmluYWwgUGFja0ZpbGUgcCwgZmluYWwgbG9uZyBzLCBmaW5hbCBpbnQgbikgeworCXByb3RlY3RlZCBCeXRlV2luZG93KFBhY2tGaWxlIHAsIGxvbmcgcywgaW50IG4pIHsKIAkJcGFjayA9IHA7CiAJCXN0YXJ0ID0gczsKIAkJZW5kID0gc3RhcnQgKyBuOwpAQCAtODYsNyArODYsNyBAQAogCQlyZXR1cm4gKGludCkgKGVuZCAtIHN0YXJ0KTsKIAl9CiAKLQlmaW5hbCBib29sZWFuIGNvbnRhaW5zKGZpbmFsIFBhY2tGaWxlIG5lZWRlZEZpbGUsIGZpbmFsIGxvbmcgbmVlZGVkUG9zKSB7CisJZmluYWwgYm9vbGVhbiBjb250YWlucyhQYWNrRmlsZSBuZWVkZWRGaWxlLCBsb25nIG5lZWRlZFBvcykgewogCQlyZXR1cm4gcGFjayA9PSBuZWVkZWRGaWxlICYmIHN0YXJ0IDw9IG5lZWRlZFBvcyAmJiBuZWVkZWRQb3MgPCBlbmQ7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCmluZGV4IGU4MTBhZTAuLjdmN2VjYzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCkBAIC0xODEsMTEgKzE4MSwxMSBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGJvb2xlYW4gaGFzKEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaGFzKG9iamVjdElkLCBudWxsKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaGFzKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykKKwlwcml2YXRlIGJvb2xlYW4gaGFzKEFueU9iamVjdElkIG9iamVjdElkLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh1bnBhY2tlZE9iamVjdHMuY29udGFpbnMob2JqZWN0SWQpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCU9iamVjdExvYWRlciBvcGVuT2JqZWN0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlPYmplY3RMb2FkZXIgb3Blbk9iamVjdChXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbk9iamVjdChjdXJzLCBvYmplY3RJZCwgbnVsbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0RlbHRhQmFzZUNhY2hlLmphdmEKaW5kZXggYjM5Nzk4OS4uZWQ3M2U3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9EZWx0YUJhc2VDYWNoZS5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAKIAlzdGF0aWMgZmluYWwgU29mdFJlZmVyZW5jZTxFbnRyeT4gREVBRDsKIAotCXByaXZhdGUgc3RhdGljIGludCBoYXNoKGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChsb25nIHBvc2l0aW9uKSB7CiAJCXJldHVybiAoKChpbnQpIHBvc2l0aW9uKSA8PCAyMikgPj4+IDIyOwogCX0KIApAQCAtODIsNyArODIsNyBAQAogCQljYWNoZSA9IG5ldyBTbG90W0NBQ0hFX1NaXTsKIAl9CiAKLQlFbnRyeSBnZXQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCUVudHJ5IGdldChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCVNsb3QgZSA9IGNhY2hlW2hhc2gocG9zaXRpb24pXTsKIAkJaWYgKGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgbW92ZVRvSGVhZChmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgbW92ZVRvSGVhZChTbG90IGUpIHsKIAkJdW5saW5rKGUpOwogCQllLmxydVByZXYgPSBudWxsOwogCQllLmxydU5leHQgPSBscnVIZWFkOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCWxydUhlYWQgPSBlOwogCX0KIAotCXByaXZhdGUgdm9pZCB1bmxpbmsoZmluYWwgU2xvdCBlKSB7CisJcHJpdmF0ZSB2b2lkIHVubGluayhTbG90IGUpIHsKIAkJZmluYWwgU2xvdCBwcmV2ID0gZS5scnVQcmV2OwogCQlmaW5hbCBTbG90IG5leHQgPSBlLmxydU5leHQ7CiAJCWlmIChwcmV2ICE9IG51bGwpCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCW5leHQubHJ1UHJldiA9IHByZXY7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRW50cnkoZmluYWwgU2xvdCBlKSB7CisJcHJpdmF0ZSB2b2lkIGNsZWFyRW50cnkoU2xvdCBlKSB7CiAJCW9wZW5CeXRlQ291bnQgLT0gZS5zejsKIAkJZS5wcm92aWRlciA9IG51bGw7CiAJCWUuZGF0YSA9IERFQUQ7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAogCQlmaW5hbCBpbnQgdHlwZTsKIAotCQlFbnRyeShmaW5hbCBieXRlW10gYURhdGEsIGZpbmFsIGludCBhVHlwZSkgeworCQlFbnRyeShieXRlW10gYURhdGEsIGludCBhVHlwZSkgewogCQkJZGF0YSA9IGFEYXRhOwogCQkJdHlwZSA9IGFUeXBlOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQppbmRleCA5YjgyMjEwLi5kMDI4ODhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKQEAgLTQ2LDggKzQ2LDYgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xMjUsNiArMTIzLDEwIEBACiAJcHJpdmF0ZSBmaW5hbCBGaWxlQmFzZWRDb25maWcgcmVwb0NvbmZpZzsKIAlwcml2YXRlIGZpbmFsIFJlZkRhdGFiYXNlIHJlZnM7CiAJcHJpdmF0ZSBmaW5hbCBPYmplY3REaXJlY3Rvcnkgb2JqZWN0RGF0YWJhc2U7CisKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBzbmFwc2hvdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKwkvLyBwcm90ZWN0ZWQgYnkgc25hcHNob3RMb2NrCiAJcHJpdmF0ZSBGaWxlU25hcHNob3Qgc25hcHNob3Q7CiAKIAkvKioKQEAgLTE0Nyw3ICsxNDksNyBAQAogCSAqICAgICAgICAgICAgIGFjY2Vzc2VkLgogCSAqIEBzZWUgRmlsZVJlcG9zaXRvcnlCdWlsZGVyCiAJICovCi0JcHVibGljIEZpbGVSZXBvc2l0b3J5KGZpbmFsIEZpbGUgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShGaWxlIGdpdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcyhuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkuc2V0R2l0RGlyKGdpdERpcikuc2V0dXAoKSk7CiAJfQogCkBAIC0xNjEsNyArMTYzLDcgQEAKIAkgKiAgICAgICAgICAgICBhY2Nlc3NlZC4KIAkgKiBAc2VlIEZpbGVSZXBvc2l0b3J5QnVpbGRlcgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKG5ldyBGaWxlKGdpdERpcikpOwogCX0KIApAQCAtMTc0LDcgKzE3Niw3IEBACiAJICogICAgICAgICAgICAgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBmaWxlIG9yIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBmaWxlCiAJICogICAgICAgICAgICAgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBCYXNlUmVwb3NpdG9yeUJ1aWxkZXIgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXN1cGVyKG9wdGlvbnMpOwogCiAJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldGVudigKQEAgLTI0MCw4ICsyNDIsOSBAQAogCQkJCQkJTG9uZy52YWx1ZU9mKHJlcG9zaXRvcnlGb3JtYXRWZXJzaW9uKSkpOwogCQl9CiAKLQkJaWYgKCFpc0JhcmUoKSkKKwkJaWYgKCFpc0JhcmUoKSkgewogCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgbG9hZFN5c3RlbUNvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MzEsMzQgKzUzNCw0MyBAQAogCSAqICAgICAgICAgICAgIGluZGV4IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCwgcmVhZCwgb3IgaXMgbm90IHJlY29nbml6ZWQgYXMKIAkgKiAgICAgICAgICAgICBhIEdpdCBwYWNrIGZpbGUgaW5kZXguCiAJICovCi0JcHVibGljIHZvaWQgb3BlblBhY2soZmluYWwgRmlsZSBwYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIG9wZW5QYWNrKEZpbGUgcGFjaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb2JqZWN0RGF0YWJhc2Uub3BlblBhY2socGFjayk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzY2FuRm9yUmVwb0NoYW5nZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsgLy8gVGhpcyB3aWxsIGxvb2sgZm9yIGNoYW5nZXMgdG8gcmVmcworCQlnZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsgLy8gVGhpcyB3aWxsIGxvb2sgZm9yIGNoYW5nZXMgdG8gcmVmcwogCQlkZXRlY3RJbmRleENoYW5nZXMoKTsKIAl9CiAKIAkvKiogRGV0ZWN0IGluZGV4IGNoYW5nZXMuICovCiAJcHJpdmF0ZSB2b2lkIGRldGVjdEluZGV4Q2hhbmdlcygpIHsKLQkJaWYgKGlzQmFyZSgpKQorCQlpZiAoaXNCYXJlKCkpIHsKIAkJCXJldHVybjsKKwkJfQogCiAJCUZpbGUgaW5kZXhGaWxlID0gZ2V0SW5kZXhGaWxlKCk7Ci0JCWlmIChzbmFwc2hvdCA9PSBudWxsKQotCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShpbmRleEZpbGUpOwotCQllbHNlIGlmIChzbmFwc2hvdC5pc01vZGlmaWVkKGluZGV4RmlsZSkpCi0JCQlub3RpZnlJbmRleENoYW5nZWQoKTsKKwkJc3luY2hyb25pemVkIChzbmFwc2hvdExvY2spIHsKKwkJCWlmIChzbmFwc2hvdCA9PSBudWxsKSB7CisJCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShpbmRleEZpbGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICghc25hcHNob3QuaXNNb2RpZmllZChpbmRleEZpbGUpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCW5vdGlmeUluZGV4Q2hhbmdlZChmYWxzZSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoKSB7Ci0JCXNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUoZ2V0SW5kZXhGaWxlKCkpOwotCQlmaXJlRXZlbnQobmV3IEluZGV4Q2hhbmdlZEV2ZW50KCkpOworCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZChib29sZWFuIGludGVybmFsKSB7CisJCXN5bmNocm9uaXplZCAoc25hcHNob3RMb2NrKSB7CisJCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGdldEluZGV4RmlsZSgpKTsKKwkJfQorCQlmaXJlRXZlbnQobmV3IEluZGV4Q2hhbmdlZEV2ZW50KGludGVybmFsKSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVTbmFwc2hvdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEKaW5kZXggMjE2NWFhMi4uMTBhZGM2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEKQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJCSsgIiwgcmVhZDogIiArIGYuZm9ybWF0KG5ldyBEYXRlKGxhc3RSZWFkKSkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBub3RSYWN5Q2xlYW4oZmluYWwgbG9uZyByZWFkKSB7CisJcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihsb25nIHJlYWQpIHsKIAkJLy8gVGhlIGxhc3QgbW9kaWZpZWQgdGltZSBncmFudWxhcml0eSBvZiBGQVQgZmlsZXN5c3RlbXMgaXMgMiBzZWNvbmRzLgogCQkvLyBVc2luZyAyLjUgc2Vjb25kcyBoZXJlIHByb3ZpZGVzIGEgcmVhc29uYWJseSBoaWdoIGFzc3VyYW5jZSB0aGF0CiAJCS8vIGEgbW9kaWZpY2F0aW9uIHdhcyBub3QgbWlzc2VkLgpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCXJldHVybiByZWFkIC0gbGFzdE1vZGlmaWVkID4gMjUwMDsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZChmaW5hbCBsb25nIGN1cnJMYXN0TW9kaWZpZWQpIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZChsb25nIGN1cnJMYXN0TW9kaWZpZWQpIHsKIAkJLy8gQW55IGRpZmZlcmVuY2UgaW5kaWNhdGVzIHRoZSBwYXRoIHdhcyBtb2RpZmllZC4KIAkJLy8KIAkJaWYgKGxhc3RNb2RpZmllZCAhPSBjdXJyTGFzdE1vZGlmaWVkKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0dDLmphdmEKaW5kZXggYWQ0MWQ5OC4uMGVjZmIyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhCkBAIC03NjksNyArNzY5LDggQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgdm9pZCBwYWNrUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfUkVGUykudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpCisJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9SRUZTKTsKIAkJTGlzdDxTdHJpbmc+IHJlZnNUb0JlUGFja2VkID0gbmV3IEFycmF5TGlzdDw+KHJlZnMuc2l6ZSgpKTsKIAkJcG0uYmVnaW5UYXNrKEpHaXRUZXh0LmdldCgpLnBhY2tSZWZzLCByZWZzLnNpemUoKSk7CiAJCXRyeSB7CkBAIC04MzUsNyArODM2LDcgQEAKIAkJfQogCiAJCUxpc3Q8T2JqZWN0SWRTZXQ+IGV4Y2x1ZGVkID0gbmV3IExpbmtlZExpc3Q8PigpOwotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgeworCQlmb3IgKFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgewogCQkJY2hlY2tDYW5jZWxsZWQoKTsKIAkJCWlmIChmLnNob3VsZEJlS2VwdCgpKQogCQkJCWV4Y2x1ZGVkLmFkZChmLmdldEluZGV4KCkpOwpAQCAtOTk4LDYgKzk5OSw5IEBACiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZVRlbXBQYWNrc0lkeCgpIHsKIAkJUGF0aCBwYWNrRGlyID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKS50b1BhdGgoKTsKIAkJSW5zdGFudCB0aHJlc2hvbGQgPSBJbnN0YW50Lm5vdygpLm1pbnVzKDEsIENocm9ub1VuaXQuREFZUyk7CisJCWlmICghRmlsZXMuZXhpc3RzKHBhY2tEaXIpKSB7CisJCQlyZXR1cm47CisJCX0KIAkJdHJ5IChEaXJlY3RvcnlTdHJlYW08UGF0aD4gc3RyZWFtID0KIAkJCQlGaWxlcy5uZXdEaXJlY3RvcnlTdHJlYW0ocGFja0RpciwgImdjXypfdG1wIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJc3RyZWFtLmZvckVhY2godCAtPiB7CkBAIC0xMDU5LDcgKzEwNjMsNyBAQAogCSAqLwogCXByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGdldEFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZEYXRhYmFzZSByZWZkYiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVmZGIuZ2V0UmVmcygpOwogCQlMaXN0PFJlZj4gYWRkbCA9IHJlZmRiLmdldEFkZGl0aW9uYWxSZWZzKCk7CiAJCWlmICghYWRkbC5pc0VtcHR5KCkpIHsKIAkJCUxpc3Q8UmVmPiBhbGwgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkgKyBhZGRsLnNpemUoKSk7CkBAIC0xMzY3LDcgKzEzNzEsNyBAQAogCQl9CiAKIAkJUmVmRGF0YWJhc2UgcmVmRGIgPSByZXBvLmdldFJlZkRhdGFiYXNlKCk7Ci0JCWZvciAoUmVmIHIgOiByZWZEYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgciA6IHJlZkRiLmdldFJlZnMoKSkgewogCQkJU3RvcmFnZSBzdG9yYWdlID0gci5nZXRTdG9yYWdlKCk7CiAJCQlpZiAoc3RvcmFnZSA9PSBTdG9yYWdlLkxPT1NFIHx8IHN0b3JhZ2UgPT0gU3RvcmFnZS5MT09TRV9QQUNLRUQpCiAJCQkJcmV0Lm51bWJlck9mTG9vc2VSZWZzKys7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NMb2cuamF2YQppbmRleCA4MjQ1OGMxLi4wZTU4N2NlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xNzEsNiArMTcxLDYgQEAKIAkJaWYgKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7CiAJCQlub25FbXB0eSA9IHRydWU7CiAJCX0KLQkJbG9jay53cml0ZShjb250ZW50LmdldEJ5dGVzKFVURl84KSk7CisJCWxvY2sud3JpdGUoY29udGVudC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhCmluZGV4IDNkMGU5YzcuLmM4MmQ1MmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xhenlPYmplY3RJZFNldEZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC04Niw3ICs4Niw3IEBACiAJcHJpdmF0ZSBPYmplY3RJZE93bmVyTWFwPEVudHJ5PiBsb2FkKCkgewogCQlPYmplY3RJZE93bmVyTWFwPEVudHJ5PiByID0gbmV3IE9iamVjdElkT3duZXJNYXA8PigpOwogCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCQkJUmVhZGVyIHJpbiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaW4sIFVURl84KTsKKwkJCQlSZWFkZXIgcmluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpbiwgQ0hBUlNFVCk7CiAJCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmluKSkgewogCQkJTXV0YWJsZU9iamVjdElkIGlkID0gbmV3IE11dGFibGVPYmplY3RJZCgpOwogCQkJZm9yIChTdHJpbmcgbGluZTsgKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsOykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2FsT2JqZWN0VG9QYWNrLmphdmEKaW5kZXggNTVlZWI5NS4uZWQ1Y2JmYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJLyoqIExlbmd0aCBvZiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBvYmplY3QuICovCiAJbG9uZyBsZW5ndGg7CiAKLQlMb2NhbE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGZpbmFsIGludCB0eXBlKSB7CisJTG9jYWxPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSkgewogCQlzdXBlcihzcmMsIHR5cGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEKaW5kZXggOWJlZmUyYS4uYjgwYzU4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhCkBAIC05Myw3ICs5Myw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdW5sb2NrZWQsIGZhbHNlIGlmIHVubG9ja2luZyBmYWlsZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5sb2NrKGZpbmFsIEZpbGUgZmlsZSkgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1bmxvY2soRmlsZSBmaWxlKSB7CiAJCWZpbmFsIEZpbGUgbG9ja0ZpbGUgPSBnZXRMb2NrRmlsZShmaWxlKTsKIAkJZmluYWwgaW50IGZsYWdzID0gRmlsZVV0aWxzLlJFVFJZIHwgRmlsZVV0aWxzLlNLSVBfTUlTU0lORzsKIAkJdHJ5IHsKQEAgLTE0NCwyNiArMTQ0LDggQEAKIAkgKgogCSAqIEBwYXJhbSBmCiAJICogICAgICAgICAgICB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgbG9ja2VkLgotCSAqIEBwYXJhbSBmcwotCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KLQkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGUjTG9ja0ZpbGUoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAogCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIExvY2tGaWxlKGZpbmFsIEZpbGUgZiwgZmluYWwgRlMgZnMpIHsKLQkJcmVmID0gZjsKLQkJbGNrID0gZ2V0TG9ja0ZpbGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbG9jayBmb3IgYW55IGZpbGUuCi0JICoKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgTG9ja0ZpbGUoZmluYWwgRmlsZSBmKSB7CisJcHVibGljIExvY2tGaWxlKEZpbGUgZikgewogCQlyZWYgPSBmOwogCQlsY2sgPSBnZXRMb2NrRmlsZShyZWYpOwogCX0KQEAgLTI4Miw3ICsyNjQsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4gVGhlIGxvY2sgaXMgcmVsZWFzZWQKIAkgKiAgICAgICAgICAgICBiZWZvcmUgdGhyb3dpbmcgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggKyAxXTsKIAkJaWQuY29weVRvKGJ1ZiwgMCk7CiAJCWJ1ZltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdID0gJ1xuJzsKQEAgLTMwMyw3ICsyODUsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4gVGhlIGxvY2sgaXMgcmVsZWFzZWQKIAkgKiAgICAgICAgICAgICBiZWZvcmUgdGhyb3dpbmcgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlcXVpcmVMb2NrKCk7CiAJCXRyeSB7CiAJCQlpZiAoZnN5bmMpIHsKQEAgLTM0OSwxOCArMzMxLDE4IEBACiAKIAkJcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbywgZmluYWwgaW50IG4pCisJCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG8sIGludCBuKQogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiLCBvLCBuKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiKTsKIAkJCX0KIApAQCAtNDAwLDcgKzM4Miw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb21taXQgbWV0aG9kIG11c3QgcmVtZW1iZXIgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oYm9vbGVhbiBvbikgewogCQlzZXROZWVkU25hcHNob3Qob24pOwogCX0KIApAQCAtNDExLDcgKzM5Myw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb21taXQgbWV0aG9kIG11c3QgcmVtZW1iZXIgdGhlIEZpbGVTbmFwc2hvdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZWVkU25hcHNob3QoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE5lZWRTbmFwc2hvdChib29sZWFuIG9uKSB7CiAJCW5lZWRTbmFwc2hvdCA9IG9uOwogCX0KIApAQCAtNDIxLDcgKzQwMyw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIGRpcnR5IGRhdGEgc2hvdWxkIGJlIGZvcmNlZCB0byB0aGUgZHJpdmUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RlN5bmMoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldEZTeW5jKGJvb2xlYW4gb24pIHsKIAkJZnN5bmMgPSBvbjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggOTJiNTNhZC4uNTFjNTcwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkvLyBGdWxseSBjbG9zZSBhbGwgbG9hZGVkIGFsdGVybmF0ZXMgYW5kIGNsZWFyIHRoZSBhbHRlcm5hdGUgbGlzdC4KIAkJQWx0ZXJuYXRlSGFuZGxlW10gYWx0ID0gYWx0ZXJuYXRlcy5nZXQoKTsKIAkJaWYgKGFsdCAhPSBudWxsICYmIGFsdGVybmF0ZXMuY29tcGFyZUFuZFNldChhbHQsIG51bGwpKSB7Ci0JCQlmb3IoZmluYWwgQWx0ZXJuYXRlSGFuZGxlIG9kIDogYWx0KQorCQkJZm9yKEFsdGVybmF0ZUhhbmRsZSBvZCA6IGFsdCkKIAkJCQlvZC5jbG9zZSgpOwogCQl9CiAJfQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJICogQWRkIGEgc2luZ2xlIGV4aXN0aW5nIHBhY2sgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2sgZmlsZXMuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFBhY2tGaWxlIG9wZW5QYWNrKGZpbmFsIEZpbGUgcGFjaykKKwlwdWJsaWMgUGFja0ZpbGUgb3BlblBhY2soRmlsZSBwYWNrKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHAgPSBwYWNrLmdldE5hbWUoKTsKIAkJaWYgKHAubGVuZ3RoKCkgIT0gNTAgfHwgIXAuc3RhcnRzV2l0aCgicGFjay0iKSB8fCAhcC5lbmRzV2l0aCgiLnBhY2siKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC02MTksNyArNjE5LDcgQEAKIAkJCVdpbmRvd0N1cnNvciBjdXJzLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUGFja0xpc3QgcExpc3QgPSBwYWNrTGlzdC5nZXQoKTsKIAkJU0VBUkNIOiBmb3IgKDs7KSB7Ci0JCQlmb3IgKGZpbmFsIFBhY2tGaWxlIHAgOiBwTGlzdC5wYWNrcykgeworCQkJZm9yIChQYWNrRmlsZSBwIDogcExpc3QucGFja3MpIHsKIAkJCQl0cnkgewogCQkJCQlMb2NhbE9iamVjdFJlcHJlc2VudGF0aW9uIHJlcCA9IHAucmVwcmVzZW50YXRpb24oY3Vycywgb3RwKTsKIAkJCQkJcC5yZXNldFRyYW5zaWVudEVycm9yQ291bnQoKTsKQEAgLTgxNCw3ICs4MTQsNyBAQAogCQlyZXR1cm4gc2hhbGxvd0NvbW1pdHNJZHM7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBhY2soZmluYWwgUGFja0ZpbGUgcGYpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0UGFjayhQYWNrRmlsZSBwZikgewogCQlQYWNrTGlzdCBvLCBuOwogCQlkbyB7CiAJCQlvID0gcGFja0xpc3QuZ2V0KCk7CkBAIC04MzcsNyArODM3LDcgQEAKIAkJfSB3aGlsZSAoIXBhY2tMaXN0LmNvbXBhcmVBbmRTZXQobywgbikpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVQYWNrKGZpbmFsIFBhY2tGaWxlIGRlYWRQYWNrKSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZVBhY2soUGFja0ZpbGUgZGVhZFBhY2spIHsKIAkJUGFja0xpc3QgbywgbjsKIAkJZG8gewogCQkJbyA9IHBhY2tMaXN0LmdldCgpOwpAQCAtODU1LDcgKzg1NSw3IEBACiAJCWRlYWRQYWNrLmNsb3NlKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoZmluYWwgUGFja0ZpbGVbXSBsaXN0LCBmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoUGFja0ZpbGVbXSBsaXN0LCBQYWNrRmlsZSBwYWNrKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogCQkJaWYgKGxpc3RbaV0gPT0gcGFjaykKIAkJCQlyZXR1cm4gaTsKQEAgLTg2Myw3ICs4NjMsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3MoZmluYWwgUGFja0xpc3Qgb3JpZ2luYWwpIHsKKwlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrcyhQYWNrTGlzdCBvcmlnaW5hbCkgewogCQlzeW5jaHJvbml6ZWQgKHBhY2tMaXN0KSB7CiAJCQlQYWNrTGlzdCBvLCBuOwogCQkJZG8gewpAQCAtODgyLDEzICs4ODIsMTMgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzSW1wbChmaW5hbCBQYWNrTGlzdCBvbGQpIHsKKwlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrc0ltcGwoUGFja0xpc3Qgb2xkKSB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFBhY2tGaWxlPiBmb3JSZXVzZSA9IHJldXNlTWFwKG9sZCk7CiAJCWZpbmFsIEZpbGVTbmFwc2hvdCBzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKHBhY2tEaXJlY3RvcnkpOwogCQlmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lcyA9IGxpc3RQYWNrRGlyZWN0b3J5KCk7CiAJCWZpbmFsIExpc3Q8UGFja0ZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4obmFtZXMuc2l6ZSgpID4+IDIpOwogCQlib29sZWFuIGZvdW5kTmV3ID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgU3RyaW5nIGluZGV4TmFtZSA6IG5hbWVzKSB7CisJCWZvciAoU3RyaW5nIGluZGV4TmFtZSA6IG5hbWVzKSB7CiAJCQkvLyBNdXN0IG1hdGNoICJwYWNrLVswLTlhLWZdezQwfS5pZHgiIHRvIGJlIGFuIGluZGV4LgogCQkJLy8KIAkJCWlmIChpbmRleE5hbWUubGVuZ3RoKCkgIT0gNDkgfHwgIWluZGV4TmFtZS5lbmRzV2l0aCgiLmlkeCIpKSAvLyROT04tTkxTLTEkCkBAIC05MzEsNyArOTMxLDcgQEAKIAkJCXJldHVybiBvbGQ7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIHAgOiBmb3JSZXVzZS52YWx1ZXMoKSkgeworCQlmb3IgKFBhY2tGaWxlIHAgOiBmb3JSZXVzZS52YWx1ZXMoKSkgewogCQkJcC5jbG9zZSgpOwogCQl9CiAKQEAgLTk0Myw5ICs5NDMsOSBAQAogCQlyZXR1cm4gbmV3IFBhY2tMaXN0KHNuYXBzaG90LCByKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gcmV1c2VNYXAoZmluYWwgUGFja0xpc3Qgb2xkKSB7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUGFja0ZpbGU+IHJldXNlTWFwKFBhY2tMaXN0IG9sZCkgewogCQlmaW5hbCBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gZm9yUmV1c2UgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoZmluYWwgUGFja0ZpbGUgcCA6IG9sZC5wYWNrcykgeworCQlmb3IgKFBhY2tGaWxlIHAgOiBvbGQucGFja3MpIHsKIAkJCWlmIChwLmludmFsaWQoKSkgewogCQkJCS8vIFRoZSBwYWNrIGluc3RhbmNlIGlzIGNvcnJ1cHRlZCwgYW5kIGNhbm5vdCBiZSBzYWZlbHkgdXNlZAogCQkJCS8vIGFnYWluLiBEbyBub3QgaW5jbHVkZSBpdCBpbiBvdXIgcmV1c2UgbWFwLgpAQCAtOTc0LDcgKzk3NCw3IEBACiAJCWlmIChuYW1lTGlzdCA9PSBudWxsKQogCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAJCWZpbmFsIFNldDxTdHJpbmc+IG5hbWVTZXQgPSBuZXcgSGFzaFNldDw+KG5hbWVMaXN0Lmxlbmd0aCA8PCAxKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbmFtZSA6IG5hbWVMaXN0KSB7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lTGlzdCkgewogCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgicGFjay0iKSkgLy8kTk9OLU5MUy0xJAogCQkJCW5hbWVTZXQuYWRkKG5hbWUpOwogCQl9CkBAIC0xMDMzLDEyICsxMDMzLDEyIEBACiAJCXJldHVybiBsLnRvQXJyYXkobmV3IEFsdGVybmF0ZUhhbmRsZVtsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG9wZW4oZmluYWwgRmlsZSBmKQorCXByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG9wZW4oRmlsZSBmKQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZikpOwogCX0KIAotCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBvYmpkaXIgPSBmcy5yZXNvbHZlKG9iamVjdHMsIGxvY2F0aW9uKTsKIAkJcmV0dXJuIG9wZW5BbHRlcm5hdGUob2JqZGlyKTsKQEAgLTEwNzYsNyArMTA3Niw3IEBACiAJCS8qKiBBbGwga25vd24gcGFja3MsIHNvcnRlZCBieSB7QGxpbmsgUGFja0ZpbGUjU09SVH0uICovCiAJCWZpbmFsIFBhY2tGaWxlW10gcGFja3M7CiAKLQkJUGFja0xpc3QoZmluYWwgRmlsZVNuYXBzaG90IG1vbml0b3IsIGZpbmFsIFBhY2tGaWxlW10gcGFja3MpIHsKKwkJUGFja0xpc3QoRmlsZVNuYXBzaG90IG1vbml0b3IsIFBhY2tGaWxlW10gcGFja3MpIHsKIAkJCXRoaXMuc25hcHNob3QgPSBtb25pdG9yOwogCQkJdGhpcy5wYWNrcyA9IHBhY2tzOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIuamF2YQppbmRleCBlMDZmNzIxLi5lNWE1NGUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAogCXByaXZhdGUgRGVmbGF0ZXIgZGVmbGF0ZTsKIAotCU9iamVjdERpcmVjdG9yeUluc2VydGVyKGZpbmFsIEZpbGVPYmplY3REYXRhYmFzZSBkZXN0LCBmaW5hbCBDb25maWcgY2ZnKSB7CisJT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIoRmlsZU9iamVjdERhdGFiYXNlIGRlc3QsIENvbmZpZyBjZmcpIHsKIAkJZGIgPSBkZXN0OwogCQljb25maWcgPSBjZmcuZ2V0KFdyaXRlQ29uZmlnLktFWSk7CiAJfQpAQCAtMTE3LDcgKzExNyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RJZCBpbnNlcnQoZmluYWwgaW50IHR5cGUsIGxvbmcgbGVuLCBmaW5hbCBJbnB1dFN0cmVhbSBpcykKKwlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGludCB0eXBlLCBsb25nIGxlbiwgSW5wdXRTdHJlYW0gaXMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaW5zZXJ0KHR5cGUsIGxlbiwgaXMsIGZhbHNlKTsKIAl9CkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJfQogCX0KIAotCXZvaWQgd3JpdGVIZWFkZXIoT3V0cHV0U3RyZWFtIG91dCwgZmluYWwgaW50IHR5cGUsIGxvbmcgbGVuKQorCXZvaWQgd3JpdGVIZWFkZXIoT3V0cHV0U3RyZWFtIG91dCwgaW50IHR5cGUsIGxvbmcgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0LndyaXRlKENvbnN0YW50cy5lbmNvZGVkVHlwZVN0cmluZyh0eXBlKSk7CiAJCW91dC53cml0ZSgoYnl0ZSkgJyAnKTsKQEAgLTI3OSw3ICsyNzksNyBAQAogCQlyZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgibm96IiwgbnVsbCwgZGIuZ2V0RGlyZWN0b3J5KCkpOyAvLyROT04tTkxTLTEkCiAJfQogCi0JRGVmbGF0ZXJPdXRwdXRTdHJlYW0gY29tcHJlc3MoZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgeworCURlZmxhdGVyT3V0cHV0U3RyZWFtIGNvbXByZXNzKE91dHB1dFN0cmVhbSBvdXQpIHsKIAkJaWYgKGRlZmxhdGUgPT0gbnVsbCkKIAkJCWRlZmxhdGUgPSBuZXcgRGVmbGF0ZXIoY29uZmlnLmdldENvbXByZXNzaW9uKCkpOwogCQllbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEKaW5kZXggNWRjYmE2MC4uMGNlYzJkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YQpAQCAtMTUzLDcgKzE1Myw3IEBACiAJICogQHBhcmFtIGVtcHR5CiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBrZWVwaW5nIGFuIGVtcHR5IHBhY2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0S2VlcEVtcHR5KGZpbmFsIGJvb2xlYW4gZW1wdHkpIHsKKwlwdWJsaWMgdm9pZCBzZXRLZWVwRW1wdHkoYm9vbGVhbiBlbXB0eSkgewogCQlrZWVwRW1wdHkgPSBlbXB0eTsKIAl9CiAKQEAgLTQyOSw4ICs0MjksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlSWR4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0ID0gZ2V0U29ydGVkT2JqZWN0TGlzdChudWxsIC8qIGJ5IE9iamVjdElkICovKTsKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCkpIHsKIAkJCWZpbmFsIFBhY2tJbmRleFdyaXRlciBpdzsKIAkJCWlmIChpbmRleFZlcnNpb24gPD0gMCkKIAkJCQlpdyA9IFBhY2tJbmRleFdyaXRlci5jcmVhdGVPbGRlc3RQb3NzaWJsZShvcywgbGlzdCk7CkBAIC00MzgsMTIgKzQzNywxMCBAQAogCQkJCWl3ID0gUGFja0luZGV4V3JpdGVyLmNyZWF0ZVZlcnNpb24ob3MsIGluZGV4VmVyc2lvbik7CiAJCQlpdy53cml0ZShsaXN0LCBwYWNrSGFzaCk7CiAJCQlvcy5nZXRDaGFubmVsKCkuZm9yY2UodHJ1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcy5jbG9zZSgpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYWNrTG9jayByZW5hbWVBbmRPcGVuUGFjayhmaW5hbCBTdHJpbmcgbG9ja01lc3NhZ2UpCisJcHJpdmF0ZSBQYWNrTG9jayByZW5hbWVBbmRPcGVuUGFjayhTdHJpbmcgbG9ja01lc3NhZ2UpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWtlZXBFbXB0eSAmJiBnZXRPYmplY3RDb3VudCgpID09IDApIHsKIAkJCWNsZWFudXBUZW1wb3JhcnlGaWxlcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQppbmRleCAyMWExYzdmLi42NzcyZTJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQpAQCAtNDQsNyArNDQsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC01Myw2ICs1Miw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZWNvZGUuamF2YWV3YWguRVdBSENvbXByZXNzZWRCaXRtYXA7CiAKQEAgLTkzLDE5ICs5MywxNSBAQAogCXB1YmxpYyBzdGF0aWMgUGFja0JpdG1hcEluZGV4IG9wZW4oCiAJCQlGaWxlIGlkeEZpbGUsIFBhY2tJbmRleCBwYWNrSW5kZXgsIFBhY2tSZXZlcnNlSW5kZXggcmV2ZXJzZUluZGV4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpZHhGaWxlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiByZWFkKGZkLCBwYWNrSW5kZXgsIHJldmVyc2VJbmRleCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnJlYWRhYmxlUGFja0luZGV4LAotCQkJCQkJCWlkeEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotCQkJCQlpb2UpOwotCQl9IGZpbmFsbHkgeworCQl0cnkgKFNpbGVudEZpbGVJbnB1dFN0cmVhbSBmZCA9IG5ldyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0oCisJCQkJaWR4RmlsZSkpIHsKIAkJCXRyeSB7Ci0JCQkJZmQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKLQkJCQkvLyBpZ25vcmUKKwkJCQlyZXR1cm4gcmVhZChmZCwgcGFja0luZGV4LCByZXZlcnNlSW5kZXgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKKwkJCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCisJCQkJCQlpb2UpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlLmphdmEKaW5kZXggZDUyMTljNy4uNzFmNjRhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkvKiogU29ydHMgUGFja0ZpbGVzIHRvIGJlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0byBsZWFzdCByZWNlbnRseSBjcmVhdGVkLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQYWNrRmlsZT4gU09SVCA9IG5ldyBDb21wYXJhdG9yPFBhY2tGaWxlPigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYWNrRmlsZSBhLCBmaW5hbCBQYWNrRmlsZSBiKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShQYWNrRmlsZSBhLCBQYWNrRmlsZSBiKSB7CiAJCQlyZXR1cm4gYi5wYWNrTGFzdE1vZGlmaWVkIC0gYS5wYWNrTGFzdE1vZGlmaWVkOwogCQl9CiAJfTsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCSAqIEBwYXJhbSBleHRlbnNpb25zCiAJICogICAgICAgICAgICBhZGRpdGlvbmFsIHBhY2sgZmlsZSBleHRlbnNpb25zIHdpdGggdGhlIHNhbWUgYmFzZSBhcyB0aGUgcGFjawogCSAqLwotCXB1YmxpYyBQYWNrRmlsZShmaW5hbCBGaWxlIHBhY2tGaWxlLCBpbnQgZXh0ZW5zaW9ucykgeworCXB1YmxpYyBQYWNrRmlsZShGaWxlIHBhY2tGaWxlLCBpbnQgZXh0ZW5zaW9ucykgewogCQl0aGlzLnBhY2tGaWxlID0gcGFja0ZpbGU7CiAJCXRoaXMucGFja0xhc3RNb2RpZmllZCA9IChpbnQpIChwYWNrRmlsZS5sYXN0TW9kaWZpZWQoKSA+PiAxMCk7CiAJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7CkBAIC0yNTEsNyArMjUxLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBjYW5ub3QgYmUgbG9hZGVkIGludG8gbWVtb3J5LgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXNPYmplY3QoQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgb2Zmc2V0ID0gaWR4KCkuZmluZE9mZnNldChpZCk7CiAJCXJldHVybiAwIDwgb2Zmc2V0ICYmICFpc0NvcnJ1cHQob2Zmc2V0KTsKIAl9CkBAIC0yNzksNyArMjc5LDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHBhY2sgZmlsZSBvciB0aGUgaW5kZXggY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JT2JqZWN0TG9hZGVyIGdldChmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgZmluYWwgQW55T2JqZWN0SWQgaWQpCisJT2JqZWN0TG9hZGVyIGdldChXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBsb25nIG9mZnNldCA9IGlkeCgpLmZpbmRPZmZzZXQoaWQpOwogCQlyZXR1cm4gMCA8IG9mZnNldCAmJiAhaXNDb3JydXB0KG9mZnNldCkgPyBsb2FkKGN1cnMsIG9mZnNldCkgOiBudWxsOwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JT2JqZWN0SWQgZmluZE9iamVjdEZvck9mZnNldChmaW5hbCBsb25nIG9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlPYmplY3RJZCBmaW5kT2JqZWN0Rm9yT2Zmc2V0KGxvbmcgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmV2ZXJzZUlkeCgpLmZpbmRPYmplY3Qob2Zmc2V0KTsKIAl9CiAKQEAgLTY5Miw3ICs2OTIsNyBAQAogCQl9CiAJfQogCi0JQnl0ZUFycmF5V2luZG93IHJlYWQoZmluYWwgbG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworCUJ5dGVBcnJheVdpbmRvdyByZWFkKGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc3luY2hyb25pemVkIChyZWFkTG9jaykgewogCQkJaWYgKGxlbmd0aCA8IHBvcyArIHNpemUpCiAJCQkJc2l6ZSA9IChpbnQpIChsZW5ndGggLSBwb3MpOwpAQCAtNzAzLDcgKzcwMyw3IEBACiAJCX0KIAl9CiAKLQlCeXRlV2luZG93IG1tYXAoZmluYWwgbG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworCUJ5dGVXaW5kb3cgbW1hcChsb25nIHBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXN5bmNocm9uaXplZCAocmVhZExvY2spIHsKIAkJCWlmIChsZW5ndGggPCBwb3MgKyBzaXplKQogCQkJCXNpemUgPSAoaW50KSAobGVuZ3RoIC0gcG9zKTsKQEAgLTc2MCw3ICs3NjAsNyBAQAogCQl9CiAJfQogCi0JT2JqZWN0TG9hZGVyIGxvYWQoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKQorCU9iamVjdExvYWRlciBsb2FkKFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgTGFyZ2VPYmplY3RFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgYnl0ZVtdIGliID0gY3Vycy50ZW1wSWQ7CkBAIC05NDksNyArOTQ5LDcgQEAKIAkJcmV0dXJuIGhkcjsKIAl9CiAKLQlpbnQgZ2V0T2JqZWN0VHlwZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaW50IGdldE9iamVjdFR5cGUoV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gaWIgPSBjdXJzLnRlbXBJZDsKIAkJZm9yICg7OykgewogCQkJcmVhZEZ1bGx5KHBvcywgaWIsIDAsIDIwLCBjdXJzKTsKQEAgLTk5NiwxMyArOTk2LDEzIEBACiAJCX0KIAl9CiAKLQlsb25nIGdldE9iamVjdFNpemUoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGZpbmFsIEFueU9iamVjdElkIGlkKQorCWxvbmcgZ2V0T2JqZWN0U2l6ZShXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBsb25nIG9mZnNldCA9IGlkeCgpLmZpbmRPZmZzZXQoaWQpOwogCQlyZXR1cm4gMCA8IG9mZnNldCA/IGdldE9iamVjdFNpemUoY3Vycywgb2Zmc2V0KSA6IC0xOwogCX0KIAotCWxvbmcgZ2V0T2JqZWN0U2l6ZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgZmluYWwgbG9uZyBwb3MpCisJbG9uZyBnZXRPYmplY3RTaXplKFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwogCQlyZWFkRnVsbHkocG9zLCBpYiwgMCwgMjAsIGN1cnMpOwpAQCAtMTEwMCw3ICsxMTAwLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgbG9uZyBmaW5kRW5kT2Zmc2V0KGZpbmFsIGxvbmcgc3RhcnRPZmZzZXQpCisJcHJpdmF0ZSBsb25nIGZpbmRFbmRPZmZzZXQobG9uZyBzdGFydE9mZnNldCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgbWF4T2Zmc2V0ID0gbGVuZ3RoIC0gMjA7CiAJCXJldHVybiBnZXRSZXZlcnNlSWR4KCkuZmluZE5leHRPZmZzZXQoc3RhcnRPZmZzZXQsIG1heE9mZnNldCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCmluZGV4IGFjZmQ5YzQuLjcyNjk5YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCkBAIC00NSw3ICs0NSw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTY0LDYgKzYzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZFNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk5COworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogQWNjZXNzIHBhdGggdG8gbG9jYXRlIG9iamVjdHMgYnkge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkfSBpbiBhCkBAIC05NCwyMSArOTQsMTUgQEAKIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMgYnV0IGNvdWxkIG5vdCBiZSByZWFkIGR1ZSB0byBzZWN1cml0eSBlcnJvcnMsCiAJICogICAgICAgICAgICAgdW5yZWNvZ25pemVkIGRhdGEgdmVyc2lvbiwgb3IgdW5leHBlY3RlZCBkYXRhIGNvcnJ1cHRpb24uCiAJICovCi0JcHVibGljIHN0YXRpYyBQYWNrSW5kZXggb3BlbihmaW5hbCBGaWxlIGlkeEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmZCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaWR4RmlsZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVhZChmZCk7CisJcHVibGljIHN0YXRpYyBQYWNrSW5kZXggb3BlbihGaWxlIGlkeEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQlpZHhGaWxlKSkgeworCQkJCXJldHVybiByZWFkKGZkKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCiAJCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCiAJCQkJCWlvZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWZkLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIyKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9CiAJCX0KIAl9CiAKQEAgLTE0NSw3ICsxMzksNyBAQAogCQlyZXR1cm4gbmV3IFBhY2tJbmRleFYxKGZkLCBoZHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUT0MoZmluYWwgYnl0ZVtdIGgpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVE9DKGJ5dGVbXSBoKSB7CiAJCWZpbmFsIGJ5dGVbXSB0b2MgPSBQYWNrSW5kZXhXcml0ZXIuVE9DOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRvYy5sZW5ndGg7IGkrKykKIAkJCWlmIChoW2ldICE9IHRvY1tpXSkKQEAgLTE2Myw3ICsxNTcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBsb29rIGZvci4gTXVzdCBub3QgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBsaXN0ZWQgaW4gdGhpcyBpbmRleDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBpZCkgewogCQlyZXR1cm4gZmluZE9mZnNldChpZCkgIT0gLTE7CiAJfQogCkBAIC0yNDcsNyArMjQxLDcgQEAKIAkgKiAgICAgICAgICAgIG5lZ2F0aXZlLCBidXQgc3RpbGwgdmFsaWQuCiAJICogQHJldHVybiB0aGUgT2JqZWN0SWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LgogCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBpbnQgbnRoUG9zaXRpb24pIHsKKwlwdWJsaWMgZmluYWwgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoaW50IG50aFBvc2l0aW9uKSB7CiAJCWlmIChudGhQb3NpdGlvbiA+PSAwKQogCQkJcmV0dXJuIGdldE9iamVjdElkKChsb25nKSBudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCB1MzEgPSBudGhQb3NpdGlvbiA+Pj4gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYxLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMS5qYXZhCmluZGV4IDhlYTMxZTQuLjQ0NDRkZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYxLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjEuamF2YQpAQCAtMTEzLDE0ICsxMTMsMTQgQEAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgbG9uZyBnZXRPZmZzZXQ2NENvdW50KCkgewogCQlsb25nIG42NCA9IDA7Ci0JCWZvciAoZmluYWwgTXV0YWJsZUVudHJ5IGUgOiB0aGlzKSB7CisJCWZvciAoTXV0YWJsZUVudHJ5IGUgOiB0aGlzKSB7CiAJCQlpZiAoZS5nZXRPZmZzZXQoKSA+PSBJbnRlZ2VyLk1BWF9WQUxVRSkKIAkJCQluNjQrKzsKIAkJfQogCQlyZXR1cm4gbjY0OwogCX0KIAotCXByaXZhdGUgaW50IGZpbmRMZXZlbE9uZShmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CisJcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJaW50IGxldmVsT25lID0gQXJyYXlzLmJpbmFyeVNlYXJjaChpZHhIZWFkZXIsIG50aFBvc2l0aW9uICsgMSk7CiAJCWlmIChsZXZlbE9uZSA+PSAwKSB7CiAJCQkvLyBJZiB3ZSBoaXQgdGhlIGJ1Y2tldCBleGFjdGx5IHRoZSBpdGVtIGlzIGluIHRoZSBidWNrZXQsIG9yCkBAIC0xMzcsMTQgKzEzNywxNCBAQAogCQlyZXR1cm4gbGV2ZWxPbmU7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0TGV2ZWxUd28oZmluYWwgbG9uZyBudGhQb3NpdGlvbiwgZmluYWwgaW50IGxldmVsT25lKSB7CisJcHJpdmF0ZSBpbnQgZ2V0TGV2ZWxUd28obG9uZyBudGhQb3NpdGlvbiwgaW50IGxldmVsT25lKSB7CiAJCWZpbmFsIGxvbmcgYmFzZSA9IGxldmVsT25lID4gMCA/IGlkeEhlYWRlcltsZXZlbE9uZSAtIDFdIDogMDsKIAkJcmV0dXJuIChpbnQpIChudGhQb3NpdGlvbiAtIGJhc2UpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKKwlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQobG9uZyBudGhQb3NpdGlvbikgewogCQlmaW5hbCBpbnQgbGV2ZWxPbmUgPSBmaW5kTGV2ZWxPbmUobnRoUG9zaXRpb24pOwogCQlmaW5hbCBpbnQgcCA9IGdldExldmVsVHdvKG50aFBvc2l0aW9uLCBsZXZlbE9uZSk7CiAJCWZpbmFsIGludCBkYXRhSWR4ID0gaWRPZmZzZXQocCk7CkBAIC0xNjEsNyArMTYxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgZmluZE9mZnNldChmaW5hbCBBbnlPYmplY3RJZCBvYmpJZCkgeworCXB1YmxpYyBsb25nIGZpbmRPZmZzZXQoQW55T2JqZWN0SWQgb2JqSWQpIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gb2JqSWQuZ2V0Rmlyc3RCeXRlKCk7CiAJCWJ5dGVbXSBkYXRhID0gaWR4ZGF0YVtsZXZlbE9uZV07CiAJCWlmIChkYXRhID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjIuamF2YQppbmRleCA5ZjYyMDFmLi5hOTYwNmNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYyLmphdmEKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlyZXR1cm4gb2Zmc2V0NjQubGVuZ3RoIC8gODsKIAl9CiAKLQlwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXByaXZhdGUgaW50IGZpbmRMZXZlbE9uZShsb25nIG50aFBvc2l0aW9uKSB7CiAJCWludCBsZXZlbE9uZSA9IEFycmF5cy5iaW5hcnlTZWFyY2goZmFub3V0VGFibGUsIG50aFBvc2l0aW9uICsgMSk7CiAJCWlmIChsZXZlbE9uZSA+PSAwKSB7CiAJCQkvLyBJZiB3ZSBoaXQgdGhlIGJ1Y2tldCBleGFjdGx5IHRoZSBpdGVtIGlzIGluIHRoZSBidWNrZXQsIG9yCkBAIC0xOTMsMTQgKzE5MywxNCBAQAogCQlyZXR1cm4gbGV2ZWxPbmU7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0TGV2ZWxUd28oZmluYWwgbG9uZyBudGhQb3NpdGlvbiwgZmluYWwgaW50IGxldmVsT25lKSB7CisJcHJpdmF0ZSBpbnQgZ2V0TGV2ZWxUd28obG9uZyBudGhQb3NpdGlvbiwgaW50IGxldmVsT25lKSB7CiAJCWZpbmFsIGxvbmcgYmFzZSA9IGxldmVsT25lID4gMCA/IGZhbm91dFRhYmxlW2xldmVsT25lIC0gMV0gOiAwOwogCQlyZXR1cm4gKGludCkgKG50aFBvc2l0aW9uIC0gYmFzZSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChsb25nIG50aFBvc2l0aW9uKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IGZpbmRMZXZlbE9uZShudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCBwID0gZ2V0TGV2ZWxUd28obnRoUG9zaXRpb24sIGxldmVsT25lKTsKIAkJZmluYWwgaW50IHA0ID0gcCA8PCAyOwpAQCAtMjA5LDcgKzIwOSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIGdldE9mZnNldChmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CisJcHVibGljIGxvbmcgZ2V0T2Zmc2V0KGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gZmluZExldmVsT25lKG50aFBvc2l0aW9uKTsKIAkJZmluYWwgaW50IGxldmVsVHdvID0gZ2V0TGV2ZWxUd28obnRoUG9zaXRpb24sIGxldmVsT25lKTsKIAkJcmV0dXJuIGdldE9mZnNldChsZXZlbE9uZSwgbGV2ZWxUd28pOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIGZpbmRPZmZzZXQoZmluYWwgQW55T2JqZWN0SWQgb2JqSWQpIHsKKwlwdWJsaWMgbG9uZyBmaW5kT2Zmc2V0KEFueU9iamVjdElkIG9iaklkKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IG9iaklkLmdldEZpcnN0Qnl0ZSgpOwogCQlmaW5hbCBpbnQgbGV2ZWxUd28gPSBiaW5hcnlTZWFyY2hMZXZlbFR3byhvYmpJZCwgbGV2ZWxPbmUpOwogCQlpZiAobGV2ZWxUd28gPT0gLTEpCkBAIC0yMjUsNyArMjI1LDcgQEAKIAkJcmV0dXJuIGdldE9mZnNldChsZXZlbE9uZSwgbGV2ZWxUd28pOwogCX0KIAotCXByaXZhdGUgbG9uZyBnZXRPZmZzZXQoZmluYWwgaW50IGxldmVsT25lLCBmaW5hbCBpbnQgbGV2ZWxUd28pIHsKKwlwcml2YXRlIGxvbmcgZ2V0T2Zmc2V0KGludCBsZXZlbE9uZSwgaW50IGxldmVsVHdvKSB7CiAJCWZpbmFsIGxvbmcgcCA9IE5CLmRlY29kZVVJbnQzMihvZmZzZXQzMltsZXZlbE9uZV0sIGxldmVsVHdvIDw8IDIpOwogCQlpZiAoKHAgJiBJU19PNjQpICE9IDApCiAJCQlyZXR1cm4gTkIuZGVjb2RlVUludDY0KG9mZnNldDY0LCAoOCAqIChpbnQpIChwICYgfklTX082NCkpKTsKQEAgLTI5MCw3ICsyOTAsNyBAQAogCQlyZXR1cm4gKHAgPDwgMikgKyBwOyAvLyBwICogNQogCX0KIAotCXByaXZhdGUgaW50IGJpbmFyeVNlYXJjaExldmVsVHdvKGZpbmFsIEFueU9iamVjdElkIG9iaklkLCBmaW5hbCBpbnQgbGV2ZWxPbmUpIHsKKwlwcml2YXRlIGludCBiaW5hcnlTZWFyY2hMZXZlbFR3byhBbnlPYmplY3RJZCBvYmpJZCwgaW50IGxldmVsT25lKSB7CiAJCWZpbmFsIGludFtdIGRhdGEgPSBuYW1lc1tsZXZlbE9uZV07CiAJCWludCBoaWdoID0gb2Zmc2V0MzJbbGV2ZWxPbmVdLmxlbmd0aCA+Pj4gMjsKIAkJaWYgKGhpZ2ggPT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEKaW5kZXggYjkyZjdiMi4uNTUzZjdjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEKQEAgLTEyMyw3ICsxMjMsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgaW50IG9sZGVzdFBvc3NpYmxlRm9ybWF0KAogCQkJZmluYWwgTGlzdDw/IGV4dGVuZHMgUGFja2VkT2JqZWN0SW5mbz4gb2JqcykgewotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBvYmpzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IG9ianMpIHsKIAkJCWlmICghUGFja0luZGV4V3JpdGVyVjEuY2FuU3RvcmUob2UpKQogCQkJCXJldHVybiAyOwogCQl9CkBAIC0xODAsNyArMTgwLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdGhpcyBpbnN0YW5jZSBvdXRwdXRzIHRvLiBJZiBub3QgYWxyZWFkeSBidWZmZXJlZAogCSAqICAgICAgICAgICAgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4gYSBidWZmZXJlZCBzdHJlYW0uCiAJICovCi0JcHJvdGVjdGVkIFBhY2tJbmRleFdyaXRlcihmaW5hbCBPdXRwdXRTdHJlYW0gZHN0KSB7CisJcHJvdGVjdGVkIFBhY2tJbmRleFdyaXRlcihPdXRwdXRTdHJlYW0gZHN0KSB7CiAJCW91dCA9IG5ldyBEaWdlc3RPdXRwdXRTdHJlYW0oZHN0IGluc3RhbmNlb2YgQnVmZmVyZWRPdXRwdXRTdHJlYW0gPyBkc3QKIAkJCQk6IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkc3QpLAogCQkJCUNvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCkpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVRPQyhmaW5hbCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZVRPQyhpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0LndyaXRlKFRPQyk7CiAJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgdmVyc2lvbik7CiAJCW91dC53cml0ZSh0bXAsIDAsIDQpOwpAQCAtMjY5LDExICsyNjksMTEgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZhbk91dFRhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50W10gZmFub3V0ID0gbmV3IGludFsyNTZdOwotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gcG8gOiBlbnRyaWVzKQorCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gcG8gOiBlbnRyaWVzKQogCQkJZmFub3V0W3BvLmdldEZpcnN0Qnl0ZSgpICYgMHhmZl0rKzsKIAkJZm9yIChpbnQgaSA9IDE7IGkgPCAyNTY7IGkrKykKIAkJCWZhbm91dFtpXSArPSBmYW5vdXRbaSAtIDFdOwotCQlmb3IgKGZpbmFsIGludCBuIDogZmFub3V0KSB7CisJCWZvciAoaW50IG4gOiBmYW5vdXQpIHsKIAkJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgbik7CiAJCQlvdXQud3JpdGUodG1wLCAwLCA0KTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjEuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYxLmphdmEKaW5kZXggZjIyMGU3YS4uODc3ZjdjOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMS5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgKiBAc2VlIFBhY2tJbmRleFYxCiAgKi8KIGNsYXNzIFBhY2tJbmRleFdyaXRlclYxIGV4dGVuZHMgUGFja0luZGV4V3JpdGVyIHsKLQlzdGF0aWMgYm9vbGVhbiBjYW5TdG9yZShmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lKSB7CisJc3RhdGljIGJvb2xlYW4gY2FuU3RvcmUoUGFja2VkT2JqZWN0SW5mbyBvZSkgewogCQkvLyBXZSBhcmUgbGltaXRlZCB0byA0IEdCIHBlciBwYWNrIGFzIG9mZnNldCBpcyAzMiBiaXQgdW5zaWduZWQgaW50LgogCQkvLwogCQlyZXR1cm4gb2UuZ2V0T2Zmc2V0KCkgPj4+IDEgPCBJbnRlZ2VyLk1BWF9WQUxVRTsKQEAgLTczLDcgKzczLDcgQEAKIAlwcm90ZWN0ZWQgdm9pZCB3cml0ZUltcGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUZhbk91dFRhYmxlKCk7CiAKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlpZiAoIWNhblN0b3JlKG9lKSkKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkucGFja1Rvb0xhcmdlRm9ySW5kZXhWZXJzaW9uMSk7CiAJCQlOQi5lbmNvZGVJbnQzMih0bXAsIDAsIChpbnQpIG9lLmdldE9mZnNldCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMi5qYXZhCmluZGV4IGExOGNjYWYuLjk1MDVkMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjIuamF2YQpAQCAtNzYsMTIgKzc2LDEyIEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0TmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKQorCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKQogCQkJb2UuY29weVJhd1RvKG91dCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlQ1JDcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKKwkJZm9yIChQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgewogCQkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCBvZS5nZXRDUkMoKSk7CiAJCQlvdXQud3JpdGUodG1wLCAwLCA0KTsKIAkJfQpAQCAtODksNyArODksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlT2Zmc2V0MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgbzY0ID0gMDsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlmaW5hbCBsb25nIG8gPSBvZS5nZXRPZmZzZXQoKTsKIAkJCWlmIChvIDw9IE1BWF9PRkZTRVRfMzIpCiAJCQkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCAoaW50KSBvKTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCX0KIAogCXByaXZhdGUgdm9pZCB3cml0ZU9mZnNldDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlmaW5hbCBsb25nIG8gPSBvZS5nZXRPZmZzZXQoKTsKIAkJCWlmIChNQVhfT0ZGU0VUXzMyIDwgbykgewogCQkJCU5CLmVuY29kZUludDY0KHRtcCwgMCwgbyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhCmluZGV4IDdmZjI2OTYuLjBjZTNjYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhCkBAIC00MzgsNyArNDM4LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQloZHJCdWZbMF0gPSAoYnl0ZSkgYjsKIAkJCXdyaXRlKGhkckJ1ZiwgMCwgMSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tMb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrTG9jay5qYXZhCmluZGV4IDgyZjBkYTEuLjBmYjg5MTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tMb2NrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0xvY2suamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCSAqIEBwYXJhbSBmcwogCSAqICAgICAgICAgICAgdGhlIGZpbGVzeXN0ZW0gYWJzdHJhY3Rpb24gdXNlZCBieSB0aGUgcmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgUGFja0xvY2soZmluYWwgRmlsZSBwYWNrRmlsZSwgZmluYWwgRlMgZnMpIHsKKwlwdWJsaWMgUGFja0xvY2soRmlsZSBwYWNrRmlsZSwgRlMgZnMpIHsKIAkJZmluYWwgRmlsZSBwID0gcGFja0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwogCQlmaW5hbCBTdHJpbmcgbiA9IHBhY2tGaWxlLmdldE5hbWUoKTsKIAkJa2VlcEZpbGUgPSBuZXcgRmlsZShwLCBuLnN1YnN0cmluZygwLCBuLmxlbmd0aCgpIC0gNSkgKyAiLmtlZXAiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1JldmVyc2VJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1JldmVyc2VJbmRleC5qYXZhCmluZGV4IDk0NGFmMjYuLmRmZTIzYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tSZXZlcnNlSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrUmV2ZXJzZUluZGV4LmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAkgKiBAcGFyYW0gcGFja0luZGV4CiAJICogICAgICAgICAgICBmb3J3YXJkIGluZGV4IC0gZW50cmllcyB0byAocmV2ZXJzZSkgaW5kZXguCiAJICovCi0JcHVibGljIFBhY2tSZXZlcnNlSW5kZXgoZmluYWwgUGFja0luZGV4IHBhY2tJbmRleCkgeworCXB1YmxpYyBQYWNrUmV2ZXJzZUluZGV4KFBhY2tJbmRleCBwYWNrSW5kZXgpIHsKIAkJaW5kZXggPSBwYWNrSW5kZXg7CiAKIAkJZmluYWwgbG9uZyBjbnQgPSBpbmRleC5nZXRPYmplY3RDb3VudCgpOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAKIAkJbG9uZyBtYXhPZmZzZXQgPSAwOwogCQlpbnQgaXRoID0gMDsKLQkJZm9yIChmaW5hbCBNdXRhYmxlRW50cnkgbWUgOiBpbmRleCkgeworCQlmb3IgKE11dGFibGVFbnRyeSBtZSA6IGluZGV4KSB7CiAJCQlmaW5hbCBsb25nIG8gPSBtZS5nZXRPZmZzZXQoKTsKIAkJCW9mZnNldHNCeVNoYTFbaXRoKytdID0gbzsKIAkJCWlmIChvID4gbWF4T2Zmc2V0KQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2Ygb2JqZWN0IHRvIGZpbmQuCiAJICogQHJldHVybiBvYmplY3QgaWQgZm9yIHRoaXMgb2Zmc2V0LCBvciBudWxsIGlmIG5vIG9iamVjdCB3YXMgZm91bmQuCiAJICovCi0JcHVibGljIE9iamVjdElkIGZpbmRPYmplY3QoZmluYWwgbG9uZyBvZmZzZXQpIHsKKwlwdWJsaWMgT2JqZWN0SWQgZmluZE9iamVjdChsb25nIG9mZnNldCkgewogCQlmaW5hbCBpbnQgaXRoID0gYmluYXJ5U2VhcmNoKG9mZnNldCk7CiAJCWlmIChpdGggPCAwKQogCQkJcmV0dXJuIG51bGw7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIG5vIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBvZmZzZXQuCiAJICovCi0JcHVibGljIGxvbmcgZmluZE5leHRPZmZzZXQoZmluYWwgbG9uZyBvZmZzZXQsIGZpbmFsIGxvbmcgbWF4T2Zmc2V0KQorCXB1YmxpYyBsb25nIGZpbmROZXh0T2Zmc2V0KGxvbmcgb2Zmc2V0LCBsb25nIG1heE9mZnNldCkKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGl0aCA9IGJpbmFyeVNlYXJjaChvZmZzZXQpOwogCQlpZiAoaXRoIDwgMCkKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQlyZXR1cm4gYmluYXJ5U2VhcmNoKG9mZnNldCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgYmluYXJ5U2VhcmNoKGZpbmFsIGxvbmcgb2Zmc2V0KSB7CisJcHJpdmF0ZSBpbnQgYmluYXJ5U2VhcmNoKGxvbmcgb2Zmc2V0KSB7CiAJCWludCBidWNrZXQgPSAoaW50KSAob2Zmc2V0IC8gYnVja2V0U2l6ZSk7CiAJCWludCBsb3cgPSBidWNrZXQgPT0gMCA/IDAgOiBvZmZzZXRJbmRleFtidWNrZXQgLSAxXTsKIAkJaW50IGhpZ2ggPSBvZmZzZXRJbmRleFtidWNrZXRdOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQppbmRleCAxMDZjODRiLi42YTE4ZGY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQpAQCAtMjA5LDcgKzIwOSw3IEBACiAKIAlwcml2YXRlIExpc3Q8SW50ZWdlcj4gcmV0cnlTbGVlcE1zID0gUkVUUllfU0xFRVBfTVM7CiAKLQlSZWZEaXJlY3RvcnkoZmluYWwgRmlsZVJlcG9zaXRvcnkgZGIpIHsKKwlSZWZEaXJlY3RvcnkoRmlsZVJlcG9zaXRvcnkgZGIpIHsKIAkJZmluYWwgRlMgZnMgPSBkYi5nZXRGUygpOwogCQlwYXJlbnQgPSBkYjsKIAkJZ2l0RGlyID0gZGIuZ2V0RGlyZWN0b3J5KCk7CkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlZiBnZXRSZWYoZmluYWwgU3RyaW5nIG5lZWRsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmIGdldFJlZihTdHJpbmcgbmVlZGxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZWZMaXN0PFJlZj4gcGFja2VkID0gZ2V0UGFja2VkUmVmcygpOwogCQlSZWYgcmVmID0gbnVsbDsKIAkJZm9yIChTdHJpbmcgcHJlZml4IDogU0VBUkNIX1BBVEgpIHsKQEAgLTQzNSw3ICs0MzUsNyBAQAogCiAJCVJlZkxpc3QuQnVpbGRlcjxMb29zZVJlZj4gbmV3TG9vc2U7CiAKLQkJTG9vc2VTY2FubmVyKGZpbmFsIFJlZkxpc3Q8TG9vc2VSZWY+IGN1ckxvb3NlKSB7CisJCUxvb3NlU2Nhbm5lcihSZWZMaXN0PExvb3NlUmVmPiBjdXJMb29zZSkgewogCQkJdGhpcy5jdXJMb29zZSA9IGN1ckxvb3NlOwogCQl9CiAKQEAgLTU0Niw3ICs1NDYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmIHBlZWwoZmluYWwgUmVmIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmIHBlZWwoUmVmIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmVmIGxlYWYgPSByZWYuZ2V0TGVhZigpOwogCQlpZiAobGVhZi5pc1BlZWxlZCgpIHx8IGxlYWYuZ2V0T2JqZWN0SWQoKSA9PSBudWxsKQogCQkJcmV0dXJuIHJlZjsKQEAgLTU2OCw3ICs1NjgsNyBAQAogCQlyZXR1cm4gcmVjcmVhdGUocmVmLCBuZXdMZWFmKTsKIAl9CiAKLQlwcml2YXRlIE9iamVjdElkUmVmIGRvUGVlbChmaW5hbCBSZWYgbGVhZikgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHJpdmF0ZSBPYmplY3RJZFJlZiBkb1BlZWwoUmVmIGxlYWYpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhnZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQlSZXZPYmplY3Qgb2JqID0gcncucGFyc2VBbnkobGVhZi5nZXRPYmplY3RJZCgpKTsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUmVmIHJlY3JlYXRlKGZpbmFsIFJlZiBvbGQsIGZpbmFsIE9iamVjdElkUmVmIGxlYWYpIHsKKwlwcml2YXRlIHN0YXRpYyBSZWYgcmVjcmVhdGUoUmVmIG9sZCwgT2JqZWN0SWRSZWYgbGVhZikgewogCQlpZiAob2xkLmlzU3ltYm9saWMoKSkgewogCQkJUmVmIGRzdCA9IHJlY3JlYXRlKG9sZC5nZXRUYXJnZXQoKSwgbGVhZik7CiAJCQlyZXR1cm4gbmV3IFN5bWJvbGljUmVmKG9sZC5nZXROYW1lKCksIGRzdCk7CkBAIC05NzIsNyArOTcyLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmTGlzdDxSZWY+IHBhcnNlUGFja2VkUmVmcyhmaW5hbCBCdWZmZXJlZFJlYWRlciBicikKKwlwcml2YXRlIFJlZkxpc3Q8UmVmPiBwYXJzZVBhY2tlZFJlZnMoQnVmZmVyZWRSZWFkZXIgYnIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZMaXN0LkJ1aWxkZXI8UmVmPiBhbGwgPSBuZXcgUmVmTGlzdC5CdWlsZGVyPD4oKTsKIAkJUmVmIGxhc3QgPSBudWxsOwpAQCAtMTAyNCw3ICsxMDI0LDcgQEAKIAkJcmV0dXJuIGFsbC50b1JlZkxpc3QoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29weShmaW5hbCBTdHJpbmcgc3JjLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvcHkoU3RyaW5nIHNyYywgaW50IG9mZiwgaW50IGVuZCkgewogCQkvLyBEb24ndCB1c2Ugc3Vic3RyaW5nIHNpbmNlIGl0IGNvdWxkIGxlYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBtdWNoCiAJCS8vIGxhcmdlciBleGlzdGluZyBzdHJpbmcuIEZvcmNlIGNvbnN0cnVjdGlvbiBvZiBhIGZ1bGwgbmV3IG9iamVjdC4KIAkJcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGVuZCAtIG9mZikuYXBwZW5kKHNyYywgb2ZmLCBlbmQpLnRvU3RyaW5nKCk7CkBAIC0xMTkwLDcgKzExOTAsNyBAQAogCQlyZXR1cm4gbmV3IExvb3NlVW5wZWVsZWQob3RoZXJTbmFwc2hvdCwgbmFtZSwgaWQpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTeW1SZWYoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IG4pIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3ltUmVmKGJ5dGVbXSBidWYsIGludCBuKSB7CiAJCWlmIChuIDwgNikKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIC8qKi9idWZbMF0gPT0gJ3InIC8vCkBAIC0xMjYzLDE4ICsxMjYzLDE4IEBACiAJCXJldHVybiBuZXcgRmlsZShnaXREaXIsIG5hbWUpOwogCX0KIAotCXN0YXRpYyBpbnQgbGV2ZWxzSW4oZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlzdGF0aWMgaW50IGxldmVsc0luKFN0cmluZyBuYW1lKSB7CiAJCWludCBjb3VudCA9IDA7CiAJCWZvciAoaW50IHAgPSBuYW1lLmluZGV4T2YoJy8nKTsgcCA+PSAwOyBwID0gbmFtZS5pbmRleE9mKCcvJywgcCArIDEpKQogCQkJY291bnQrKzsKIAkJcmV0dXJuIGNvdW50OwogCX0KIAotCXN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmaWxlLCBpbnQgZGVwdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShmaWxlLCBkZXB0aCwgbnVsbCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBpbnQgZGVwdGgsIExvY2tGaWxlIHJMY2spCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmaWxlLCBpbnQgZGVwdGgsIExvY2tGaWxlIHJMY2spCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWZpbGUuZGVsZXRlKCkgJiYgZmlsZS5pc0ZpbGUoKSkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5UmVuYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YQppbmRleCAyMDJlNTFmLi5lYzdlYzczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCW9iaklkID0gc291cmNlLmdldE9sZE9iamVjdElkKCk7CiAJCXVwZGF0ZUhFQUQgPSBuZWVkVG9VcGRhdGVIRUFEKCk7CiAJCXRtcCA9IHJlZmRiLm5ld1RlbXBvcmFyeVVwZGF0ZSgpOwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZWZkYi5nZXRSZXBvc2l0b3J5KCkpKSB7CisJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlZmRiLmdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCS8vIEZpcnN0IGJhY2t1cCB0aGUgc291cmNlIHNvIGl0cyBuZXZlciB1bnJlYWNoYWJsZS4KIAkJCXRtcC5zZXROZXdPYmplY3RJZChvYmpJZCk7CiAJCQl0bXAuc2V0Rm9yY2VVcGRhdGUodHJ1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlVcGRhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhCmluZGV4IDRkNmIyNDUuLjQ1Y2U2MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAJcHJpdmF0ZSBib29sZWFuIHNob3VsZERlcmVmOwogCXByaXZhdGUgTG9ja0ZpbGUgbG9jazsKIAotCVJlZkRpcmVjdG9yeVVwZGF0ZShmaW5hbCBSZWZEaXJlY3RvcnkgciwgZmluYWwgUmVmIHJlZikgeworCVJlZkRpcmVjdG9yeVVwZGF0ZShSZWZEaXJlY3RvcnkgciwgUmVmIHJlZikgewogCQlzdXBlcihyZWYpOwogCQlkYXRhYmFzZSA9IHI7CiAJfQpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXN1bHQgZG9VcGRhdGUoZmluYWwgUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmVzdWx0IGRvVXBkYXRlKFJlc3VsdCBzdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVdyaXRlQ29uZmlnIHdjID0gZGF0YWJhc2UuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpCiAJCQkJLmdldChXcml0ZUNvbmZpZy5LRVkpOwogCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc3VsdCBkb0RlbGV0ZShmaW5hbCBSZXN1bHQgc3RhdHVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBSZXN1bHQgZG9EZWxldGUoUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGdldFJlZigpLmdldFN0b3JhZ2UoKSAhPSBSZWYuU3RvcmFnZS5ORVcpCiAJCQlkYXRhYmFzZS5kZWxldGUodGhpcyk7CiAJCXJldHVybiBzdGF0dXM7CkBAIC0xNTYsNyArMTU2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc3VsdCBkb0xpbmsoZmluYWwgU3RyaW5nIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmVzdWx0IGRvTGluayhTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlXcml0ZUNvbmZpZyB3YyA9IGRhdGFiYXNlLmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKQogCQkJCS5nZXQoV3JpdGVDb25maWcuS0VZKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmbG9nV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YQppbmRleCBmZDZiNDI3Li4xMzFmNzE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YQpAQCAtMjIwLDYgKzIyMCwyMiBAQAogCQlyZXR1cm4gQ29uc3RhbnRzLmVuY29kZShyLnRvU3RyaW5nKCkpOwogCX0KIAorCXByaXZhdGUgRmlsZU91dHB1dFN0cmVhbSBnZXRGaWxlT3V0cHV0U3RyZWFtKEZpbGUgbG9nKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlcnIpIHsKKwkJCUZpbGUgZGlyID0gbG9nLmdldFBhcmVudEZpbGUoKTsKKwkJCWlmIChkaXIuZXhpc3RzKCkpIHsKKwkJCQl0aHJvdyBlcnI7CisJCQl9CisJCQlpZiAoIWRpci5ta2RpcnMoKSAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5jYW5ub3RDcmVhdGVEaXJlY3RvcnksIGRpcikpOworCQkJfQorCQkJcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7CisJCX0KKwl9CisKIAlwcml2YXRlIFJlZmxvZ1dyaXRlciBsb2coU3RyaW5nIHJlZk5hbWUsIGJ5dGVbXSByZWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgbG9nID0gcmVmZGIubG9nRm9yKHJlZk5hbWUpOwogCQlib29sZWFuIHdyaXRlID0gZm9yY2VXcml0ZQpAQCAtMjI5LDI5ICsyNDUsMTcgQEAKIAkJCXJldHVybiB0aGlzOwogCiAJCVdyaXRlQ29uZmlnIHdjID0gcmVmZGIuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpLmdldChXcml0ZUNvbmZpZy5LRVkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG91dDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlcnIpIHsKLQkJCUZpbGUgZGlyID0gbG9nLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChkaXIuZXhpc3RzKCkpCi0JCQkJdGhyb3cgZXJyOwotCQkJaWYgKCFkaXIubWtkaXJzKCkgJiYgIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUpHaXRUZXh0LmdldCgpLmNhbm5vdENyZWF0ZURpcmVjdG9yeSwgZGlyKSk7Ci0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2csIHRydWUpOwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBnZXRGaWxlT3V0cHV0U3RyZWFtKGxvZykpIHsKIAkJCWlmICh3Yy5nZXRGU3luY1JlZkZpbGVzKCkpIHsKIAkJCQlGaWxlQ2hhbm5lbCBmYyA9IG91dC5nZXRDaGFubmVsKCk7CiAJCQkJQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAocmVjKTsKLQkJCQl3aGlsZSAoMCA8IGJ1Zi5yZW1haW5pbmcoKSkKKwkJCQl3aGlsZSAoMCA8IGJ1Zi5yZW1haW5pbmcoKSkgewogCQkJCQlmYy53cml0ZShidWYpOworCQkJCX0KIAkJCQlmYy5mb3JjZSh0cnVlKTsKLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKIAkJCQlvdXQud3JpdGUocmVjKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOworCQkJfQogCQl9CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdC5qYXZhCmluZGV4IGFkYjA1ZTQuLmNmNDc0YWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3QuamF2YQpAQCAtMjY2LDcgKzI2Niw3IEBACiAJCX0KIAl9CiAKLQlzdGF0aWMgYm9vbGVhbiBpc1N0YW5kYXJkRm9ybWF0KGZpbmFsIGJ5dGVbXSBoZHIpIHsKKwlzdGF0aWMgYm9vbGVhbiBpc1N0YW5kYXJkRm9ybWF0KGJ5dGVbXSBoZHIpIHsKIAkJLyoKIAkJICogV2UgbXVzdCBkZXRlcm1pbmUgaWYgdGhlIGJ1ZmZlciBjb250YWlucyB0aGUgc3RhbmRhcmQKIAkJICogemxpYi1kZWZsYXRlZCBzdHJlYW0gb3IgdGhlIGV4cGVyaW1lbnRhbCBmb3JtYXQgYmFzZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZS5qYXZhCmluZGV4IGU3MTI4NGYuLjhjZjFkNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGUuamF2YQpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJICogICAgICAgICAgICAgc2V0dGluZ3MsIHVzdWFsbHkgdG9vIGxvdyBvZiBhIGxpbWl0LgogCSAqLwogCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWNvbmZpZ3VyZShXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAkJZmluYWwgV2luZG93Q2FjaGUgbmMgPSBuZXcgV2luZG93Q2FjaGUoY2ZnKTsKIAkJZmluYWwgV2luZG93Q2FjaGUgb2MgPSBjYWNoZTsKIAkJaWYgKG9jICE9IG51bGwpCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJcmV0dXJuIGNhY2hlOwogCX0KIAotCXN0YXRpYyBmaW5hbCBCeXRlV2luZG93IGdldChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG9mZnNldCkKKwlzdGF0aWMgZmluYWwgQnl0ZVdpbmRvdyBnZXQoUGFja0ZpbGUgcGFjaywgbG9uZyBvZmZzZXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBXaW5kb3dDYWNoZSBjID0gY2FjaGU7CiAJCWZpbmFsIEJ5dGVXaW5kb3cgciA9IGMuZ2V0T3JMb2FkKHBhY2ssIGMudG9TdGFydChvZmZzZXQpKTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlzdGF0aWMgZmluYWwgdm9pZCBwdXJnZShmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CisJc3RhdGljIGZpbmFsIHZvaWQgcHVyZ2UoUGFja0ZpbGUgcGFjaykgewogCQljYWNoZS5yZW1vdmVBbGwocGFjayk7CiAJfQogCkBAIC0yMzIsNyArMjMyLDcgQEAKIAogCXByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBvcGVuQnl0ZXM7CiAKLQlwcml2YXRlIFdpbmRvd0NhY2hlKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgV2luZG93Q2FjaGUoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCXRhYmxlU2l6ZSA9IHRhYmxlU2l6ZShjZmcpOwogCQlmaW5hbCBpbnQgbG9ja0NvdW50ID0gbG9ja0NvdW50KGNmZyk7CiAJCWlmICh0YWJsZVNpemUgPCAxKQpAQCAtMjg2LDExICsyODYsMTEgQEAKIAkJcmV0dXJuIG9wZW5CeXRlcy5nZXQoKTsKIAl9CiAKLQlwcml2YXRlIGludCBoYXNoKGZpbmFsIGludCBwYWNrSGFzaCwgZmluYWwgbG9uZyBvZmYpIHsKKwlwcml2YXRlIGludCBoYXNoKGludCBwYWNrSGFzaCwgbG9uZyBvZmYpIHsKIAkJcmV0dXJuIHBhY2tIYXNoICsgKGludCkgKG9mZiA+Pj4gd2luZG93U2l6ZVNoaWZ0KTsKIAl9CiAKLQlwcml2YXRlIEJ5dGVXaW5kb3cgbG9hZChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG9mZnNldCkKKwlwcml2YXRlIEJ5dGVXaW5kb3cgbG9hZChQYWNrRmlsZSBwYWNrLCBsb25nIG9mZnNldCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChwYWNrLmJlZ2luV2luZG93Q2FjaGUoKSkKIAkJCW9wZW5GaWxlcy5pbmNyZW1lbnRBbmRHZXQoKTsKQEAgLTMxMCwxOCArMzEwLDE4IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlZiBjcmVhdGVSZWYoZmluYWwgUGFja0ZpbGUgcCwgZmluYWwgbG9uZyBvLCBmaW5hbCBCeXRlV2luZG93IHYpIHsKKwlwcml2YXRlIFJlZiBjcmVhdGVSZWYoUGFja0ZpbGUgcCwgbG9uZyBvLCBCeXRlV2luZG93IHYpIHsKIAkJZmluYWwgUmVmIHJlZiA9IG5ldyBSZWYocCwgbywgdiwgcXVldWUpOwogCQlvcGVuQnl0ZXMuYWRkQW5kR2V0KHJlZi5zaXplKTsKIAkJcmV0dXJuIHJlZjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2xlYXIoZmluYWwgUmVmIHJlZikgeworCXByaXZhdGUgdm9pZCBjbGVhcihSZWYgcmVmKSB7CiAJCW9wZW5CeXRlcy5hZGRBbmRHZXQoLXJlZi5zaXplKTsKIAkJY2xvc2UocmVmLnBhY2spOwogCX0KIAotCXByaXZhdGUgdm9pZCBjbG9zZShmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CisJcHJpdmF0ZSB2b2lkIGNsb3NlKFBhY2tGaWxlIHBhY2spIHsKIAkJaWYgKHBhY2suZW5kV2luZG93Q2FjaGUoKSkKIAkJCW9wZW5GaWxlcy5kZWNyZW1lbnRBbmRHZXQoKTsKIAl9CkBAIC0zMzAsMTEgKzMzMCwxMSBAQAogCQlyZXR1cm4gbWF4RmlsZXMgPCBvcGVuRmlsZXMuZ2V0KCkgfHwgbWF4Qnl0ZXMgPCBvcGVuQnl0ZXMuZ2V0KCk7CiAJfQogCi0JcHJpdmF0ZSBsb25nIHRvU3RhcnQoZmluYWwgbG9uZyBvZmZzZXQpIHsKKwlwcml2YXRlIGxvbmcgdG9TdGFydChsb25nIG9mZnNldCkgewogCQlyZXR1cm4gKG9mZnNldCA+Pj4gd2luZG93U2l6ZVNoaWZ0KSA8PCB3aW5kb3dTaXplU2hpZnQ7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlmaW5hbCBpbnQgd3N6ID0gY2ZnLmdldFBhY2tlZEdpdFdpbmRvd1NpemUoKTsKIAkJZmluYWwgbG9uZyBsaW1pdCA9IGNmZy5nZXRQYWNrZWRHaXRMaW1pdCgpOwogCQlpZiAod3N6IDw9IDApCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkJcmV0dXJuIChpbnQpIE1hdGgubWluKDUgKiAobGltaXQgLyB3c3opIC8gMiwgMjAwMDAwMDAwMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxvY2tDb3VudChmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgbG9ja0NvdW50KFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlyZXR1cm4gTWF0aC5tYXgoY2ZnLmdldFBhY2tlZEdpdE9wZW5GaWxlcygpLCAzMik7CiAJfQogCkBAIC0zNjAsNyArMzYwLDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IHJlZmVyZW5jZSB3YXMgbm90IGluIHRoZSBjYWNoZSBhbmQgY291bGQgbm90IGJlCiAJICogICAgICAgICAgICAgb2J0YWluZWQgYnkge0BsaW5rICNsb2FkKFBhY2tGaWxlLCBsb25nKX0uCiAJICovCi0JcHJpdmF0ZSBCeXRlV2luZG93IGdldE9yTG9hZChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKQorCXByaXZhdGUgQnl0ZVdpbmRvdyBnZXRPckxvYWQoUGFja0ZpbGUgcGFjaywgbG9uZyBwb3NpdGlvbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBzbG90ID0gc2xvdChwYWNrLCBwb3NpdGlvbik7CiAJCWZpbmFsIEVudHJ5IGUxID0gdGFibGUuZ2V0KHNsb3QpOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJCXJldHVybiB2OwogCX0KIAotCXByaXZhdGUgQnl0ZVdpbmRvdyBzY2FuKEVudHJ5IG4sIGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIEJ5dGVXaW5kb3cgc2NhbihFbnRyeSBuLCBQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCWZvciAoOyBuICE9IG51bGw7IG4gPSBuLm5leHQpIHsKIAkJCWZpbmFsIFJlZiByID0gbi5yZWY7CiAJCQlpZiAoci5wYWNrID09IHBhY2sgJiYgci5wb3NpdGlvbiA9PSBwb3NpdGlvbikgewpAQCAtNDE1LDcgKzQxNSw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBoaXQoZmluYWwgUmVmIHIpIHsKKwlwcml2YXRlIHZvaWQgaGl0KFJlZiByKSB7CiAJCS8vIFdlIGRvbid0IG5lZWQgdG8gYmUgMTAwJSBhY2N1cmF0ZSBoZXJlLiBJdHMgc3VmZmljaWVudCB0aGF0IGF0IGxlYXN0CiAJCS8vIG9uZSB0aHJlYWQgcGVyZm9ybXMgdGhlIGluY3JlbWVudC4gQW55IG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzIGF0CiAJCS8vIGV4YWN0bHkgdGhlIHNhbWUgdGltZSBjYW4gc2ltcGx5IHVzZSB0aGUgc2FtZSBjbG9jayB2YWx1ZS4KQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCSAqIEBwYXJhbSBwYWNrCiAJICogICAgICAgICAgICB0aGUgZmlsZSB0byBwdXJnZSBhbGwgZW50cmllcyBvZi4KIAkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsKGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsKFBhY2tGaWxlIHBhY2spIHsKIAkJZm9yIChpbnQgcyA9IDA7IHMgPCB0YWJsZVNpemU7IHMrKykgewogCQkJZmluYWwgRW50cnkgZTEgPSB0YWJsZS5nZXQocyk7CiAJCQlib29sZWFuIGhhc0RlYWQgPSBmYWxzZTsKQEAgLTUyMSwxMSArNTIxLDExIEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIGludCBzbG90KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIGludCBzbG90KFBhY2tGaWxlIHBhY2ssIGxvbmcgcG9zaXRpb24pIHsKIAkJcmV0dXJuIChoYXNoKHBhY2suaGFzaCwgcG9zaXRpb24pID4+PiAxKSAlIHRhYmxlU2l6ZTsKIAl9CiAKLQlwcml2YXRlIExvY2sgbG9jayhmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKSB7CisJcHJpdmF0ZSBMb2NrIGxvY2soUGFja0ZpbGUgcGFjaywgbG9uZyBwb3NpdGlvbikgewogCQlyZXR1cm4gbG9ja3NbKGhhc2gocGFjay5oYXNoLCBwb3NpdGlvbikgPj4+IDEpICUgbG9ja3MubGVuZ3RoXTsKIAl9CiAKQEAgLTU1Niw3ICs1NTYsNyBAQAogCQkgKi8KIAkJdm9sYXRpbGUgYm9vbGVhbiBkZWFkOwogCi0JCUVudHJ5KGZpbmFsIEVudHJ5IG4sIGZpbmFsIFJlZiByKSB7CisJCUVudHJ5KEVudHJ5IG4sIFJlZiByKSB7CiAJCQluZXh0ID0gbjsKIAkJCXJlZiA9IHI7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0N1cnNvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEKaW5kZXggNTY5YmZlOC4uMDEwYzE0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQkJaW5mLnJlc2V0KCk7CiAJfQogCi0Jdm9pZCBwaW4oZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikKKwl2b2lkIHBpbihQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZVdpbmRvdyB3ID0gd2luZG93OwogCQlpZiAodyA9PSBudWxsIHx8ICF3LmNvbnRhaW5zKHBhY2ssIHBvc2l0aW9uKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV3JpdGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dyaXRlQ29uZmlnLmphdmEKaW5kZXggZDljYmJkOC4uMjMwNTVlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV3JpdGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Xcml0ZUNvbmZpZy5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZnN5bmNSZWZGaWxlczsKIAotCXByaXZhdGUgV3JpdGVDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBXcml0ZUNvbmZpZyhDb25maWcgcmMpIHsKIAkJY29tcHJlc3Npb24gPSByYy5nZXQoQ29yZUNvbmZpZy5LRVkpLmdldENvbXByZXNzaW9uKCk7CiAJCWZzeW5jT2JqZWN0RmlsZXMgPSByYy5nZXRCb29sZWFuKCJjb3JlIiwgImZzeW5jb2JqZWN0ZmlsZXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlmc3luY1JlZkZpbGVzID0gcmMuZ2V0Qm9vbGVhbigiY29yZSIsICJmc3luY3JlZmZpbGVzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0JpbmFyeURlbHRhLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9CaW5hcnlEZWx0YS5qYXZhCmluZGV4IDI1NjU5MzEuLmM3ZTVhZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0JpbmFyeURlbHRhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmluYXJ5RGVsdGEuamF2YQpAQCAtNjQsNyArNjQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGRlbHRhIHN0cmVhbSwgb3IgYXQgbGVhc3QgdGhlIGhlYWRlciBvZiBpdC4KIAkgKiBAcmV0dXJuIHRoZSBiYXNlIG9iamVjdCdzIHNpemUuCiAJICovCi0JcHVibGljIHN0YXRpYyBsb25nIGdldEJhc2VTaXplKGZpbmFsIGJ5dGVbXSBkZWx0YSkgeworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRCYXNlU2l6ZShieXRlW10gZGVsdGEpIHsKIAkJaW50IHAgPSAwOwogCQlsb25nIGJhc2VMZW4gPSAwOwogCQlpbnQgYywgc2hpZnQgPSAwOwpAQCAtODMsNyArODMsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGRlbHRhIHN0cmVhbSwgb3IgYXQgbGVhc3QgdGhlIGhlYWRlciBvZiBpdC4KIAkgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgb2JqZWN0J3Mgc2l6ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0UmVzdWx0U2l6ZShmaW5hbCBieXRlW10gZGVsdGEpIHsKKwlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0UmVzdWx0U2l6ZShieXRlW10gZGVsdGEpIHsKIAkJaW50IHAgPSAwOwogCiAJCS8vIFNraXAgbGVuZ3RoIG9mIHRoZSBiYXNlIG9iamVjdC4KQEAgLTExNCw3ICsxMTQsNyBAQAogCSAqICAgICAgICAgICAgYW5vdGhlci4KIAkgKiBAcmV0dXJuIHBhdGNoZWQgYmFzZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIGFwcGx5KGZpbmFsIGJ5dGVbXSBiYXNlLCBmaW5hbCBieXRlW10gZGVsdGEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBhcHBseShieXRlW10gYmFzZSwgYnl0ZVtdIGRlbHRhKSB7CiAJCXJldHVybiBhcHBseShiYXNlLCBkZWx0YSwgbnVsbCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YUluZGV4U2Nhbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFJbmRleFNjYW5uZXIuamF2YQppbmRleCA5NjlkMDJiLi45NDRhOWU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YUluZGV4U2Nhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhSW5kZXhTY2FubmVyLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzY2FuKGJ5dGVbXSByYXcsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIHZvaWQgc2NhbihieXRlW10gcmF3LCBpbnQgZW5kKSB7CiAJCS8vIFdlIHNjYW4gdGhlIGlucHV0IGJhY2t3YXJkcywgYW5kIGFsd2F5cyBpbnNlcnQgb250byB0aGUKIAkJLy8gZnJvbnQgb2YgdGhlIGNoYWluLiBUaGlzIGVuc3VyZXMgdGhhdCBjaGFpbnMgd2lsbCBoYXZlIGxvd2VyCiAJCS8vIG9mZnNldHMgYXQgdGhlIGZyb250IG9mIHRoZSBjaGFpbiwgYWxsb3dpbmcgdXMgdG8gcHJlZmVyIHRoZQpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCX0gd2hpbGUgKDAgPD0gcHRyKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKGZpbmFsIGludCB3b3JzdENhc2VCbG9ja0NudCkgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoaW50IHdvcnN0Q2FzZUJsb2NrQ250KSB7CiAJCWludCBzaGlmdCA9IDMyIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyh3b3JzdENhc2VCbG9ja0NudCk7CiAJCWludCBzeiA9IDEgPDwgKHNoaWZ0IC0gMSk7CiAJCWlmIChzeiA8IHdvcnN0Q2FzZUJsb2NrQ250KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhV2luZG93LmphdmEKaW5kZXggNzNiMjg1YS4uYTA0NzUzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YVdpbmRvdy5qYXZhCkBAIC0yNjYsNyArMjY2LDcgQEAKIAkJZGVsdGFCdWYgPSBudWxsOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBkZWx0YShmaW5hbCBEZWx0YVdpbmRvd0VudHJ5IHNyYykKKwlwcml2YXRlIGJvb2xlYW4gZGVsdGEoRGVsdGFXaW5kb3dFbnRyeSBzcmMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBJZiB0aGUgc2l6ZXMgYXJlIHJhZGljYWxseSBkaWZmZXJlbnQsIHRoaXMgaXMgYSBiYWQgcGFpcmluZy4KIAkJaWYgKHJlcy5zaXplKCkgPCBzcmMuc2l6ZSgpID4+PiA0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svT2JqZWN0VG9QYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YQppbmRleCBlOGM3NTEwLi5hMzBiZjk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBACiAJICogQHBhcmFtIHR5cGUKIAkgKiAgICAgICAgICAgIHJlYWwgdHlwZSBjb2RlIG9mIHRoZSBvYmplY3QsIG5vdCBpdHMgaW4tcGFjayB0eXBlLgogCSAqLwotCXB1YmxpYyBPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSkgewogCQlzdXBlcihzcmMpOwogCQlmbGFncyA9IHR5cGUgPDwgVFlQRV9TSElGVDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZmQ5YzFhMC4uN2YzOGE3YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTA3LDcgKzEwNyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb3VudCsrOwogCQlvdXQud3JpdGUoYik7CiAJCW1kLnVwZGF0ZSgoYnl0ZSkgYik7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCisJcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3aGlsZSAoMCA8IGxlbikgewogCQkJZmluYWwgaW50IG4gPSBNYXRoLm1pbihsZW4sIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0spOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja1dyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja1dyaXRlci5qYXZhCmluZGV4IDQyZGYxYTYuLjM2ZDZmMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrV3JpdGVyLmphdmEKQEAgLTMwMyw2ICszMDMsOCBAQAogCiAJcHJpdmF0ZSBPYmplY3RDb3VudENhbGxiYWNrIGNhbGxiYWNrOwogCisJcHJpdmF0ZSBsb25nIGZpbHRlckJsb2JMaW1pdCA9IC0xOworCiAJLyoqCiAJICogQ3JlYXRlIHdyaXRlciBmb3Igc3BlY2lmaWVkIHJlcG9zaXRvcnkuCiAJICogPHA+CkBAIC0zMTIsNyArMzE0LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgcmVwb3NpdG9yeSB3aGVyZSBvYmplY3RzIGFyZSBzdG9yZWQuCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFBhY2tXcml0ZXIoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwbywgcmVwby5uZXdPYmplY3RSZWFkZXIoKSk7CiAJfQogCkBAIC0zMjUsNyArMzI3LDcgQEAKIAkgKiBAcGFyYW0gcmVhZGVyCiAJICogICAgICAgICAgICByZWFkZXIgdG8gcmVhZCBmcm9tIHRoZSByZXBvc2l0b3J5IHdpdGguCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgeworCXB1YmxpYyBQYWNrV3JpdGVyKE9iamVjdFJlYWRlciByZWFkZXIpIHsKIAkJdGhpcyhuZXcgUGFja0NvbmZpZygpLCByZWFkZXIpOwogCX0KIApAQCAtMzQwLDcgKzM0Miw3IEBACiAJICogQHBhcmFtIHJlYWRlcgogCSAqICAgICAgICAgICAgcmVhZGVyIHRvIHJlYWQgZnJvbSB0aGUgcmVwb3NpdG9yeSB3aXRoLgogCSAqLwotCXB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgeworCXB1YmxpYyBQYWNrV3JpdGVyKFJlcG9zaXRvcnkgcmVwbywgT2JqZWN0UmVhZGVyIHJlYWRlcikgewogCQl0aGlzKG5ldyBQYWNrQ29uZmlnKHJlcG8pLCByZWFkZXIpOwogCX0KIApAQCAtMzU1LDcgKzM1Nyw3IEBACiAJICogQHBhcmFtIHJlYWRlcgogCSAqICAgICAgICAgICAgcmVhZGVyIHRvIHJlYWQgZnJvbSB0aGUgcmVwb3NpdG9yeSB3aXRoLgogCSAqLwotCXB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIFBhY2tDb25maWcgY29uZmlnLCBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIFBhY2tXcml0ZXIoUGFja0NvbmZpZyBjb25maWcsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKIAkJdGhpcyhjb25maWcsIHJlYWRlciwgbnVsbCk7CiAJfQogCkBAIC01MTAsNyArNTEyLDcgQEAKIAkgKiAgICAgICAgICAgIGRldGVybWluZWQgYnkgc2V0OyB0aGlzIGtpbmQgb2YgcGFjayBpcyB1c2VkIG9ubHkgZm9yCiAJICogICAgICAgICAgICB0cmFuc3BvcnQ7IHRydWUgLSB0byBwcm9kdWNlIHRoaW4gcGFjaywgZmFsc2UgLSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGhpbihmaW5hbCBib29sZWFuIHBhY2t0aGluKSB7CisJcHVibGljIHZvaWQgc2V0VGhpbihib29sZWFuIHBhY2t0aGluKSB7CiAJCXRoaW4gPSBwYWNrdGhpbjsKIAl9CiAKQEAgLTYwMSw3ICs2MDMsNyBAQAogCSAqICAgICAgICAgICAgcGFjazsgZmFsc2Ugb3RoZXJ3aXNlIC0gbm9uIGV4aXN0aW5nIHVuaW50ZXJlc3Rpbmcgb2JqZWN0cyBtYXkKIAkgKiAgICAgICAgICAgIGNhdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9ufQogCSAqLwotCXB1YmxpYyB2b2lkIHNldElnbm9yZU1pc3NpbmdVbmludGVyZXN0aW5nKGZpbmFsIGJvb2xlYW4gaWdub3JlKSB7CisJcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcoYm9vbGVhbiBpZ25vcmUpIHsKIAkJaWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcgPSBpZ25vcmU7CiAJfQogCkBAIC02MzksNiArNjQxLDE0IEBACiAJfQogCiAJLyoqCisJICogQHBhcmFtIGJ5dGVzIGV4Y2x1ZGUgYmxvYnMgb2Ygc2l6ZSBncmVhdGVyIHRoYW4gdGhpcworCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJCbG9iTGltaXQobG9uZyBieXRlcykgeworCQlmaWx0ZXJCbG9iTGltaXQgPSBieXRlczsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIG9iamVjdHMgbnVtYmVyIGluIGEgcGFjayBmaWxlIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhpcyB3cml0ZXIuCiAJICoKIAkgKiBAcmV0dXJuIG51bWJlciBvZiBvYmplY3RzIGluIHBhY2suCkBAIC05MTQsNyArOTI0LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGNhY2hlZCBwYWNrIGNhbm5vdCBiZSBleGFtaW5lZC4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3aWxsSW5jbHVkZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiB3aWxsSW5jbHVkZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJT2JqZWN0VG9QYWNrIG9iaiA9IG9iamVjdHNNYXAuZ2V0KGlkKTsKIAkJcmV0dXJuIG9iaiAhPSBudWxsICYmICFvYmouaXNFZGdlKCk7CiAJfQpAQCAtOTgxLDcgKzk5MSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGRhdGEgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIHN1cHBsaWVkIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUluZGV4KGZpbmFsIE91dHB1dFN0cmVhbSBpbmRleFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZUluZGV4KE91dHB1dFN0cmVhbSBpbmRleFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGlzSW5kZXhEaXNhYmxlZCgpKQogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhY2hlZFBhY2tzUHJldmVudHNJbmRleENyZWF0aW9uKTsKIApAQCAtMTAwMyw3ICsxMDEzLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZGF0YSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgc3VwcGxpZWQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlQml0bWFwSW5kZXgoZmluYWwgT3V0cHV0U3RyZWFtIGJpdG1hcEluZGV4U3RyZWFtKQorCXB1YmxpYyB2b2lkIHdyaXRlQml0bWFwSW5kZXgoT3V0cHV0U3RyZWFtIGJpdG1hcEluZGV4U3RyZWFtKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHdyaXRlQml0bWFwcyA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmJpdG1hcHNNdXN0QmVQcmVwYXJlZCk7CkBAIC0xNTE2LDcgKzE1MjYsNyBAQAogCQkJLy8gVGhlIGNhbGxlciBnYXZlIHVzIGFuIGV4ZWN1dG9yLCBidXQgaXQgbWlnaHQgbm90IGRvCiAJCQkvLyBhc3luY2hyb25vdXMgZXhlY3V0aW9uLiAgV3JhcCBldmVyeXRoaW5nIGFuZCBob3BlIGl0CiAJCQkvLyBjYW4gc2NoZWR1bGUgdGhlc2UgZm9yIHVzLgotCQkJZm9yIChmaW5hbCBEZWx0YVRhc2sgdGFzayA6IHRhc2tCbG9jay50YXNrcykgeworCQkJZm9yIChEZWx0YVRhc2sgdGFzayA6IHRhc2tCbG9jay50YXNrcykgewogCQkJCWV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgewogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHVibGljIHZvaWQgcnVuKCkgewpAQCAtMTcyMyw3ICsxNzMzLDcgQEAKIAkJdHlwZVN0YXRzLmRlbHRhQnl0ZXMgKz0gb3V0Lmxlbmd0aCgpIC0gb3RwLmdldE9mZnNldCgpOwogCX0KIAotCXByaXZhdGUgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgZGVsdGEoZmluYWwgT2JqZWN0VG9QYWNrIG90cCkKKwlwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGRlbHRhKE9iamVjdFRvUGFjayBvdHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlEZWx0YUluZGV4IGluZGV4ID0gbmV3IERlbHRhSW5kZXgoYnVmZmVyKG90cC5nZXREZWx0YUJhc2VJZCgpKSk7CiAJCWJ5dGVbXSByZXMgPSBidWZmZXIob3RwKTsKQEAgLTE5NjAsNyArMTk3MCw3IEBACiAJCQkJYnl0ZVtdIHBhdGhCdWYgPSB3YWxrZXIuZ2V0UGF0aEJ1ZmZlcigpOwogCQkJCWludCBwYXRoTGVuID0gd2Fsa2VyLmdldFBhdGhMZW5ndGgoKTsKIAkJCQliYXNlcy5hZGRCYXNlKG8uZ2V0VHlwZSgpLCBwYXRoQnVmLCBwYXRoTGVuLCBwYXRoSGFzaCk7Ci0JCQkJYWRkT2JqZWN0KG8sIHBhdGhIYXNoKTsKKwkJCQlmaWx0ZXJBbmRBZGRPYmplY3Qobywgby5nZXRUeXBlKCksIHBhdGhIYXNoKTsKIAkJCQljb3VudGluZ01vbml0b3IudXBkYXRlKDEpOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTk3MCw3ICsxOTgwLDcgQEAKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKGV4Y2x1ZGUobykpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWFkZE9iamVjdChvLCB3YWxrZXIuZ2V0UGF0aEhhc2hDb2RlKCkpOworCQkJCWZpbHRlckFuZEFkZE9iamVjdChvLCBvLmdldFR5cGUoKSwgd2Fsa2VyLmdldFBhdGhIYXNoQ29kZSgpKTsKIAkJCQljb3VudGluZ01vbml0b3IudXBkYXRlKDEpOwogCQkJfQogCQl9CkBAIC0yMDAzLDcgKzIwMTMsNyBAQAogCQkJCW5lZWRCaXRtYXAucmVtb3ZlKG9iamVjdElkKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWFkZE9iamVjdChvYmplY3RJZCwgb2JqLmdldFR5cGUoKSwgMCk7CisJCQlmaWx0ZXJBbmRBZGRPYmplY3Qob2JqZWN0SWQsIG9iai5nZXRUeXBlKCksIDApOwogCQl9CiAKIAkJaWYgKHRoaW4pCkBAIC0yMDQwLDEzICsyMDUwLDEzIEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9iamVjdChmaW5hbCBSZXZPYmplY3Qgb2JqZWN0KQorCXB1YmxpYyB2b2lkIGFkZE9iamVjdChSZXZPYmplY3Qgb2JqZWN0KQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gewogCQlpZiAoIWV4Y2x1ZGUob2JqZWN0KSkKIAkJCWFkZE9iamVjdChvYmplY3QsIDApOwogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRPYmplY3QoZmluYWwgUmV2T2JqZWN0IG9iamVjdCwgZmluYWwgaW50IHBhdGhIYXNoQ29kZSkgeworCXByaXZhdGUgdm9pZCBhZGRPYmplY3QoUmV2T2JqZWN0IG9iamVjdCwgaW50IHBhdGhIYXNoQ29kZSkgewogCQlhZGRPYmplY3Qob2JqZWN0LCBvYmplY3QuZ2V0VHlwZSgpLCBwYXRoSGFzaENvZGUpOwogCX0KIApAQCAtMjA2Miw2ICsyMDcyLDIxIEBACiAJCW9iamVjdHNNYXAuYWRkKG90cCk7CiAJfQogCisJLy8gQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IGFzIGFuIG9iamVjdCB0byBiZSBwYWNrZWQsIGZpcnN0IHBlcmZvcm1pbmcKKwkvLyBmaWx0ZXJpbmcgb24gYmxvYnMgYXQgb3IgZXhjZWVkaW5nIGEgZ2l2ZW4gc2l6ZS4KKwlwcml2YXRlIHZvaWQgZmlsdGVyQW5kQWRkT2JqZWN0KEBOb25OdWxsIEFueU9iamVjdElkIHNyYywgaW50IHR5cGUsCisJCQlpbnQgcGF0aEhhc2hDb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCS8vIENoZWNrIGlmIHRoaXMgb2JqZWN0IG5lZWRzIHRvIGJlIHJlamVjdGVkLCBkb2luZyB0aGUgY2hlYXBlcgorCQkvLyBjaGVja3MgZmlyc3QuCisJCWJvb2xlYW4gcmVqZWN0ID0gZmlsdGVyQmxvYkxpbWl0ID49IDAgJiYKKwkJCXR5cGUgPT0gT0JKX0JMT0IgJiYKKwkJCXJlYWRlci5nZXRPYmplY3RTaXplKHNyYywgT0JKX0JMT0IpID4gZmlsdGVyQmxvYkxpbWl0OworCQlpZiAoIXJlamVjdCkgeworCQkJYWRkT2JqZWN0KHNyYywgdHlwZSwgcGF0aEhhc2hDb2RlKTsKKwkJfQorCX0KKwogCXByaXZhdGUgYm9vbGVhbiBleGNsdWRlKEFueU9iamVjdElkIG9iamVjdElkKSB7CiAJCWlmIChleGNsdWRlSW5QYWNrcyA9PSBudWxsKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMjIyMywyOTAgKzIyNDgsNiBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkvKioKLQkgKiBTdW1tYXJ5IG9mIGhvdyBQYWNrV3JpdGVyIGNyZWF0ZWQgdGhlIHBhY2suCi0JICoKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhY2tTdGF0aXN0aWNzfSBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0aXN0aWNzIHsKLQkJLyoqIFN0YXRpc3RpY3MgYWJvdXQgYSBzaW5nbGUgY2xhc3Mgb2Ygb2JqZWN0LiAqLwotCQlwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdFR5cGUgewotCQkJLy8gQWxsIHJlcXVlc3RzIGFyZSBmb3J3YXJkZWQgdG8gdGhpcyBvYmplY3QuCi0JCQlwcml2YXRlIFBhY2tTdGF0aXN0aWNzLk9iamVjdFR5cGUgb2JqZWN0VHlwZTsKLQotCQkJLyoqCi0JCQkgKiBXcmFwcyBhbgotCQkJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrLlBhY2tTdGF0aXN0aWNzLk9iamVjdFR5cGV9Ci0JCQkgKiBpbnN0YW5jZSB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIEFQSS4KLQkJCSAqCi0JCQkgKiBAcGFyYW0gdHlwZQotCQkJICogICAgICAgICAgICB0aGUgd3JhcHBlZCBpbnN0YW5jZQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0VHlwZShQYWNrU3RhdGlzdGljcy5PYmplY3RUeXBlIHR5cGUpIHsKLQkJCQlvYmplY3RUeXBlID0gdHlwZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIG91dHB1dC4gVGhpcyB0b3RhbCBpbmNsdWRlcyB0aGUKLQkJCSAqICAgICAgICAgdmFsdWUgb2Yge0BsaW5rICNnZXREZWx0YXMoKX0uCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldE9iamVjdHMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0T2JqZWN0cygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGRlbHRhcyBvdXRwdXQuIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gdGhlCi0JCQkgKiAgICAgICAgIGFjdHVhbCBudW1iZXIgb2YgZGVsdGFzIGlmIGEgY2FjaGVkIHBhY2sgd2FzIHJldXNlZC4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0RGVsdGFzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldERlbHRhcygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzCi0JCQkgKiAgICAgICAgIHJldXNlZCBpbiB0aGUgb3V0cHV0LiBUaGlzIGNvdW50IGluY2x1ZGVzCi0JCQkgKiAgICAgICAgIHtAbGluayAjZ2V0UmV1c2VkRGVsdGFzKCl9LgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXRSZXVzZWRPYmplY3RzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldFJldXNlZE9iamVjdHMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkZWx0YXMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzIHJldXNlZAotCQkJICogICAgICAgICBpbiB0aGUgb3V0cHV0LCBhcyB0aGVpciBiYXNlIG9iamVjdCB3YXMgYWxzbyBvdXRwdXQgb3IKLQkJCSAqICAgICAgICAgd2FzIGFzc3VtZWQgcHJlc2VudCBmb3IgYSB0aGluIHBhY2suIFRoaXMgbWF5IGJlIGxvd2VyCi0JCQkgKiAgICAgICAgIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgcmV1c2VkIGRlbHRhcyBpZiBhIGNhY2hlZCBwYWNrCi0JCQkgKiAgICAgICAgIHdhcyByZXVzZWQuCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldFJldXNlZERlbHRhcygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXRSZXVzZWREZWx0YXMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBUaGlzIHNpemUgaW5jbHVkZXMgdGhlCi0JCQkgKiAgICAgICAgIG9iamVjdCBoZWFkZXJzIGFzIHdlbGwgYXMgdGhlIGNvbXByZXNzZWQgZGF0YS4gVGhpcyBzaXplCi0JCQkgKiAgICAgICAgIGFsc28gaW5jbHVkZXMgYWxsIG9mIHtAbGluayAjZ2V0RGVsdGFCeXRlcygpfS4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0Qnl0ZXMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0Qnl0ZXMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkZWx0YSBieXRlcyB3cml0dGVuLiBUaGlzIHNpemUgaW5jbHVkZXMgdGhlCi0JCQkgKiAgICAgICAgIG9iamVjdCBoZWFkZXJzIGZvciB0aGUgZGVsdGEgb2JqZWN0cy4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0RGVsdGFCeXRlcygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXREZWx0YUJ5dGVzKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBbGwgcmVxdWVzdHMgYXJlIGZvcndhcmRlZCB0byB0aGlzIG9iamVjdC4KLQkJcHJpdmF0ZSBQYWNrU3RhdGlzdGljcyBzdGF0aXN0aWNzOwotCi0JCS8qKgotCQkgKiBXcmFwcyBhIHtAbGluayBQYWNrU3RhdGlzdGljc30gb2JqZWN0IHRvIG1haW50YWluIGJhY2t3YXJkcwotCQkgKiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgQVBJLgotCQkgKgotCQkgKiBAcGFyYW0gc3RhdHMKLQkJICogICAgICAgICAgICB0aGUgd3JhcHBlZCBQYWNrU3RhdGl0aWNzIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFN0YXRpc3RpY3MoUGFja1N0YXRpc3RpY3Mgc3RhdHMpIHsKLQkJCXN0YXRpc3RpY3MgPSBzdGF0czsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSAqICAgICAgICAgcGFjay4gTWF5IGJlIG51bGwgaWYgdGhlIHBhY2sgd2FzIGhhbmQtY3JhZnRlZCBpbiBhIHVuaXQKLQkJICogICAgICAgICB0ZXN0LgotCQkgKi8KLQkJcHVibGljIFNldDxPYmplY3RJZD4gZ2V0SW50ZXJlc3RpbmdPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0SW50ZXJlc3RpbmdPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkCi0JCSAqICAgICAgICAgZnJvbSB0aGUgcGFjaywgYXMgdGhlIHBlZXIgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHBhY2sgYWxyZWFkeQotCQkgKiAgICAgICAgIGhhcyB0aGVzZSBvYmplY3RzLgotCQkgKi8KLQkJcHVibGljIFNldDxPYmplY3RJZD4gZ2V0VW5pbnRlcmVzdGluZ09iamVjdHMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRVbmludGVyZXN0aW5nT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gb2YgdGhlIGNhY2hlZCBwYWNrcyB0aGF0IHdlcmUgcmV1c2VkCi0JCSAqICAgICAgICAgaW4gdGhlIG91dHB1dCwgaWYgYW55IHdlcmUgc2VsZWN0ZWQgZm9yIHJldXNlLgotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Q2FjaGVkUGFjaz4gZ2V0UmV1c2VkUGFja3MoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRSZXVzZWRQYWNrcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG91dHB1dCBwYWNrIHRoYXQgd2VudCB0aHJvdWdoIHRoZQotCQkgKiAgICAgICAgIGRlbHRhIHNlYXJjaCBwcm9jZXNzIGluIG9yZGVyIHRvIGZpbmQgYSBwb3RlbnRpYWwgZGVsdGEgYmFzZS4KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0RGVsdGFTZWFyY2hOb25FZGdlT2JqZWN0cygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldERlbHRhU2VhcmNoTm9uRWRnZU9iamVjdHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBvdXRwdXQgcGFjayB0aGF0IHdlbnQgdGhyb3VnaCBkZWx0YQotCQkgKiAgICAgICAgIGJhc2Ugc2VhcmNoIGFuZCBmb3VuZCBhIHN1aXRhYmxlIGJhc2UuIFRoaXMgaXMgYSBzdWJzZXQgb2YKLQkJICogICAgICAgICB7QGxpbmsgI2dldERlbHRhU2VhcmNoTm9uRWRnZU9iamVjdHMoKX0uCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldERlbHRhc0ZvdW5kKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0RGVsdGFzRm91bmQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIG91dHB1dC4gVGhpcyB0b3RhbCBpbmNsdWRlcyB0aGUgdmFsdWUKLQkJICogICAgICAgICBvZiB7QGxpbmsgI2dldFRvdGFsRGVsdGFzKCl9LgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VG90YWxPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VG90YWxPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgY291bnQgb2Ygb2JqZWN0cyB0aGF0IG5lZWRlZCB0byBiZSBkaXNjb3ZlcmVkIHRocm91Z2ggYW4KLQkJICogICAgICAgICBvYmplY3Qgd2FsayBiZWNhdXNlIHRoZXkgd2VyZSBub3QgZm91bmQgaW4gYml0bWFwIGluZGljZXMuCi0JCSAqICAgICAgICAgUmV0dXJucyAtMSBpZiBubyBiaXRtYXAgaW5kaWNlcyB3ZXJlIGZvdW5kLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0Qml0bWFwSW5kZXhNaXNzZXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRCaXRtYXBJbmRleE1pc3NlcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGRlbHRhcyBvdXRwdXQuIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gdGhlCi0JCSAqICAgICAgICAgYWN0dWFsIG51bWJlciBvZiBkZWx0YXMgaWYgYSBjYWNoZWQgcGFjayB3YXMgcmV1c2VkLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VG90YWxEZWx0YXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUb3RhbERlbHRhcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzIHJldXNlZCBpbgotCQkgKiAgICAgICAgIHRoZSBvdXRwdXQuIFRoaXMgY291bnQgaW5jbHVkZXMge0BsaW5rICNnZXRSZXVzZWREZWx0YXMoKX0uCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRSZXVzZWRPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0UmV1c2VkT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIGRlbHRhcyB3aG9zZSBleGlzdGluZyByZXByZXNlbnRhdGlvbiB3YXMgcmV1c2VkIGluCi0JCSAqICAgICAgICAgdGhlIG91dHB1dCwgYXMgdGhlaXIgYmFzZSBvYmplY3Qgd2FzIGFsc28gb3V0cHV0IG9yIHdhcwotCQkgKiAgICAgICAgIGFzc3VtZWQgcHJlc2VudCBmb3IgYSB0aGluIHBhY2suIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gdGhlCi0JCSAqICAgICAgICAgYWN0dWFsIG51bWJlciBvZiByZXVzZWQgZGVsdGFzIGlmIGEgY2FjaGVkIHBhY2sgd2FzIHJldXNlZC4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFJldXNlZERlbHRhcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFJldXNlZERlbHRhcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFRoaXMgc2l6ZSBpbmNsdWRlcyB0aGUgcGFjawotCQkgKiAgICAgICAgIGhlYWRlciwgdHJhaWxlciwgdGhpbiBwYWNrLCBhbmQgcmV1c2VkIGNhY2hlZCBwYWNrKHMpLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VG90YWxCeXRlcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRvdGFsQnl0ZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHNpemUgb2YgdGhlIHRoaW4gcGFjayBpbiBieXRlcywgaWYgYSB0aGluIHBhY2sgd2FzIGdlbmVyYXRlZC4KLQkJICogICAgICAgICBBIHRoaW4gcGFjayBpcyBjcmVhdGVkIHdoZW4gdGhlIGNsaWVudCBhbHJlYWR5IGhhcyBvYmplY3RzCi0JCSAqICAgICAgICAgYW5kIHNvbWUgZGVsdGFzIGFyZSBjcmVhdGVkIGFnYWluc3QgdGhvc2Ugb2JqZWN0cywgb3IgaWYgYQotCQkgKiAgICAgICAgIGNhY2hlZCBwYWNrIGlzIGJlaW5nIHVzZWQgYW5kIHNvbWUgZGVsdGFzIHdpbGwgcmVmZXJlbmNlCi0JCSAqICAgICAgICAgb2JqZWN0cyBpbiB0aGUgY2FjaGVkIHBhY2suIFRoaXMgc2l6ZSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotCQkgKiAgICAgICAgIHBhY2sgaGVhZGVyIG9yIHRyYWlsZXIuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaGluUGFja0J5dGVzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGhpblBhY2tCeXRlcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB0eXBlQ29kZQotCQkgKiAgICAgICAgICAgIG9iamVjdCB0eXBlIGNvZGUsIGUuZy4gT0JKX0NPTU1JVCBvciBPQkpfVFJFRS4KLQkJICogQHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHR5cGUgb2Ygb2JqZWN0IGluIHRoZSBwYWNrLgotCQkgKi8KLQkJcHVibGljIE9iamVjdFR5cGUgYnlPYmplY3RUeXBlKGludCB0eXBlQ29kZSkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RUeXBlKHN0YXRpc3RpY3MuYnlPYmplY3RUeXBlKHR5cGVDb2RlKSk7Ci0JCX0KLQotCQkvKiogQHJldHVybiB0cnVlIGlmIHRoZSByZXN1bHRpbmcgcGFjayBmaWxlIHdhcyBhIHNoYWxsb3cgcGFjay4gKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTaGFsbG93KCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuaXNTaGFsbG93KCk7Ci0JCX0KLQotCQkvKiogQHJldHVybiBkZXB0aCAoaW4gY29tbWl0cykgdGhlIHBhY2sgaW5jbHVkZXMgaWYgc2hhbGxvdy4gKi8KLQkJcHVibGljIGludCBnZXREZXB0aCgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldERlcHRoKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCBlbnVtZXJhdGluZyB0aGUgb2JqZWN0cyB0aGF0IG5lZWQKLQkJICogICAgICAgICB0byBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LiBUaGlzIHRpbWUgaW5jbHVkZXMgYW55IHJlc3RhcnRzCi0JCSAqICAgICAgICAgdGhhdCBvY2N1ciB3aGVuIGEgY2FjaGVkIHBhY2sgaXMgc2VsZWN0ZWQgZm9yIHJldXNlLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZUNvdW50aW5nKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZUNvdW50aW5nKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCBtYXRjaGluZyBleGlzdGluZyByZXByZXNlbnRhdGlvbnMKLQkJICogICAgICAgICBhZ2FpbnN0IG9iamVjdHMgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkLCBvciB0aGF0IHRoZSBjbGllbnQKLQkJICogICAgICAgICBjYW4gYmUgYXNzdW1lZCB0byBhbHJlYWR5IGhhdmUuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lU2VhcmNoaW5nRm9yUmV1c2UoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lU2VhcmNoaW5nRm9yUmV1c2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IGZpbmRpbmcgdGhlIHNpemVzIG9mIGFsbCBvYmplY3RzCi0JCSAqICAgICAgICAgdGhhdCB3aWxsIGVudGVyIHRoZSBkZWx0YSBjb21wcmVzc2lvbiBzZWFyY2ggd2luZG93LiBUaGUKLQkJICogICAgICAgICBzaXplcyBuZWVkIHRvIGJlIGtub3duIHRvIGJldHRlciBtYXRjaCBzaW1pbGFyIG9iamVjdHMKLQkJICogICAgICAgICB0b2dldGhlciBhbmQgaW1wcm92ZSBkZWx0YSBjb21wcmVzc2lvbiByYXRpb3MuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lU2VhcmNoaW5nRm9yU2l6ZXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lU2VhcmNoaW5nRm9yU2l6ZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IG9uIGRlbHRhIGNvbXByZXNzaW9uLiBUaGlzIGlzCi0JCSAqICAgICAgICAgb2JzZXJ2ZWQgd2FsbC1jbG9jayB0aW1lIGFuZCBkb2VzIG5vdCBhY2N1cmF0ZWx5IHRyYWNrIENQVQotCQkgKiAgICAgICAgIHRpbWUgdXNlZCB3aGVuIG11bHRpcGxlIHRocmVhZHMgd2VyZSB1c2VkIHRvIHBlcmZvcm0gdGhlCi0JCSAqICAgICAgICAgZGVsdGEgY29tcHJlc3Npb24uCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lQ29tcHJlc3NpbmcoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lQ29tcHJlc3NpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IHdyaXRpbmcgdGhlIHBhY2sgb3V0cHV0LCBmcm9tCi0JCSAqICAgICAgICAgc3RhcnQgb2YgaGVhZGVyIHVudGlsIGVuZCBvZiB0cmFpbGVyLiBUaGUgdHJhbnNmZXIgc3BlZWQgY2FuCi0JCSAqICAgICAgICAgYmUgYXBwcm94aW1hdGVkIGJ5IGRpdmlkaW5nIHtAbGluayAjZ2V0VG90YWxCeXRlcygpfSBieSB0aGlzCi0JCSAqICAgICAgICAgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lV3JpdGluZygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVXcml0aW5nKCk7Ci0JCX0KLQotCQkvKiogQHJldHVybiB0b3RhbCB0aW1lIHNwZW50IHByb2Nlc3NpbmcgdGhpcyBwYWNrLiAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lVG90YWwoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lVG90YWwoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIGdldCB0aGUgYXZlcmFnZSBvdXRwdXQgc3BlZWQgaW4gdGVybXMgb2YgYnl0ZXMtcGVyLXNlY29uZC4KLQkJICogICAgICAgICB7QGNvZGUgZ2V0VG90YWxCeXRlcygpIC8gKGdldFRpbWVXcml0aW5nKCkgLyAxMDAwLjApfS4KLQkJICovCi0JCXB1YmxpYyBkb3VibGUgZ2V0VHJhbnNmZXJSYXRlKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VHJhbnNmZXJSYXRlKCk7Ci0JCX0KLQotCQkvKiogQHJldHVybiBmb3JtYXR0ZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGRpc3BsYXkgdG8gY2xpZW50cy4gKi8KLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JfQotCiAJcHJpdmF0ZSBjbGFzcyBNdXRhYmxlU3RhdGUgewogCQkvKiogRXN0aW1hdGVkIHNpemUgb2YgYSBzaW5nbGUgT2JqZWN0VG9QYWNrIGluc3RhbmNlLiAqLwogCQkvLyBBc3N1bWUgNjQtYml0IHBvaW50ZXJzLCBzaW5jZSB0aGlzIGlzIGp1c3QgYW4gZXN0aW1hdGUuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhCmluZGV4IGNlMmJhNGEuLjk0MmQ3MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5CbG9ja1dyaXRlci5jb21wYXJlOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9IRUFERVJfTEVOOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCWlmIChibG9ja1R5cGUgPT0gTE9HX0JMT0NLX1RZUEUpIHsKIAkJCWxlbiAtPSA5OwogCQl9Ci0JCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShVVEZfOCwgbmFtZUJ1ZiwgMCwgbGVuKTsKKwkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIG5hbWVCdWYsIDAsIGxlbik7CiAJfQogCiAJYm9vbGVhbiBtYXRjaChieXRlW10gbWF0Y2gsIGJvb2xlYW4gbWF0Y2hJc1ByZWZpeCkgewpAQCAtMTcxLDcgKzE3MSw3IEBACiAJfQogCiAJUmVmIHJlYWRSZWYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgbmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCBuYW1lQnVmLCAwLCBuYW1lTGVuKTsKKwkJU3RyaW5nIG5hbWUgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULCBuYW1lQnVmLCAwLCBuYW1lTGVuKTsKIAkJc3dpdGNoICh2YWx1ZVR5cGUgJiBWQUxVRV9UWVBFX01BU0spIHsKIAkJY2FzZSBWQUxVRV9OT05FOiAvLyBkZWxldGUKIAkJCXJldHVybiBuZXdSZWYobmFtZSk7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAlwcml2YXRlIFN0cmluZyByZWFkVmFsdWVTdHJpbmcoKSB7CiAJCWludCBsZW4gPSByZWFkVmFyaW50MzIoKTsKIAkJaW50IGVuZCA9IHB0ciArIGxlbjsKLQkJU3RyaW5nIHMgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShVVEZfOCwgYnVmLCBwdHIsIGVuZCk7CisJCVN0cmluZyBzID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgYnVmLCBwdHIsIGVuZCk7CiAJCXB0ciA9IGVuZDsKIAkJcmV0dXJuIHM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tXcml0ZXIuamF2YQppbmRleCBiMzE3M2U4Li4zZDhmYmY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tXcml0ZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9IRUFERVJfTEVOOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuSU5ERVhfQkxPQ0tfVFlQRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkxPR19CTE9DS19UWVBFOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAJCX0KIAogCQlwcml2YXRlIHN0YXRpYyBieXRlW10gbmFtZVV0ZjgoUmVmIHJlZikgewotCQkJcmV0dXJuIHJlZi5nZXROYW1lKCkuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJcmV0dXJuIHJlZi5nZXROYW1lKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCX0KIAl9CiAKQEAgLTU1OSwxMyArNTU5LDEzIEBACiAJCQl0aGlzLm5ld0lkID0gbmV3SWQ7CiAJCQl0aGlzLnRpbWVTZWNzID0gd2hvLmdldFdoZW4oKS5nZXRUaW1lKCkgLyAxMDAwTDsKIAkJCXRoaXMudHogPSAoc2hvcnQpIHdoby5nZXRUaW1lWm9uZU9mZnNldCgpOwotCQkJdGhpcy5uYW1lID0gd2hvLmdldE5hbWUoKS5nZXRCeXRlcyhVVEZfOCk7Ci0JCQl0aGlzLmVtYWlsID0gd2hvLmdldEVtYWlsQWRkcmVzcygpLmdldEJ5dGVzKFVURl84KTsKLQkJCXRoaXMubXNnID0gbWVzc2FnZS5nZXRCeXRlcyhVVEZfOCk7CisJCQl0aGlzLm5hbWUgPSB3aG8uZ2V0TmFtZSgpLmdldEJ5dGVzKENIQVJTRVQpOworCQkJdGhpcy5lbWFpbCA9IHdoby5nZXRFbWFpbEFkZHJlc3MoKS5nZXRCeXRlcyhDSEFSU0VUKTsKKwkJCXRoaXMubXNnID0gbWVzc2FnZS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJfQogCiAJCXN0YXRpYyBieXRlW10ga2V5KFN0cmluZyByZWYsIGxvbmcgaW5kZXgpIHsKLQkJCWJ5dGVbXSBuYW1lID0gcmVmLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBuYW1lID0gcmVmLmdldEJ5dGVzKENIQVJTRVQpOwogCQkJYnl0ZVtdIGtleSA9IEFycmF5cy5jb3B5T2YobmFtZSwgbmFtZS5sZW5ndGggKyAxICsgOCk7CiAJCQlOQi5lbmNvZGVJbnQ2NChrZXksIGtleS5sZW5ndGggLSA4LCByZXZlcnNlVXBkYXRlSW5kZXgoaW5kZXgpKTsKIAkJCXJldHVybiBrZXk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDFmYzQzYzkuLjQ0YmJiMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0hFQURFUl9MRU47CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5JTkRFWF9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuTE9HX0JMT0NLX1RZUEU7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAl9CiAKIAl2b2lkIHdyaXRlVmFyaW50U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXdyaXRlVmFyaW50U3RyaW5nKHMuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJd3JpdGVWYXJpbnRTdHJpbmcocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogCiAJdm9pZCB3cml0ZVZhcmludFN0cmluZyhieXRlW10gbXNnKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhCmluZGV4IDc0ODc3MTkuLjUzNTY5NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5CbG9ja1JlYWRlci5kZWNvZGVCbG9ja0xlbjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfQkxPQ0tfVFlQRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfRk9PVEVSX0xFTjsKQEAgLTE4Miw3ICsxODIsNyBAQAogCXB1YmxpYyBSZWZDdXJzb3Igc2Vla1JlZihTdHJpbmcgcmVmTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW5pdFJlZkluZGV4KCk7CiAKLQkJYnl0ZVtdIGtleSA9IHJlZk5hbWUuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10ga2V5ID0gcmVmTmFtZS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJYm9vbGVhbiBwcmVmaXggPSBrZXlba2V5Lmxlbmd0aCAtIDFdID09ICcvJzsKIAogCQlSZWZDdXJzb3JJbXBsIGkgPSBuZXcgUmVmQ3Vyc29ySW1wbChyZWZFbmQsIGtleSwgcHJlZml4KTsKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQlpbml0TG9nSW5kZXgoKTsKIAkJaWYgKGxvZ1Bvc2l0aW9uID4gMCkgewogCQkJYnl0ZVtdIGtleSA9IExvZ0VudHJ5LmtleShyZWZOYW1lLCB1cGRhdGVJbmRleCk7Ci0JCQlieXRlW10gbWF0Y2ggPSByZWZOYW1lLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBtYXRjaCA9IHJlZk5hbWUuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCQlMb2dDdXJzb3JJbXBsIGkgPSBuZXcgTG9nQ3Vyc29ySW1wbChsb2dFbmQsIG1hdGNoKTsKIAkJCWkuYmxvY2sgPSBzZWVrKExPR19CTE9DS19UWVBFLCBrZXksIGxvZ0luZGV4LCBsb2dQb3NpdGlvbiwgbG9nRW5kKTsKIAkJCXJldHVybiBpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZS5qYXZhCmluZGV4IGU5YWExMTAuLjU3NTFkZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlLmphdmEKQEAgLTI3OSw3ICsyNzksNyBAQAogCQlyZXR1cm4gSEVBRC5lcXVhbHMobikgfHwgUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShuKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXBwbHkoRGlyQ2FjaGVFZGl0b3IgZWQsIGZpbmFsIENvbW1hbmQgY21kKSB7CisJcHJpdmF0ZSB2b2lkIGFwcGx5KERpckNhY2hlRWRpdG9yIGVkLCBDb21tYW5kIGNtZCkgewogCQlTdHJpbmcgcGF0aCA9IHJlZlBhdGgoY21kLmdldFJlZk5hbWUoKSk7CiAJCVJlZiBvbGRSZWYgPSBjbWQuZ2V0T2xkUmVmKCk7CiAJCWZpbmFsIFJlZiBuZXdSZWYgPSBjbWQuZ2V0TmV3UmVmKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhCmluZGV4IDE4MzQ2OGYuLjI3ZGFhZjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhCkBAIC0yODIsNyArMjgyLDcgQEAKIAlwdWJsaWMgTGlzdDxSZWY+IGdldEFkZGl0aW9uYWxSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJQ29sbGVjdGlvbjxSZWY+IHR4blJlZnM7CiAJCWlmICh0eG5OYW1lc3BhY2UgIT0gbnVsbCkgewotCQkJdHhuUmVmcyA9IGJvb3RzdHJhcC5nZXRSZWZzKHR4bk5hbWVzcGFjZSkudmFsdWVzKCk7CisJCQl0eG5SZWZzID0gYm9vdHN0cmFwLmdldFJlZnNCeVByZWZpeCh0eG5OYW1lc3BhY2UpOwogCQl9IGVsc2UgewogCQkJUmVmIHIgPSBib290c3RyYXAuZXhhY3RSZWYodHhuQ29tbWl0dGVkKTsKIAkJCWlmIChyICE9IG51bGwgJiYgci5nZXRPYmplY3RJZCgpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldmlhdGVkT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldmlhdGVkT2JqZWN0SWQuamF2YQppbmRleCA0MjVmN2Y2Li5kMTA1ZDBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZpYXRlZE9iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2aWF0ZWRPYmplY3RJZC5qYXZhCkBAIC03NCw3ICs3NCw3IEBACiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGNvbnZlcnRlZCBpbnRvIGFuIEFiYnJldmlhdGVkT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSA8IDIgfHwgQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIIDwgaWQubGVuZ3RoKCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXRyeSB7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlICZsdDs9IDQwIGNoYXJhY3RlcnMuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpID4gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkSWQsIHN0cikpOwogCQlmaW5hbCBieXRlW10gYiA9IENvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCXJldHVybiByIDw8ICg4IC0gbikgKiA0OwogCX0KIAotCXN0YXRpYyBpbnQgbWFzayhmaW5hbCBpbnQgbmliYmxlcywgZmluYWwgaW50IHdvcmQsIGZpbmFsIGludCB2KSB7CisJc3RhdGljIGludCBtYXNrKGludCBuaWJibGVzLCBpbnQgd29yZCwgaW50IHYpIHsKIAkJZmluYWwgaW50IGIgPSAod29yZCAtIDEpICogODsKIAkJaWYgKGIgKyA4IDw9IG5pYmJsZXMpIHsKIAkJCS8vIFdlIGhhdmUgYWxsIG9mIHRoZSBiaXRzIHJlcXVpcmVkIGZvciB0aGlzIHdvcmQuCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIEFueU9iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKEFueU9iamVjdElkIG90aGVyKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgbWFzaygxLCBvdGhlci53MSkpOwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBtYXNrKDEsIE5CLmRlY29kZUludDMyKGJzLCBwKSkpOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBpbnRbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoaW50W10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgbWFzaygxLCBic1twXSkpOwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJCXJldHVybiB3MSA+Pj4gMjQ7CiAJfQogCi0JcHJpdmF0ZSBpbnQgbWFzayhmaW5hbCBpbnQgd29yZCwgZmluYWwgaW50IHYpIHsKKwlwcml2YXRlIGludCBtYXNrKGludCB3b3JkLCBpbnQgdikgewogCQlyZXR1cm4gbWFzayhuaWJibGVzLCB3b3JkLCB2KTsKIAl9CiAKQEAgLTM1OSw3ICszNTksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJaWYgKG8gaW5zdGFuY2VvZiBBYmJyZXZpYXRlZE9iamVjdElkKSB7CiAJCQlmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGIgPSAoQWJicmV2aWF0ZWRPYmplY3RJZCkgbzsKIAkJCXJldHVybiBuaWJibGVzID09IGIubmliYmxlcyAmJiB3MSA9PSBiLncxICYmIHcyID09IGIudzIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FueU9iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BbnlPYmplY3RJZC5qYXZhCmluZGV4IDU4NDc3NjUuLjk3OGRkM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FueU9iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQW55T2JqZWN0SWQuamF2YQpAQCAtNzMsMTcgKzczLDE5IEBACiAJCWlmIChmaXJzdE9iamVjdElkID09IHNlY29uZE9iamVjdElkKQogCQkJcmV0dXJuIHRydWU7CiAKLQkJLy8gV2UgdGVzdCB3b3JkIDIgZmlyc3QgYXMgb2RkcyBhcmUgc29tZW9uZSBhbHJlYWR5IHVzZWQgb3VyCi0JCS8vIHdvcmQgMSBhcyBhIGhhc2ggY29kZSwgYW5kIGFwcGx5aW5nIHRoYXQgY2FtZSB1cCB3aXRoIHRoZXNlCi0JCS8vIHR3byBpbnN0YW5jZXMgd2UgYXJlIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkuIFRoZXJlZm9yZSB0aGUKLQkJLy8gZmlyc3QgdHdvIHdvcmRzIGFyZSB2ZXJ5IGxpa2VseSB0byBiZSBpZGVudGljYWwuIFdlIHdhbnQgdG8KLQkJLy8gYnJlYWsgYXdheSBmcm9tIGNvbGxpc2lvbnMgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKwkJLy8gV2UgdGVzdCB3b3JkIDMgZmlyc3Qgc2luY2UgdGhlIGdpdCBmaWxlLWJhc2VkIE9EQgorCQkvLyB1c2VzIHRoZSBmaXJzdCBieXRlIG9mIHcxLCBhbmQgd2UgdXNlIHcyIGFzIHRoZQorCQkvLyBoYXNoIGNvZGUsIG9uZSBvZiB0aG9zZSBwcm9iYWJseSBjYW1lIHVwIHdpdGggdGhlc2UKKwkJLy8gdHdvIGluc3RhbmNlcyB3aGljaCB3ZSBhcmUgY29tcGFyaW5nIGZvciBlcXVhbGl0eS4KKwkJLy8gVGhlcmVmb3JlIHRoZSBmaXJzdCB0d28gd29yZHMgYXJlIHZlcnkgbGlrZWx5IHRvIGJlCisJCS8vIGlkZW50aWNhbC4gV2Ugd2FudCB0byBicmVhayBhd2F5IGZyb20gY29sbGlzaW9ucyBhcworCQkvLyBxdWlja2x5IGFzIHBvc3NpYmxlLgogCQkvLwotCQlyZXR1cm4gZmlyc3RPYmplY3RJZC53MiA9PSBzZWNvbmRPYmplY3RJZC53MgotCQkJCSYmIGZpcnN0T2JqZWN0SWQudzMgPT0gc2Vjb25kT2JqZWN0SWQudzMKKwkJcmV0dXJuIGZpcnN0T2JqZWN0SWQudzMgPT0gc2Vjb25kT2JqZWN0SWQudzMKIAkJCQkmJiBmaXJzdE9iamVjdElkLnc0ID09IHNlY29uZE9iamVjdElkLnc0CiAJCQkJJiYgZmlyc3RPYmplY3RJZC53NSA9PSBzZWNvbmRPYmplY3RJZC53NQotCQkJCSYmIGZpcnN0T2JqZWN0SWQudzEgPT0gc2Vjb25kT2JqZWN0SWQudzE7CisJCQkJJiYgZmlyc3RPYmplY3RJZC53MSA9PSBzZWNvbmRPYmplY3RJZC53MQorCQkJCSYmIGZpcnN0T2JqZWN0SWQudzIgPT0gc2Vjb25kT2JqZWN0SWQudzI7CiAJfQogCiAJaW50IHcxOwpAQCAtMTU5LDcgKzE2MSw3IEBACiAJICogQ29tcGFyZSB0aGlzIE9iamVjdElkIHRvIGFub3RoZXIgYW5kIG9idGFpbiBhIHNvcnQgb3JkZXJpbmcuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgQW55T2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhBbnlPYmplY3RJZCBvdGhlcikgewogCQlpZiAodGhpcyA9PSBvdGhlcikKIAkJCXJldHVybiAwOwogCkBAIC0xOTUsNyArMTk3LDcgQEAKIAkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzCiAJICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBOQi5kZWNvZGVJbnQzMihicywgcCkpOwpAQCAtMjI4LDcgKzIzMCw3IEBACiAJICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGlzIG9iamVjdCBpcwogCSAqICAgICAgICAgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIGludFtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGludFtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50MzIodzEsIGJzW3BdKTsKQEAgLTI1Nyw3ICsyNTksNyBAQAogCSAqICAgICAgICAgICAgdGhlIGFiYnJldmlhdGlvbi4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBPYmplY3RJZCBiZWdpbnMgd2l0aCB0aGUgYWJicmV2aWF0aW9uOyBlbHNlIGZhbHNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyKSB7CisJcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChBYmJyZXZpYXRlZE9iamVjdElkIGFiYnIpIHsKIAkJcmV0dXJuIGFiYnIucHJlZml4Q29tcGFyZSh0aGlzKSA9PSAwOwogCX0KIApAQCAtMjc0LDEzICsyNzYsMTMgQEAKIAkgKiAgICAgICAgICAgIHRoZSBvdGhlciBpZCB0byBjb21wYXJlIHRvLiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgb25seSBpZiBib3RoIE9iamVjdElkcyBoYXZlIGlkZW50aWNhbCBiaXRzLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhBbnlPYmplY3RJZCBvdGhlcikgewogCQlyZXR1cm4gb3RoZXIgIT0gbnVsbCA/IGVxdWFscyh0aGlzLCBvdGhlcikgOiBmYWxzZTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFueU9iamVjdElkKQogCQkJcmV0dXJuIGVxdWFscygoQW55T2JqZWN0SWQpIG8pOwogCQllbHNlCkBAIC0yOTMsNyArMjk1LDcgQEAKIAkgKiBAcGFyYW0gdwogCSAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBjb3B5IHRvLiBNdXN0IGJlIGluIGJpZyBlbmRpYW4gb3JkZXIuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIEJ5dGVCdWZmZXIgdykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhCeXRlQnVmZmVyIHcpIHsKIAkJdy5wdXRJbnQodzEpOwogCQl3LnB1dEludCh3Mik7CiAJCXcucHV0SW50KHczKTsKQEAgLTMwOSw3ICszMTEsNyBAQAogCSAqIEBwYXJhbSBvCiAJICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiBiIHRvIHdyaXRlIGF0LgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8pIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oYnl0ZVtdIGIsIGludCBvKSB7CiAJCU5CLmVuY29kZUludDMyKGIsIG8sIHcxKTsKIAkJTkIuZW5jb2RlSW50MzIoYiwgbyArIDQsIHcyKTsKIAkJTkIuZW5jb2RlSW50MzIoYiwgbyArIDgsIHczKTsKQEAgLTMyNSw3ICszMjcsNyBAQAogCSAqIEBwYXJhbSBvCiAJICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiBiIHRvIHdyaXRlIGF0LgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBpbnRbXSBiLCBmaW5hbCBpbnQgbykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhpbnRbXSBiLCBpbnQgbykgewogCQliW29dID0gdzE7CiAJCWJbbyArIDFdID0gdzI7CiAJCWJbbyArIDJdID0gdzM7CkBAIC0zNDEsNyArMzQzLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUmF3SW50KHcsIHcxKTsKIAkJd3JpdGVSYXdJbnQodywgdzIpOwogCQl3cml0ZVJhd0ludCh3LCB3Myk7CkBAIC0zNDksNyArMzUxLDcgQEAKIAkJd3JpdGVSYXdJbnQodywgdzUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSYXdJbnQoZmluYWwgT3V0cHV0U3RyZWFtIHcsIGludCB2KQorCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSYXdJbnQoT3V0cHV0U3RyZWFtIHcsIGludCB2KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdy53cml0ZSh2ID4+PiAyNCk7CiAJCXcud3JpdGUodiA+Pj4gMTYpOwpAQCAtMzY1LDcgKzM2Nyw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVRvKE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3LndyaXRlKHRvSGV4Qnl0ZUFycmF5KCkpOwogCX0KIApAQCAtNDA4LDcgKzQxMCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGhleGJ5dGUgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShmaW5hbCBieXRlW10gZHN0LCBmaW5hbCBpbnQgcCwgaW50IHcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoYnl0ZVtdIGRzdCwgaW50IHAsIGludCB3KSB7CiAJCWludCBvID0gcCArIDc7CiAJCXdoaWxlIChvID49IHAgJiYgdyAhPSAwKSB7CiAJCQlkc3Rbby0tXSA9IGhleGJ5dGVbdyAmIDB4Zl07CkBAIC00MjYsNyArNDI4LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhDaGFyQXJyYXkoKSk7CiAJfQogCkBAIC00NDIsNyArNDQ0LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcud3JpdGUodG1wLCAwLCBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ1Nyw3ICs0NTksNyBAQAogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGFwcGVuZCBvbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBTdHJpbmdCdWlsZGVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcuYXBwZW5kKHRtcCwgMCwgQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKTsKIAl9CkBAIC00NjgsNyArNDcwLDcgQEAKIAkJcmV0dXJuIGRzdDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoZmluYWwgY2hhcltdIGRzdCkgeworCXByaXZhdGUgdm9pZCB0b0hleENoYXJBcnJheShjaGFyW10gZHN0KSB7CiAJCWZvcm1hdEhleENoYXIoZHN0LCAwLCB3MSk7CiAJCWZvcm1hdEhleENoYXIoZHN0LCA4LCB3Mik7CiAJCWZvcm1hdEhleENoYXIoZHN0LCAxNiwgdzMpOwpAQCAtNDc5LDcgKzQ4MSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGNoYXIgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoZmluYWwgY2hhcltdIGRzdCwgZmluYWwgaW50IHAsIGludCB3KSB7CisJc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgaW50IHcpIHsKIAkJaW50IG8gPSBwICsgNzsKIAkJd2hpbGUgKG8gPj0gcCAmJiB3ICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Y2hhclt3ICYgMHhmXTsKQEAgLTUyNyw3ICs1MjksNyBAQAogCSAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRlZCBzdHJpbmcuCiAJICogQHJldHVybiBTSEEtMSBhYmJyZXZpYXRpb24uCiAJICovCi0JcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicmV2aWF0ZShmaW5hbCBpbnQgbGVuKSB7CisJcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicmV2aWF0ZShpbnQgbGVuKSB7CiAJCWZpbmFsIGludCBhID0gQWJicmV2aWF0ZWRPYmplY3RJZC5tYXNrKGxlbiwgMSwgdzEpOwogCQlmaW5hbCBpbnQgYiA9IEFiYnJldmlhdGVkT2JqZWN0SWQubWFzayhsZW4sIDIsIHcyKTsKIAkJZmluYWwgaW50IGMgPSBBYmJyZXZpYXRlZE9iamVjdElkLm1hc2sobGVuLCAzLCB3Myk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CYXRjaFJlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmF0Y2hSZWZVcGRhdGUuamF2YQppbmRleCA2OTE5ZjdlLi45MjViNmJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CYXRjaFJlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JhdGNoUmVmVXBkYXRlLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuTk9UX0FUVEVNUFRFRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuUmVzdWx0LlJFSkVDVEVEX09USEVSX1JFQVNPTjsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvQ29sbGVjdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC0xNzksNyArMTgwLDcgQEAKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30uCiAJICovCi0JcHVibGljIEJhdGNoUmVmVXBkYXRlIHNldFJlZkxvZ0lkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIEJhdGNoUmVmVXBkYXRlIHNldFJlZkxvZ0lkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCXJlZkxvZ0lkZW50ID0gcGk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTUyOCw4ICs1MjksOSBAQAogCQl9CiAJCWlmICghY29tbWFuZHMyLmlzRW1wdHkoKSkgewogCQkJLy8gV2hhdCBwYXJ0IG9mIHRoZSBuYW1lIHNwYWNlIGlzIGFscmVhZHkgdGFrZW4KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiB0YWtlbk5hbWVzID0gbmV3IEhhc2hTZXQ8PihyZWZkYi5nZXRSZWZzKAotCQkJCQlSZWZEYXRhYmFzZS5BTEwpLmtleVNldCgpKTsKKwkJCUNvbGxlY3Rpb248U3RyaW5nPiB0YWtlbk5hbWVzID0gcmVmZGIuZ2V0UmVmcygpLnN0cmVhbSgpCisJCQkJCS5tYXAoUmVmOjpnZXROYW1lKQorCQkJCQkuY29sbGVjdCh0b0NvbGxlY3Rpb24oSGFzaFNldDo6bmV3KSk7CiAJCQlDb2xsZWN0aW9uPFN0cmluZz4gdGFrZW5QcmVmaXhlcyA9IGdldFRha2VuUHJlZml4ZXModGFrZW5OYW1lcyk7CiAKIAkJCS8vIE5vdyB0byB0aGUgdXBkYXRlIHRoYXQgbWF5IHJlcXVpcmUgbW9yZSByb29tIGluIHRoZSBuYW1lIHNwYWNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CaXRtYXBJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQml0bWFwSW5kZXguamF2YQppbmRleCBmYzM1NGRiLi45ZjY0ZjM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CaXRtYXBJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JpdG1hcEluZGV4LmphdmEKQEAgLTEyMSwxOSArMTIxLDYgQEAKIAkgKiByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYnVpbGRlci4KIAkgKi8KIAlwdWJsaWMgaW50ZXJmYWNlIEJpdG1hcEJ1aWxkZXIgZXh0ZW5kcyBCaXRtYXAgewotCQkvKioKLQkJICogQWRkcyB0aGUgaWQgYW5kIHRoZSBleGlzdGluZyBiaXRtYXAgZm9yIHRoZSBpZCwgaWYgb25lIGV4aXN0cywgdG8gdGhlCi0JCSAqIGJpdG1hcC4KLQkJICoKLQkJICogQHBhcmFtIG9iamVjdElkCi0JCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBJRAotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiAgICAgICAgICAgIHRoZSBHaXQgb2JqZWN0IHR5cGUuIFNlZSB7QGxpbmsgQ29uc3RhbnRzfS4KLQkJICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGNvbnRhaW5lZCBvciBhYmxlIHRvIGJlIGxvYWRlZC4KLQkJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjb3J9IG9yIHtAbGluayAjYWRkT2JqZWN0fSBpbnN0ZWFkLgotCQkgKi8KLQkJQERlcHJlY2F0ZWQKLQkJYm9vbGVhbiBhZGQoQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlKTsKIAogCQkvKioKIAkJICogV2hldGhlciB0aGUgYml0bWFwIGhhcyB0aGUgaWQgc2V0LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmxvYkJhc2VkQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YQppbmRleCAzZmY5MmRjLi5lMDA4YmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTc2LDEzICs3OCwxMiBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBieXRlIGFycmF5IGlzIG5vdCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZm9ybWF0LgogCSAqLwotCXB1YmxpYyBCbG9iQmFzZWRDb25maWcoQ29uZmlnIGJhc2UsIGZpbmFsIGJ5dGVbXSBibG9iKQorCXB1YmxpYyBCbG9iQmFzZWRDb25maWcoQ29uZmlnIGJhc2UsIGJ5dGVbXSBibG9iKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlzdXBlcihiYXNlKTsKIAkJZmluYWwgU3RyaW5nIGRlY29kZWQ7CiAJCWlmIChpc1V0ZjgoYmxvYikpIHsKLQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVCwKLQkJCQkJYmxvYiwgMywgYmxvYi5sZW5ndGgpOworCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIGJsb2IsIDMsIGJsb2IubGVuZ3RoKTsKIAkJfSBlbHNlIHsKIAkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShibG9iKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YQppbmRleCA1OTZkYTAzLi5iZTUzYzRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YQpAQCAtMTA3LDcgKzEwNyw3IEBACiAJICogQHBhcmFtIGJyYW5jaE5hbWUKIAkgKiAgICAgICAgICAgIHRoZSBzaG9ydCBicmFuY2ggbmFtZSBvZiB0aGUgc2VjdGlvbiB0byByZWFkCiAJICovCi0JcHVibGljIEJyYW5jaENvbmZpZyhmaW5hbCBDb25maWcgY29uZmlnLCBTdHJpbmcgYnJhbmNoTmFtZSkgeworCXB1YmxpYyBCcmFuY2hDb25maWcoQ29uZmlnIGNvbmZpZywgU3RyaW5nIGJyYW5jaE5hbWUpIHsKIAkJdGhpcy5jb25maWcgPSBjb25maWc7CiAJCXRoaXMuYnJhbmNoTmFtZSA9IGJyYW5jaE5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0QnVpbGRlci5qYXZhCmluZGV4IDIyMTdmZGUuLjU5YTEzZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdEJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRCdWlsZGVyLmphdmEKQEAgLTI0Myw3ICsyNDMsNyBAQAogCSAqIEBwYXJhbSBuZXdNZXNzYWdlCiAJICogICAgICAgICAgICB0aGUgY29tbWl0IG1lc3NhZ2UuIFNob3VsZCBub3QgYmUgbnVsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBuZXdNZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewogCQltZXNzYWdlID0gbmV3TWVzc2FnZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEKaW5kZXggNGQ1NThjOS4uMGUwMWNjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEKQEAgLTUxLDYgKzUxLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKKwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMzc0LDcgKzM3Niw3IEBACiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IFRbXSBhbGxWYWx1ZXNPZihmaW5hbCBUIHZhbHVlKSB7CisJcHJpdmF0ZSBzdGF0aWMgPFQ+IFRbXSBhbGxWYWx1ZXNPZihUIHZhbHVlKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gKFRbXSkgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInZhbHVlcyIpLmludm9rZShudWxsKTsgLy8kTk9OLU5MUy0xJAogCQl9IGNhdGNoIChFeGNlcHRpb24gZXJyKSB7CkBAIC01MTMsNyArNTE1LDcgQEAKIAkgKiAgICAgICAgIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHN0YXJ0aW5nIGZyb20gdGhpcwogCSAqICAgICAgICAgaW5zdGFuY2UgYW5kIHByb2dyZXNzaW5nIHRocm91Z2ggdGhlIGJhc2UuCiAJICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFN1YnNlY3Rpb25zKGZpbmFsIFN0cmluZyBzZWN0aW9uKSB7CisJcHVibGljIFNldDxTdHJpbmc+IGdldFN1YnNlY3Rpb25zKFN0cmluZyBzZWN0aW9uKSB7CiAJCXJldHVybiBnZXRTdGF0ZSgpLmdldFN1YnNlY3Rpb25zKHNlY3Rpb24pOwogCX0KIApAQCAtNTk5LDcgKzYwMSw3IEBACiAJICogQHJldHVybiB0aGUgcGFyc2VkIG9iamVjdCBpbnN0YW5jZSwgd2hpY2ggaXMgY2FjaGVkIGluc2lkZSB0aGlzIGNvbmZpZy4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgPFQ+IFQgZ2V0KGZpbmFsIFNlY3Rpb25QYXJzZXI8VD4gcGFyc2VyKSB7CisJcHVibGljIDxUPiBUIGdldChTZWN0aW9uUGFyc2VyPFQ+IHBhcnNlcikgewogCQlmaW5hbCBDb25maWdTbmFwc2hvdCBteVN0YXRlID0gZ2V0U3RhdGUoKTsKIAkJVCBvYmogPSAoVCkgbXlTdGF0ZS5jYWNoZS5nZXQocGFyc2VyKTsKIAkJaWYgKG9iaiA9PSBudWxsKSB7CkBAIC02MTksNyArNjIxLDcgQEAKIAkgKiAgICAgICAgICAgIHBhcnNlciB1c2VkIHRvIG9idGFpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QuCiAJICogQHNlZSAjZ2V0KFNlY3Rpb25QYXJzZXIpCiAJICovCi0JcHVibGljIHZvaWQgdW5jYWNoZShmaW5hbCBTZWN0aW9uUGFyc2VyPD8+IHBhcnNlcikgeworCXB1YmxpYyB2b2lkIHVuY2FjaGUoU2VjdGlvblBhcnNlcjw/PiBwYXJzZXIpIHsKIAkJc3RhdGUuZ2V0KCkuY2FjaGUucmVtb3ZlKHBhcnNlcik7CiAJfQogCkBAIC0xMDA4LDcgKzEwMTAsNyBAQAogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9UZXh0KCkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgQ29uZmlnTGluZSBlIDogc3RhdGUuZ2V0KCkuZW50cnlMaXN0KSB7CisJCWZvciAoQ29uZmlnTGluZSBlIDogc3RhdGUuZ2V0KCkuZW50cnlMaXN0KSB7CiAJCQlpZiAoZS5wcmVmaXggIT0gbnVsbCkKIAkJCQlvdXQuYXBwZW5kKGUucHJlZml4KTsKIAkJCWlmIChlLnNlY3Rpb24gIT0gbnVsbCAmJiBlLm5hbWUgPT0gbnVsbCkgewpAQCAtMTA1NywxMSArMTA1OSwxMSBAQAogCSAqICAgICAgICAgICAgIHRoZSB0ZXh0IHN1cHBsaWVkIGlzIG5vdCBmb3JtYXR0ZWQgY29ycmVjdGx5LiBObyBjaGFuZ2VzIHdlcmUKIAkgKiAgICAgICAgICAgICBtYWRlIHRvIHtAY29kZSB0aGlzfS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGZyb21UZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCXN0YXRlLnNldChuZXdTdGF0ZShmcm9tVGV4dFJlY3Vyc2UodGV4dCwgMSkpKTsKIAl9CiAKLQlwcml2YXRlIExpc3Q8Q29uZmlnTGluZT4gZnJvbVRleHRSZWN1cnNlKGZpbmFsIFN0cmluZyB0ZXh0LCBpbnQgZGVwdGgpCisJcHJpdmF0ZSBMaXN0PENvbmZpZ0xpbmU+IGZyb21UZXh0UmVjdXJzZShTdHJpbmcgdGV4dCwgaW50IGRlcHRoKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlpZiAoZGVwdGggPiBNQVhfREVQVEgpIHsKIAkJCXRocm93IG5ldyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKApAQCAtMTE2Niw4ICsxMTY4LDcgQEAKIAogCQlTdHJpbmcgZGVjb2RlZDsKIAkJaWYgKGlzVXRmOChieXRlcykpIHsKLQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVCwgYnl0ZXMsIDMsCi0JCQkJCWJ5dGVzLmxlbmd0aCk7CisJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgYnl0ZXMsIDMsIGJ5dGVzLmxlbmd0aCk7CiAJCX0gZWxzZSB7CiAJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoYnl0ZXMpOwogCQl9CkBAIC0xMTg0LDcgKzExODUsNyBAQAogCQkJCWdldEJhc2VTdGF0ZSgpKTsKIAl9CiAKLQlwcml2YXRlIENvbmZpZ1NuYXBzaG90IG5ld1N0YXRlKGZpbmFsIExpc3Q8Q29uZmlnTGluZT4gZW50cmllcykgeworCXByaXZhdGUgQ29uZmlnU25hcHNob3QgbmV3U3RhdGUoTGlzdDxDb25maWdMaW5lPiBlbnRyaWVzKSB7CiAJCXJldHVybiBuZXcgQ29uZmlnU25hcHNob3QoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChlbnRyaWVzKSwKIAkJCQlnZXRCYXNlU3RhdGUoKSk7CiAJfQpAQCAtMTIwOSw3ICsxMjEwLDcgQEAKIAkJCQkmJiBieXRlc1sxXSA9PSAoYnl0ZSkgMHhCQiAmJiBieXRlc1syXSA9PSAoYnl0ZSkgMHhCRjsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFNlY3Rpb25OYW1lKGZpbmFsIFN0cmluZ1JlYWRlciBpbikKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFNlY3Rpb25OYW1lKFN0cmluZ1JlYWRlciBpbikKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBuYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZm9yICg7OykgewpAQCAtMTI0OCw3ICsxMjQ5LDcgQEAKIAkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEtleU5hbWUoZmluYWwgU3RyaW5nUmVhZGVyIGluKQorCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkS2V5TmFtZShTdHJpbmdSZWFkZXIgaW4pCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZvciAoOzspIHsKQEAgLTEzMzUsNyArMTMzNiw3IEBACiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRWYWx1ZShmaW5hbCBTdHJpbmdSZWFkZXIgaW4pCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRWYWx1ZShTdHJpbmdSZWFkZXIgaW4pCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCVN0cmluZ0J1aWxkZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlTdHJpbmdCdWlsZGVyIHRyYWlsaW5nU3BhY2VzID0gbnVsbDsKQEAgLTE0NTEsNyArMTQ1Miw3IEBACiAKIAkJcHJpdmF0ZSBpbnQgcG9zOwogCi0JCVN0cmluZ1JlYWRlcihmaW5hbCBTdHJpbmcgaW4pIHsKKwkJU3RyaW5nUmVhZGVyKFN0cmluZyBpbikgewogCQkJYnVmID0gaW4udG9DaGFyQXJyYXkoKTsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdMaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdMaW5lLmphdmEKaW5kZXggZDVmMWQ4Zi4uOTM3YmE5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnTGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0xpbmUuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCS8qKiBUaGUgdGV4dCBjb250ZW50IGFmdGVyIGVudHJ5LiAqLwogCVN0cmluZyBzdWZmaXg7CiAKLQlDb25maWdMaW5lIGZvclZhbHVlKGZpbmFsIFN0cmluZyBuZXdWYWx1ZSkgeworCUNvbmZpZ0xpbmUgZm9yVmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7CiAJCWZpbmFsIENvbmZpZ0xpbmUgZSA9IG5ldyBDb25maWdMaW5lKCk7CiAJCWUucHJlZml4ID0gcHJlZml4OwogCQllLnNlY3Rpb24gPSBzZWN0aW9uOwpAQCAtOTEsMTIgKzkxLDEyIEBACiAJCQkJJiYgZXFJZ25vcmVDYXNlKG5hbWUsIGFLZXkpOwogCX0KIAotCWJvb2xlYW4gbWF0Y2goZmluYWwgU3RyaW5nIGFTZWN0aW9uLCBmaW5hbCBTdHJpbmcgYVN1YnNlY3Rpb24pIHsKKwlib29sZWFuIG1hdGNoKFN0cmluZyBhU2VjdGlvbiwgU3RyaW5nIGFTdWJzZWN0aW9uKSB7CiAJCXJldHVybiBlcUlnbm9yZUNhc2Uoc2VjdGlvbiwgYVNlY3Rpb24pCiAJCQkJJiYgZXFTYW1lQ2FzZShzdWJzZWN0aW9uLCBhU3Vic2VjdGlvbik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcUlnbm9yZUNhc2UoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcUlnbm9yZUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCXJldHVybiBTdHJpbmdVdGlscy5lcXVhbHNJZ25vcmVDYXNlKGEsIGIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXFTYW1lQ2FzZShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxU2FtZUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQppbmRleCAxMGFiZDllLi45MDIzYmQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKQEAgLTIyNiwxMCArMjI4LDEwIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUEFDS19TSUdOQVRVUkUgPSB7ICdQJywgJ0EnLCAnQycsICdLJyB9OwogCiAJLyoqIE5hdGl2ZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIGNvbW1pdCBtZXNzYWdlcywgZmlsZSBuYW1lcy4uLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9FTkNPRElORyA9ICJVVEYtOCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyc2V0IENIQVJTRVQ7CiAKIAkvKiogTmF0aXZlIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgY29tbWl0IG1lc3NhZ2VzLCBmaWxlIG5hbWVzLi4uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyc2V0IENIQVJTRVQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX0VOQ09ESU5HOwogCiAJLyoqIERlZmF1bHQgbWFpbiBicmFuY2ggbmFtZSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUiA9ICJtYXN0ZXIiOwpAQCAtNDc1LDcgKzQ3Nyw3IEBACiAJICogQHBhcmFtIHR5cGVDb2RlIHRoZSB0eXBlIGNvZGUsIGZyb20gYSBwYWNrIHJlcHJlc2VudGF0aW9uLgogCSAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgbmFtZSBvZiB0aGlzIHR5cGUuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZVN0cmluZyhmaW5hbCBpbnQgdHlwZUNvZGUpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlU3RyaW5nKGludCB0eXBlQ29kZSkgewogCQlzd2l0Y2ggKHR5cGVDb2RlKSB7CiAJCWNhc2UgT0JKX0NPTU1JVDoKIAkJCXJldHVybiBUWVBFX0NPTU1JVDsKQEAgLTUwMCw3ICs1MDIsNyBAQAogCSAqIEBwYXJhbSB0eXBlQ29kZSB0aGUgdHlwZSBjb2RlLCBmcm9tIGEgcGFjayByZXByZXNlbnRhdGlvbi4KIAkgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgQVNDSUkgZW5jb2RlZCBuYW1lIG9mIHRoaXMgdHlwZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVkVHlwZVN0cmluZyhmaW5hbCBpbnQgdHlwZUNvZGUpIHsKKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVkVHlwZVN0cmluZyhpbnQgdHlwZUNvZGUpIHsKIAkJc3dpdGNoICh0eXBlQ29kZSkgewogCQljYXNlIE9CSl9DT01NSVQ6CiAJCQlyZXR1cm4gRU5DT0RFRF9UWVBFX0NPTU1JVDsKQEAgLTU5OSw3ICs2MDEsNyBAQAogCSAqIEByZXR1cm4gYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCBpbnRlZ2VyLiBUaGUgcmV0dXJuZWQgYXJyYXkKIAkgKiAgICAgICAgIGlzIHRoZSBzbWFsbGVzdCBhcnJheSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWUuCiAJICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQVNDSUkoZmluYWwgbG9uZyBzKSB7CisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQVNDSUkobG9uZyBzKSB7CiAJCXJldHVybiBlbmNvZGVBU0NJSShMb25nLnRvU3RyaW5nKHMpKTsKIAl9CiAKQEAgLTYxNSw3ICs2MTcsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBvdXRzaWRlIG9mCiAJICogICAgICAgICAgICAgdGhlIDctYml0IEFTQ0lJIGNoYXJhY3RlciBzcGFjZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVBU0NJSShmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZUFTQ0lJKFN0cmluZyBzKSB7CiAJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbcy5sZW5ndGgoKV07CiAJCWZvciAoaW50IGsgPSByLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7CiAJCQlmaW5hbCBjaGFyIGMgPSBzLmNoYXJBdChrKTsKQEAgLTYzNSw3ICs2MzcsNyBAQAogCSAqICAgICAgICAgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcgKFVURi04KS4KIAkgKiBAc2VlICNDSEFSQUNURVJfRU5DT0RJTkcKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShTdHJpbmcgc3RyKSB7CiAJCWZpbmFsIEJ5dGVCdWZmZXIgYmIgPSBDb25zdGFudHMuQ0hBUlNFVC5lbmNvZGUoc3RyKTsKIAkJZmluYWwgaW50IGxlbiA9IGJiLmxpbWl0KCk7CiAJCWlmIChiYi5oYXNBcnJheSgpICYmIGJiLmFycmF5T2Zmc2V0KCkgPT0gMCkgewpAQCAtNjUyLDcgKzY1NCw4IEBACiAJc3RhdGljIHsKIAkJaWYgKE9CSkVDVF9JRF9MRU5HVEggIT0gbmV3TWVzc2FnZURpZ2VzdCgpLmdldERpZ2VzdExlbmd0aCgpKQogCQkJdGhyb3cgbmV3IExpbmthZ2VFcnJvcihKR2l0VGV4dC5nZXQoKS5pbmNvcnJlY3RPQkpFQ1RfSURfTEVOR1RIKTsKLQkJQ0hBUlNFVCA9IENoYXJzZXQuZm9yTmFtZShDSEFSQUNURVJfRU5DT0RJTkcpOworCQlDSEFSU0VUID0gVVRGXzg7CisJCUNIQVJBQ1RFUl9FTkNPRElORyA9IENIQVJTRVQubmFtZSgpOwogCX0KIAogCS8qKiBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbW1pdCBtc2cgZm9yIGEgbWVyZ2UgY29tbWl0ICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEKaW5kZXggMzJhODk0Zi4uOThkZTNhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YQpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCURPVEdJVE9OTFkKIAl9CiAKLQlwcml2YXRlIENvcmVDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBDb3JlQ29uZmlnKENvbmZpZyByYykgewogCQljb21wcmVzc2lvbiA9IHJjLmdldEludChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKIAkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DT01QUkVTU0lPTiwgREVGQVVMVF9DT01QUkVTU0lPTik7CiAJCXBhY2tJbmRleFZlcnNpb24gPSByYy5nZXRJbnQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19QQUNLX1NFQ1RJT04sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCmluZGV4IDY4Zjg4MWQuLjg5MWM3ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCkBAIC0yNzAsOCArMjcwLDggQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2goZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZy4uLiBjYXNlcykgewotCQlmb3IgKGZpbmFsIFN0cmluZyBiIDogY2FzZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBhLCBTdHJpbmcuLi4gY2FzZXMpIHsKKwkJZm9yIChTdHJpbmcgYiA6IGNhc2VzKSB7CiAJCQlpZiAoYiAhPSBudWxsICYmIGIuZXF1YWxzSWdub3JlQ2FzZShhKSkgewogCQkJCXJldHVybiB0cnVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRmlsZU1vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0ZpbGVNb2RlLmphdmEKaW5kZXggNzg1MjM3MS4uZDRjNGQ1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRmlsZU1vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9GaWxlTW9kZS5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBUUkVFID0gbmV3IEZpbGVNb2RlKFRZUEVfVFJFRSwKIAkJCUNvbnN0YW50cy5PQkpfVFJFRSkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX1RSRUU7CiAJCX0KIAl9OwpAQCAtOTcsNyArOTcsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgU1lNTElOSyA9IG5ldyBGaWxlTW9kZShUWVBFX1NZTUxJTkssCiAJCQlDb25zdGFudHMuT0JKX0JMT0IpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCBtb2RlQml0cykgewogCQkJcmV0dXJuIChtb2RlQml0cyAmIFRZUEVfTUFTSykgPT0gVFlQRV9TWU1MSU5LOwogCQl9CiAJfTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgUkVHVUxBUl9GSUxFID0gbmV3IEZpbGVNb2RlKDAxMDA2NDQsCiAJCQlDb25zdGFudHMuT0JKX0JMT0IpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCBtb2RlQml0cykgewogCQkJcmV0dXJuIChtb2RlQml0cyAmIFRZUEVfTUFTSykgPT0gVFlQRV9GSUxFICYmIChtb2RlQml0cyAmIDAxMTEpID09IDA7CiAJCX0KIAl9OwpAQCAtMTE1LDcgKzExNSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBFWEVDVVRBQkxFX0ZJTEUgPSBuZXcgRmlsZU1vZGUoMDEwMDc1NSwKIAkJCUNvbnN0YW50cy5PQkpfQkxPQikgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX0ZJTEUgJiYgKG1vZGVCaXRzICYgMDExMSkgIT0gMDsKIAkJfQogCX07CkBAIC0xMjQsNyArMTI0LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIEdJVExJTksgPSBuZXcgRmlsZU1vZGUoVFlQRV9HSVRMSU5LLAogCQkJQ29uc3RhbnRzLk9CSl9DT01NSVQpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCBtb2RlQml0cykgewogCQkJcmV0dXJuIChtb2RlQml0cyAmIFRZUEVfTUFTSykgPT0gVFlQRV9HSVRMSU5LOwogCQl9CiAJfTsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgTUlTU0lORyA9IG5ldyBGaWxlTW9kZShUWVBFX01JU1NJTkcsCiAJCQlDb25zdGFudHMuT0JKX0JBRCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gbW9kZUJpdHMgPT0gMDsKIAkJfQogCX07CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBtb2RlIGJpdHMgdGhlIGNhbGxlciBoYXMgc29tZWhvdyBvYnRhaW5lZC4KIAkgKiBAcmV0dXJuIHRoZSBGaWxlTW9kZSBpbnN0YW5jZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIGJpdHMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBmcm9tQml0cyhmaW5hbCBpbnQgYml0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgZnJvbUJpdHMoaW50IGJpdHMpIHsKIAkJc3dpdGNoIChiaXRzICYgVFlQRV9NQVNLKSB7CiAJCWNhc2UgVFlQRV9NSVNTSU5HOgogCQkJaWYgKGJpdHMgPT0gMCkKQEAgLTE2NSw3ICsxNjUsNyBAQAogCiAJCXJldHVybiBuZXcgRmlsZU1vZGUoYml0cywgQ29uc3RhbnRzLk9CSl9CQUQpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBhKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IGEpIHsKIAkJCQlyZXR1cm4gYml0cyA9PSBhOwogCQkJfQogCQl9OwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIAlwcml2YXRlIGZpbmFsIGludCBvYmplY3RUeXBlOwogCi0JcHJpdmF0ZSBGaWxlTW9kZShpbnQgbW9kZSwgZmluYWwgaW50IGV4cFR5cGUpIHsKKwlwcml2YXRlIEZpbGVNb2RlKGludCBtb2RlLCBpbnQgZXhwVHlwZSkgewogCQltb2RlQml0cyA9IG1vZGU7CiAJCW9iamVjdFR5cGUgPSBleHBUeXBlOwogCQlpZiAobW9kZSAhPSAwKSB7CkBAIC0yMDYsNyArMjA2LDcgQEAKIAkgKiAgICAgICAgICAgIGEgaW50LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZSBiaXRzIHJlcHJlc2VudCB0aGUgc2FtZSBtb2RlIGFzIHRoaXMgb2JqZWN0CiAJICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlYml0cyk7CisJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKGludCBtb2RlYml0cyk7CiAKIAkvKioKIAkgKiBDb3B5IHRoaXMgbW9kZSBhcyBhIHNlcXVlbmNlIG9mIG9jdGFsIFVTLUFTQ0lJIGJ5dGVzLgpAQCAtMjIyLDcgKzIyMiw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhlIGNvcHkuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvcy53cml0ZShvY3RhbEJ5dGVzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKaW5kZXggODcwODZjYi4uOTRiOWRkYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKQEAgLTU0MiwxMCArNTQyLDkgQEAKIAkJCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkSWdub3JlUGFyYW1TdWJtb2R1bGUsCiAJCQkJCQkJc213LmdldFBhdGgoKSksIGUpOwogCQkJCX0KLQkJCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBzbXcuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN1YlJlcG9QYXRoID0gc213LmdldFBhdGgoKTsKLQkJCQkJdHJ5IHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IHNtdy5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgeworCQkJCQkJU3RyaW5nIHN1YlJlcG9QYXRoID0gc213LmdldFBhdGgoKTsKIAkJCQkJCU9iamVjdElkIHN1YkhlYWQgPSBzdWJSZXBvLnJlc29sdmUoIkhFQUQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJaWYgKHN1YkhlYWQgIT0gbnVsbAogCQkJCQkJCQkmJiAhc3ViSGVhZC5lcXVhbHMoc213LmdldE9iamVjdElkKCkpKSB7CkBAIC01NzQsOCArNTczLDYgQEAKIAkJCQkJCQkJcmVjb3JkRmlsZU1vZGUoc3ViUmVwb1BhdGgsIEZpbGVNb2RlLkdJVExJTkspOwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTc0NSw3ICs3NDIsNyBAQAogCSAqIEBwYXJhbSBwYXRoIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKiBAcmV0dXJuIGZpbGUgbW9kZQogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleE1vZGUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgRmlsZU1vZGUgZ2V0SW5kZXhNb2RlKFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIERpckNhY2hlRW50cnkgZW50cnkgPSBkaXJDYWNoZS5nZXRFbnRyeShwYXRoKTsKIAkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRGaWxlTW9kZSgpIDogRmlsZU1vZGUuTUlTU0lORzsKIAl9CkBAIC03NTksNyArNzU2LDcgQEAKIAkgKiAgICAgICAgIHRoZSBnaXZlbiBmaWxlIG1vZGUKIAkgKiBAc2luY2UgMy42CiAJICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFBhdGhzV2l0aEluZGV4TW9kZShmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHVibGljIFNldDxTdHJpbmc+IGdldFBhdGhzV2l0aEluZGV4TW9kZShGaWxlTW9kZSBtb2RlKSB7CiAJCVNldDxTdHJpbmc+IHBhdGhzID0gZmlsZU1vZGVzLmdldChtb2RlKTsKIAkJaWYgKHBhdGhzID09IG51bGwpCiAJCQlwYXRocyA9IG5ldyBIYXNoU2V0PD4oKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YQppbmRleCBhOTc3MjFjLi5kZDBmMThlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmZsYXRlckNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhCkBAIC04OSw3ICs4OSw3IEBACiAJICogICAgICAgICAgICB0aGUgaW5mbGF0ZXIgdG8gcmV0dXJuLiBNYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGlzIG1ldGhvZAogCSAqICAgICAgICAgICAgZG9lcyBub3RoaW5nLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKGZpbmFsIEluZmxhdGVyIGkpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZShJbmZsYXRlciBpKSB7CiAJCWlmIChpICE9IG51bGwpIHsKIAkJCWkucmVzZXQoKTsKIAkJCWlmIChyZWxlYXNlSW1wbChpKSkKQEAgLTk3LDcgKzk3LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbGVhc2VJbXBsKGZpbmFsIEluZmxhdGVyIGkpIHsKKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxlYXNlSW1wbChJbmZsYXRlciBpKSB7CiAJCWlmIChvcGVuSW5mbGF0ZXJDb3VudCA8IFNaKSB7CiAJCQlpbmZsYXRlckNhY2hlW29wZW5JbmZsYXRlckNvdW50KytdID0gaTsKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL011dGFibGVPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKaW5kZXggZTQ5MmFmOS4uOGNmMGZkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKQEAgLTE2Miw3ICsxNjIsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJhdyBieXRlIGJ1ZmZlciB0byByZWFkIGZyb20uIEF0IGxlYXN0IDIwIGJ5dGVzIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBieXRlIGFycmF5LgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMpIHsKIAkJZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCXcxID0gTkIuZGVjb2RlSW50MzIoYnMsIHApOwogCQl3MiA9IE5CLmRlY29kZUludDMyKGJzLCBwICsgNCk7CiAJCXczID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA4KTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJhdyBpbnQgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNSBpbnRlZ2VycyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgaW50ZWdlcnMgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhpbnRbXSBpbnRzKSB7CiAJCWZyb21SYXcoaW50cywgMCk7CiAJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgaW50ZWdlciBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoaW50W10gaW50cywgaW50IHApIHsKIAkJdzEgPSBpbnRzW3BdOwogCQl3MiA9IGludHNbcCArIDFdOwogCQl3MyA9IGludHNbcCArIDJdOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCWZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjUzLDE0ICsyNTMsMTQgQEAKIAkgKiBAcGFyYW0gc3RyCiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA0MCBjaGFyYWN0ZXJzIGxvbmcuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZElkLCBzdHIpKTsKIAkJZnJvbUhleFN0cmluZyhDb25zdGFudHMuZW5jb2RlQVNDSUkoc3RyKSwgMCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCXcxID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwKTsKIAkJCXcyID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwICsgOCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEKaW5kZXggYTZkMmMzZi4uNjg5NjU5YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXIuamF2YQpAQCAtMTEwNSw3ICsxMTA1LDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkgZXJyb3Igd2FzIGRldGVjdGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQmxvYihmaW5hbCBieXRlW10gcmF3KSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY2hlY2tCbG9iKGJ5dGVbXSByYXcpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gV2UgY2FuIGFsd2F5cyBhc3N1bWUgdGhlIGJsb2IgaXMgdmFsaWQuCiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQppbmRleCBiYmVmNTFkLi45M2FkZDVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKQEAgLTEyMSw4ICsxMjEsOCBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RvcmUgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgeworCXB1YmxpYyBib29sZWFuIGhhcyhBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgewogCQkJcmV0dXJuIG9yLmhhcyhvYmplY3RJZCk7CiAJCX0KIAl9CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IHN0b3JlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpCisJcHVibGljIE9iamVjdExvYWRlciBvcGVuKEFueU9iamVjdElkIG9iamVjdElkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG9wZW4ob2JqZWN0SWQsIE9iamVjdFJlYWRlci5PQkpfQU5ZKTsKIAl9CkBAIC0xNzIsNyArMTcyLDcgQEAKIAlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlSGludCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CisJCXRyeSAoT2JqZWN0UmVhZGVyIG9yID0gbmV3UmVhZGVyKCkpIHsKIAkJCXJldHVybiBvci5vcGVuKG9iamVjdElkLCB0eXBlSGludCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWQuamF2YQppbmRleCAwZTg1NTQ1Li43NjRmODkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSAhPSBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXRyeSB7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBpZCB0byBjb252ZXJ0LiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRoZSBoZXggc3RyaW5nIGNvbnZlcnNpb24gb2YgdGhpcyBpZCdzIGNvbnRlbnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoZmluYWwgT2JqZWN0SWQgaSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKE9iamVjdElkIGkpIHsKIAkJcmV0dXJuIGkgIT0gbnVsbCA/IGkubmFtZSgpIDogWkVST0lEX1NUUjsKIAl9CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlyZXR1cm4gZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlmaW5hbCBpbnQgYSA9IE5CLmRlY29kZUludDMyKGJzLCBwKTsKIAkJZmluYWwgaW50IGIgPSBOQi5kZWNvZGVJbnQzMihicywgcCArIDQpOwogCQlmaW5hbCBpbnQgYyA9IE5CLmRlY29kZUludDMyKGJzLCBwICsgOCk7CkBAIC0xODgsNyArMTg4LDcgQEAKIAkgKiAgICAgICAgICAgIGJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBpbnQgYXJyYXkuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgaW50W10gaXMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoaW50W10gaXMpIHsKIAkJcmV0dXJuIGZyb21SYXcoaXMsIDApOwogCX0KIApAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpcywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoaW50W10gaXMsIGludCBwKSB7CiAJCXJldHVybiBuZXcgT2JqZWN0SWQoaXNbcF0sIGlzW3AgKyAxXSwgaXNbcCArIDJdLCBpc1twICsgM10sIGlzW3AgKyA0XSk7CiAJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21TdHJpbmcoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogCQlyZXR1cm4gZnJvbUhleFN0cmluZyhidWYsIG9mZnNldCk7CiAJfQogCkBAIC0yMjcsMTQgKzIyNywxNCBAQAogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3QgYmUgNDAgY2hhcmFjdGVycyBsb25nLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgc3RhdGljIE9iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkgewogCQkJdGhyb3cgbmV3IEludmFsaWRPYmplY3RJZEV4Y2VwdGlvbihzdHIpOwogCQl9CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKENvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpLCAwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGZpbmFsIGJ5dGVbXSBicywgaW50IHApIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGludCBhID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwKTsKIAkJCWZpbmFsIGludCBiID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwICsgOCk7CkBAIC0yODEsNyArMjgxLDcgQEAKIAkgKiBAcGFyYW0gc3JjCiAJICogICAgICAgICAgICBhbm90aGVyIGFscmVhZHkgcGFyc2VkIE9iamVjdElkIHRvIGNvcHkgdGhlIHZhbHVlIG91dCBvZi4KIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0SWQoZmluYWwgQW55T2JqZWN0SWQgc3JjKSB7CisJcHJvdGVjdGVkIE9iamVjdElkKEFueU9iamVjdElkIHNyYykgewogCQl3MSA9IHNyYy53MTsKIAkJdzIgPSBzcmMudzI7CiAJCXczID0gc3JjLnczOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRPd25lck1hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRPd25lck1hcC5qYXZhCmluZGV4IDAzYTQzMGMuLjlkZjU5MzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkT3duZXJNYXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZE93bmVyTWFwLmphdmEKQEAgLTEzNCw3ICsxMzQsNyBAQAogCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG1hcHBlZCB0byB0b0ZpbmQsIG9yIG51bGwgaWYgbm8gbWFwcGluZyBleGlzdHMuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFYgZ2V0KGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgeworCXB1YmxpYyBWIGdldChBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJaW50IGggPSB0b0ZpbmQudzE7CiAJCVYgb2JqID0gZGlyZWN0b3J5W2ggJiBtYXNrXVtoID4+PiBTRUdNRU5UX1NISUZUXTsKIAkJZm9yICg7IG9iaiAhPSBudWxsOyBvYmogPSAoVikgb2JqLm5leHQpCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJCXJldHVybiBnZXQodG9GaW5kKSAhPSBudWxsOwogCX0KIApAQCAtMTYzLDcgKzE2Myw3IEBACiAJICogQHBhcmFtIG5ld1ZhbHVlCiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHN0b3JlLgogCSAqLwotCXB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKGZpbmFsIFEgbmV3VmFsdWUpIHsKKwlwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChRIG5ld1ZhbHVlKSB7CiAJCWlmICgrK3NpemUgPT0gZ3JvdykKIAkJCWdyb3coKTsKIApAQCAtMTk0LDcgKzE5NCw3IEBACiAJICogICAgICAgICB7QGNvZGUgZ2V0KG5ld1ZhbHVlKX0gZmlyc3QuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChmaW5hbCBRIG5ld1ZhbHVlKSB7CisJcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChRIG5ld1ZhbHVlKSB7CiAJCWludCBoID0gbmV3VmFsdWUudzE7CiAJCVZbXSB0YWJsZSA9IGRpcmVjdG9yeVtoICYgbWFza107CiAJCWggPj4+PSBTRUdNRU5UX1NISUZUOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRTdWJjbGFzc01hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRTdWJjbGFzc01hcC5qYXZhCmluZGV4IDAwMWFhOWMuLmNkNTdiZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkU3ViY2xhc3NNYXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZFN1YmNsYXNzTWFwLmphdmEKQEAgLTk2LDcgKzk2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgaWRlbnRpZmllciB0byBmaW5kLgogCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG1hcHBlZCB0byB0b0ZpbmQsIG9yIG51bGwgaWYgbm8gbWFwcGluZyBleGlzdHMuCiAJICovCi0JcHVibGljIFYgZ2V0KGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgeworCXB1YmxpYyBWIGdldChBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBpID0gdG9GaW5kLncxICYgbXNrOwogCQlmaW5hbCBWW10gdGJsID0gdGFibGU7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJCXJldHVybiBnZXQodG9GaW5kKSAhPSBudWxsOwogCX0KIApAQCAtMTMxLDcgKzEzMSw3IEBACiAJICogQHBhcmFtIG5ld1ZhbHVlCiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHN0b3JlLgogCSAqLwotCXB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKGZpbmFsIFEgbmV3VmFsdWUpIHsKKwlwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChRIG5ld1ZhbHVlKSB7CiAJCWlmICgrK3NpemUgPT0gZ3JvdykKIAkJCWdyb3coKTsKIAkJaW5zZXJ0KG5ld1ZhbHVlKTsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCSAqICAgICAgICAgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgaGFkIHRoZSBjYWxsZXIgdXNlZAogCSAqICAgICAgICAge0Bjb2RlIGdldChuZXdWYWx1ZSl9IGZpcnN0LgogCSAqLwotCXB1YmxpYyA8USBleHRlbmRzIFY+IFYgYWRkSWZBYnNlbnQoZmluYWwgUSBuZXdWYWx1ZSkgeworCXB1YmxpYyA8USBleHRlbmRzIFY+IFYgYWRkSWZBYnNlbnQoUSBuZXdWYWx1ZSkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGkgPSBuZXdWYWx1ZS53MSAmIG1zazsKIAkJZmluYWwgVltdIHRibCA9IHRhYmxlOwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJCX07CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydChmaW5hbCBWIG5ld1ZhbHVlKSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydChWIG5ld1ZhbHVlKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaiA9IG5ld1ZhbHVlLncxICYgbXNrOwogCQlmaW5hbCBWW10gdGJsID0gdGFibGU7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIGZpbmFsIFZbXSBjcmVhdGVBcnJheShmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIGZpbmFsIFZbXSBjcmVhdGVBcnJheShpbnQgc3opIHsKIAkJcmV0dXJuIChWW10pIG5ldyBPYmplY3RJZFtzel07CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdEluc2VydGVyLmphdmEKaW5kZXggNDA1MjJiYS4uNzdmYTFiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SW5zZXJ0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJbnNlcnRlci5qYXZhCkBAIC0zNjEsNyArMzYxLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IGNvdWxkIG5vdCBiZSBzdG9yZWQuCiAJICovCi0JcHVibGljIE9iamVjdElkIGluc2VydChmaW5hbCBpbnQgdHlwZSwgZmluYWwgYnl0ZVtdIGRhdGEpCisJcHVibGljIE9iamVjdElkIGluc2VydChpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaW5zZXJ0KHR5cGUsIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RMb2FkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhCmluZGV4IDQzMmY1YTYuLjJlNTJmMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhCkBAIC0xOTQsOCArMTk0LDcgQEAKIAkJaWYgKCFpc0xhcmdlKCkpCiAJCQlyZXR1cm4gZ2V0Q2FjaGVkQnl0ZXMoKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvcGVuU3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb3BlblN0cmVhbSgpKSB7CiAJCQlsb25nIHN6ID0gaW4uZ2V0U2l6ZSgpOwogCQkJaWYgKHNpemVMaW1pdCA8IHN6KQogCQkJCXRocm93IG5ldyBMYXJnZU9iamVjdEV4Y2VwdGlvbi5FeGNlZWRzTGltaXQoc2l6ZUxpbWl0LCBzeik7CkBAIC0yMTIsOCArMjExLDYgQEAKIAogCQkJSU8ucmVhZEZ1bGx5KGluLCBidWYsIDAsIGJ1Zi5sZW5ndGgpOwogCQkJcmV0dXJuIGJ1ZjsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTI1NSw4ICsyNTIsNyBAQAogCXB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJaWYgKGlzTGFyZ2UoKSkgewotCQkJT2JqZWN0U3RyZWFtIGluID0gb3BlblN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb3BlblN0cmVhbSgpKSB7CiAJCQkJZmluYWwgbG9uZyBzeiA9IGluLmdldFNpemUoKTsKIAkJCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbODE5Ml07CiAJCQkJbG9uZyBjb3BpZWQgPSAwOwpAQCAtMjY5LDE1ICsyNjUsMTMgQEAKIAkJCQl9CiAJCQkJaWYgKDAgPD0gaW4ucmVhZCgpKQogCQkJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlvdXQud3JpdGUoZ2V0Q2FjaGVkQnl0ZXMoKSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY2xvbmVBcnJheShmaW5hbCBieXRlW10gZGF0YSkgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjbG9uZUFycmF5KGJ5dGVbXSBkYXRhKSB7CiAJCWZpbmFsIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwogCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGNvcHksIDAsIGRhdGEubGVuZ3RoKTsKIAkJcmV0dXJuIGNvcHk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQppbmRleCAxOGExMWYwLi5jMTZhMmI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCSAqCiAJICogQHBhcmFtIHJlcG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUGVyc29uSWRlbnQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwby5nZXRDb25maWcoKS5nZXQoVXNlckNvbmZpZy5LRVkpKTsKIAl9CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCSAqIEBwYXJhbSBwaQogCSAqICAgICAgICAgICAgT3JpZ2luYWwge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50fQogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSkgewogCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCkpOwogCX0KIApAQCAtMTkwLDcgKzE5MCw3IEBACiAJICogQHBhcmFtIGFFbWFpbEFkZHJlc3MKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBmaW5hbCBTdHJpbmcgYUVtYWlsQWRkcmVzcykgeworCXB1YmxpYyBQZXJzb25JZGVudChTdHJpbmcgYU5hbWUsIFN0cmluZyBhRW1haWxBZGRyZXNzKSB7CiAJCXRoaXMoYU5hbWUsIGFFbWFpbEFkZHJlc3MsIFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRUaW1lKCkpOwogCX0KIApAQCAtMjIxLDcgKzIyMSw3IEBACiAJICogQHBhcmFtIHR6CiAJICogICAgICAgICAgICB0aW1lIHpvbmUKIAkgKi8KLQlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGksIGZpbmFsIERhdGUgd2hlbiwgZmluYWwgVGltZVpvbmUgdHopIHsKKwlwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGksIERhdGUgd2hlbiwgVGltZVpvbmUgdHopIHsKIAkJdGhpcyhwaS5nZXROYW1lKCksIHBpLmdldEVtYWlsQWRkcmVzcygpLCB3aGVuLCB0eik7CiAJfQogCkBAIC0yMzQsNyArMjM0LDcgQEAKIAkgKiBAcGFyYW0gYVdoZW4KIAkgKiAgICAgICAgICAgIGxvY2FsIHRpbWUKIAkgKi8KLQlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGksIGZpbmFsIERhdGUgYVdoZW4pIHsKKwlwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGksIERhdGUgYVdoZW4pIHsKIAkJdGhpcyhwaS5nZXROYW1lKCksIHBpLmdldEVtYWlsQWRkcmVzcygpLCBhV2hlbi5nZXRUaW1lKCksIHBpLnR6T2Zmc2V0KTsKIAl9CiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogCSAqIEBwYXJhbSBhVFoKIAkgKiAgICAgICAgICAgIHRpbWUgem9uZQogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSwgZmluYWwgbG9uZyBhV2hlbiwgZmluYWwgaW50IGFUWikgeworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgbG9uZyBhV2hlbiwgaW50IGFUWikgewogCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCksIGFXaGVuLCBhVFopOwogCX0KIApAQCAtMjc0LDcgKzI3NCw3IEBACiAJCQkJLmdldFRpbWV6b25lKHdoZW4pKTsKIAl9CiAKLQlwcml2YXRlIFBlcnNvbklkZW50KGZpbmFsIFVzZXJDb25maWcgY29uZmlnKSB7CisJcHJpdmF0ZSBQZXJzb25JZGVudChVc2VyQ29uZmlnIGNvbmZpZykgewogCQl0aGlzKGNvbmZpZy5nZXRDb21taXR0ZXJOYW1lKCksIGNvbmZpZy5nZXRDb21taXR0ZXJFbWFpbCgpKTsKIAl9CiAKQEAgLTM3MCw3ICszNzAsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJaWYgKG8gaW5zdGFuY2VvZiBQZXJzb25JZGVudCkgewogCQkJZmluYWwgUGVyc29uSWRlbnQgcCA9IChQZXJzb25JZGVudCkgbzsKIAkJCXJldHVybiBnZXROYW1lKCkuZXF1YWxzKHAuZ2V0TmFtZSgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmViYXNlVG9kb0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlYmFzZVRvZG9GaWxlLmphdmEKaW5kZXggMDZiNGIyMi4uMzg3MTYwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmViYXNlVG9kb0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWJhc2VUb2RvRmlsZS5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCQlzd2l0Y2ggKHRva2VuQ291bnQpIHsKIAkJCWNhc2UgMDoKIAkJCQlTdHJpbmcgYWN0aW9uVG9rZW4gPSBuZXcgU3RyaW5nKGJ1ZiwgdG9rZW5CZWdpbiwKLQkJCQkJCW5leHRTcGFjZSAtIHRva2VuQmVnaW4gLSAxLCBVVEZfOCk7CisJCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgQ0hBUlNFVCk7CiAJCQkJdG9rZW5CZWdpbiA9IG5leHRTcGFjZTsKIAkJCQlhY3Rpb24gPSBSZWJhc2VUb2RvTGluZS5BY3Rpb24ucGFyc2UoYWN0aW9uVG9rZW4pOwogCQkJCWlmIChhY3Rpb24gPT0gbnVsbCkKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQkJY2FzZSAxOgogCQkJCW5leHRTcGFjZSA9IFJhd1BhcnNlVXRpbHMubmV4dChidWYsIHRva2VuQmVnaW4sICcgJyk7CiAJCQkJU3RyaW5nIGNvbW1pdFRva2VuID0gbmV3IFN0cmluZyhidWYsIHRva2VuQmVnaW4sCi0JCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgVVRGXzgpOworCQkJCQkJbmV4dFNwYWNlIC0gdG9rZW5CZWdpbiAtIDEsIENIQVJTRVQpOwogCQkJCXRva2VuQmVnaW4gPSBuZXh0U3BhY2U7CiAJCQkJY29tbWl0ID0gQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tU3RyaW5nKGNvbW1pdFRva2VuKTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEKaW5kZXggMzk1YmIzMi4uYjAwMDU1OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgYm9vbGVhbiBwYWNrZWQ7CiAKLQkJcHJpdmF0ZSBTdG9yYWdlKGZpbmFsIGJvb2xlYW4gbCwgZmluYWwgYm9vbGVhbiBwKSB7CisJCXByaXZhdGUgU3RvcmFnZShib29sZWFuIGwsIGJvb2xlYW4gcCkgewogCQkJbG9vc2UgPSBsOwogCQkJcGFja2VkID0gcDsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmQ29tcGFyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmQ29tcGFyYXRvci5qYXZhCmluZGV4IDQzZDJmMzcuLjhiY2FjMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkNvbXBhcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZDb21wYXJhdG9yLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBjb21wYXJlKGZpbmFsIFJlZiBvMSwgZmluYWwgUmVmIG8yKSB7CisJcHVibGljIGludCBjb21wYXJlKFJlZiBvMSwgUmVmIG8yKSB7CiAJCXJldHVybiBjb21wYXJlVG8obzEsIG8yKTsKIAl9CiAKQEAgLTczLDcgKzczLDcgQEAKIAkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24gdG8gYmUgc29ydGVkCiAJICogQHJldHVybiBzb3J0ZWQgY29sbGVjdGlvbiBvZiByZWZzCiAJICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZj4gc29ydChmaW5hbCBDb2xsZWN0aW9uPFJlZj4gcmVmcykgeworCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZWY+IHNvcnQoQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHsKIAkJZmluYWwgTGlzdDxSZWY+IHIgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcyk7CiAJCUNvbGxlY3Rpb25zLnNvcnQociwgSU5TVEFOQ0UpOwogCQlyZXR1cm4gcjsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG90aGVyIHJlZmVyZW5jZSBpbnN0YW5jZS4KIAkgKiBAcmV0dXJuIHN0YW5kYXJkIENvbXBhcmF0b3IgcmVzdWx0IG9mICZsdDsgMCwgMCwgJmd0OyAwLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhmaW5hbCBSZWYgbzEsIGZpbmFsIFJlZiBvMikgeworCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhSZWYgbzEsIFJlZiBvMikgewogCQlyZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkRhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZEYXRhYmFzZS5qYXZhCmluZGV4IDU1N2JkYjkuLjMxNzA3ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkRhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmRGF0YWJhc2UuamF2YQpAQCAtNDMsNiArNDMsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC04OSw3ICs5MSwxMCBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TWU1CT0xJQ19SRUZfREVQVEggPSA1OwogCi0JLyoqIE1hZ2ljIHZhbHVlIGZvciB7QGxpbmsgI2dldFJlZnMoU3RyaW5nKX0gdG8gcmV0dXJuIGFsbCByZWZlcmVuY2VzLiAqLworCS8qKgorCSAqIE1hZ2ljIHZhbHVlIGZvciB7QGxpbmsgI2dldFJlZnNCeVByZWZpeChTdHJpbmcpfSB0byByZXR1cm4gYWxsCisJICogcmVmZXJlbmNlcy4KKwkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSAiIjsvLyROT04tTkxTLTEkCiAKIAkvKioKQEAgLTMzMiw2ICszMzcsMjkgQEAKIAl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIGFsbCByZWZzLgorCSAqIDxwPgorCSAqIFRoaXMgaW5jbHVkZXMge0Bjb2RlIEhFQUR9LCBicmFuY2hlcyB1bmRlciB7QGNvZGUgcmVmL2hlYWRzL30sIHRhZ3MKKwkgKiB1bmRlciB7QGNvZGUgcmVmcy90YWdzL30sIGV0Yy4gSXQgZG9lcyBub3QgaW5jbHVkZSBwc2V1ZG8tcmVmcyBsaWtlCisJICoge0Bjb2RlIEZFVENIX0hFQUR9OyBmb3IgdGhvc2UsIHNlZSB7QGxpbmsgI2dldEFkZGl0aW9uYWxSZWZzfS4KKwkgKiA8cD4KKwkgKiBTeW1ib2xpYyByZWZlcmVuY2VzIHRvIGEgbm9uLWV4aXN0ZW50IHJlZiAoZm9yIGV4YW1wbGUsCisJICoge0Bjb2RlIEhFQUR9IHBvaW50aW5nIHRvIGEgYnJhbmNoIHlldCB0byBiZSBib3JuKSBhcmUgbm90IGluY2x1ZGVkLgorCSAqIDxwPgorCSAqIENhbGxlcnMgaW50ZXJlc3RlZCBpbiBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgcmVmIGhpZXJhcmNoeSBjYW4gY2FsbAorCSAqIHtAbGluayAjZ2V0UmVmc0J5UHJlZml4fSBpbnN0ZWFkLgorCSAqCisJICogQHJldHVybiBpbW11dGFibGUgbGlzdCBvZiBhbGwgcmVmcy4KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHNwYWNlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJQE5vbk51bGwKKwlwdWJsaWMgTGlzdDxSZWY+IGdldFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2V0UmVmc0J5UHJlZml4KEFMTCk7CisJfQorCisJLyoqCiAJICogR2V0IGEgc2VjdGlvbiBvZiB0aGUgcmVmZXJlbmNlIG5hbWVzcGFjZS4KIAkgKgogCSAqIEBwYXJhbSBwcmVmaXgKQEAgLTM0MywxNiArMzcxLDczIEBACiAJICogICAgICAgICBvZiBlYWNoIGtleS4gVGhlIG1hcCBjYW4gYmUgYW4gdW5zb3J0ZWQgbWFwLgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkLgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFJlZnNCeVByZWZpeH0gaW5zdGVhZAogCSAqLwogCUBOb25OdWxsCisJQERlcHJlY2F0ZWQKIAlwdWJsaWMgYWJzdHJhY3QgTWFwPFN0cmluZywgUmVmPiBnZXRSZWZzKFN0cmluZyBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogCS8qKgorCSAqIFJldHVybnMgcmVmcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGEgZ2l2ZW4gcHJlZml4LgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMge0BsaW5rICNnZXRSZWZzKFN0cmluZyl9LiBJbXBsZW1lbnRvcnMgb2YKKwkgKiB7QGxpbmsgUmVmRGF0YWJhc2V9IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBkaXJlY3RseSBpZiBhIGJldHRlcgorCSAqIGltcGxlbWVudGF0aW9uIGlzIHBvc3NpYmxlLgorCSAqCisJICogQHBhcmFtIHByZWZpeCBzdHJpbmcgdGhhdCBuYW1lcyBvZiByZWZzIHNob3VsZCBzdGFydCB3aXRoOyBtYXkgYmUKKwkgKiAgICAgICAgICAgICBlbXB0eSAodG8gcmV0dXJuIGFsbCByZWZzKS4KKwkgKiBAcmV0dXJuIGltbXV0YWJsZSBsaXN0IG9mIHJlZnMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCB7QGNvZGUgcHJlZml4fS4KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHNwYWNlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJQE5vbk51bGwKKwlwdWJsaWMgTGlzdDxSZWY+IGdldFJlZnNCeVByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBSZWY+IGNvYXJzZVJlZnM7CisJCWludCBsYXN0U2xhc2ggPSBwcmVmaXgubGFzdEluZGV4T2YoJy8nKTsKKwkJaWYgKGxhc3RTbGFzaCA9PSAtMSkgeworCQkJY29hcnNlUmVmcyA9IGdldFJlZnMoQUxMKTsKKwkJfSBlbHNlIHsKKwkJCWNvYXJzZVJlZnMgPSBnZXRSZWZzKHByZWZpeC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoICsgMSkpOworCQl9CisKKwkJTGlzdDxSZWY+IHJlc3VsdDsKKwkJaWYgKGxhc3RTbGFzaCArIDEgPT0gcHJlZml4Lmxlbmd0aCgpKSB7CisJCQlyZXN1bHQgPSBjb2Fyc2VSZWZzLnZhbHVlcygpLnN0cmVhbSgpLmNvbGxlY3QodG9MaXN0KCkpOworCQl9IGVsc2UgeworCQkJU3RyaW5nIHAgPSBwcmVmaXguc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOworCQkJcmVzdWx0ID0gY29hcnNlUmVmcy5lbnRyeVNldCgpLnN0cmVhbSgpCisJCQkJCS5maWx0ZXIoZSAtPiBlLmdldEtleSgpLnN0YXJ0c1dpdGgocCkpCisJCQkJCS5tYXAoZSAtPiBlLmdldFZhbHVlKCkpCisJCQkJCS5jb2xsZWN0KHRvTGlzdCgpKTsKKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQpOworCX0KKworCS8qKgorCSAqIENoZWNrIGlmIGFueSByZWZzIGV4aXN0IGluIHRoZSByZWYgZGF0YWJhc2UuCisJICogPHA+CisJICogVGhpcyB1c2VzIHRoZSBzYW1lIGRlZmluaXRpb24gb2YgcmVmcyBhcyB7QGxpbmsgI2dldFJlZnMoKX0uIEluCisJICogcGFydGljdWxhciwgcmV0dXJucyB7QGNvZGUgZmFsc2V9IGluIGEgbmV3IHJlcG9zaXRvcnkgd2l0aCBubyByZWZzCisJICogdW5kZXIge0Bjb2RlIHJlZnMvfSBhbmQge0Bjb2RlIEhFQUR9IHBvaW50aW5nIHRvIGEgYnJhbmNoIHlldCB0byBiZQorCSAqIGJvcm4sIGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpbiBhIHJlcG9zaXRvcnkgd2l0aCBubyByZWZzIHVuZGVyCisJICoge0Bjb2RlIHJlZnMvfSBhbmQgYSBkZXRhY2hlZCB7QGNvZGUgSEVBRH0gcG9pbnRpbmcgdG8gaGlzdG9yeS4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YWJhc2UgaGFzIHJlZnMuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBzcGFjZSBjYW5ub3QgYmUgYWNjZXNzZWQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1JlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gIWdldFJlZnMoKS5pc0VtcHR5KCk7CisJfQorCisJLyoqCiAJICogR2V0IHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZS1saWtlIGVudGl0aWVzIGZyb20gdGhlIHJlcG9zaXRvcnkuCiAJICogPHA+CiAJICogVGhlIHJlc3VsdCBsaXN0IGluY2x1ZGVzIG5vbi1yZWYgaXRlbXMgc3VjaCBhcyBNRVJHRV9IRUFEIGFuZAogCSAqIEZFVENIX1JFU1VMVCBjYXN0IHRvIGJlIHJlZnMuIFRoZSBuYW1lcyBvZiB0aGVzZSByZWZzIGFyZSBub3QgcmV0dXJuZWQgYnkKLQkgKiA8Y29kZT5nZXRSZWZzKEFMTCk8L2NvZGU+IGJ1dCBhcmUgYWNjZXB0ZWQgYnkge0BsaW5rICNnZXRSZWYoU3RyaW5nKX0KKwkgKiA8Y29kZT5nZXRSZWZzKCk8L2NvZGU+IGJ1dCBhcmUgYWNjZXB0ZWQgYnkge0BsaW5rICNnZXRSZWYoU3RyaW5nKX0KIAkgKiBhbmQge0BsaW5rICNleGFjdFJlZihTdHJpbmcpfS4KIAkgKgogCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFkZGl0aW9uYWwgcmVmcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmUmVuYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YQppbmRleCAzZDIyYmIwLi5hMDVkYWEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCSAqIEBwYXJhbSBkc3QKIAkgKiAgICAgICAgICAgIG9wZXJhdGlvbiB0byBjcmVhdGUgKG9yIG92ZXJ3cml0ZSkgdGhlIGRlc3RpbmF0aW9uLgogCSAqLwotCXByb3RlY3RlZCBSZWZSZW5hbWUoZmluYWwgUmVmVXBkYXRlIHNyYywgZmluYWwgUmVmVXBkYXRlIGRzdCkgeworCXByb3RlY3RlZCBSZWZSZW5hbWUoUmVmVXBkYXRlIHNyYywgUmVmVXBkYXRlIGRzdCkgewogCQlzb3VyY2UgPSBzcmM7CiAJCWRlc3RpbmF0aW9uID0gZHN0OwogCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgcmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCWRlc3RpbmF0aW9uLnNldFJlZkxvZ0lkZW50KHBpKTsKIAl9CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogCSAqIEBwYXJhbSBtc2cKIAkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGRlc2NyaWJlIHRoaXMgY2hhbmdlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoZmluYWwgU3RyaW5nIG1zZykgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoU3RyaW5nIG1zZykgewogCQlpZiAobXNnID09IG51bGwpCiAJCQlkaXNhYmxlUmVmTG9nKCk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEKaW5kZXggMDZhNzU3Ni4uNWNkNTkzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEKQEAgLTIyNyw3ICsyMjcsNyBAQAogCSAqIEBwYXJhbSByZWYKIAkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCiAJICovCi0JcHJvdGVjdGVkIFJlZlVwZGF0ZShmaW5hbCBSZWYgcmVmKSB7CisJcHJvdGVjdGVkIFJlZlVwZGF0ZShSZWYgcmVmKSB7CiAJCXRoaXMucmVmID0gcmVmOwogCQlvbGRWYWx1ZSA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQlyZWZMb2dNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKQEAgLTM1MCw3ICszNTAsNyBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldE5ld09iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJCW5ld1ZhbHVlID0gaWQuY29weSgpOwogCX0KIApAQCAtMzc3LDcgKzM3Nyw3IEBACiAJICogICAgICAgICAgICBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkI3plcm9JZCgpfSB0byBpbmRpY2F0ZQogCSAqICAgICAgICAgICAgZXhwZWN0YXRpb24gb2YgYSBub24tZXhpc3RhbnQgcmVmLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGVjdGVkT2xkT2JqZWN0SWQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZE9sZE9iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJCWV4cFZhbHVlID0gaWQgIT0gbnVsbCA/IGlkLnRvT2JqZWN0SWQoKSA6IG51bGw7CiAJfQogCkBAIC0zOTYsNyArMzk2LDcgQEAKIAkgKiBAcGFyYW0gYgogCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIHVwZGF0ZSBzaG91bGQgaWdub3JlIG1lcmdlIHRlc3RzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmNlVXBkYXRlKGZpbmFsIGJvb2xlYW4gYikgeworCXB1YmxpYyB2b2lkIHNldEZvcmNlVXBkYXRlKGJvb2xlYW4gYikgewogCQlmb3JjZSA9IGI7CiAJfQogCkBAIC00MjEsNyArNDIxLDcgQEAKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgcmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCXJlZkxvZ0lkZW50ID0gcGk7CiAJfQogCkBAIC00NjEsNyArNDYxLDcgQEAKIAkgKiAgICAgICAgICAgIGZvcmNlZC11cGRhdGUpIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGUgdXNlciBzdXBwbGllZAogCSAqICAgICAgICAgICAgbWVzc2FnZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZMb2dNZXNzYWdlKGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIGJvb2xlYW4gYXBwZW5kU3RhdHVzKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nTWVzc2FnZShTdHJpbmcgbXNnLCBib29sZWFuIGFwcGVuZFN0YXR1cykgewogCQlpZiAobXNnID09IG51bGwgJiYgIWFwcGVuZFN0YXR1cykKIAkJCWRpc2FibGVSZWZMb2coKTsKIAkJZWxzZSBpZiAobXNnID09IG51bGwgJiYgYXBwZW5kU3RhdHVzKSB7CkBAIC02MTUsNyArNjE1LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiB1bmV4cGVjdGVkIElPIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgY2hhbmdlcy4KIAkgKi8KLQlwdWJsaWMgUmVzdWx0IHVwZGF0ZShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlc3VsdCB1cGRhdGUoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXF1aXJlQ2FuRG9VcGRhdGUoKTsKIAkJdHJ5IHsKIAkJCXJldHVybiByZXN1bHQgPSB1cGRhdGVJbXBsKHdhbGssIG5ldyBTdG9yZSgpIHsKQEAgLTY1OSw3ICs2NTksNyBAQAogCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBzdGF0dXMgb2YgdGhlIGRlbGV0ZS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmVzdWx0IGRlbGV0ZShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlc3VsdCBkZWxldGUoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbXlOYW1lID0gZGV0YWNoaW5nU3ltYm9saWNSZWYKIAkJCQk/IGdldFJlZigpLmdldE5hbWUoKQogCQkJCTogZ2V0UmVmKCkuZ2V0TGVhZigpLmdldE5hbWUoKTsKQEAgLTczMSw3ICs3MzEsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXN1bHQgdXBkYXRlSW1wbChmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIFN0b3JlIHN0b3JlKQorCXByaXZhdGUgUmVzdWx0IHVwZGF0ZUltcGwoUmV2V2FsayB3YWxrLCBTdG9yZSBzdG9yZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCBuZXdPYmo7CiAJCVJldk9iamVjdCBvbGRPYmo7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhCmluZGV4IDkwYTAzNTAuLjcxZWU5NjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlwdWJsaWMgdm9pZCB3cml0ZUluZm9SZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAJCWZpbmFsIGNoYXJbXSB0bXAgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhyLmdldE5hbWUoKSkpIHsKIAkJCQkvLyBIaXN0b3JpY2FsbHkgSEVBRCBoYXMgbmV2ZXIgYmVlbiBwdWJsaXNoZWQgdGhyb3VnaAogCQkJCS8vIHRoZSBJTkZPX1JFRlMgZmlsZS4gVGhpcyBpcyBhIG1pc3Rha2UsIGJ1dCBpdHMgdGhlCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkgKi8KIAlwdWJsaWMgdm9pZCB3cml0ZVBhY2tlZFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlib29sZWFuIHBlZWxlZCA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJaWYgKHIuZ2V0U3RvcmFnZSgpLmlzUGFja2VkKCkgJiYgci5pc1BlZWxlZCgpKSB7CiAJCQkJcGVlbGVkID0gdHJ1ZTsKIAkJCQlicmVhazsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQl9CiAKIAkJZmluYWwgY2hhcltdIHRtcCA9IG5ldyBjaGFyW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSF07Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlpZiAoci5nZXRTdG9yYWdlKCkgIT0gUmVmLlN0b3JhZ2UuUEFDS0VEKQogCQkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5LmphdmEKaW5kZXggZGI1Y2FkMC4uMjljYzE5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnkuamF2YQpAQCAtMTY0LDcgKzE2NCw3IEBACiAJICogQHBhcmFtIG9wdGlvbnMKIAkgKiAgICAgICAgICAgIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSByZXBvc2l0b3J5LgogCSAqLwotCXByb3RlY3RlZCBSZXBvc2l0b3J5KGZpbmFsIEJhc2VSZXBvc2l0b3J5QnVpbGRlciBvcHRpb25zKSB7CisJcHJvdGVjdGVkIFJlcG9zaXRvcnkoQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHsKIAkJZ2l0RGlyID0gb3B0aW9ucy5nZXRHaXREaXIoKTsKIAkJZnMgPSBvcHRpb25zLmdldEZTKCk7CiAJCXdvcmtUcmVlID0gb3B0aW9ucy5nZXRXb3JrVHJlZSgpOwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdG9yZSBjYW5ub3QgYmUgYWNjZXNzZWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpCisJcHVibGljIE9iamVjdExvYWRlciBvcGVuKEFueU9iamVjdElkIG9iamVjdElkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldE9iamVjdERhdGFiYXNlKCkub3BlbihvYmplY3RJZCk7CiAJfQpAQCAtMzkyLDcgKzM5Miw3IEBACiAJICogICAgICAgICAgICAgdG8gdGhlIGJhc2UgcmVmLCBhcyB0aGUgc3ltYm9saWMgcmVmIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJlZlVwZGF0ZSB1cGRhdGVSZWYoZmluYWwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gdXBkYXRlUmVmKHJlZiwgZmFsc2UpOwogCX0KIApAQCAtNDExLDcgKzQxMSw3IEBACiAJICogICAgICAgICAgICAgdG8gdGhlIGJhc2UgcmVmLCBhcyB0aGUgc3ltYm9saWMgcmVmIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJlZlVwZGF0ZSB1cGRhdGVSZWYoZmluYWwgU3RyaW5nIHJlZiwgZmluYWwgYm9vbGVhbiBkZXRhY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlZlVwZGF0ZSB1cGRhdGVSZWYoU3RyaW5nIHJlZiwgYm9vbGVhbiBkZXRhY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZWZEYXRhYmFzZSgpLm5ld1VwZGF0ZShyZWYsIGRldGFjaCk7CiAJfQogCkBAIC00MjcsNyArNDI3LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgcmVuYW1lIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmUmVuYW1lIHJlbmFtZVJlZihmaW5hbCBTdHJpbmcgZnJvbVJlZiwgZmluYWwgU3RyaW5nIHRvUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWZSZW5hbWUgcmVuYW1lUmVmKFN0cmluZyBmcm9tUmVmLCBTdHJpbmcgdG9SZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZWZEYXRhYmFzZSgpLm5ld1JlbmFtZShmcm9tUmVmLCB0b1JlZik7CiAJfQogCkBAIC00ODIsMTMgKzQ4MiwxMyBAQAogCSAqICAgICAgICAgICAgIG9uIHNlcmlvdXMgZXJyb3JzCiAJICovCiAJQE51bGxhYmxlCi0JcHVibGljIE9iamVjdElkIHJlc29sdmUoZmluYWwgU3RyaW5nIHJldnN0cikKKwlwdWJsaWMgT2JqZWN0SWQgcmVzb2x2ZShTdHJpbmcgcmV2c3RyKQogCQkJdGhyb3dzIEFtYmlndW91c09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCVJldmlzaW9uU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRoaXMpKSB7CiAJCQlPYmplY3QgcmVzb2x2ZWQgPSByZXNvbHZlKHJ3LCByZXZzdHIpOwogCQkJaWYgKHJlc29sdmVkIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJZmluYWwgUmVmIHJlZiA9IGdldFJlZigoU3RyaW5nKXJlc29sdmVkKTsKKwkJCQlmaW5hbCBSZWYgcmVmID0gZmluZFJlZigoU3RyaW5nKSByZXNvbHZlZCk7CiAJCQkJcmV0dXJuIHJlZiAhPSBudWxsID8gcmVmLmdldExlYWYoKS5nZXRPYmplY3RJZCgpIDogbnVsbDsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIChPYmplY3RJZCkgcmVzb2x2ZWQ7CkBAIC01MDksNyArNTA5LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgU3RyaW5nIHNpbXBsaWZ5KGZpbmFsIFN0cmluZyByZXZzdHIpCisJcHVibGljIFN0cmluZyBzaW1wbGlmeShTdHJpbmcgcmV2c3RyKQogCQkJdGhyb3dzIEFtYmlndW91c09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2Fsayh0aGlzKSkgewogCQkJT2JqZWN0IHJlc29sdmVkID0gcmVzb2x2ZShydywgcmV2c3RyKTsKQEAgLTUyMyw3ICs1MjMsNyBAQAogCX0KIAogCUBOdWxsYWJsZQotCXByaXZhdGUgT2JqZWN0IHJlc29sdmUoZmluYWwgUmV2V2FsayBydywgZmluYWwgU3RyaW5nIHJldnN0cikKKwlwcml2YXRlIE9iamVjdCByZXNvbHZlKFJldldhbGsgcncsIFN0cmluZyByZXZzdHIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljaGFyW10gcmV2Q2hhcnMgPSByZXZzdHIudG9DaGFyQXJyYXkoKTsKIAkJUmV2T2JqZWN0IHJldiA9IG51bGw7CkBAIC02ODgsNiArNjg4LDggQEAKIAkJCWNhc2UgJ0AnOgogCQkJCWlmIChyZXYgIT0gbnVsbCkKIAkJCQkJdGhyb3cgbmV3IFJldmlzaW9uU3ludGF4RXhjZXB0aW9uKHJldnN0cik7CisJCQkJaWYgKGkgKyAxID09IHJldkNoYXJzLmxlbmd0aCkKKwkJCQkJY29udGludWU7CiAJCQkJaWYgKGkgKyAxIDwgcmV2Q2hhcnMubGVuZ3RoICYmIHJldkNoYXJzW2kgKyAxXSAhPSAneycpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWludCBtOwpAQCAtNzExLDcgKzcxMyw3IEBACiAJCQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRSZWZOYW1lLAogCQkJCQkJCQkJCQluYW1lKSwKIAkJCQkJCQkJCXJldnN0cik7Ci0JCQkJCQlSZWYgcmVmID0gZ2V0UmVmKG5hbWUpOworCQkJCQkJUmVmIHJlZiA9IGZpbmRSZWYobmFtZSk7CiAJCQkJCQluYW1lID0gbnVsbDsKIAkJCQkJCWlmIChyZWYgPT0gbnVsbCkKIAkJCQkJCQlyZXR1cm4gbnVsbDsKQEAgLTc2NCw3ICs3NjYsNyBAQAogCQkJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkUmVmTmFtZSwKIAkJCQkJCQkJCQkJbmFtZSksCiAJCQkJCQkJCQlyZXZzdHIpOwotCQkJCQkJUmVmIHJlZiA9IGdldFJlZihuYW1lKTsKKwkJCQkJCVJlZiByZWYgPSBmaW5kUmVmKG5hbWUpOwogCQkJCQkJbmFtZSA9IG51bGw7CiAJCQkJCQlpZiAocmVmID09IG51bGwpCiAJCQkJCQkJcmV0dXJuIG51bGw7CkBAIC04MTUsNyArODE3LDcgQEAKIAkJCXRocm93IG5ldyBSZXZpc2lvblN5bnRheEV4Y2VwdGlvbigKIAkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZk5hbWUsIG5hbWUpLAogCQkJCQlyZXZzdHIpOwotCQlpZiAoZ2V0UmVmKG5hbWUpICE9IG51bGwpCisJCWlmIChmaW5kUmVmKG5hbWUpICE9IG51bGwpCiAJCQlyZXR1cm4gbmFtZTsKIAkJcmV0dXJuIHJlc29sdmVTaW1wbGUobmFtZSk7CiAJfQpAQCAtODQxLDcgKzg0Myw3IEBACiAJfQogCiAJQE51bGxhYmxlCi0JcHJpdmF0ZSBPYmplY3RJZCByZXNvbHZlU2ltcGxlKGZpbmFsIFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBPYmplY3RJZCByZXNvbHZlU2ltcGxlKFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChPYmplY3RJZC5pc0lkKHJldnN0cikpCiAJCQlyZXR1cm4gT2JqZWN0SWQuZnJvbVN0cmluZyhyZXZzdHIpOwogCkBAIC05MTEsNyArOTEzLDcgQEAKIAl9CiAKIAlATnVsbGFibGUKLQlwcml2YXRlIE9iamVjdElkIHJlc29sdmVBYmJyZXZpYXRpb24oZmluYWwgU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgT2JqZWN0SWQgcmVzb2x2ZUFiYnJldmlhdGlvbihTdHJpbmcgcmV2c3RyKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24gewogCQlBYmJyZXZpYXRlZE9iamVjdElkIGlkID0gQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tU3RyaW5nKHJldnN0cik7CiAJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IG5ld09iamVjdFJlYWRlcigpKSB7CkBAIC0xMDU5LDI0ICsxMDYxLDYgQEAKIAkgKiBHZXQgYSByZWYgYnkgbmFtZS4KIAkgKgogCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVmIHRvIGxvb2t1cC4gTWF5IGJlIGEgc2hvcnQtaGFuZCBmb3JtLCBlLmcuCi0JICogICAgICAgICAgICAibWFzdGVyIiB3aGljaCBpcyBpcyBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIHRvCi0JICogICAgICAgICAgICAicmVmcy9oZWFkcy9tYXN0ZXIiIGlmICJyZWZzL2hlYWRzL21hc3RlciIgYWxyZWFkeSBleGlzdHMuCi0JICogQHJldHVybiB0aGUgUmVmIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIHtAY29kZSBudWxsfSBpZiBpdCBkb2VzIG5vdCBleGlzdAotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2V4YWN0UmVmKFN0cmluZyl9IG9yIHtAbGluayAjZmluZFJlZihTdHJpbmcpfQotCSAqIGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlATnVsbGFibGUKLQlwdWJsaWMgUmVmIGdldFJlZihmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbmRSZWYobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgcmVmIGJ5IG5hbWUuCi0JICoKLQkgKiBAcGFyYW0gbmFtZQogCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlZiB0byBsb29rdXAuIE11c3Qgbm90IGJlIGEgc2hvcnQtaGFuZAogCSAqICAgICAgICAgICAgZm9ybTsgZS5nLiwgIm1hc3RlciIgaXMgbm90IGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgdG8KIAkgKiAgICAgICAgICAgICJyZWZzL2hlYWRzL21hc3RlciIuCkBAIC0xMDg1LDcgKzEwNjksNyBAQAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgUmVmIGV4YWN0UmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBmaW5hbCBSZWYgZXhhY3RSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZWZEYXRhYmFzZSgpLmV4YWN0UmVmKG5hbWUpOwogCX0KIApAQCAtMTEwMSw3ICsxMDg1LDcgQEAKIAkgKiBAc2luY2UgNC4yCiAJICovCiAJQE51bGxhYmxlCi0JcHVibGljIFJlZiBmaW5kUmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBmaW5hbCBSZWYgZmluZFJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmKG5hbWUpOwogCX0KIApAQCAtMTEyNiw3ICsxMTEwLDkgQEAKIAkgKiBAcmV0dXJuIG11dGFibGUgbWFwIG9mIGFsbCB0YWdzOyBrZXkgaXMgc2hvcnQgdGFnIG5hbWUgKCJ2MS4wIikgYW5kIHZhbHVlCiAJICogICAgICAgICBvZiB0aGUgZW50cnkgY29udGFpbnMgdGhlIHJlZiB3aXRoIHRoZSBmdWxsIHRhZyBuYW1lCiAJICogICAgICAgICAoInJlZnMvdGFncy92MS4wIikuCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBnZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChSX1RBR1MpfSBpbnN0ZWFkCiAJICovCisJQERlcHJlY2F0ZWQKIAlATm9uTnVsbAogCXB1YmxpYyBNYXA8U3RyaW5nLCBSZWY+IGdldFRhZ3MoKSB7CiAJCXRyeSB7CkBAIC0xMTQ5LDkgKzExMzUsMTEgQEAKIAkgKiAgICAgICAgIG5ldyBSZWYgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2FtZSBkYXRhIGFzIFJlZiwgYnV0IGlzUGVlbGVkKCkKIAkgKiAgICAgICAgIHdpbGwgYmUgdHJ1ZSBhbmQgZ2V0UGVlbGVkT2JqZWN0SWQgd2lsbCBjb250YWluIHRoZSBwZWVsZWQgb2JqZWN0CiAJICogICAgICAgICAob3IgbnVsbCkuCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBnZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKX0gaW5zdGVhZC4KIAkgKi8KKwlARGVwcmVjYXRlZAogCUBOb25OdWxsCi0JcHVibGljIFJlZiBwZWVsKGZpbmFsIFJlZiByZWYpIHsKKwlwdWJsaWMgUmVmIHBlZWwoUmVmIHJlZikgewogCQl0cnkgewogCQkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0xMjg1LDcgKzEyNzMsNyBAQAogCQlJbmRleENoYW5nZWRMaXN0ZW5lciBsID0gbmV3IEluZGV4Q2hhbmdlZExpc3RlbmVyKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCBvbkluZGV4Q2hhbmdlZChJbmRleENoYW5nZWRFdmVudCBldmVudCkgewotCQkJCW5vdGlmeUluZGV4Q2hhbmdlZCgpOworCQkJCW5vdGlmeUluZGV4Q2hhbmdlZCh0cnVlKTsKIAkJCX0KIAkJfTsKIAkJcmV0dXJuIERpckNhY2hlLmxvY2sodGhpcywgbCk7CkBAIC0xMzc4LDcgKzEzNjYsNyBAQAogCSAqIEBwYXJhbSByZWZOYW1lIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgcmVmTmFtZSBpcyBhIHZhbGlkIHJlZiBuYW1lCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZOYW1lKGZpbmFsIFN0cmluZyByZWZOYW1lKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZOYW1lKFN0cmluZyByZWZOYW1lKSB7CiAJCWZpbmFsIGludCBsZW4gPSByZWZOYW1lLmxlbmd0aCgpOwogCQlpZiAobGVuID09IDApIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE1ODAsMTYgKzE1NjgsMjIgQEAKIAl9CiAKIAkvKioKLQkgKiBGb3JjZSBhIHNjYW4gZm9yIGNoYW5nZWQgcmVmcy4KKwkgKiBGb3JjZSBhIHNjYW4gZm9yIGNoYW5nZWQgcmVmcy4gRmlyZXMgYW4gSW5kZXhDaGFuZ2VkRXZlbnQoZmFsc2UpIGlmCisJICogY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCiAJICoKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2FuRm9yUmVwb0NoYW5nZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKIAkvKioKLQkgKiBOb3RpZnkgdGhhdCB0aGUgaW5kZXggY2hhbmdlZAorCSAqIE5vdGlmeSB0aGF0IHRoZSBpbmRleCBjaGFuZ2VkIGJ5IGZpcmluZyBhbiBJbmRleENoYW5nZWRFdmVudC4KKwkgKgorCSAqIEBwYXJhbSBpbnRlcm5hbAorCSAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBpbmRleCB3YXMgY2hhbmdlZCBieSB0aGUgc2FtZQorCSAqICAgICAgICAgICAgICAgICAgICAgSkdpdCBwcm9jZXNzCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpOworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZChib29sZWFuIGludGVybmFsKTsKIAogCS8qKgogCSAqIEdldCBhIHNob3J0ZW5lZCBtb3JlIHVzZXIgZnJpZW5kbHkgcmVmIG5hbWUKQEAgLTE5NjgsMTEgKzE5NjIsOCBAQAogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlQ29tbWl0TXNnKEZpbGUgbXNnRmlsZSwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1zZ0ZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtc2dGaWxlKSkgewogCQkJCWZvcy53cml0ZShtc2cuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCUZpbGVVdGlscy5kZWxldGUobXNnRmlsZSwgRmlsZVV0aWxzLlNLSVBfTUlTU0lORyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhCmluZGV4IGNlN2NlOGMuLjQwMDM0MmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGUuamF2YQpAQCAtODgsNyArODgsNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlcmUgaXMgbm8gcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgS2V5IGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oS2V5IGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhdGlvbiwgdHJ1ZSk7CiAJfQpAQCAtMTE1LDcgKzExNSw3IEBACiAJICogICAgICAgICAgICAgVGhlcmUgaXMgbm8gcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24sIG9ubHkgdGhyb3duIGlmCiAJICogICAgICAgICAgICAge0Bjb2RlIG11c3RFeGlzdH0gaXMgdHJ1ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgb3BlbihmaW5hbCBLZXkgbG9jYXRpb24sIGZpbmFsIGJvb2xlYW4gbXVzdEV4aXN0KQorCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBvcGVuKEtleSBsb2NhdGlvbiwgYm9vbGVhbiBtdXN0RXhpc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gY2FjaGUub3BlblJlcG9zaXRvcnkobG9jYXRpb24sIG11c3RFeGlzdCk7CiAJfQpAQCAtMTM1LDcgKzEzNSw3IEBACiAJICogQHBhcmFtIGRiCiAJICogICAgICAgICAgICByZXBvc2l0b3J5IHRvIHJlZ2lzdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKFJlcG9zaXRvcnkgZGIpIHsKIAkJaWYgKGRiLmdldERpcmVjdG9yeSgpICE9IG51bGwpIHsKIAkJCUZpbGVLZXkga2V5ID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CiAJCQljYWNoZS5yZWdpc3RlclJlcG9zaXRvcnkoa2V5LCBkYik7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgdG8gdW5yZWdpc3Rlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoQE5vbk51bGwgZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShATm9uTnVsbCBSZXBvc2l0b3J5IGRiKSB7CiAJCWlmIChkYi5nZXREaXJlY3RvcnkoKSAhPSBudWxsKSB7CiAJCQlGaWxlS2V5IGtleSA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOwogCQkJY2FjaGUudW5yZWdpc3RlckFuZENsb3NlUmVwb3NpdG9yeShrZXkpOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJICogICAgICAgICAgICByZXBvc2l0b3J5IHRvIHVucmVnaXN0ZXIuCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgdW5yZWdpc3RlcihSZXBvc2l0b3J5IGRiKSB7CiAJCWlmIChkYi5nZXREaXJlY3RvcnkoKSAhPSBudWxsKSB7CiAJCQl1bnJlZ2lzdGVyKEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpKTsKIAkJfQpAQCAtMjg3LDEzICsyODcsMTMgQEAKIAkJcmV0dXJuIGRiOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWdpc3RlclJlcG9zaXRvcnkoZmluYWwgS2V5IGxvY2F0aW9uLCBmaW5hbCBSZXBvc2l0b3J5IGRiKSB7Ci0JCVJlcG9zaXRvcnkgb2xkRGIgPSBjYWNoZU1hcC5wdXQobG9jYXRpb24sIGRiKTsKLQkJaWYgKG9sZERiICE9IG51bGwpCi0JCQlvbGREYi5jbG9zZSgpOworCXByaXZhdGUgdm9pZCByZWdpc3RlclJlcG9zaXRvcnkoS2V5IGxvY2F0aW9uLCBSZXBvc2l0b3J5IGRiKSB7CisJCXRyeSAoUmVwb3NpdG9yeSBvbGREYiA9IGNhY2hlTWFwLnB1dChsb2NhdGlvbiwgZGIpKSB7CisJCQkvLyBvbGREYiBpcyBhdXRvLWNsb3NlZAorCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXBvc2l0b3J5IHVucmVnaXN0ZXJSZXBvc2l0b3J5KGZpbmFsIEtleSBsb2NhdGlvbikgeworCXByaXZhdGUgUmVwb3NpdG9yeSB1bnJlZ2lzdGVyUmVwb3NpdG9yeShLZXkgbG9jYXRpb24pIHsKIAkJcmV0dXJuIGNhY2hlTWFwLnJlbW92ZShsb2NhdGlvbik7CiAJfQogCkBAIC0zMDIsNyArMzAyLDcgQEAKIAkJCSYmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGRiLmNsb3NlZEF0LmdldCgpID4gZXhwaXJlQWZ0ZXIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyQW5kQ2xvc2VSZXBvc2l0b3J5KGZpbmFsIEtleSBsb2NhdGlvbikgeworCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyQW5kQ2xvc2VSZXBvc2l0b3J5KEtleSBsb2NhdGlvbikgewogCQlzeW5jaHJvbml6ZWQgKGxvY2tGb3IobG9jYXRpb24pKSB7CiAJCQlSZXBvc2l0b3J5IG9sZERiID0gdW5yZWdpc3RlclJlcG9zaXRvcnkobG9jYXRpb24pOwogCQkJaWYgKG9sZERiICE9IG51bGwpIHsKQEAgLTMyOSw3ICszMjksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBMb2NrIGxvY2tGb3IoZmluYWwgS2V5IGxvY2F0aW9uKSB7CisJcHJpdmF0ZSBMb2NrIGxvY2tGb3IoS2V5IGxvY2F0aW9uKSB7CiAJCXJldHVybiBvcGVuTG9ja3NbKGxvY2F0aW9uLmhhc2hDb2RlKCkgPj4+IDEpICUgb3BlbkxvY2tzLmxlbmd0aF07CiAJfQogCkBAIC0zODMsNyArMzgzLDcgQEAKIAkJICogQHJldHVybiBhIGtleSBmb3IgdGhlIGdpdmVuIGRpcmVjdG9yeS4KIAkJICogQHNlZSAjbGVuaWVudChGaWxlLCBGUykKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgRmlsZUtleSBleGFjdChmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKKwkJcHVibGljIHN0YXRpYyBGaWxlS2V5IGV4YWN0KEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgewogCQkJcmV0dXJuIG5ldyBGaWxlS2V5KGRpcmVjdG9yeSwgZnMpOwogCQl9CiAKQEAgLTQwNiw3ICs0MDYsNyBAQAogCQkgKiBAcmV0dXJuIGEga2V5IGZvciB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogCQkgKiBAc2VlICNleGFjdChGaWxlLCBGUykKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgRmlsZUtleSBsZW5pZW50KGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIEZpbGVLZXkgbGVuaWVudChGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJCWZpbmFsIEZpbGUgZ2l0ZGlyID0gcmVzb2x2ZShkaXJlY3RvcnksIGZzKTsKIAkJCXJldHVybiBuZXcgRmlsZUtleShnaXRkaXIgIT0gbnVsbCA/IGdpdGRpciA6IGRpcmVjdG9yeSwgZnMpOwogCQl9CkBAIC00MjEsMTIgKzQyMSwxMiBAQAogCQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0bwogCQkgKiAgICAgICAgICAgIHBlcmZvcm0gY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgogCQkgKi8KLQkJcHJvdGVjdGVkIEZpbGVLZXkoZmluYWwgRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CisJCXByb3RlY3RlZCBGaWxlS2V5KEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgewogCQkJcGF0aCA9IGNhbm9uaWNhbChkaXJlY3RvcnkpOwogCQkJdGhpcy5mcyA9IGZzOwogCQl9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgRmlsZSBjYW5vbmljYWwoZmluYWwgRmlsZSBwYXRoKSB7CisJCXByaXZhdGUgc3RhdGljIEZpbGUgY2Fub25pY2FsKEZpbGUgcGF0aCkgewogCQkJdHJ5IHsKIAkJCQlyZXR1cm4gcGF0aC5nZXRDYW5vbmljYWxGaWxlKCk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC00NDAsNyArNDQwLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIGJvb2xlYW4gbXVzdEV4aXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKGJvb2xlYW4gbXVzdEV4aXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaWYgKG11c3RFeGlzdCAmJiAhaXNHaXRSZXBvc2l0b3J5KHBhdGgsIGZzKSkKIAkJCQl0aHJvdyBuZXcgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKHBhdGgpOwogCQkJcmV0dXJuIG5ldyBGaWxlUmVwb3NpdG9yeShwYXRoKTsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCXJldHVybiBvIGluc3RhbmNlb2YgRmlsZUtleSAmJiBwYXRoLmVxdWFscygoKEZpbGVLZXkpIG8pLnBhdGgpOwogCQl9CiAKQEAgLTQ3NiwxOSArNDc2LDE5IEBACiAJCSAqICAgICAgICAgaXQgZG9lc24ndCBsb29rIGVub3VnaCBsaWtlIGEgR2l0IGRpcmVjdG9yeSB0byByZWFsbHkgYmUgYQogCQkgKiAgICAgICAgIEdpdCBkaXJlY3RvcnkuCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHaXRSZXBvc2l0b3J5KGZpbmFsIEZpbGUgZGlyLCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHaXRSZXBvc2l0b3J5KEZpbGUgZGlyLCBGUyBmcykgewogCQkJcmV0dXJuIGZzLnJlc29sdmUoZGlyLCAib2JqZWN0cyIpLmV4aXN0cygpIC8vJE5PTi1OTFMtMSQKIAkJCQkJJiYgZnMucmVzb2x2ZShkaXIsICJyZWZzIikuZXhpc3RzKCkgLy8kTk9OLU5MUy0xJAogCQkJCQkmJiBpc1ZhbGlkSGVhZChuZXcgRmlsZShkaXIsIENvbnN0YW50cy5IRUFEKSk7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRIZWFkKGZpbmFsIEZpbGUgaGVhZCkgeworCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRIZWFkKEZpbGUgaGVhZCkgewogCQkJZmluYWwgU3RyaW5nIHJlZiA9IHJlYWRGaXJzdExpbmUoaGVhZCk7CiAJCQlyZXR1cm4gcmVmICE9IG51bGwKIAkJCQkJJiYgKHJlZi5zdGFydHNXaXRoKCJyZWY6IHJlZnMvIikgfHwgT2JqZWN0SWQuaXNJZChyZWYpKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRGaXJzdExpbmUoZmluYWwgRmlsZSBoZWFkKSB7CisJCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkRmlyc3RMaW5lKEZpbGUgaGVhZCkgewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBieXRlW10gYnVmID0gSU8ucmVhZEZ1bGx5KGhlYWQsIDQwOTYpOwogCQkJCWludCBuID0gYnVmLmxlbmd0aDsKQEAgLTUyMSw3ICs1MjEsNyBAQAogCQkgKiBAcmV0dXJuIHRoZSBhY3R1YWwgZGlyZWN0b3J5IGxvY2F0aW9uIGlmIGEgYmV0dGVyIG1hdGNoIGlzIGZvdW5kOwogCQkgKiAgICAgICAgIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VpdGFibGUgbWF0Y2guCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb2x2ZShmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKKwkJcHVibGljIHN0YXRpYyBGaWxlIHJlc29sdmUoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlpZiAoaXNHaXRSZXBvc2l0b3J5KGRpcmVjdG9yeSwgZnMpKQogCQkJCXJldHVybiBkaXJlY3Rvcnk7CiAJCQlpZiAoaXNHaXRSZXBvc2l0b3J5KG5ldyBGaWxlKGRpcmVjdG9yeSwgQ29uc3RhbnRzLkRPVF9HSVQpLCBmcykpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UYWdCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UYWdCdWlsZGVyLmphdmEKaW5kZXggMzJlZjUwNC4uYmQwMzE2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGFnQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RhZ0J1aWxkZXIuamF2YQpAQCAtMTY4LDcgKzE2OCw3IEBACiAJICogQHBhcmFtIG5ld01lc3NhZ2UKIAkgKiAgICAgICAgICAgIHRoZSB0YWcncyBtZXNzYWdlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG5ld01lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7CiAJCW1lc3NhZ2UgPSBuZXdNZXNzYWdlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGV4dFByb2dyZXNzTW9uaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGV4dFByb2dyZXNzTW9uaXRvci5qYXZhCmluZGV4IDkzNmNlM2QuLjJmNzU5ZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RleHRQcm9ncmVzc01vbml0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UZXh0UHJvZ3Jlc3NNb25pdG9yLmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKiBJbml0aWFsaXplIGEgbmV3IHByb2dyZXNzIG1vbml0b3IuCiAJICovCiAJcHVibGljIFRleHRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXRoaXMobmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLmVyciwgVVRGXzgpKSk7CisJCXRoaXMobmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLmVyciwgQ0hBUlNFVCkpKTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1VzZXJDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1VzZXJDb25maWcuamF2YQppbmRleCAxYTNjNmY2Li5iZmI1ZTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Vc2VyQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVXNlckNvbmZpZy5qYXZhCkBAIC03MSw3ICs3MSw3IEBACiAKIAlwcml2YXRlIGJvb2xlYW4gaXNDb21taXR0ZXJFbWFpbEltcGxpY2l0OwogCi0JcHJpdmF0ZSBVc2VyQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXByaXZhdGUgVXNlckNvbmZpZyhDb25maWcgcmMpIHsKIAkJYXV0aG9yTmFtZSA9IGdldE5hbWVJbnRlcm5hbChyYywgQ29uc3RhbnRzLkdJVF9BVVRIT1JfTkFNRV9LRVkpOwogCQlpZiAoYXV0aG9yTmFtZSA9PSBudWxsKSB7CiAJCQlhdXRob3JOYW1lID0gZ2V0RGVmYXVsdFVzZXJOYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlU3RyYXRlZ3kuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VTdHJhdGVneS5qYXZhCmluZGV4IDUyMGVhNmUuLjk4YTcwNmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VTdHJhdGVneS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VTdHJhdGVneS5qYXZhCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHN0cmF0ZWd5IGJ5IHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihmaW5hbCBNZXJnZVN0cmF0ZWd5IGltcCkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihNZXJnZVN0cmF0ZWd5IGltcCkgewogCQlyZWdpc3RlcihpbXAuZ2V0TmFtZSgpLCBpbXApOwogCX0KIApAQCAtMTI5LDcgKzEyOSw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBzdHJhdGVneSB0byBsb2NhdGUuCiAJICogQHJldHVybiB0aGUgc3RyYXRlZ3kgaW5zdGFuY2U7IG51bGwgaWYgbm8gc3RyYXRlZ3kgbWF0Y2hlcyB0aGUgbmFtZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNZXJnZVN0cmF0ZWd5IGdldChmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1lcmdlU3RyYXRlZ3kgZ2V0KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBTVFJBVEVHSUVTLmdldChuYW1lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlci5qYXZhCmluZGV4IGNkMTlkNjkuLjI1ZWIxYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXIuamF2YQpAQCAtMTEzLDcgKzExMyw3IEBACiAJICogQHBhcmFtIGxvY2FsCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGlzIG1lcmdlciB3aWxsIHJlYWQgYW5kIHdyaXRlIGRhdGEgb24uCiAJICovCi0JcHJvdGVjdGVkIE1lcmdlcihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsKSB7CisJcHJvdGVjdGVkIE1lcmdlcihSZXBvc2l0b3J5IGxvY2FsKSB7CiAJCWlmIChsb2NhbCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkucmVwb3NpdG9yeUlzUmVxdWlyZWQpOwogCQl9CkBAIC0yMTUsNyArMjE1LDcgQEAKIAkgKiAgICAgICAgICAgICBvbmUgb3IgbW9yZSBzb3VyY2VzIGNvdWxkIG5vdCBiZSByZWFkLCBvciBvdXRwdXRzIGNvdWxkIG5vdAogCSAqICAgICAgICAgICAgIGJlIHdyaXR0ZW4gdG8gdGhlIFJlcG9zaXRvcnkuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWVyZ2UoZmluYWwgQW55T2JqZWN0SWQuLi4gdGlwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBtZXJnZShBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbWVyZ2UodHJ1ZSwgdGlwcyk7CiAJfQogCkBAIC0yNDMsNyArMjQzLDcgQEAKIAkgKiAgICAgICAgICAgICBvbmUgb3IgbW9yZSBzb3VyY2VzIGNvdWxkIG5vdCBiZSByZWFkLCBvciBvdXRwdXRzIGNvdWxkIG5vdAogCSAqICAgICAgICAgICAgIGJlIHdyaXR0ZW4gdG8gdGhlIFJlcG9zaXRvcnkuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWVyZ2UoZmluYWwgYm9vbGVhbiBmbHVzaCwgZmluYWwgQW55T2JqZWN0SWQuLi4gdGlwcykKKwlwdWJsaWMgYm9vbGVhbiBtZXJnZShib29sZWFuIGZsdXNoLCBBbnlPYmplY3RJZC4uLiB0aXBzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc291cmNlT2JqZWN0cyA9IG5ldyBSZXZPYmplY3RbdGlwcy5sZW5ndGhdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRpcHMubGVuZ3RoOyBpKyspCkBAIC0zMjgsNyArMzI4LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdHJlZSBvYmplY3QgaXMgbm90IGZvdW5kIG9yIGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvciBvcGVuVHJlZShmaW5hbCBBbnlPYmplY3RJZCB0cmVlSWQpCisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9wZW5UcmVlKEFueU9iamVjdElkIHRyZWVJZCkKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQ2Fub25pY2FsVHJlZVBhcnNlcihudWxsLCByZWFkZXIsIHRyZWVJZCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDZmN2E3MDIuLmRhNmEzZGEKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKQEAgLTUxNiw2MSArNTE2LDYgQEAKIAkgKiBAcGFyYW0gaWdub3JlQ29uZmxpY3RzCiAJICogICAgICAgICAgICBzZWUKIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIjbWVyZ2VUcmVlcyhBYnN0cmFjdFRyZWVJdGVyYXRvciwgUmV2VHJlZSwgUmV2VHJlZSwgYm9vbGVhbil9Ci0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG1lcmdlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBpbmRleCBlbnRyeQotCSAqICAgICAgICAgZGlkbid0IG1hdGNoIG91cnMgb3IgdGhlIHdvcmtpbmctZGlyIGZpbGUgd2FzIGRpcnR5IGFuZCBhCi0JICogICAgICAgICBjb25mbGljdCBvY2N1cnJlZAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAzLjUKLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCi0JCQlDYW5vbmljYWxUcmVlUGFyc2VyIG91cnMsIENhbm9uaWNhbFRyZWVQYXJzZXIgdGhlaXJzLAotCQkJRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGluZGV4LCBXb3JraW5nVHJlZUl0ZXJhdG9yIHdvcmssCi0JCQlib29sZWFuIGlnbm9yZUNvbmZsaWN0cykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCi0JCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwcm9jZXNzRW50cnkoYmFzZSwgb3VycywgdGhlaXJzLCBpbmRleCwgd29yaywgaWdub3JlQ29uZmxpY3RzLAotCQkJCW51bGwpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyBvbmUgcGF0aCBhbmQgdHJpZXMgdG8gbWVyZ2UgdGFraW5nIGdpdCBhdHRyaWJ1dGVzIGluIGFjY291bnQuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBkbyBhbGwgdHJpdmlhbCAobm90IGNvbnRlbnQpIG1lcmdlcyBhbmQgd2lsbCBhbHNvIGRldGVjdAotCSAqIGlmIGEgbWVyZ2Ugd2lsbCBmYWlsLiBUaGUgbWVyZ2Ugd2lsbCBmYWlsIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMKLQkgKiB0cnVlCi0JICogPHVsPgotCSAqIDxsaT50aGUgaW5kZXggZW50cnkgZG9lcyBub3QgbWF0Y2ggdGhlIGVudHJ5IGluIG91cnMuIFdoZW4gbWVyZ2luZyBvbmUKLQkgKiBicmFuY2ggaW50byB0aGUgY3VycmVudCBIRUFELCBvdXJzIHdpbGwgcG9pbnQgdG8gSEVBRCBhbmQgdGhlaXJzIHdpbGwKLQkgKiBwb2ludCB0byB0aGUgb3RoZXIgYnJhbmNoLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGluZGV4IG1hdGNoZXMgdGhlIEhFQUQKLQkgKiBiZWNhdXNlIGl0IHdpbGwgb25seSBub3QgbWF0Y2ggSEVBRCBpZiBpdCB3YXMgcG9wdWxhdGVkIGJlZm9yZSB0aGUgbWVyZ2UKLQkgKiBvcGVyYXRpb24uIEJ1dCB0aGUgbWVyZ2UgY29tbWl0IHNob3VsZCBub3QgYWNjaWRlbnRhbGx5IGNvbnRhaW4KLQkgKiBtb2RpZmljYXRpb25zIGRvbmUgYmVmb3JlIHRoZSBtZXJnZS4gQ2hlY2sgdGhlIDxhIGhyZWY9Ci0JICogImh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL2dpdC1yZWFkLXRyZWUuaHRtbCNfM193YXlfbWVyZ2UiCi0JICogPmdpdCByZWFkLXRyZWU8L2E+IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb25zLjwvbGk+Ci0JICogPGxpPkEgY29uZmxpY3Qgd2FzIGRldGVjdGVkIGFuZCB0aGUgd29ya2luZy10cmVlIGZpbGUgaXMgZGlydHkuIFdoZW4gYQotCSAqIGNvbmZsaWN0IGlzIGRldGVjdGVkIHRoZSBjb250ZW50LW1lcmdlIGFsZ29yaXRobSB3aWxsIHRyeSB0byB3cml0ZSBhCi0JICogbWVyZ2VkIHZlcnNpb24gaW50byB0aGUgd29ya2luZy10cmVlLiBJZiB0aGUgZmlsZSBpcyBkaXJ0eSB3ZSB3b3VsZAotCSAqIG92ZXJyaWRlIHVuc2F2ZWQgZGF0YS48L2xpPgotCSAqIDwvdWw+Ci0JICoKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgdGhlIGNvbW1vbiBiYXNlIGZvciBvdXJzIGFuZCB0aGVpcnMKLQkgKiBAcGFyYW0gb3VycwotCSAqICAgICAgICAgICAgdGhlIG91cnMgc2lkZSBvZiB0aGUgbWVyZ2UuIFdoZW4gbWVyZ2luZyBhIGJyYW5jaCBpbnRvIHRoZQotCSAqICAgICAgICAgICAgSEVBRCBvdXJzIHdpbGwgcG9pbnQgdG8gSEVBRAotCSAqIEBwYXJhbSB0aGVpcnMKLQkgKiAgICAgICAgICAgIHRoZSB0aGVpcnMgc2lkZSBvZiB0aGUgbWVyZ2UuIFdoZW4gbWVyZ2luZyBhIGJyYW5jaCBpbnRvIHRoZQotCSAqICAgICAgICAgICAgY3VycmVudCBIRUFEIHRoZWlycyB3aWxsIHBvaW50IHRvIHRoZSBicmFuY2ggd2hpY2ggaXMgbWVyZ2VkCi0JICogICAgICAgICAgICBpbnRvIEhFQUQuCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggZW50cnkKLQkgKiBAcGFyYW0gd29yawotCSAqICAgICAgICAgICAgdGhlIGZpbGUgaW4gdGhlIHdvcmtpbmcgdHJlZQotCSAqIEBwYXJhbSBpZ25vcmVDb25mbGljdHMKLQkgKiAgICAgICAgICAgIHNlZQotCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciNtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yLCBSZXZUcmVlLCBSZXZUcmVlLCBib29sZWFuKX0KIAkgKiBAcGFyYW0gYXR0cmlidXRlcwogCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbnRyeQogCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBtZXJnZSB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgaW5kZXggZW50cnkKQEAgLTEwNTAsMTEgKzk5NSwxMSBAQAogCQlyZXR1cm4gUmF3VGV4dC5sb2FkKGxvYWRlciwgdGhyZXNob2xkKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoZmluYWwgaW50IG1vZGUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoaW50IG1vZGUpIHsKIAkJcmV0dXJuIG1vZGUgIT0gMCAmJiAhRmlsZU1vZGUuVFJFRS5lcXVhbHMobW9kZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0dpdExpbmsoZmluYWwgaW50IG1vZGUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR2l0TGluayhpbnQgbW9kZSkgewogCQlyZXR1cm4gRmlsZU1vZGUuR0lUTElOSy5lcXVhbHMobW9kZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5T25lU2lkZWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhCmluZGV4IDk3OTY4NWMuLjZlMmUyYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhCkBAIC03MSw3ICs3MSw3IEBACiAJICogQHBhcmFtIGluZGV4CiAJICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGlucHV0IHRyZWUgdG8gYWNjZXB0IGFzIHRoZSByZXN1bHQuCiAJICovCi0JcHJvdGVjdGVkIFN0cmF0ZWd5T25lU2lkZWQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGludCBpbmRleCkgeworCXByb3RlY3RlZCBTdHJhdGVneU9uZVNpZGVkKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKIAkJc3RyYXRlZ3lOYW1lID0gbmFtZTsKIAkJdHJlZUluZGV4ID0gaW5kZXg7CiAJfQpAQCAtODQsMzEgKzg0LDMxIEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihSZXBvc2l0b3J5IGRiKSB7CiAJCXJldHVybiBuZXcgT25lU2lkZShkYiwgdHJlZUluZGV4KTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGJvb2xlYW4gaW5Db3JlKSB7CisJcHVibGljIE1lcmdlciBuZXdNZXJnZXIoUmVwb3NpdG9yeSBkYiwgYm9vbGVhbiBpbkNvcmUpIHsKIAkJcmV0dXJuIG5ldyBPbmVTaWRlKGRiLCB0cmVlSW5kZXgpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE1lcmdlciBuZXdNZXJnZXIoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIGZpbmFsIENvbmZpZyBjb25maWcpIHsKKwlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgQ29uZmlnIGNvbmZpZykgewogCQlyZXR1cm4gbmV3IE9uZVNpZGUoaW5zZXJ0ZXIsIHRyZWVJbmRleCk7CiAJfQogCiAJc3RhdGljIGNsYXNzIE9uZVNpZGUgZXh0ZW5kcyBNZXJnZXIgewogCQlwcml2YXRlIGZpbmFsIGludCB0cmVlSW5kZXg7CiAKLQkJcHJvdGVjdGVkIE9uZVNpZGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgaW50IGluZGV4KSB7CisJCXByb3RlY3RlZCBPbmVTaWRlKFJlcG9zaXRvcnkgbG9jYWwsIGludCBpbmRleCkgewogCQkJc3VwZXIobG9jYWwpOwogCQkJdHJlZUluZGV4ID0gaW5kZXg7CiAJCX0KIAotCQlwcm90ZWN0ZWQgT25lU2lkZShmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgZmluYWwgaW50IGluZGV4KSB7CisJCXByb3RlY3RlZCBPbmVTaWRlKE9iamVjdEluc2VydGVyIGluc2VydGVyLCBpbnQgaW5kZXgpIHsKIAkJCXN1cGVyKGluc2VydGVyKTsKIAkJCXRyZWVJbmRleCA9IGluZGV4OwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5U2ltcGxlVHdvV2F5SW5Db3JlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5U2ltcGxlVHdvV2F5SW5Db3JlLmphdmEKaW5kZXggNTczOWQ1OC4uNGFlYWNmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneVNpbXBsZVR3b1dheUluQ29yZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lTaW1wbGVUd29XYXlJbkNvcmUuamF2YQpAQCAtODQsNyArODQsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgVGhyZWVXYXlNZXJnZXIgbmV3TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgVGhyZWVXYXlNZXJnZXIgbmV3TWVyZ2VyKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIG5ldyBJbkNvcmVNZXJnZXIoZGIpOwogCX0KIApAQCAtMTE2LDEzICsxMTYsMTMgQEAKIAogCQlwcml2YXRlIE9iamVjdElkIHJlc3VsdFRyZWU7CiAKLQkJSW5Db3JlTWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKKwkJSW5Db3JlTWVyZ2VyKFJlcG9zaXRvcnkgbG9jYWwpIHsKIAkJCXN1cGVyKGxvY2FsKTsKIAkJCXR3ID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKGxvY2FsLCByZWFkZXIpOwogCQkJY2FjaGUgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJfQogCi0JCUluQ29yZU1lcmdlcihmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgeworCQlJbkNvcmVNZXJnZXIoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIpIHsKIAkJCXN1cGVyKGluc2VydGVyKTsKIAkJCXR3ID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKG51bGwsIHJlYWRlcik7CiAJCQljYWNoZSA9IERpckNhY2hlLm5ld0luQ29yZSgpOwpAQCAtMTgyLDExICsxODIsMTEgQEAKIAkJCX0KIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbm9uVHJlZShmaW5hbCBpbnQgbW9kZSkgeworCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoaW50IG1vZGUpIHsKIAkJCXJldHVybiBtb2RlICE9IDAgJiYgIUZpbGVNb2RlLlRSRUUuZXF1YWxzKG1vZGUpOwogCQl9CiAKLQkJcHJpdmF0ZSB2b2lkIGFkZChmaW5hbCBpbnQgdHJlZSwgZmluYWwgaW50IHN0YWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwcml2YXRlIHZvaWQgYWRkKGludCB0cmVlLCBpbnQgc3RhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBpID0gZ2V0VHJlZSh0cmVlKTsKIAkJCWlmIChpICE9IG51bGwpIHsKIAkJCQlpZiAoRmlsZU1vZGUuVFJFRS5lcXVhbHModHcuZ2V0UmF3TW9kZSh0cmVlKSkpIHsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQkJfQogCQl9CiAKLQkJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBnZXRUcmVlKGZpbmFsIGludCB0cmVlKSB7CisJCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZ2V0VHJlZShpbnQgdHJlZSkgewogCQkJcmV0dXJuIHR3LmdldFRyZWUodHJlZSwgQWJzdHJhY3RUcmVlSXRlcmF0b3IuY2xhc3MpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvVGhyZWVXYXlNZXJnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvVGhyZWVXYXlNZXJnZXIuamF2YQppbmRleCAzZjI4ODIwLi4yZmMwZjRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1RocmVlV2F5TWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9UaHJlZVdheU1lcmdlci5qYXZhCkBAIC03MSw3ICs3MSw3IEBACiAJICogQHBhcmFtIGxvY2FsCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGlzIG1lcmdlciB3aWxsIHJlYWQgYW5kIHdyaXRlIGRhdGEgb24uCiAJICovCi0JcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKKwlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoUmVwb3NpdG9yeSBsb2NhbCkgewogCQlzdXBlcihsb2NhbCk7CiAJfQogCkBAIC04Myw3ICs4Myw3IEBACiAJICogQHBhcmFtIGluQ29yZQogCSAqICAgICAgICAgICAgcGVyZm9ybSB0aGUgbWVyZ2UgaW4gY29yZSB3aXRoIG5vIHdvcmtpbmcgZm9sZGVyIGludm9sdmVkCiAJICovCi0JcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGJvb2xlYW4gaW5Db3JlKSB7CisJcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKFJlcG9zaXRvcnkgbG9jYWwsIGJvb2xlYW4gaW5Db3JlKSB7CiAJCXRoaXMobG9jYWwpOwogCX0KIApAQCAtMTEyLDcgKzExMiw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCBzZXRCYXNlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGlkICE9IG51bGwpIHsKIAkJCWJhc2VUcmVlID0gd2Fsay5wYXJzZVRyZWUoaWQpOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIG1lcmdlKGZpbmFsIEFueU9iamVjdElkLi4uIHRpcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGJvb2xlYW4gbWVyZ2UoQW55T2JqZWN0SWQuLi4gdGlwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHRpcHMubGVuZ3RoICE9IDIpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiBzdXBlci5tZXJnZSh0aXBzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbm90ZXMvTGVhZkJ1Y2tldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ub3Rlcy9MZWFmQnVja2V0LmphdmEKaW5kZXggMWJlNTI1MS4uNjcyM2I2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ub3Rlcy9MZWFmQnVja2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ub3Rlcy9MZWFmQnVja2V0LmphdmEKQEAgLTIxOCw3ICsyMTgsNyBAQAogCQlyZXR1cm4gZm10OwogCX0KIAotCXByaXZhdGUgaW50IHRyZWVTaXplKGZpbmFsIGludCBuYW1lTGVuKSB7CisJcHJpdmF0ZSBpbnQgdHJlZVNpemUoaW50IG5hbWVMZW4pIHsKIAkJaW50IHN6ID0gY250ICogVHJlZUZvcm1hdHRlci5lbnRyeVNpemUoUkVHVUxBUl9GSUxFLCBuYW1lTGVuKTsKIAkJZm9yIChOb25Ob3RlRW50cnkgZSA9IG5vbk5vdGVzOyBlICE9IG51bGw7IGUgPSBlLm5leHQpCiAJCQlzeiArPSBlLnRyZWVFbnRyeVNpemUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQmluYXJ5SHVuay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEKaW5kZXggMDc5ZDZmNi4uOTUzOTFlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEKQEAgLTgwLDcgKzgwLDcgQEAKIAkvKiogSW5mbGF0ZWQgbGVuZ3RoIG9mIHRoZSBkYXRhLiAqLwogCXByaXZhdGUgaW50IGxlbmd0aDsKIAotCUJpbmFyeUh1bmsoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCkgeworCUJpbmFyeUh1bmsoRmlsZUhlYWRlciBmaCwgaW50IG9mZnNldCkgewogCQlmaWxlID0gZmg7CiAJCXN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogCX0KQEAgLTEzOSw3ICsxMzksNyBAQAogCQlyZXR1cm4gbGVuZ3RoOwogCX0KIAotCWludCBwYXJzZUh1bmsoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUh1bmsoaW50IHB0ciwgaW50IGVuZCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAKIAkJaWYgKG1hdGNoKGJ1ZiwgcHRyLCBMSVRFUkFMKSA+PSAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkRmlsZUhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEZpbGVIZWFkZXIuamF2YQppbmRleCAxYWZiNTNkLi4zNDA3NTc4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkRmlsZUhlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRGaWxlSGVhZGVyLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKIAogCXByaXZhdGUgRmlsZU1vZGVbXSBvbGRNb2RlczsKIAotCUNvbWJpbmVkRmlsZUhlYWRlcihmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZnNldCkgeworCUNvbWJpbmVkRmlsZUhlYWRlcihieXRlW10gYiwgaW50IG9mZnNldCkgewogCQlzdXBlcihiLCBvZmZzZXQpOwogCX0KIApAQCAtMTA4LDcgKzEwOCw3IEBACiAJICogICAgICAgICAgICB0aGUgYW5jZXN0b3IgdG8gZ2V0IHRoZSBtb2RlIG9mCiAJICogQHJldHVybiB0aGUgbW9kZSBvZiB0aGUgcmVxdWVzdGVkIGFuY2VzdG9yLgogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRPbGRNb2RlKGZpbmFsIGludCBudGhQYXJlbnQpIHsKKwlwdWJsaWMgRmlsZU1vZGUgZ2V0T2xkTW9kZShpbnQgbnRoUGFyZW50KSB7CiAJCXJldHVybiBvbGRNb2Rlc1tudGhQYXJlbnRdOwogCX0KIApAQCAtMTMwLDEzICsxMzAsMTMgQEAKIAkgKiAgICAgICAgICAgIHRoZSBhbmNlc3RvciB0byBnZXQgdGhlIG9iamVjdCBpZCBvZgogCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSByZXF1ZXN0ZWQgYW5jZXN0b3IuCiAJICovCi0JcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgZ2V0T2xkSWQoZmluYWwgaW50IG50aFBhcmVudCkgeworCXB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGdldE9sZElkKGludCBudGhQYXJlbnQpIHsKIAkJcmV0dXJuIG9sZElkc1tudGhQYXJlbnRdOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTY3JpcHRUZXh0KGZpbmFsIENoYXJzZXQgb2NzLCBmaW5hbCBDaGFyc2V0IG5jcykgeworCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0VGV4dChDaGFyc2V0IG9jcywgQ2hhcnNldCBuY3MpIHsKIAkJZmluYWwgQ2hhcnNldFtdIGNzID0gbmV3IENoYXJzZXRbZ2V0UGFyZW50Q291bnQoKSArIDFdOwogCQlBcnJheXMuZmlsbChjcywgb2NzKTsKIAkJY3NbZ2V0UGFyZW50Q291bnQoKV0gPSBuY3M7CkBAIC0xNDksMTIgKzE0OSwxMiBAQAogCSAqIENvbnZlcnQgdGhlIHBhdGNoIHNjcmlwdCBmb3IgdGhpcyBmaWxlIGludG8gYSBzdHJpbmcuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTY3JpcHRUZXh0KGZpbmFsIENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKKwlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFRleHQoQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgewogCQlyZXR1cm4gc3VwZXIuZ2V0U2NyaXB0VGV4dChjaGFyc2V0R3Vlc3MpOwogCX0KIAogCUBPdmVycmlkZQotCWludCBwYXJzZUdpdEhlYWRlcnMoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUdpdEhlYWRlcnMoaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKSB7CiAJCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJCWlmIChpc0h1bmtIZHIoYnVmLCBwdHIsIGVuZCkgPj0gMSkgewpAQCAtMTkxLDcgKzE5MSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwlwcm90ZWN0ZWQgdm9pZCBwYXJzZUluZGV4TGluZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCS8vICJpbmRleCAkYXNoYTEsJGJzaGExLi4kY3NoYTEiCiAJCS8vCiAJCWZpbmFsIExpc3Q8QWJicmV2aWF0ZWRPYmplY3RJZD4gaWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC0yMTMsMTggKzIxMywxOCBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZU5ld0ZpbGVNb2RlKGZpbmFsIGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwlwcm90ZWN0ZWQgdm9pZCBwYXJzZU5ld0ZpbGVNb2RlKGludCBwdHIsIGludCBlb2wpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRNb2Rlcy5sZW5ndGg7IGkrKykKIAkJCW9sZE1vZGVzW2ldID0gRmlsZU1vZGUuTUlTU0lORzsKIAkJc3VwZXIucGFyc2VOZXdGaWxlTW9kZShwdHIsIGVvbCk7CiAJfQogCiAJQE92ZXJyaWRlCi0JSHVua0hlYWRlciBuZXdIdW5rSGVhZGVyKGZpbmFsIGludCBvZmZzZXQpIHsKKwlIdW5rSGVhZGVyIG5ld0h1bmtIZWFkZXIoaW50IG9mZnNldCkgewogCQlyZXR1cm4gbmV3IENvbWJpbmVkSHVua0hlYWRlcih0aGlzLCBvZmZzZXQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwYXJzZU1vZGVMaW5lKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwlwcml2YXRlIHZvaWQgcGFyc2VNb2RlTGluZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCS8vICJtb2RlICRhbW9kZSwkYm1vZGUuLiRjbW9kZSIKIAkJLy8KIAkJaW50IG4gPSAwOwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJCW5ld01vZGUgPSBwYXJzZUZpbGVNb2RlKGRvdDIgKyAxLCBlb2wpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwYXJzZURlbGV0ZWRGaWxlTW9kZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJcHJpdmF0ZSB2b2lkIHBhcnNlRGVsZXRlZEZpbGVNb2RlKGludCBwdHIsIGludCBlb2wpIHsKIAkJLy8gImRlbGV0ZWQgZmlsZSBtb2RlICRhbW9kZSwkYm1vZGUiCiAJCS8vCiAJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLkRFTEVURTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRIdW5rSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkSHVua0hlYWRlci5qYXZhCmluZGV4IGJiZjgwMjMuLmQyNzgxMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRIdW5rSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEh1bmtIZWFkZXIuamF2YQpAQCAtNjQsNyArNjQsNyBAQAogCiAJcHJpdmF0ZSBDb21iaW5lZE9sZEltYWdlW10gb2xkOwogCi0JQ29tYmluZWRIdW5rSGVhZGVyKGZpbmFsIENvbWJpbmVkRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCkgeworCUNvbWJpbmVkSHVua0hlYWRlcihDb21iaW5lZEZpbGVIZWFkZXIgZmgsIGludCBvZmZzZXQpIHsKIAkJc3VwZXIoZmgsIG9mZnNldCwgbnVsbCk7CiAJCW9sZCA9IG5ldyBDb21iaW5lZE9sZEltYWdlW2ZoLmdldFBhcmVudENvdW50KCldOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZC5sZW5ndGg7IGkrKykgewpAQCAtOTcsNyArOTcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGFuY2VzdG9yIHRvIGdldCB0aGUgb2xkIGltYWdlIGRhdGEgb2YKIAkgKiBAcmV0dXJuIGltYWdlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBhbmNlc3Rvci4KIAkgKi8KLQlwdWJsaWMgT2xkSW1hZ2UgZ2V0T2xkSW1hZ2UoZmluYWwgaW50IG50aFBhcmVudCkgeworCXB1YmxpYyBPbGRJbWFnZSBnZXRPbGRJbWFnZShpbnQgbnRoUGFyZW50KSB7CiAJCXJldHVybiBvbGRbbnRoUGFyZW50XTsKIAl9CiAKQEAgLTEyNSwxMSArMTI1LDExIEBACiAJfQogCiAJQE92ZXJyaWRlCi0JaW50IHBhcnNlQm9keShmaW5hbCBQYXRjaCBzY3JpcHQsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VCb2R5KFBhdGNoIHNjcmlwdCwgaW50IGVuZCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAJCWludCBjID0gbmV4dExGKGJ1Ziwgc3RhcnRPZmZzZXQpOwogCi0JCWZvciAoZmluYWwgQ29tYmluZWRPbGRJbWFnZSBvIDogb2xkKSB7CisJCWZvciAoQ29tYmluZWRPbGRJbWFnZSBvIDogb2xkKSB7CiAJCQlvLm5EZWxldGVkID0gMDsKIAkJCW8ubkFkZGVkID0gMDsKIAkJCW8ubkNvbnRleHQgPSAwOwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBleHRyYWN0RmlsZUxpbmVzKGZpbmFsIE91dHB1dFN0cmVhbVtdIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGV4dHJhY3RGaWxlTGluZXMoT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAJCWludCBwdHIgPSBzdGFydE9mZnNldDsKIAkJaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhCmluZGV4IDVjZmJiYjIuLmQwYTUyMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkgKiBAcGFyYW0gdHlwZQogCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcGF0Y2ggdXNlZCB0byBtb2RpZnkgdGhpcyBmaWxlCiAJICovCi0JcHVibGljIEZpbGVIZWFkZXIoZmluYWwgYnl0ZVtdIGhlYWRlckxpbmVzLCBFZGl0TGlzdCBlZGl0cywgUGF0Y2hUeXBlIHR5cGUpIHsKKwlwdWJsaWMgRmlsZUhlYWRlcihieXRlW10gaGVhZGVyTGluZXMsIEVkaXRMaXN0IGVkaXRzLCBQYXRjaFR5cGUgdHlwZSkgewogCQl0aGlzKGhlYWRlckxpbmVzLCAwKTsKIAkJZW5kT2Zmc2V0ID0gaGVhZGVyTGluZXMubGVuZ3RoOwogCQlpbnQgcHRyID0gcGFyc2VHaXRGaWxlTmFtZShQYXRjaC5ESUZGX0dJVC5sZW5ndGgsIGhlYWRlckxpbmVzLmxlbmd0aCk7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAkJYWRkSHVuayhuZXcgSHVua0hlYWRlcih0aGlzLCBlZGl0cykpOwogCX0KIAotCUZpbGVIZWFkZXIoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlGaWxlSGVhZGVyKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0KSB7CiAJCWJ1ZiA9IGI7CiAJCXN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5NT0RJRlk7IC8vIHVubGVzcyBvdGhlcndpc2UgZGVzaWduYXRlZApAQCAtMjY0LDEyICsyNjQsMTIgQEAKIAogCQlmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IGV4dHJhY3RGaWxlTGluZXMoY2hhcnNldEd1ZXNzKTsKIAkJZmluYWwgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbZmlsZXMubGVuZ3RoXTsKLQkJZm9yIChmaW5hbCBIdW5rSGVhZGVyIGggOiBnZXRIdW5rcygpKQorCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCiAJCQloLmV4dHJhY3RGaWxlTGluZXMociwgZmlsZXMsIG9mZnNldHMpOwogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ5U2ltcGxlQ29udmVyc2lvbihmaW5hbCBDaGFyc2V0W10gY2hhcnNldEd1ZXNzKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0cnlTaW1wbGVDb252ZXJzaW9uKENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKIAkJaWYgKGNoYXJzZXRHdWVzcyA9PSBudWxsKQogCQkJcmV0dXJuIHRydWU7CiAJCWZvciAoaW50IGkgPSAxOyBpIDwgY2hhcnNldEd1ZXNzLmxlbmd0aDsgaSsrKSB7CkBAIC0yNzksMTIgKzI3OSwxMiBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZ1tdIGV4dHJhY3RGaWxlTGluZXMoZmluYWwgQ2hhcnNldFtdIGNzR3Vlc3MpIHsKKwlwcml2YXRlIFN0cmluZ1tdIGV4dHJhY3RGaWxlTGluZXMoQ2hhcnNldFtdIGNzR3Vlc3MpIHsKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyW10gdG1wID0gbmV3IFRlbXBvcmFyeUJ1ZmZlcltnZXRQYXJlbnRDb3VudCgpICsgMV07CiAJCXRyeSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykKIAkJCQl0bXBbaV0gPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJZm9yIChmaW5hbCBIdW5rSGVhZGVyIGggOiBnZXRIdW5rcygpKQorCQkJZm9yIChIdW5rSGVhZGVyIGggOiBnZXRIdW5rcygpKQogCQkJCWguZXh0cmFjdEZpbGVMaW5lcyh0bXApOwogCiAJCQlmaW5hbCBTdHJpbmdbXSByID0gbmV3IFN0cmluZ1t0bXAubGVuZ3RoXTsKQEAgLTMyOSw3ICszMjksNyBAQAogCQlyZXR1cm4gaHVua3M7CiAJfQogCi0Jdm9pZCBhZGRIdW5rKGZpbmFsIEh1bmtIZWFkZXIgaCkgeworCXZvaWQgYWRkSHVuayhIdW5rSGVhZGVyIGgpIHsKIAkJaWYgKGguZ2V0RmlsZUhlYWRlcigpICE9IHRoaXMpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmh1bmtCZWxvbmdzVG9Bbm90aGVyRmlsZSk7CiAJCWlmIChodW5rcyA9PSBudWxsKQpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCWh1bmtzLmFkZChoKTsKIAl9CiAKLQlIdW5rSGVhZGVyIG5ld0h1bmtIZWFkZXIoZmluYWwgaW50IG9mZnNldCkgeworCUh1bmtIZWFkZXIgbmV3SHVua0hlYWRlcihpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBuZXcgSHVua0hlYWRlcih0aGlzLCBvZmZzZXQpOwogCX0KIApAQCAtMzcwLDcgKzM3MCw3IEBACiAJICovCiAJcHVibGljIEVkaXRMaXN0IHRvRWRpdExpc3QoKSB7CiAJCWZpbmFsIEVkaXRMaXN0IHIgPSBuZXcgRWRpdExpc3QoKTsKLQkJZm9yIChmaW5hbCBIdW5rSGVhZGVyIGh1bmsgOiBodW5rcykKKwkJZm9yIChIdW5rSGVhZGVyIGh1bmsgOiBodW5rcykKIAkJCXIuYWRkQWxsKGh1bmsudG9FZGl0TGlzdCgpKTsKIAkJcmV0dXJuIHI7CiAJfQpAQCAtMzg0LDcgKzM4NCw3IEBACiAJICogICAgICAgICAgICBvbmUgcGFzdCB0aGUgbGFzdCBwb3NpdGlvbiB0byBwYXJzZS4KIAkgKiBAcmV0dXJuIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgTEYgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsgLTEgb24gZXJyb3IuCiAJICovCi0JaW50IHBhcnNlR2l0RmlsZU5hbWUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUdpdEZpbGVOYW1lKGludCBwdHIsIGludCBlbmQpIHsKIAkJZmluYWwgaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CiAJCWZpbmFsIGludCBib2wgPSBwdHI7CiAJCWlmIChlb2wgPj0gZW5kKSB7CkBAIC00NDQsNyArNDQ0LDcgQEAKIAkJcmV0dXJuIGVvbDsKIAl9CiAKLQlpbnQgcGFyc2VHaXRIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VHaXRIZWFkZXJzKGludCBwdHIsIGludCBlbmQpIHsKIAkJd2hpbGUgKHB0ciA8IGVuZCkgewogCQkJZmluYWwgaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CiAJCQlpZiAoaXNIdW5rSGRyKGJ1ZiwgcHRyLCBlb2wpID49IDEpIHsKQEAgLTUxNCwyNSArNTE0LDI1IEBACiAJCXJldHVybiBwdHI7CiAJfQogCi0Jdm9pZCBwYXJzZU9sZE5hbWUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXZvaWQgcGFyc2VPbGROYW1lKGludCBwdHIsIGludCBlb2wpIHsKIAkJb2xkUGF0aCA9IHAxKHBhcnNlTmFtZShvbGRQYXRoLCBwdHIgKyBPTERfTkFNRS5sZW5ndGgsIGVvbCkpOwogCQlpZiAob2xkUGF0aCA9PSBERVZfTlVMTCkKIAkJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLkFERDsKIAl9CiAKLQl2b2lkIHBhcnNlTmV3TmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJdm9pZCBwYXJzZU5ld05hbWUoaW50IHB0ciwgaW50IGVvbCkgewogCQluZXdQYXRoID0gcDEocGFyc2VOYW1lKG5ld1BhdGgsIHB0ciArIE5FV19OQU1FLmxlbmd0aCwgZW9sKSk7CiAJCWlmIChuZXdQYXRoID09IERFVl9OVUxMKQogCQkJY2hhbmdlVHlwZSA9IENoYW5nZVR5cGUuREVMRVRFOwogCX0KIAotCXZvaWQgcGFyc2VOZXdGaWxlTW9kZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJdm9pZCBwYXJzZU5ld0ZpbGVNb2RlKGludCBwdHIsIGludCBlb2wpIHsKIAkJb2xkTW9kZSA9IEZpbGVNb2RlLk1JU1NJTkc7CiAJCW5ld01vZGUgPSBwYXJzZUZpbGVNb2RlKHB0ciArIE5FV19GSUxFX01PREUubGVuZ3RoLCBlb2wpOwogCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5BREQ7CiAJfQogCi0JaW50IHBhcnNlVHJhZGl0aW9uYWxIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VUcmFkaXRpb25hbEhlYWRlcnMoaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKSB7CiAJCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJCWlmIChpc0h1bmtIZHIoYnVmLCBwdHIsIGVvbCkgPj0gMSkgewpAQCAtNTU1LDcgKzU1NSw3IEBACiAJCXJldHVybiBwdHI7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgcGFyc2VOYW1lKGZpbmFsIFN0cmluZyBleHBlY3QsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIFN0cmluZyBwYXJzZU5hbWUoU3RyaW5nIGV4cGVjdCwgaW50IHB0ciwgaW50IGVuZCkgewogCQlpZiAocHRyID09IGVuZCkKIAkJCXJldHVybiBleHBlY3Q7CiAKQEAgLTU4NSw3ICs1ODUsNyBAQAogCQlyZXR1cm4gcyA+IDAgPyByLnN1YnN0cmluZyhzICsgMSkgOiByOwogCX0KIAotCUZpbGVNb2RlIHBhcnNlRmlsZU1vZGUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCUZpbGVNb2RlIHBhcnNlRmlsZU1vZGUoaW50IHB0ciwgaW50IGVuZCkgewogCQlpbnQgdG1wID0gMDsKIAkJd2hpbGUgKHB0ciA8IGVuZCAtIDEpIHsKIAkJCXRtcCA8PD0gMzsKQEAgLTU5NCw3ICs1OTQsNyBAQAogCQlyZXR1cm4gRmlsZU1vZGUuZnJvbUJpdHModG1wKTsKIAl9CiAKLQl2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwl2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGludCBlbmQpIHsKIAkJLy8gImluZGV4ICRhc2hhMS4uJGJzaGExWyAkbW9kZV0iIHdoZXJlICRhc2hhMSBhbmQgJGJzaGExCiAJCS8vIGNhbiBiZSB1bmlxdWUgYWJicmV2aWF0aW9ucwogCQkvLwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJICogICAgICAgICBmb3IgYSAzIHdheS1tZXJnZSByZXR1cm5zIDMuIElmIHRoaXMgaXMgbm90IGEgaHVuayBoZWFkZXIsIDAgaXMKIAkgKiAgICAgICAgIHJldHVybmVkIGluc3RlYWQuCiAJICovCi0Jc3RhdGljIGludCBpc0h1bmtIZHIoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJc3RhdGljIGludCBpc0h1bmtIZHIoYnl0ZVtdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCWludCBwdHIgPSBzdGFydDsKIAkJd2hpbGUgKHB0ciA8IGVuZCAmJiBidWZbcHRyXSA9PSAnQCcpCiAJCQlwdHIrKzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvSHVua0hlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEKaW5kZXggZDAyMmQ0Ny4uMTQ1ODk0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiAJcHJpdmF0ZSBFZGl0TGlzdCBlZGl0TGlzdDsKIAotCUh1bmtIZWFkZXIoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCkgeworCUh1bmtIZWFkZXIoRmlsZUhlYWRlciBmaCwgaW50IG9mZnNldCkgewogCQl0aGlzKGZoLCBvZmZzZXQsIG5ldyBPbGRJbWFnZSgpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgZ2V0SWQoKSB7CkBAIC0xMjksMTMgKzEyOSwxMyBAQAogCQl9KTsKIAl9CiAKLQlIdW5rSGVhZGVyKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIE9sZEltYWdlIG9pKSB7CisJSHVua0hlYWRlcihGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0LCBPbGRJbWFnZSBvaSkgewogCQlmaWxlID0gZmg7CiAJCXN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogCQlvbGQgPSBvaTsKIAl9CiAKLQlIdW5rSGVhZGVyKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGZpbmFsIEVkaXRMaXN0IGVkaXRMaXN0KSB7CisJSHVua0hlYWRlcihGaWxlSGVhZGVyIGZoLCBFZGl0TGlzdCBlZGl0TGlzdCkgewogCQl0aGlzKGZoLCBmaC5idWYubGVuZ3RoKTsKIAkJdGhpcy5lZGl0TGlzdCA9IGVkaXRMaXN0OwogCQllbmRPZmZzZXQgPSBzdGFydE9mZnNldDsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCQkJbmV3TGluZUNvdW50ID0gMTsKIAl9CiAKLQlpbnQgcGFyc2VCb2R5KGZpbmFsIFBhdGNoIHNjcmlwdCwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUJvZHkoUGF0Y2ggc2NyaXB0LCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IGMgPSBuZXh0TEYoYnVmLCBzdGFydE9mZnNldCksIGxhc3QgPSBjOwogCkBAIC0zNTksNyArMzU5LDcgQEAKIAkJcmV0dXJuIGM7CiAJfQogCi0Jdm9pZCBleHRyYWN0RmlsZUxpbmVzKGZpbmFsIE91dHB1dFN0cmVhbVtdIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGV4dHJhY3RGaWxlTGluZXMoT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAJCWludCBwdHIgPSBzdGFydE9mZnNldDsKIAkJaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoLmphdmEKaW5kZXggZGExMjNhNy4uMDUyZjJhNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2guamF2YQpAQCAtMTAxLDcgKzEwMSw3IEBACiAJICogQHBhcmFtIGZoCiAJICogICAgICAgICAgICB0aGUgaGVhZGVyIG9mIHRoZSBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZpbGUoZmluYWwgRmlsZUhlYWRlciBmaCkgeworCXB1YmxpYyB2b2lkIGFkZEZpbGUoRmlsZUhlYWRlciBmaCkgewogCQlmaWxlcy5hZGQoZmgpOwogCX0KIApAQCAtMTIwLDcgKzEyMCw3IEBACiAJICogQHBhcmFtIGVycgogCSAqICAgICAgICAgICAgdGhlIGVycm9yIGRlc2NyaXB0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9yKGZpbmFsIEZvcm1hdEVycm9yIGVycikgeworCXB1YmxpYyB2b2lkIGFkZEVycm9yKEZvcm1hdEVycm9yIGVycikgewogCQllcnJvcnMuYWRkKGVycik7CiAJfQogCkBAIC0xNDYsMTIgKzE0NiwxMiBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IHJlYWRGdWxseShpcyk7CiAJCXBhcnNlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRGdWxseShmaW5hbCBJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gcmVhZEZ1bGx5KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKEludGVnZXIuTUFYX1ZBTFVFKSkgewogCQkJYi5jb3B5KGlzKTsKIAkJCXJldHVybiBiLnRvQnl0ZUFycmF5KCk7CkBAIC0xNzMsMTIgKzE3MywxMiBAQAogCSAqICAgICAgICAgICAgMSBwYXN0IHRoZSBsYXN0IHBvc2l0aW9uIHRvIGVuZCBwYXJzaW5nLiBUaGUgdG90YWwgbGVuZ3RoIHRvCiAJICogICAgICAgICAgICBiZSBwYXJzZWQgaXMgPGNvZGU+ZW5kIC0gcHRyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShmaW5hbCBieXRlW10gYnVmLCBpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKQogCQkJcHRyID0gcGFyc2VGaWxlKGJ1ZiwgcHRyLCBlbmQpOwogCX0KIAotCXByaXZhdGUgaW50IHBhcnNlRmlsZShmaW5hbCBieXRlW10gYnVmLCBpbnQgYywgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgaW50IHBhcnNlRmlsZShieXRlW10gYnVmLCBpbnQgYywgaW50IGVuZCkgewogCQl3aGlsZSAoYyA8IGVuZCkgewogCQkJaWYgKGlzSHVua0hkcihidWYsIGMsIGVuZCkgPj0gMSkgewogCQkJCS8vIElmIHdlIGZpbmQgYSBkaXNjb25uZWN0ZWQgaHVuayBoZWFkZXIgd2UgbWlnaHQKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlyZXR1cm4gYzsKIAl9CiAKLQlwcml2YXRlIGludCBwYXJzZURpZmZHaXQoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VEaWZmR2l0KGJ5dGVbXSBidWYsIGludCBzdGFydCwgaW50IGVuZCkgewogCQlmaW5hbCBGaWxlSGVhZGVyIGZoID0gbmV3IEZpbGVIZWFkZXIoYnVmLCBzdGFydCk7CiAJCWludCBwdHIgPSBmaC5wYXJzZUdpdEZpbGVOYW1lKHN0YXJ0ICsgRElGRl9HSVQubGVuZ3RoLCBlbmQpOwogCQlpZiAocHRyIDwgMCkKQEAgLTI3MSwxNCArMjcxLDE0IEBACiAJCXJldHVybiBwdHI7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHNraXBGaWxlKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgc2tpcEZpbGUoYnl0ZVtdIGJ1ZiwgaW50IHB0cikgewogCQlwdHIgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQlpZiAobWF0Y2goYnVmLCBwdHIsIE9MRF9OQU1FKSA+PSAwKQogCQkJcHRyID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQlwcml2YXRlIGludCBwYXJzZUh1bmtzKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGludCBjLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VIdW5rcyhGaWxlSGVhZGVyIGZoLCBpbnQgYywgaW50IGVuZCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gZmguYnVmOwogCQl3aGlsZSAoYyA8IGVuZCkgewogCQkJLy8gSWYgd2Ugc2VlIGEgZmlsZSBoZWFkZXIgYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbGwgb2YgdGhlCkBAIC0zNDksNyArMzQ5LDcgQEAKIAkJcmV0dXJuIGM7CiAJfQogCi0JcHJpdmF0ZSBpbnQgcGFyc2VHaXRCaW5hcnkoZmluYWwgRmlsZUhlYWRlciBmaCwgaW50IGMsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIGludCBwYXJzZUdpdEJpbmFyeShGaWxlSGVhZGVyIGZoLCBpbnQgYywgaW50IGVuZCkgewogCQlmaW5hbCBCaW5hcnlIdW5rIHBvc3RJbWFnZSA9IG5ldyBCaW5hcnlIdW5rKGZoLCBjKTsKIAkJZmluYWwgaW50IG5FbmQgPSBwb3N0SW1hZ2UucGFyc2VIdW5rKGMsIGVuZCk7CiAJCWlmIChuRW5kIDwgMCkgewpAQCAtMzczLDE3ICszNzMsMTcgQEAKIAkJcmV0dXJuIGM7CiAJfQogCi0Jdm9pZCB3YXJuKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBwdHIsIGZpbmFsIFN0cmluZyBtc2cpIHsKKwl2b2lkIHdhcm4oYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgU3RyaW5nIG1zZykgewogCQlhZGRFcnJvcihuZXcgRm9ybWF0RXJyb3IoYnVmLCBwdHIsIEZvcm1hdEVycm9yLlNldmVyaXR5LldBUk5JTkcsIG1zZykpOwogCX0KIAotCXZvaWQgZXJyb3IoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHB0ciwgZmluYWwgU3RyaW5nIG1zZykgeworCXZvaWQgZXJyb3IoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgU3RyaW5nIG1zZykgewogCQlhZGRFcnJvcihuZXcgRm9ybWF0RXJyb3IoYnVmLCBwdHIsIEZvcm1hdEVycm9yLlNldmVyaXR5LkVSUk9SLCBtc2cpKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoQW55KGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBjLAogCQkJZmluYWwgYnl0ZVtdW10gc3JjcykgewotCQlmb3IgKGZpbmFsIGJ5dGVbXSBzIDogc3JjcykgeworCQlmb3IgKGJ5dGVbXSBzIDogc3JjcykgewogCQkJaWYgKG1hdGNoKGJ1ZiwgYywgcykgPj0gMCkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L0Fic3RyYWN0UGxvdFJlbmRlcmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YQppbmRleCBmODhiODE5Li41OGUyMTA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YQpAQCAtOTIsMTQgKzkyLDE0IEBACiAJICogICAgICAgICAgICB0b3RhbCBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhpcyBjZWxsLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tbWl0KGZpbmFsIFBsb3RDb21taXQ8VExhbmU+IGNvbW1pdCwgZmluYWwgaW50IGgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBwYWludENvbW1pdChQbG90Q29tbWl0PFRMYW5lPiBjb21taXQsIGludCBoKSB7CiAJCWZpbmFsIGludCBkb3RTaXplID0gY29tcHV0ZURvdFNpemUoaCk7CiAJCWZpbmFsIFRMYW5lIG15TGFuZSA9IGNvbW1pdC5nZXRMYW5lKCk7CiAJCWZpbmFsIGludCBteUxhbmVYID0gbGFuZUMobXlMYW5lKTsKIAkJZmluYWwgVENvbG9yIG15Q29sb3IgPSBsYW5lQ29sb3IobXlMYW5lKTsKIAogCQlpbnQgbWF4Q2VudGVyID0gbXlMYW5lWDsKLQkJZm9yIChmaW5hbCBUTGFuZSBwYXNzaW5nTGFuZSA6IChUTGFuZVtdKSBjb21taXQucGFzc2luZ0xhbmVzKSB7CisJCWZvciAoVExhbmUgcGFzc2luZ0xhbmUgOiAoVExhbmVbXSkgY29tbWl0LnBhc3NpbmdMYW5lcykgewogCQkJZmluYWwgaW50IGN4ID0gbGFuZUMocGFzc2luZ0xhbmUpOwogCQkJZmluYWwgVENvbG9yIGMgPSBsYW5lQ29sb3IocGFzc2luZ0xhbmUpOwogCQkJZHJhd0xpbmUoYywgY3gsIDAsIGN4LCBoLCBMSU5FX1dJRFRIKTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCSAqLwogCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZHJhd0xhYmVsKGludCB4LCBpbnQgeSwgUmVmIHJlZik7CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgY29tcHV0ZURvdFNpemUoZmluYWwgaW50IGgpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgY29tcHV0ZURvdFNpemUoaW50IGgpIHsKIAkJaW50IGQgPSAoaW50KSAoTWF0aC5taW4oaCwgTEFORV9XSURUSCkgKiAwLjUwZik7CiAJCWQgKz0gKGQgJiAxKTsKIAkJcmV0dXJuIGQ7CkBAIC0yODIsMTIgKzI4MiwxMiBAQAogCSAqLwogCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRyYXdUZXh0KFN0cmluZyBtc2csIGludCB4LCBpbnQgeSk7CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFuZVgoZmluYWwgUGxvdExhbmUgbXlMYW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGxhbmVYKFBsb3RMYW5lIG15TGFuZSkgewogCQlmaW5hbCBpbnQgcCA9IG15TGFuZSAhPSBudWxsID8gbXlMYW5lLmdldFBvc2l0aW9uKCkgOiAwOwogCQlyZXR1cm4gTEVGVF9QQUQgKyBMQU5FX1dJRFRIICogcDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFuZUMoZmluYWwgUGxvdExhbmUgbXlMYW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGxhbmVDKFBsb3RMYW5lIG15TGFuZSkgewogCQlyZXR1cm4gbGFuZVgobXlMYW5lKSArIExBTkVfV0lEVEggLyAyOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdC5qYXZhCmluZGV4IDA5MWJmNjguLjk5MTRiMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YQpAQCAtNzksNyArNzksNyBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHRoaXMgY29tbWl0LgogCSAqLwotCXByb3RlY3RlZCBQbG90Q29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFBsb3RDb21taXQoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCQlmb3JraW5nT2ZmTGFuZXMgPSBOT19MQU5FUzsKIAkJcGFzc2luZ0xhbmVzID0gTk9fTEFORVM7CkBAIC04OCwxOSArODgsMTkgQEAKIAkJcmVmcyA9IE5PX1JFRlM7CiAJfQogCi0Jdm9pZCBhZGRGb3JraW5nT2ZmTGFuZShmaW5hbCBQbG90TGFuZSBmKSB7CisJdm9pZCBhZGRGb3JraW5nT2ZmTGFuZShQbG90TGFuZSBmKSB7CiAJCWZvcmtpbmdPZmZMYW5lcyA9IGFkZExhbmUoZiwgZm9ya2luZ09mZkxhbmVzKTsKIAl9CiAKLQl2b2lkIGFkZFBhc3NpbmdMYW5lKGZpbmFsIFBsb3RMYW5lIGMpIHsKKwl2b2lkIGFkZFBhc3NpbmdMYW5lKFBsb3RMYW5lIGMpIHsKIAkJcGFzc2luZ0xhbmVzID0gYWRkTGFuZShjLCBwYXNzaW5nTGFuZXMpOwogCX0KIAotCXZvaWQgYWRkTWVyZ2luZ0xhbmUoZmluYWwgUGxvdExhbmUgbSkgeworCXZvaWQgYWRkTWVyZ2luZ0xhbmUoUGxvdExhbmUgbSkgewogCQltZXJnaW5nTGFuZXMgPSBhZGRMYW5lKG0sIG1lcmdpbmdMYW5lcyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUGxvdExhbmVbXSBhZGRMYW5lKGZpbmFsIFBsb3RMYW5lIGwsIFBsb3RMYW5lW10gbGFuZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBQbG90TGFuZVtdIGFkZExhbmUoUGxvdExhbmUgbCwgUGxvdExhbmVbXSBsYW5lcykgewogCQlmaW5hbCBpbnQgY250ID0gbGFuZXMubGVuZ3RoOwogCQlpZiAoY250ID09IDApCiAJCQlsYW5lcyA9IG5ldyBQbG90TGFuZVtdIHsgbCB9OwpAQCAtMTE1LDcgKzExNSw3IEBACiAJCXJldHVybiBsYW5lczsKIAl9CiAKLQl2b2lkIGFkZENoaWxkKGZpbmFsIFBsb3RDb21taXQgYykgeworCXZvaWQgYWRkQ2hpbGQoUGxvdENvbW1pdCBjKSB7CiAJCWZpbmFsIGludCBjbnQgPSBjaGlsZHJlbi5sZW5ndGg7CiAJCWlmIChjbnQgPT0gMCkKIAkJCWNoaWxkcmVuID0gbmV3IFBsb3RDb21taXRbXSB7IGMgfTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIGludmFsaWQgY2hpbGQgaW5kZXggd2FzIHNwZWNpZmllZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgUGxvdENvbW1pdCBnZXRDaGlsZChmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIGZpbmFsIFBsb3RDb21taXQgZ2V0Q2hpbGQoaW50IG50aCkgewogCQlyZXR1cm4gY2hpbGRyZW5bbnRoXTsKIAl9CiAKQEAgLTE2Myw4ICsxNjMsOCBAQAogCSAqICAgICAgICAgICAgdGhlIGNvbW1pdCB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29tbWl0IGJ1aWx0IG9uIHRvcCBvZiB0aGlzIGNvbW1pdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NoaWxkKGZpbmFsIFBsb3RDb21taXQgYykgewotCQlmb3IgKGZpbmFsIFBsb3RDb21taXQgYSA6IGNoaWxkcmVuKQorCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGQoUGxvdENvbW1pdCBjKSB7CisJCWZvciAoUGxvdENvbW1pdCBhIDogY2hpbGRyZW4pCiAJCQlpZiAoYSA9PSBjKQogCQkJCXJldHVybiB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CkBAIC0xODksNyArMTg5LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBpbnZhbGlkIHJlZiBpbmRleCB3YXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBmaW5hbCBSZWYgZ2V0UmVmKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgZmluYWwgUmVmIGdldFJlZihpbnQgbnRoKSB7CiAJCXJldHVybiByZWZzW250aF07CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhCmluZGV4IDZhMGJhNjYuLjVlMTUzMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhCkBAIC05NCw3ICs5NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNvdXJjZShmaW5hbCBSZXZXYWxrIHcpIHsKKwlwdWJsaWMgdm9pZCBzb3VyY2UoUmV2V2FsayB3KSB7CiAJCWlmICghKHcgaW5zdGFuY2VvZiBQbG90V2FsaykpCiAJCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmNsYXNzQ2FzdE5vdEEsIFBsb3RXYWxrLmNsYXNzLmdldE5hbWUoKSkpOwogCQlzdXBlci5zb3VyY2Uodyk7CkBAIC0xMjAsMTMgKzEyMCwxMyBAQAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCXB1YmxpYyB2b2lkIGZpbmRQYXNzaW5nVGhyb3VnaChmaW5hbCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQsCiAJCQlmaW5hbCBDb2xsZWN0aW9uPEw+IHJlc3VsdCkgewotCQlmb3IgKGZpbmFsIFBsb3RMYW5lIHAgOiBjdXJyQ29tbWl0LnBhc3NpbmdMYW5lcykKKwkJZm9yIChQbG90TGFuZSBwIDogY3VyckNvbW1pdC5wYXNzaW5nTGFuZXMpCiAJCQlyZXN1bHQuYWRkKChMKSBwKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVudGVyKGZpbmFsIGludCBpbmRleCwgZmluYWwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0KSB7CisJcHJvdGVjdGVkIHZvaWQgZW50ZXIoaW50IGluZGV4LCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQpIHsKIAkJc2V0dXBDaGlsZHJlbihjdXJyQ29tbWl0KTsKIAogCQlmaW5hbCBpbnQgbkNoaWxkcmVuID0gY3VyckNvbW1pdC5nZXRDaGlsZENvdW50KCk7CkBAIC0yMDIsNyArMjAyLDcgQEAKIAkJCWNsb3NlTGFuZShjdXJyQ29tbWl0LmxhbmUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjb250aW51ZUFjdGl2ZUxhbmVzKGZpbmFsIFBsb3RDb21taXQgY3VyckNvbW1pdCkgeworCXByaXZhdGUgdm9pZCBjb250aW51ZUFjdGl2ZUxhbmVzKFBsb3RDb21taXQgY3VyckNvbW1pdCkgewogCQlmb3IgKFBsb3RMYW5lIGxhbmUgOiBhY3RpdmVMYW5lcykKIAkJCWlmIChsYW5lICE9IGN1cnJDb21taXQubGFuZSkKIAkJCQljdXJyQ29tbWl0LmFkZFBhc3NpbmdMYW5lKGxhbmUpOwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgc2V0dXBDaGlsZHJlbihmaW5hbCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQpIHsKKwlwcml2YXRlIHZvaWQgc2V0dXBDaGlsZHJlbihQbG90Q29tbWl0PEw+IGN1cnJDb21taXQpIHsKIAkJZmluYWwgaW50IG5QYXJlbnRzID0gY3VyckNvbW1pdC5nZXRQYXJlbnRDb3VudCgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG5QYXJlbnRzOyBpKyspCiAJCQkoKFBsb3RDb21taXQpIGN1cnJDb21taXQuZ2V0UGFyZW50KGkpKS5hZGRDaGlsZChjdXJyQ29tbWl0KTsKQEAgLTQxNiw3ICs0MTYsNyBAQAogCSAqIEBwYXJhbSBsYW5lCiAJICogICAgICAgICAgICBhIGxhbmUKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWN5Y2xlTGFuZShmaW5hbCBMIGxhbmUpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZWN5Y2xlTGFuZShMIGxhbmUpIHsKIAkJLy8gTm90aGluZy4KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdFdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90V2Fsay5qYXZhCmluZGV4IDhiYThkNmUuLmYyN2YzNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90V2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90V2Fsay5qYXZhCkBAIC05MCw3ICs5MCw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyBQbG90V2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUGxvdFdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlzdXBlci5zb3J0KFJldlNvcnQuVE9QTywgdHJ1ZSk7CiAJCXJldmVyc2VSZWZNYXAgPSByZXBvLmdldEFsbFJlZnNCeVBlZWxlZE9iamVjdElkKCk7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMsIGZpbmFsIGJvb2xlYW4gdXNlKSB7CisJcHVibGljIHZvaWQgc29ydChSZXZTb3J0IHMsIGJvb2xlYW4gdXNlKSB7CiAJCWlmIChzID09IFJldlNvcnQuVE9QTyAmJiAhdXNlKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b3BvbG9naWNhbFNvcnRSZXF1aXJlZCk7CiAJCXN1cGVyLnNvcnQocywgdXNlKTsKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNyZWF0ZUNvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZDb21taXQgY3JlYXRlQ29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCXJldHVybiBuZXcgUGxvdENvbW1pdChpZCk7CiAJfQogCkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJcmV0dXJuIHBjOwogCX0KIAotCXByaXZhdGUgUmVmW10gZ2V0UmVmcyhmaW5hbCBBbnlPYmplY3RJZCBjb21taXRJZCkgeworCXByaXZhdGUgUmVmW10gZ2V0UmVmcyhBbnlPYmplY3RJZCBjb21taXRJZCkgewogCQlDb2xsZWN0aW9uPFJlZj4gbGlzdCA9IHJldmVyc2VSZWZNYXAuZ2V0KGNvbW1pdElkKTsKIAkJaWYgKGxpc3QgPT0gbnVsbCkKIAkJCXJldHVybiBQbG90Q29tbWl0Lk5PX1JFRlM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQWJzdHJhY3RSZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Fic3RyYWN0UmV2UXVldWUuamF2YQppbmRleCBiOTQ4YWRiLi4yNDdhM2JkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQWJzdHJhY3RSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9BYnN0cmFjdFJldlF1ZXVlLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAkgKiBAcGFyYW0gcXVldWVDb250cm9sCiAJICogICAgICAgICAgICBmbGFnIHRoYXQgY29udHJvbHMgYWRtaXNzaW9uIHRvIHRoZSBxdWV1ZS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMsIGZpbmFsIFJldkZsYWcgcXVldWVDb250cm9sKSB7CisJcHVibGljIGZpbmFsIHZvaWQgYWRkKFJldkNvbW1pdCBjLCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgewogCQlpZiAoIWMuaGFzKHF1ZXVlQ29udHJvbCkpIHsKIAkJCWMuYWRkKHF1ZXVlQ29udHJvbCk7CiAJCQlhZGQoYyk7CkBAIC05NCw3ICs5NCw3IEBACiAJICogQHBhcmFtIHF1ZXVlQ29udHJvbAogCSAqICAgICAgICAgICAgZmxhZyB0aGF0IGNvbnRyb2xzIGFkbWlzc2lvbiB0byB0aGUgcXVldWUuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkUGFyZW50cyhmaW5hbCBSZXZDb21taXQgYywgZmluYWwgUmV2RmxhZyBxdWV1ZUNvbnRyb2wpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCBhZGRQYXJlbnRzKFJldkNvbW1pdCBjLCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgewogCQlmaW5hbCBSZXZDb21taXRbXSBwTGlzdCA9IGMucGFyZW50czsKIAkJaWYgKHBMaXN0ID09IG51bGwpCiAJCQlyZXR1cm47CkBAIC0xMzIsNyArMTMyLDcgQEAKIAkgKiBAcGFyYW0gYwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdH0KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVzY3JpYmUoZmluYWwgU3RyaW5nQnVpbGRlciBzLCBmaW5hbCBSZXZDb21taXQgYykgeworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkZXNjcmliZShTdHJpbmdCdWlsZGVyIHMsIFJldkNvbW1pdCBjKSB7CiAJCXMuYXBwZW5kKGMudG9TdHJpbmcoKSk7CiAJCXMuYXBwZW5kKCdcbicpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja09ialF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tPYmpRdWV1ZS5qYXZhCmluZGV4IDM3MWNkMDYuLmZjZGY3OTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja09ialF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrT2JqUXVldWUuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogCQlmcmVlID0gbmV3IEJsb2NrRnJlZUxpc3QoKTsKIAl9CiAKLQl2b2lkIGFkZChmaW5hbCBSZXZPYmplY3QgYykgeworCXZvaWQgYWRkKFJldk9iamVjdCBjKSB7CiAJCUJsb2NrIGIgPSB0YWlsOwogCQlpZiAoYiA9PSBudWxsKSB7CiAJCQliID0gZnJlZS5uZXdCbG9jaygpOwpAQCAtOTgsNyArOTgsNyBAQAogCQkJcmV0dXJuIGI7CiAJCX0KIAotCQl2b2lkIGZyZWVCbG9jayhmaW5hbCBCbG9jayBiKSB7CisJCXZvaWQgZnJlZUJsb2NrKEJsb2NrIGIpIHsKIAkJCWIubmV4dCA9IG5leHQ7CiAJCQluZXh0ID0gYjsKIAkJfQpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCQlyZXR1cm4gaGVhZEluZGV4ID09IHRhaWxJbmRleDsKIAkJfQogCi0JCXZvaWQgYWRkKGZpbmFsIFJldk9iamVjdCBjKSB7CisJCXZvaWQgYWRkKFJldk9iamVjdCBjKSB7CiAJCQlvYmplY3RzW3RhaWxJbmRleCsrXSA9IGM7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrUmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja1JldlF1ZXVlLmphdmEKaW5kZXggNzRhMzUxMS4uNzkzMDdiNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrUmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tSZXZRdWV1ZS5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJCWZyZWUgPSBuZXcgQmxvY2tGcmVlTGlzdCgpOwogCX0KIAotCUJsb2NrUmV2UXVldWUoZmluYWwgR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCUJsb2NrUmV2UXVldWUoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmcmVlID0gbmV3IEJsb2NrRnJlZUxpc3QoKTsKIAkJb3V0cHV0VHlwZSA9IHMub3V0cHV0VHlwZSgpOwpAQCAtODUsNyArODUsNyBAQAogCSAqIHNoYXJpbmcgdGhlIHNhbWUgZnJlZSBsaXN0IGFyZSBkb2luZyBzbyBmcm9tIG9ubHkgYSBzaW5nbGUgdGhyZWFkLgogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJcHVibGljIHZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJZnJlZSA9IHEuZnJlZTsKIAl9CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQkJcmV0dXJuIGI7CiAJCX0KIAotCQl2b2lkIGZyZWVCbG9jayhmaW5hbCBCbG9jayBiKSB7CisJCXZvaWQgZnJlZUJsb2NrKEJsb2NrIGIpIHsKIAkJCWIubmV4dCA9IG5leHQ7CiAJCQluZXh0ID0gYjsKIAkJfQpAQCAtMTM4LDExICsxMzgsMTEgQEAKIAkJCXJldHVybiBoZWFkSW5kZXggPiAwOwogCQl9CiAKLQkJdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJCWNvbW1pdHNbdGFpbEluZGV4KytdID0gYzsKIAkJfQogCi0JCXZvaWQgdW5wb3AoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJdm9pZCB1bnBvcChSZXZDb21taXQgYykgewogCQkJY29tbWl0c1stLWhlYWRJbmRleF0gPSBjOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Cb3VuZGFyeUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0JvdW5kYXJ5R2VuZXJhdG9yLmphdmEKaW5kZXggNmJlMGM4NS4uMGZkNjYyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0JvdW5kYXJ5R2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0JvdW5kYXJ5R2VuZXJhdG9yLmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIAogCUdlbmVyYXRvciBnOwogCi0JQm91bmRhcnlHZW5lcmF0b3IoZmluYWwgUmV2V2FsayB3LCBmaW5hbCBHZW5lcmF0b3IgcykgeworCUJvdW5kYXJ5R2VuZXJhdG9yKFJldldhbGsgdywgR2VuZXJhdG9yIHMpIHsKIAkJZyA9IG5ldyBJbml0aWFsR2VuZXJhdG9yKHcsIHMpOwogCX0KIApAQCAtNjQsNyArNjQsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwl2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCWcuc2hhcmVGcmVlTGlzdChxKTsKIAl9CiAKQEAgLTg1LDcgKzg1LDcgQEAKIAogCQlwcml2YXRlIGZpbmFsIEdlbmVyYXRvciBzb3VyY2U7CiAKLQkJSW5pdGlhbEdlbmVyYXRvcihmaW5hbCBSZXZXYWxrIHcsIGZpbmFsIEdlbmVyYXRvciBzKSB7CisJCUluaXRpYWxHZW5lcmF0b3IoUmV2V2FsayB3LCBHZW5lcmF0b3IgcykgewogCQkJd2FsayA9IHc7CiAJCQloZWxkID0gbmV3IEZJRk9SZXZRdWV1ZSgpOwogCQkJc291cmNlID0gczsKQEAgLTk4LDcgKzk4LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJCXEuc2hhcmVGcmVlTGlzdChoZWxkKTsKIAkJfQogCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlSZXZDb21taXQgYyA9IHNvdXJjZS5uZXh0KCk7CiAJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykKKwkJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQogCQkJCQlpZiAoKHAuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSAhPSAwKQogCQkJCQkJaGVsZC5hZGQocCk7CiAJCQkJcmV0dXJuIGM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGF0ZVJldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGF0ZVJldlF1ZXVlLmphdmEKaW5kZXggYzk5M2ZlNS4uYjg2ZTg3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RhdGVSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EYXRlUmV2UXVldWUuamF2YQpAQCAtNzYsNyArNzYsNyBAQAogCQlzdXBlcigpOwogCX0KIAotCURhdGVSZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJRGF0ZVJldlF1ZXVlKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZm9yICg7OykgewogCQkJZmluYWwgUmV2Q29tbWl0IGMgPSBzLm5leHQoKTsKQEAgLTg4LDcgKzg4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCXNpbmNlTGFzdEluZGV4Kys7CiAJCWlmICgrK2luUXVldWUgPiBSRUJVSUxEX0lOREVYX0NPVU5UCiAJCQkJJiYgc2luY2VMYXN0SW5kZXggPiBSRUJVSUxEX0lOREVYX0NPVU5UKQpAQCAtMTgxLDcgKzE4MSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEVudHJ5IHEgPSBoZWFkOyBxICE9IG51bGw7IHEgPSBxLm5leHQpIHsKIAkJCWlmICgocS5jb21taXQuZmxhZ3MgJiBmKSA9PSAwKQogCQkJCXJldHVybiBmYWxzZTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGFueWJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoRW50cnkgcSA9IGhlYWQ7IHEgIT0gbnVsbDsgcSA9IHEubmV4dCkgewogCQkJaWYgKChxLmNvbW1pdC5mbGFncyAmIGYpICE9IDApCiAJCQkJcmV0dXJuIHRydWU7CkBAIC0yMTIsNyArMjEyLDcgQEAKIAkJcmV0dXJuIHMudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIEVudHJ5IG5ld0VudHJ5KGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHJpdmF0ZSBFbnRyeSBuZXdFbnRyeShSZXZDb21taXQgYykgewogCQlFbnRyeSByID0gZnJlZTsKIAkJaWYgKHIgPT0gbnVsbCkKIAkJCXIgPSBuZXcgRW50cnkoKTsKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZnJlZUVudHJ5KGZpbmFsIEVudHJ5IGUpIHsKKwlwcml2YXRlIHZvaWQgZnJlZUVudHJ5KEVudHJ5IGUpIHsKIAkJZS5uZXh0ID0gZnJlZTsKIAkJZnJlZSA9IGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlbGF5UmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZWxheVJldlF1ZXVlLmphdmEKaW5kZXggNGEwZDE5ZC4uYzM5N2EwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlbGF5UmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVsYXlSZXZRdWV1ZS5qYXZhCkBAIC02OSw3ICs2OSw3IEBACiAKIAlwcml2YXRlIGludCBzaXplOwogCi0JRGVsYXlSZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgZykgeworCURlbGF5UmV2UXVldWUoR2VuZXJhdG9yIGcpIHsKIAkJcGVuZGluZyA9IGc7CiAJCWRlbGF5ID0gbmV3IEZJRk9SZXZRdWV1ZSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZXB0aEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEKaW5kZXggYWQwNTE4Ni4uZWFlYzMwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwl2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCXBlbmRpbmcuc2hhcmVGcmVlTGlzdChxKTsKIAl9CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAJCQlpbnQgbmV3RGVwdGggPSBjLmRlcHRoICsgMTsKIAotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykgeworCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykgewogCQkJCURlcHRoV2Fsay5Db21taXQgZHAgPSAoRGVwdGhXYWxrLkNvbW1pdCkgcDsKIAogCQkJCS8vIElmIG5vIGRlcHRoIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoaXMgY29tbWl0LCBhc3NpZ24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GSUZPUmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GSUZPUmV2UXVldWUuamF2YQppbmRleCA2M2I3OTkwLi5jZGIwODRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRklGT1JldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZJRk9SZXZRdWV1ZS5qYXZhCkBAIC02MywxNCArNjMsMTQgQEAKIAkJc3VwZXIoKTsKIAl9CiAKLQlGSUZPUmV2UXVldWUoZmluYWwgR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCUZJRk9SZXZRdWV1ZShHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXN1cGVyKHMpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCUJsb2NrIGIgPSB0YWlsOwogCQlpZiAoYiA9PSBudWxsKSB7CiAJCQliID0gZnJlZS5uZXdCbG9jaygpOwpAQCAtOTIsNyArOTIsNyBAQAogCSAqIEBwYXJhbSBjCiAJICogICAgICAgICAgICB0aGUgY29tbWl0IHRvIGluc2VydCBpbnRvIHRoZSBxdWV1ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB1bnBvcChmaW5hbCBSZXZDb21taXQgYykgeworCXB1YmxpYyB2b2lkIHVucG9wKFJldkNvbW1pdCBjKSB7CiAJCUJsb2NrIGIgPSBoZWFkOwogCQlpZiAoYiA9PSBudWxsKSB7CiAJCQliID0gZnJlZS5uZXdCbG9jaygpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCiAJCQkJaWYgKChiLmNvbW1pdHNbaV0uZmxhZ3MgJiBmKSA9PSAwKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChCbG9jayBiID0gaGVhZDsgYiAhPSBudWxsOyBiID0gYi5uZXh0KSB7CiAJCQlmb3IgKGludCBpID0gYi5oZWFkSW5kZXg7IGkgPCBiLnRhaWxJbmRleDsgaSsrKQogCQkJCWlmICgoYi5jb21taXRzW2ldLmZsYWdzICYgZikgIT0gMCkKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0Jdm9pZCByZW1vdmVGbGFnKGZpbmFsIGludCBmKSB7CisJdm9pZCByZW1vdmVGbGFnKGludCBmKSB7CiAJCWZpbmFsIGludCBub3RfZiA9IH5mOwogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IuamF2YQppbmRleCA5ZDczNGE3Li40ZTZkN2U2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIGZpbmFsIGNsYXNzIEZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogCXByaXZhdGUgZmluYWwgR2VuZXJhdG9yIHBlbmRpbmc7CiAKLQlGaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yKGZpbmFsIEdlbmVyYXRvciBnKSB7CisJRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvcihHZW5lcmF0b3IgZykgewogCQlwZW5kaW5nID0gZzsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb2xsb3dGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb2xsb3dGaWx0ZXIuamF2YQppbmRleCAyZGE5N2M4Li5kYWUzYWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9sbG93RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZvbGxvd0ZpbHRlci5qYXZhCkBAIC05NSw3ICs5NSw3IEBACiAKIAlwcml2YXRlIFJlbmFtZUNhbGxiYWNrIHJlbmFtZUNhbGxiYWNrOwogCi0JRm9sbG93RmlsdGVyKGZpbmFsIFBhdGhGaWx0ZXIgcGF0aCwgZmluYWwgRGlmZkNvbmZpZyBjZmcpIHsKKwlGb2xsb3dGaWx0ZXIoUGF0aEZpbHRlciBwYXRoLCBEaWZmQ29uZmlnIGNmZykgewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQl0aGlzLmNmZyA9IGNmZzsKIAl9CkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHBhdGguaW5jbHVkZSh3YWxrZXIpICYmIEFOWV9ESUZGLmluY2x1ZGUod2Fsa2VyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJLZXkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJLZXkuamF2YQppbmRleCAzNjBiZTI5Li40NWQ1ZjgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlcktleS5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAJICogQHBhcmFtIGtleU5hbWUKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGZvb3RlciBsaW5lLgogCSAqLwotCXB1YmxpYyBGb290ZXJLZXkoZmluYWwgU3RyaW5nIGtleU5hbWUpIHsKKwlwdWJsaWMgRm9vdGVyS2V5KFN0cmluZyBrZXlOYW1lKSB7CiAJCW5hbWUgPSBrZXlOYW1lOwogCQlyYXcgPSBDb25zdGFudHMuZW5jb2RlKGtleU5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmUuamF2YQppbmRleCAwNzRjZTgyLi5kNmZlZDY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKIAkgKiAgICAgICAgICAgIGtleSB0byB0ZXN0IHRoaXMgbGluZSdzIGtleSBuYW1lIGFnYWluc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHtAY29kZSBrZXkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZWNhc2UoZ2V0S2V5KCkpfS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIEZvb3RlcktleSBrZXkpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEZvb3RlcktleSBrZXkpIHsKIAkJZmluYWwgYnl0ZVtdIGtSYXcgPSBrZXkucmF3OwogCQlmaW5hbCBpbnQgbGVuID0ga1Jhdy5sZW5ndGg7CiAJCWludCBiUHRyID0ga2V5U3RhcnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvR2VuZXJhdG9yLmphdmEKaW5kZXggYTk1MzAzYi4uYjJjOTJlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0dlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9HZW5lcmF0b3IuamF2YQpAQCAtODEsNyArODEsNyBAQAogCSAqIEBwYXJhbSBxCiAJICogICAgICAgICAgICBhbm90aGVyIEZJRk8gcXVldWUgdGhhdCB3YW50cyB0byBzaGFyZSBvdXIgcXVldWUncyBmcmVlIGxpc3QuCiAJICovCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LgogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0xJRk9SZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0xJRk9SZXZRdWV1ZS5qYXZhCmluZGV4IGY3MzRiNjkuLjg0NmI4ZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9MSUZPUmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTElGT1JldlF1ZXVlLmphdmEKQEAgLTYyLDE0ICs2MiwxNCBAQAogCQlzdXBlcigpOwogCX0KIAotCUxJRk9SZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJTElGT1JldlF1ZXVlKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJc3VwZXIocyk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJQmxvY2sgYiA9IGhlYWQ7CiAJCWlmIChiID09IG51bGwgfHwgIWIuY2FuVW5wb3AoKSkgewogCQkJYiA9IGZyZWUubmV3QmxvY2soKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CisJYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChCbG9jayBiID0gaGVhZDsgYiAhPSBudWxsOyBiID0gYi5uZXh0KSB7CiAJCQlmb3IgKGludCBpID0gYi5oZWFkSW5kZXg7IGkgPCBiLnRhaWxJbmRleDsgaSsrKQogCQkJCWlmICgoYi5jb21taXRzW2ldLmZsYWdzICYgZikgPT0gMCkKQEAgLTExMyw3ICsxMTMsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGFueWJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoQmxvY2sgYiA9IGhlYWQ7IGIgIT0gbnVsbDsgYiA9IGIubmV4dCkgewogCQkJZm9yIChpbnQgaSA9IGIuaGVhZEluZGV4OyBpIDwgYi50YWlsSW5kZXg7IGkrKykKIAkJCQlpZiAoKGIuY29tbWl0c1tpXS5mbGFncyAmIGYpICE9IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTWVyZ2VCYXNlR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTWVyZ2VCYXNlR2VuZXJhdG9yLmphdmEKaW5kZXggNzNjZTk4NS4uMmZlOTUzMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL01lcmdlQmFzZUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9NZXJnZUJhc2VHZW5lcmF0b3IuamF2YQpAQCAtODQsMTIgKzg0LDEyIEBACiAKIAlwcml2YXRlIENhcnJ5U3RhY2sgc3RhY2s7CiAKLQlNZXJnZUJhc2VHZW5lcmF0b3IoZmluYWwgUmV2V2FsayB3KSB7CisJTWVyZ2VCYXNlR2VuZXJhdG9yKFJldldhbGsgdykgewogCQl3YWxrZXIgPSB3OwogCQlwZW5kaW5nID0gbmV3IERhdGVSZXZRdWV1ZSgpOwogCX0KIAotCXZvaWQgaW5pdChmaW5hbCBBYnN0cmFjdFJldlF1ZXVlIHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBpbml0KEFic3RyYWN0UmV2UXVldWUgcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZvciAoOzspIHsKIAkJCQlmaW5hbCBSZXZDb21taXQgYyA9IHAubmV4dCgpOwpAQCAtMTE5LDcgKzExOSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHJpdmF0ZSB2b2lkIGFkZChSZXZDb21taXQgYykgewogCQlmaW5hbCBpbnQgZmxhZyA9IHdhbGtlci5hbGxvY0ZsYWcoKTsKIAkJYnJhbmNoTWFzayB8PSBmbGFnOwogCQlpZiAoKGMuZmxhZ3MgJiBicmFuY2hNYXNrKSAhPSAwKSB7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykgeworCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykgewogCQkJCWlmICgocC5mbGFncyAmIElOX1BFTkRJTkcpICE9IDApCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmICgocC5mbGFncyAmIFBBUlNFRCkgPT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCmluZGV4IDI1YzNlMTIuLmU1OTAzYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQpAQCAtMTE5LDcgKzExOSw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyBPYmplY3RXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBPYmplY3RXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQl0aGlzKHJlcG8ubmV3T2JqZWN0UmVhZGVyKCkpOwogCX0KIApAQCAtNjk5LDcgKzY5OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlc2V0KGZpbmFsIGludCByZXRhaW5GbGFncykgeworCXByb3RlY3RlZCB2b2lkIHJlc2V0KGludCByZXRhaW5GbGFncykgewogCQlzdXBlci5yZXNldChyZXRhaW5GbGFncyk7CiAKIAkJZm9yIChSZXZPYmplY3Qgb2JqIDogcm9vdE9iamVjdHMpCkBAIC03MTEsNyArNzExLDcgQEAKIAkJZnJlZVZpc2l0ID0gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT2JqZWN0KGZpbmFsIFJldk9iamVjdCBvKSB7CisJcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChSZXZPYmplY3QgbykgewogCQlpZiAoKG8uZmxhZ3MgJiBJTl9QRU5ESU5HKSA9PSAwKSB7CiAJCQlvLmZsYWdzIHw9IElOX1BFTkRJTkc7CiAJCQlyb290T2JqZWN0cy5hZGQobyk7CkBAIC03MTksNyArNzE5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrVHJlZVVuaW50ZXJlc3RpbmcoZmluYWwgUmV2VHJlZSB0cmVlKQorCXByaXZhdGUgdm9pZCBtYXJrVHJlZVVuaW50ZXJlc3RpbmcoUmV2VHJlZSB0cmVlKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWlmICgodHJlZS5mbGFncyAmIFVOSU5URVJFU1RJTkcpICE9IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUGVuZGluZ0dlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1BlbmRpbmdHZW5lcmF0b3IuamF2YQppbmRleCA5NGFlMmM5Li5lNjA3YjdkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUGVuZGluZ0dlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9QZW5kaW5nR2VuZXJhdG9yLmphdmEKQEAgLTE0MCw3ICsxNDAsNyBAQAogCQkJCQlwcm9kdWNlID0gZmlsdGVyLmluY2x1ZGUod2Fsa2VyLCBjKTsKIAkJCQl9CiAKLQkJCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykgewogCQkJCQlpZiAoKHAuZmxhZ3MgJiBTRUVOKSAhPSAwKQogCQkJCQkJY29udGludWU7CiAJCQkJCWlmICgocC5mbGFncyAmIFBBUlNFRCkgPT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZCbG9iLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2QmxvYi5qYXZhCmluZGV4IGQzNTI5MjkuLmNjNWUzZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZCbG9iLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkJsb2IuamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IG5hbWUgZm9yIHRoZSBibG9iLgogCSAqLwotCXByb3RlY3RlZCBSZXZCbG9iKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldkJsb2IoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdC5qYXZhCmluZGV4IDlkYjE0NjcuLmI2N2Y5MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwpAQCAtMTQ4LDE4ICsxNDgsMTggQEAKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCBuYW1lIGZvciB0aGUgY29tbWl0LgogCSAqLwotCXByb3RlY3RlZCBSZXZDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHBhcnNlSGVhZGVycyhmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXZvaWQgcGFyc2VIZWFkZXJzKFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXBhcnNlQ2Fub25pY2FsKHdhbGssIHdhbGsuZ2V0Q2FjaGVkQnl0ZXModGhpcykpOwogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgcGFyc2VCb2R5KGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJdm9pZCBwYXJzZUJvZHkoUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAJCQlidWZmZXIgPSB3YWxrLmdldENhY2hlZEJ5dGVzKHRoaXMpOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJCX0KIAl9CiAKLQl2b2lkIHBhcnNlQ2Fub25pY2FsKGZpbmFsIFJldldhbGsgd2FsaywgZmluYWwgYnl0ZVtdIHJhdykKKwl2b2lkIHBhcnNlQ2Fub25pY2FsKFJldldhbGsgd2FsaywgYnl0ZVtdIHJhdykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghd2Fsay5zaGFsbG93Q29tbWl0c0luaXRpYWxpemVkKQogCQkJd2Fsay5pbml0aWFsaXplU2hhbGxvd0NvbW1pdHMoKTsKQEAgLTMxMCw3ICszMTAsNyBAQAogCSAqIEBwYXJhbSBmbGFnCiAJICogICAgICAgICAgICB0aGUgc2luZ2xlIGZsYWcgdmFsdWUgdG8gY2FycnkgYmFjayBvbnRvIHBhcmVudHMuCiAJICovCi0JcHVibGljIHZvaWQgY2FycnkoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIHZvaWQgY2FycnkoUmV2RmxhZyBmbGFnKSB7CiAJCWZpbmFsIGludCBjYXJyeSA9IGZsYWdzICYgZmxhZy5tYXNrOwogCQlpZiAoY2FycnkgIT0gMCkKIAkJCWNhcnJ5RmxhZ3ModGhpcywgY2FycnkpOwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gaW52YWxpZCBwYXJlbnQgaW5kZXggd2FzIHNwZWNpZmllZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgUmV2Q29tbWl0IGdldFBhcmVudChmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIGZpbmFsIFJldkNvbW1pdCBnZXRQYXJlbnQoaW50IG50aCkgewogCQlyZXR1cm4gcGFyZW50c1tudGhdOwogCX0KIApAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCXJldHVybiBzdHI7CiAJfQogCi0Jc3RhdGljIGJvb2xlYW4gaGFzTEYoZmluYWwgYnl0ZVtdIHIsIGludCBiLCBmaW5hbCBpbnQgZSkgeworCXN0YXRpYyBib29sZWFuIGhhc0xGKGJ5dGVbXSByLCBpbnQgYiwgaW50IGUpIHsKIAkJd2hpbGUgKGIgPCBlKQogCQkJaWYgKHJbYisrXSA9PSAnXG4nKQogCQkJCXJldHVybiB0cnVlOwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJCXRyeSB7CiAJCQlyZXR1cm4gZ2V0RW5jb2RpbmcoKTsKIAkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIHwgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVVEZfODsKKwkJCXJldHVybiBDSEFSU0VUOwogCQl9CiAJfQogCkBAIC02MTUsNyArNjE1LDcgQEAKIAkgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHRoZXJlIGFyZSBubyBmb290ZXJzIGF0IGFsbC4KIAkgKiBAc2VlICNnZXRGb290ZXJMaW5lcygpCiAJICovCi0JcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhmaW5hbCBTdHJpbmcga2V5TmFtZSkgeworCXB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Rm9vdGVyTGluZXMoU3RyaW5nIGtleU5hbWUpIHsKIAkJcmV0dXJuIGdldEZvb3RlckxpbmVzKG5ldyBGb290ZXJLZXkoa2V5TmFtZSkpOwogCX0KIApAQCAtNjMwLDEyICs2MzAsMTIgQEAKIAkgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHRoZXJlIGFyZSBubyBmb290ZXJzIGF0IGFsbC4KIAkgKiBAc2VlICNnZXRGb290ZXJMaW5lcygpCiAJICovCi0JcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhmaW5hbCBGb290ZXJLZXkga2V5TmFtZSkgeworCXB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Rm9vdGVyTGluZXMoRm9vdGVyS2V5IGtleU5hbWUpIHsKIAkJZmluYWwgTGlzdDxGb290ZXJMaW5lPiBzcmMgPSBnZXRGb290ZXJMaW5lcygpOwogCQlpZiAoc3JjLmlzRW1wdHkoKSkKIAkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKIAkJZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gciA9IG5ldyBBcnJheUxpc3Q8PihzcmMuc2l6ZSgpKTsKLQkJZm9yIChmaW5hbCBGb290ZXJMaW5lIGYgOiBzcmMpIHsKKwkJZm9yIChGb290ZXJMaW5lIGYgOiBzcmMpIHsKIAkJCWlmIChmLm1hdGNoZXMoa2V5TmFtZSkpCiAJCQkJci5hZGQoZi5nZXRWYWx1ZSgpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRMaXN0LmphdmEKaW5kZXggMzhjZjNmNS4uZDJmZGEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0TGlzdC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAJICogICAgICAgICAgICAgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgd2FzIG5vdCBmb3VuZC4gUmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgIGNvcnJ1cHRpb24gbWF5IGhhdmUgb2NjdXJyZWQuCiAJICovCi0JcHVibGljIHZvaWQgYXBwbHlGbGFnKGZpbmFsIFJldkZpbHRlciBtYXRjaGluZywgZmluYWwgUmV2RmxhZyBmbGFnKQorCXB1YmxpYyB2b2lkIGFwcGx5RmxhZyhSZXZGaWx0ZXIgbWF0Y2hpbmcsIFJldkZsYWcgZmxhZykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlhcHBseUZsYWcobWF0Y2hpbmcsIGZsYWcsIDAsIHNpemUoKSk7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHJlbW92ZS4gQXBwbGljYXRpb25zIGFyZSByZXNwb25zaWJsZSBmb3IKIAkgKiAgICAgICAgICAgIGFsbG9jYXRpbmcgdGhpcyBmbGFnIGZyb20gdGhlIHNvdXJjZSBSZXZXYWxrLgogCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyRmxhZyhmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBjbGVhckZsYWcoUmV2RmxhZyBmbGFnKSB7CiAJCWNsZWFyRmxhZyhmbGFnLCAwLCBzaXplKCkpOwogCX0KIApAQCAtMjA3LDcgKzIwNyw3IEBACiAJICogQHJldHVybiBpbmRleCBvZiB0aGUgZmlyc3QgY29tbWl0IGF0IG9yIGFmdGVyIGluZGV4IDxjb2RlPmJlZ2luPC9jb2RlPgogCSAqICAgICAgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBmbGFnIHNldCBvbiBpdDsgLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCiAJICovCi0JcHVibGljIGludCBpbmRleE9mKGZpbmFsIFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CisJcHVibGljIGludCBpbmRleE9mKFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CiAJCXdoaWxlIChiZWdpbiA8IHNpemUoKSkgewogCQkJaW50IGluZGV4ID0gYmVnaW47CiAJCQlCbG9jayBzID0gY29udGVudHM7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAkgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBmaXJzdCBjb21taXQgYXQgb3IgYmVmb3JlIGluZGV4IDxjb2RlPmJlZ2luPC9jb2RlPgogCSAqICAgICAgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBmbGFnIHNldCBvbiBpdDsgLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCiAJICovCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihmaW5hbCBSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgeworCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoUmV2RmxhZyBmbGFnLCBpbnQgYmVnaW4pIHsKIAkJYmVnaW4gPSBNYXRoLm1pbihiZWdpbiwgc2l6ZSgpIC0gMSk7CiAJCXdoaWxlIChiZWdpbiA+PSAwKSB7CiAJCQlpbnQgaW5kZXggPSBiZWdpbjsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHdhbGtlciB0byBwb3B1bGF0ZSBmcm9tLgogCSAqIEBzZWUgI2ZpbGxUbyhpbnQpCiAJICovCi0JcHVibGljIHZvaWQgc291cmNlKGZpbmFsIFJldldhbGsgdykgeworCXB1YmxpYyB2b2lkIHNvdXJjZShSZXZXYWxrIHcpIHsKIAkJd2Fsa2VyID0gdzsKIAl9CiAKQEAgLTI5OSw3ICsyOTksNyBAQAogCSAqICAgICAgICAgICAgIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGsjbmV4dCgpfQogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGZpbGxUbyhmaW5hbCBpbnQgaGlnaE1hcmspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgaGlnaE1hcmspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAod2Fsa2VyID09IG51bGwgfHwgc2l6ZSA+IGhpZ2hNYXJrKQogCQkJcmV0dXJuOwpAQCAtMzY0LDcgKzM2NCw3IEBACiAJICogICAgICAgICAgICAgc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsayNuZXh0KCl9CiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgZmlsbFRvKGZpbmFsIFJldkNvbW1pdCBjb21taXRUb0xvYWQsIGludCBoaWdoTWFyaykKKwlwdWJsaWMgdm9pZCBmaWxsVG8oUmV2Q29tbWl0IGNvbW1pdFRvTG9hZCwgaW50IGhpZ2hNYXJrKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWlmICh3YWxrZXIgPT0gbnVsbCB8fCBjb21taXRUb0xvYWQgPT0gbnVsbApAQCAtNDE5LDcgKzQxOSw3IEBACiAJICogQHBhcmFtIGUKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQgKG9yIHNldCkgaW50byB0aGUgbGlzdC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcihmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIEUgZSkgeworCXByb3RlY3RlZCB2b2lkIGVudGVyKGludCBpbmRleCwgRSBlKSB7CiAJCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWcuamF2YQppbmRleCAxZTc5ODY3Li40MTNhNTUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAKIAogCWZpbmFsIGludCBtYXNrOwogCi0JUmV2RmxhZyhmaW5hbCBSZXZXYWxrIHcsIGZpbmFsIFN0cmluZyBuLCBmaW5hbCBpbnQgbSkgeworCVJldkZsYWcoUmV2V2FsayB3LCBTdHJpbmcgbiwgaW50IG0pIHsKIAkJd2Fsa2VyID0gdzsKIAkJbmFtZSA9IG47CiAJCW1hc2sgPSBtOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJfQogCiAJc3RhdGljIGNsYXNzIFN0YXRpY1JldkZsYWcgZXh0ZW5kcyBSZXZGbGFnIHsKLQkJU3RhdGljUmV2RmxhZyhmaW5hbCBTdHJpbmcgbiwgZmluYWwgaW50IG0pIHsKKwkJU3RhdGljUmV2RmxhZyhTdHJpbmcgbiwgaW50IG0pIHsKIAkJCXN1cGVyKG51bGwsIG4sIG0pOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnU2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZ1NldC5qYXZhCmluZGV4IDk3NDBkMTQuLjQ1YTczMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnU2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWdTZXQuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICB0aGUgc2V0IHRvIGNvcHkgZmxhZ3MgZnJvbS4KIAkgKi8KLQlwdWJsaWMgUmV2RmxhZ1NldChmaW5hbCBSZXZGbGFnU2V0IHMpIHsKKwlwdWJsaWMgUmV2RmxhZ1NldChSZXZGbGFnU2V0IHMpIHsKIAkJbWFzayA9IHMubWFzazsKIAkJYWN0aXZlID0gbmV3IEFycmF5TGlzdDw+KHMuYWN0aXZlKTsKIAl9CkBAIC04NCwxNCArODQsMTQgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gdG8gY29weSBmbGFncyBmcm9tLgogCSAqLwotCXB1YmxpYyBSZXZGbGFnU2V0KGZpbmFsIENvbGxlY3Rpb248UmV2RmxhZz4gcykgeworCXB1YmxpYyBSZXZGbGFnU2V0KENvbGxlY3Rpb248UmV2RmxhZz4gcykgewogCQl0aGlzKCk7CiAJCWFkZEFsbChzKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKIAkJaWYgKG8gaW5zdGFuY2VvZiBSZXZGbGFnKQogCQkJcmV0dXJuIChtYXNrICYgKChSZXZGbGFnKSBvKS5tYXNrKSAhPSAwOwogCQlyZXR1cm4gZmFsc2U7CkBAIC05OSw3ICs5OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKGZpbmFsIENvbGxlY3Rpb248Pz4gYykgeworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewogCQlpZiAoYyBpbnN0YW5jZW9mIFJldkZsYWdTZXQpIHsKIAkJCWZpbmFsIGludCBjTWFzayA9ICgoUmV2RmxhZ1NldCkgYykubWFzazsKIAkJCXJldHVybiAobWFzayAmIGNNYXNrKSA9PSBjTWFzazsKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZGQoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIGJvb2xlYW4gYWRkKFJldkZsYWcgZmxhZykgewogCQlpZiAoKG1hc2sgJiBmbGFnLm1hc2spICE9IDApCiAJCQlyZXR1cm4gZmFsc2U7CiAJCW1hc2sgfD0gZmxhZy5tYXNrOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewogCQlmaW5hbCBSZXZGbGFnIGZsYWcgPSAoUmV2RmxhZykgbzsKIAkJaWYgKChtYXNrICYgZmxhZy5tYXNrKSA9PSAwKQogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdC5qYXZhCmluZGV4IDRhODgxMDUuLmVlZjliZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0LmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAogCWludCBmbGFnczsKIAotCVJldk9iamVjdChmaW5hbCBBbnlPYmplY3RJZCBuYW1lKSB7CisJUmV2T2JqZWN0KEFueU9iamVjdElkIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQogCkBAIC05Myw3ICs5Myw3IEBACiAJICogICAgICAgICAgICB0aGUgZmxhZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhZyBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIG9iamVjdDsgZmFsc2UgaWYgbm90LgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhcyhmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXMoUmV2RmxhZyBmbGFnKSB7CiAJCXJldHVybiAoZmxhZ3MgJiBmbGFnLm1hc2spICE9IDA7CiAJfQogCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkgKiBAcmV0dXJuIHRydWUgaWYgYW55IGZsYWcgaW4gdGhlIHNldCBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIG9iamVjdDsgZmFsc2UKIAkgKiAgICAgICAgIGlmIG5vdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbnkoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbnkoUmV2RmxhZ1NldCBzZXQpIHsKIAkJcmV0dXJuIChmbGFncyAmIHNldC5tYXNrKSAhPSAwOwogCX0KIApAQCAtMTE3LDcgKzExNyw3IEBACiAJICogQHJldHVybiB0cnVlIGlmIGFsbCBmbGFncyBvZiB0aGUgc2V0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIG9iamVjdDsKIAkgKiAgICAgICAgIGZhbHNlIGlmIHNvbWUgb3Igbm9uZSBoYXZlIGJlZW4gYWRkZWQuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxsKGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxsKFJldkZsYWdTZXQgc2V0KSB7CiAJCXJldHVybiAoZmxhZ3MgJiBzZXQubWFzaykgPT0gc2V0Lm1hc2s7CiAJfQogCkBAIC0xMjksNyArMTI5LDcgQEAKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gbWFyayBvbiB0aGlzIG9iamVjdCwgZm9yIGxhdGVyIHRlc3RpbmcuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChSZXZGbGFnIGZsYWcpIHsKIAkJZmxhZ3MgfD0gZmxhZy5tYXNrOwogCX0KIApAQCAtMTM5LDcgKzEzOSw3IEBACiAJICogQHBhcmFtIHNldAogCSAqICAgICAgICAgICAgdGhlIHNldCBvZiBmbGFncyB0byBtYXJrIG9uIHRoaXMgb2JqZWN0LCBmb3IgbGF0ZXIgdGVzdGluZy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCBhZGQoUmV2RmxhZ1NldCBzZXQpIHsKIAkJZmxhZ3MgfD0gc2V0Lm1hc2s7CiAJfQogCkBAIC0xNTEsNyArMTUxLDcgQEAKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gcmVtb3ZlIGZyb20gdGhpcyBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShSZXZGbGFnIGZsYWcpIHsKIAkJZmxhZ3MgJj0gfmZsYWcubWFzazsKIAl9CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCSAqIEBwYXJhbSBzZXQKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHJlbW92ZSBmcm9tIHRoaXMgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShmaW5hbCBSZXZGbGFnU2V0IHNldCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShSZXZGbGFnU2V0IHNldCkgewogCQlmbGFncyAmPSB+c2V0Lm1hc2s7CiAJfQogCkBAIC0xODMsNyArMTgzLDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgYnVmZmVyIHRvIGFwcGVuZCBhIGRlYnVnIGRlc2NyaXB0aW9uIG9mIGNvcmUgUmV2RmxhZ3Mgb250by4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRDb3JlRmxhZ3MoZmluYWwgU3RyaW5nQnVpbGRlciBzKSB7CisJcHJvdGVjdGVkIHZvaWQgYXBwZW5kQ29yZUZsYWdzKFN0cmluZ0J1aWxkZXIgcykgewogCQlzLmFwcGVuZCgoZmxhZ3MgJiBSZXZXYWxrLlRPUE9fREVMQVkpICE9IDAgPyAnbycgOiAnLScpOwogCQlzLmFwcGVuZCgoZmxhZ3MgJiBSZXZXYWxrLlRFTVBfTUFSSykgIT0gMCA/ICd0JyA6ICctJyk7CiAJCXMuYXBwZW5kKChmbGFncyAmIFJldldhbGsuUkVXUklURSkgIT0gMCA/ICdyJyA6ICctJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdExpc3QuamF2YQppbmRleCAyYmI0NDI3Li4yZjIxZTE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RMaXN0LmphdmEKQEAgLTgyLDcgKzgyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIGludCBpbmRleCwgZmluYWwgRSBlbGVtZW50KSB7CisJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAJCWlmIChpbmRleCAhPSBzaXplKQogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS51bnN1cHBvcnRlZE9wZXJhdGlvbk5vdEFkZEF0RW5kLApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKIAkJZmluYWwgaW50IHNoaWZ0OwogCi0JCUJsb2NrKGZpbmFsIGludCBzKSB7CisJCUJsb2NrKGludCBzKSB7CiAJCQlzaGlmdCA9IHM7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnLmphdmEKaW5kZXggZDc0ODM3ZS4uMDA1MGJhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWcuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsazsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0xMzcsMTggKzEzNywxOCBAQAogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IG5hbWUgZm9yIHRoZSB0YWcuCiAJICovCi0JcHJvdGVjdGVkIFJldlRhZyhmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZUYWcoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgcGFyc2VIZWFkZXJzKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJdm9pZCBwYXJzZUhlYWRlcnMoUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcGFyc2VDYW5vbmljYWwod2Fsaywgd2Fsay5nZXRDYWNoZWRCeXRlcyh0aGlzKSk7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBwYXJzZUJvZHkoZmluYWwgUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwl2b2lkIHBhcnNlQm9keShSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoYnVmZmVyID09IG51bGwpIHsKIAkJCWJ1ZmZlciA9IHdhbGsuZ2V0Q2FjaGVkQnl0ZXModGhpcyk7CkBAIC0xNTcsNyArMTU3LDcgQEAKIAkJfQogCX0KIAotCXZvaWQgcGFyc2VDYW5vbmljYWwoZmluYWwgUmV2V2FsayB3YWxrLCBmaW5hbCBieXRlW10gcmF3VGFnKQorCXZvaWQgcGFyc2VDYW5vbmljYWwoUmV2V2FsayB3YWxrLCBieXRlW10gcmF3VGFnKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlmaW5hbCBNdXRhYmxlSW50ZWdlciBwb3MgPSBuZXcgTXV0YWJsZUludGVnZXIoKTsKIAkJZmluYWwgaW50IG9UeXBlOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAKIAkJaW50IHAgPSBwb3MudmFsdWUgKz0gNDsgLy8gInRhZyAiCiAJCWZpbmFsIGludCBuYW1lRW5kID0gUmF3UGFyc2VVdGlscy5uZXh0TEYocmF3VGFnLCBwKSAtIDE7Ci0JCXRhZ05hbWUgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShVVEZfOCwgcmF3VGFnLCBwLCBuYW1lRW5kKTsKKwkJdGFnTmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIHJhd1RhZywgcCwgbmFtZUVuZCk7CiAKIAkJaWYgKHdhbGsuaXNSZXRhaW5Cb2R5KCkpCiAJCQlidWZmZXIgPSByYXdUYWc7CkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJdHJ5IHsKIAkJCXJldHVybiBSYXdQYXJzZVV0aWxzLnBhcnNlRW5jb2RpbmcoYnVmZmVyKTsKIAkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIHwgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVVEZfODsKKwkJCXJldHVybiBDSEFSU0VUOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRyZWUuamF2YQppbmRleCA5MmI4MWExLi5lN2RlMjcwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUcmVlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCBuYW1lIGZvciB0aGUgdHJlZS4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2VHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZUcmVlKEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCmluZGV4IDkxYzE1YTEuLmE5ODZjZmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQpAQCAtMjA5LDcgKzIwOSw3IEBACiAJICogICAgICAgICAgICBPYmplY3RSZWFkZXIgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSB3YWxrZXIsIGFuZCB3aWxsIGJlIGNsb3NlZAogCSAqICAgICAgICAgICAgd2hlbiB0aGUgd2Fsa2VyIGlzIGNsb3NlZC4KIAkgKi8KLQlwdWJsaWMgUmV2V2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUmV2V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLm5ld09iamVjdFJlYWRlcigpLCB0cnVlKTsKIAl9CiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhcnQoZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIG1hcmtTdGFydChSZXZDb21taXQgYykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICgoYy5mbGFncyAmIFNFRU4pICE9IDApCiAJCQlyZXR1cm47CkBAIC0zMjQsMTAgKzMyNCwxMCBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhcnQoZmluYWwgQ29sbGVjdGlvbjxSZXZDb21taXQ+IGxpc3QpCisJcHVibGljIHZvaWQgbWFya1N0YXJ0KENvbGxlY3Rpb248UmV2Q29tbWl0PiBsaXN0KQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IGMgOiBsaXN0KQorCQlmb3IgKFJldkNvbW1pdCBjIDogbGlzdCkKIAkJCW1hcmtTdGFydChjKTsKIAl9CiAKQEAgLTM2NCw3ICszNjQsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZDb21taXQgYykKKwlwdWJsaWMgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhSZXZDb21taXQgYykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQljLmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CkBAIC00MDIsNyArNDAyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZWRJbnRvKGZpbmFsIFJldkNvbW1pdCBiYXNlLCBmaW5hbCBSZXZDb21taXQgdGlwKQorCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VkSW50byhSZXZDb21taXQgYmFzZSwgUmV2Q29tbWl0IHRpcCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZXZGaWx0ZXIgb2xkUkYgPSBmaWx0ZXI7CkBAIC00NzUsNyArNDc1LDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgYSBzb3J0aW5nIHN0cmF0ZWd5IHRvIGVuYWJsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFJldlNvcnQgcykgeworCXB1YmxpYyB2b2lkIHNvcnQoUmV2U29ydCBzKSB7CiAJCWFzc2VydE5vdFN0YXJ0ZWQoKTsKIAkJc29ydGluZy5jbGVhcigpOwogCQlzb3J0aW5nLmFkZChzKTsKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKIAkgKiAgICAgICAgICAgIHJlbW92ZWQuCiAJICovCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMsIGZpbmFsIGJvb2xlYW4gdXNlKSB7CisJcHVibGljIHZvaWQgc29ydChSZXZTb3J0IHMsIGJvb2xlYW4gdXNlKSB7CiAJCWFzc2VydE5vdFN0YXJ0ZWQoKTsKIAkJaWYgKHVzZSkKIAkJCXNvcnRpbmcuYWRkKHMpOwpAQCAtNTQxLDcgKzU0MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLkFuZFJldkZpbHRlcgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlci5PclJldkZpbHRlcgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldkZpbHRlcihmaW5hbCBSZXZGaWx0ZXIgbmV3RmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0UmV2RmlsdGVyKFJldkZpbHRlciBuZXdGaWx0ZXIpIHsKIAkJYXNzZXJ0Tm90U3RhcnRlZCgpOwogCQlmaWx0ZXIgPSBuZXdGaWx0ZXIgIT0gbnVsbCA/IG5ld0ZpbHRlciA6IFJldkZpbHRlci5BTEw7CiAJfQpAQCAtNTgyLDcgKzU4Miw3IEBACiAJICogICAgICAgICAgICB3aWxsIGJlIHVzZWQgaW5zdGVhZCwgYXMgaXQgbWF0Y2hlcyBldmVyeXRoaW5nLgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlcgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyZWVGaWx0ZXIoZmluYWwgVHJlZUZpbHRlciBuZXdGaWx0ZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRUcmVlRmlsdGVyKFRyZWVGaWx0ZXIgbmV3RmlsdGVyKSB7CiAJCWFzc2VydE5vdFN0YXJ0ZWQoKTsKIAkJdHJlZUZpbHRlciA9IG5ld0ZpbHRlciAhPSBudWxsID8gbmV3RmlsdGVyIDogVHJlZUZpbHRlci5BTEw7CiAJfQpAQCAtNjM4LDcgKzYzOCw3IEBACiAJICogQHBhcmFtIHJldGFpbgogCSAqICAgICAgICAgICAgdHJ1ZSB0byByZXRhaW4gYm9kaWVzOyBmYWxzZSB0byBkaXNjYXJkIHRoZW0gZWFybHkuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmV0YWluQm9keShmaW5hbCBib29sZWFuIHJldGFpbikgeworCXB1YmxpYyB2b2lkIHNldFJldGFpbkJvZHkoYm9vbGVhbiByZXRhaW4pIHsKIAkJcmV0YWluQm9keSA9IHJldGFpbjsKIAl9CiAKQEAgLTY1Myw3ICs2NTMsNyBAQAogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBibG9iIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZCbG9iIGxvb2t1cEJsb2IoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2QmxvYiBsb29rdXBCbG9iKEFueU9iamVjdElkIGlkKSB7CiAJCVJldkJsb2IgYyA9IChSZXZCbG9iKSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChjID09IG51bGwpIHsKIAkJCWMgPSBuZXcgUmV2QmxvYihpZCk7CkBAIC02NzMsNyArNjczLDcgQEAKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgdHJlZSBvYmplY3QuIE5ldmVyIG51bGwuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2VHJlZSBsb29rdXBUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIFJldlRyZWUgbG9va3VwVHJlZShBbnlPYmplY3RJZCBpZCkgewogCQlSZXZUcmVlIGMgPSAoUmV2VHJlZSkgb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAoYyA9PSBudWxsKSB7CiAJCQljID0gbmV3IFJldlRyZWUoaWQpOwpAQCAtNjk2LDcgKzY5Niw3IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGNvbW1pdCBvYmplY3QuIE5ldmVyIG51bGwuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2Q29tbWl0IGxvb2t1cENvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBSZXZDb21taXQgbG9va3VwQ29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCVJldkNvbW1pdCBjID0gKFJldkNvbW1pdCkgb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAoYyA9PSBudWxsKSB7CiAJCQljID0gY3JlYXRlQ29tbWl0KGlkKTsKQEAgLTcxNiw3ICs3MTYsNyBAQAogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSB0YWcgb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldlRhZyBsb29rdXBUYWcoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2VGFnIGxvb2t1cFRhZyhBbnlPYmplY3RJZCBpZCkgewogCQlSZXZUYWcgYyA9IChSZXZUYWcpIG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKGMgPT0gbnVsbCkgewogCQkJYyA9IG5ldyBSZXZUYWcoaWQpOwpAQCAtNzM4LDcgKzczOCw3IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZPYmplY3QgbG9va3VwQW55KGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBSZXZPYmplY3QgbG9va3VwQW55KEFueU9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQlSZXZPYmplY3QgciA9IG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKHIgPT0gbnVsbCkgewogCQkJc3dpdGNoICh0eXBlKSB7CkBAIC03OTMsNyArNzkzLDcgQEAKIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKQorCXB1YmxpYyBSZXZDb21taXQgcGFyc2VDb21taXQoQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IGMgPSBwZWVsKHBhcnNlQW55KGlkKSk7CkBAIC04MjEsNyArODIxLDcgQEAKIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2VHJlZSBwYXJzZVRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIFJldlRyZWUgcGFyc2VUcmVlKEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCBjID0gcGVlbChwYXJzZUFueShpZCkpOwpAQCAtODU2LDcgKzg1Niw3IEBACiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldlRhZyBwYXJzZVRhZyhmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIFJldlRhZyBwYXJzZVRhZyhBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCBjID0gcGFyc2VBbnkoaWQpOwogCQlpZiAoIShjIGluc3RhbmNlb2YgUmV2VGFnKSkKQEAgLTg4Miw3ICs4ODIsNyBAQAogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZPYmplY3QgcGFyc2VBbnkoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIFJldk9iamVjdCBwYXJzZUFueShBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCByID0gb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAociA9PSBudWxsKQpAQCAtMTA0MCw3ICsxMDQwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcGFyc2VIZWFkZXJzKGZpbmFsIFJldk9iamVjdCBvYmopCisJcHVibGljIHZvaWQgcGFyc2VIZWFkZXJzKFJldk9iamVjdCBvYmopCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoKG9iai5mbGFncyAmIFBBUlNFRCkgPT0gMCkKIAkJCW9iai5wYXJzZUhlYWRlcnModGhpcyk7CkBAIC0xMDU5LDcgKzEwNTksNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoZmluYWwgUmV2T2JqZWN0IG9iaikKKwlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoUmV2T2JqZWN0IG9iaikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCW9iai5wYXJzZUJvZHkodGhpcyk7CiAJfQpAQCAtMTEwMCw3ICsxMTAwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0b28gbWFueSBmbGFncyBoYXZlIGJlZW4gcmVzZXJ2ZWQgb24gdGhpcyByZXZpc2lvbiB3YWxrZXIuCiAJICovCi0JcHVibGljIFJldkZsYWcgbmV3RmxhZyhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZXZGbGFnIG5ld0ZsYWcoU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgaW50IG0gPSBhbGxvY0ZsYWcoKTsKIAkJcmV0dXJuIG5ldyBSZXZGbGFnKHRoaXMsIG5hbWUsIG0pOwogCX0KQEAgLTExMjQsNyArMTEyNCw3IEBACiAJICogQHBhcmFtIGZsYWcKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIGNhcnJ5IG9udG8gcGFyZW50cywgaWYgc2V0IG9uIGEgZGVzY2VuZGFudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjYXJyeShmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBjYXJyeShSZXZGbGFnIGZsYWcpIHsKIAkJaWYgKChmcmVlRmxhZ3MgJiBmbGFnLm1hc2spICE9IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmZsYWdJc0Rpc3Bvc2VkLCBmbGFnLm5hbWUpKTsKIAkJaWYgKGZsYWcud2Fsa2VyICE9IHRoaXMpCkBAIC0xMTQxLDggKzExNDEsOCBAQAogCSAqIEBwYXJhbSBzZXQKIAkgKiAgICAgICAgICAgIHRoZSBmbGFncyB0byBjYXJyeSBvbnRvIHBhcmVudHMsIGlmIHNldCBvbiBhIGRlc2NlbmRhbnQuCiAJICovCi0JcHVibGljIHZvaWQgY2FycnkoZmluYWwgQ29sbGVjdGlvbjxSZXZGbGFnPiBzZXQpIHsKLQkJZm9yIChmaW5hbCBSZXZGbGFnIGZsYWcgOiBzZXQpCisJcHVibGljIHZvaWQgY2FycnkoQ29sbGVjdGlvbjxSZXZGbGFnPiBzZXQpIHsKKwkJZm9yIChSZXZGbGFnIGZsYWcgOiBzZXQpCiAJCQljYXJyeShmbGFnKTsKIAl9CiAKQEAgLTEyMDAsMTEgKzEyMDAsMTEgQEAKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIHRvIHJlY3ljbGUuCiAJICovCi0JcHVibGljIHZvaWQgZGlzcG9zZUZsYWcoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIHZvaWQgZGlzcG9zZUZsYWcoUmV2RmxhZyBmbGFnKSB7CiAJCWZyZWVGbGFnKGZsYWcubWFzayk7CiAJfQogCi0Jdm9pZCBmcmVlRmxhZyhmaW5hbCBpbnQgbWFzaykgeworCXZvaWQgZnJlZUZsYWcoaW50IG1hc2spIHsKIAkJcmV0YWluT25SZXNldCAmPSB+bWFzazsKIAkJaWYgKGlzTm90U3RhcnRlZCgpKSB7CiAJCQlmcmVlRmxhZ3MgfD0gbWFzazsKQEAgLTEyNDQsNyArMTI0NCw3IEBACiAJICogICAgICAgICAgICBhcHBsaWNhdGlvbiBmbGFncyB0aGF0IHNob3VsZCA8Yj5ub3Q8L2I+IGJlIGNsZWFyZWQgZnJvbQogCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG9iamVjdHMuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oZmluYWwgUmV2RmxhZ1NldCByZXRhaW5GbGFncykgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0UmV0YWluKFJldkZsYWdTZXQgcmV0YWluRmxhZ3MpIHsKIAkJcmVzZXQocmV0YWluRmxhZ3MubWFzayk7CiAJfQogCkBAIC0xMjYyLDkgKzEyNjIsOSBAQAogCSAqICAgICAgICAgICAgYXBwbGljYXRpb24gZmxhZ3MgdGhhdCBzaG91bGQgPGI+bm90PC9iPiBiZSBjbGVhcmVkIGZyb20KIAkgKiAgICAgICAgICAgIGV4aXN0aW5nIGNvbW1pdCBvYmplY3RzLgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0UmV0YWluKGZpbmFsIFJldkZsYWcuLi4gcmV0YWluRmxhZ3MpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCByZXNldFJldGFpbihSZXZGbGFnLi4uIHJldGFpbkZsYWdzKSB7CiAJCWludCBtYXNrID0gMDsKLQkJZm9yIChmaW5hbCBSZXZGbGFnIGZsYWcgOiByZXRhaW5GbGFncykKKwkJZm9yIChSZXZGbGFnIGZsYWcgOiByZXRhaW5GbGFncykKIAkJCW1hc2sgfD0gZmxhZy5tYXNrOwogCQlyZXNldChtYXNrKTsKIAl9CkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCQlmaW5hbCBpbnQgY2xlYXJGbGFncyA9IH5yZXRhaW5GbGFnczsKIAogCQlmaW5hbCBGSUZPUmV2UXVldWUgcSA9IG5ldyBGSUZPUmV2UXVldWUoKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHJvb3RzKSB7CisJCWZvciAoUmV2Q29tbWl0IGMgOiByb290cykgewogCQkJaWYgKChjLmZsYWdzICYgY2xlYXJGbGFncykgPT0gMCkKIAkJCQljb250aW51ZTsKIAkJCWMuZmxhZ3MgJj0gcmV0YWluRmxhZ3M7CkBAIC0xMzAwLDcgKzEzMDAsNyBAQAogCQkJCWJyZWFrOwogCQkJaWYgKGMucGFyZW50cyA9PSBudWxsKQogCQkJCWNvbnRpbnVlOwotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykgeworCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykgewogCQkJCWlmICgocC5mbGFncyAmIGNsZWFyRmxhZ3MpID09IDApCiAJCQkJCWNvbnRpbnVlOwogCQkJCXAuZmxhZ3MgJj0gcmV0YWluRmxhZ3M7CkBAIC0xNDM1LDExICsxNDM1LDExIEBACiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRoaXMgd2Fsa2VyIHJlcXVpcmVzIGEgY29tbWl0IHJlZmVyZW5jZSBmb3IuCiAJICogQHJldHVybiBhIG5ldyB1bnBhcnNlZCByZWZlcmVuY2UgZm9yIHRoZSBvYmplY3QuCiAJICovCi0JcHJvdGVjdGVkIFJldkNvbW1pdCBjcmVhdGVDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNyZWF0ZUNvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlyZXR1cm4gbmV3IFJldkNvbW1pdChpZCk7CiAJfQogCi0Jdm9pZCBjYXJyeUZsYWdzSW1wbChmaW5hbCBSZXZDb21taXQgYykgeworCXZvaWQgY2FycnlGbGFnc0ltcGwoUmV2Q29tbWl0IGMpIHsKIAkJZmluYWwgaW50IGNhcnJ5ID0gYy5mbGFncyAmIGNhcnJ5RmxhZ3M7CiAJCWlmIChjYXJyeSAhPSAwKQogCQkJUmV2Q29tbWl0LmNhcnJ5RmxhZ3MoYywgY2FycnkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXdyaXRlR2VuZXJhdG9yLmphdmEKaW5kZXggZjgyMzAxYS4uMWM4NjhmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhCkBAIC03NiwxMiArNzYsMTIgQEAKIAogCXByaXZhdGUgZmluYWwgR2VuZXJhdG9yIHNvdXJjZTsKIAotCVJld3JpdGVHZW5lcmF0b3IoZmluYWwgR2VuZXJhdG9yIHMpIHsKKwlSZXdyaXRlR2VuZXJhdG9yKEdlbmVyYXRvciBzKSB7CiAJCXNvdXJjZSA9IHM7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJc291cmNlLnNoYXJlRnJlZUxpc3QocSk7CiAJfQogCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0W10gY2xlYW51cChmaW5hbCBSZXZDb21taXRbXSBvbGRMaXN0KSB7CisJcHJpdmF0ZSBSZXZDb21taXRbXSBjbGVhbnVwKFJldkNvbW1pdFtdIG9sZExpc3QpIHsKIAkJLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGUgcGFyZW50cyBjYXVzZWQgZHVlIHRvIHJld3JpdGVzIChlLmcuIGEgbWVyZ2UKIAkJLy8gd2l0aCB0d28gc2lkZXMgdGhhdCBib3RoIHNpbXBsaWZpZWQgYmFjayBpbnRvIHRoZSBtZXJnZSBiYXNlKS4KIAkJLy8gV2UgYWxzbyBtYXkgaGF2ZSBkZWxldGVkIGEgcGFyZW50IGJ5IG1hcmtpbmcgaXQgbnVsbC4KQEAgLTE2NywxNCArMTY3LDE0IEBACiAJCX0KIAogCQlpZiAobmV3Q250ID09IG9sZExpc3QubGVuZ3RoKSB7Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogb2xkTGlzdCkKKwkJCWZvciAoUmV2Q29tbWl0IHAgOiBvbGRMaXN0KQogCQkJCXAuZmxhZ3MgJj0gfkRVUExJQ0FURTsKIAkJCXJldHVybiBvbGRMaXN0OwogCQl9CiAKIAkJZmluYWwgUmV2Q29tbWl0W10gbmV3TGlzdCA9IG5ldyBSZXZDb21taXRbbmV3Q250XTsKIAkJbmV3Q250ID0gMDsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IG9sZExpc3QpIHsKKwkJZm9yIChSZXZDb21taXQgcCA6IG9sZExpc3QpIHsKIAkJCWlmIChwICE9IG51bGwpIHsKIAkJCQluZXdMaXN0W25ld0NudCsrXSA9IHA7CiAJCQkJcC5mbGFncyAmPSB+RFVQTElDQVRFOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1N0YXJ0R2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvU3RhcnRHZW5lcmF0b3IuamF2YQppbmRleCAxZWM2MjkwLi5lYjEyOWEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvU3RhcnRHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvU3RhcnRHZW5lcmF0b3IuamF2YQpAQCAtNjYsNyArNjYsNyBAQAogY2xhc3MgU3RhcnRHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogCXByaXZhdGUgZmluYWwgUmV2V2FsayB3YWxrZXI7CiAKLQlTdGFydEdlbmVyYXRvcihmaW5hbCBSZXZXYWxrIHcpIHsKKwlTdGFydEdlbmVyYXRvcihSZXZXYWxrIHcpIHsKIAkJd2Fsa2VyID0gdzsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Ub3BvU29ydEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RvcG9Tb3J0R2VuZXJhdG9yLmphdmEKaW5kZXggN2IxMWQwNC4uNjQ1MDM0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RvcG9Tb3J0R2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RvcG9Tb3J0R2VuZXJhdG9yLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKIAkgKiBAdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24KIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JVG9wb1NvcnRHZW5lcmF0b3IoZmluYWwgR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCVRvcG9Tb3J0R2VuZXJhdG9yKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcGVuZGluZyA9IG5ldyBGSUZPUmV2UXVldWUoKTsKIAkJb3V0cHV0VHlwZSA9IHMub3V0cHV0VHlwZSgpIHwgU09SVF9UT1BPOwpAQCAtNzgsNyArNzgsNyBAQAogCQkJZmluYWwgUmV2Q29tbWl0IGMgPSBzLm5leHQoKTsKIAkJCWlmIChjID09IG51bGwpCiAJCQkJYnJlYWs7Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQorCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykKIAkJCQlwLmluRGVncmVlKys7CiAJCQlwZW5kaW5nLmFkZChjKTsKIAkJfQpAQCAtOTAsNyArOTAsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwl2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCXEuc2hhcmVGcmVlTGlzdChwZW5kaW5nKTsKIAl9CiAKQEAgLTExMyw3ICsxMTMsNyBAQAogCQkJLy8gQWxsIG9mIG91ciBjaGlsZHJlbiBoYXZlIGFscmVhZHkgcHJvZHVjZWQsCiAJCQkvLyBzbyBpdCBpcyBPSyBmb3IgdXMgdG8gcHJvZHVjZSBub3cgYXMgd2VsbC4KIAkJCS8vCi0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJaWYgKC0tcC5pbkRlZ3JlZSA9PSAwICYmIChwLmZsYWdzICYgVE9QT19ERUxBWSkgIT0gMCkgewogCQkJCQkvLyBUaGlzIHBhcmVudCB0cmllZCB0byBjb21lIGJlZm9yZSB1cywgYnV0IHdlIGFyZQogCQkJCQkvLyBoaXMgbGFzdCBjaGlsZC4gdW5wb3AgdGhlIHBhcmVudCBzbyBpdCBnb2VzIHJpZ2h0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YQppbmRleCA5OWM1ZDU5Li4xMTMwMTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9UcmVlUmV2RmlsdGVyLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBuZXcgZmlsdGVyIGZvbGxvd2luZyBuZXcgcGF0aHMgYWZ0ZXIgYSByZW5hbWUuCiAJICogQHNpbmNlIDMuNQogCSAqLwotCXB1YmxpYyBUcmVlUmV2RmlsdGVyKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBUcmVlRmlsdGVyIHQpIHsKKwlwdWJsaWMgVHJlZVJldkZpbHRlcihSZXZXYWxrIHdhbGtlciwgVHJlZUZpbHRlciB0KSB7CiAJCXRoaXMod2Fsa2VyLCB0LCAwKTsKIAl9CiAKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCXRocm93cyBTdG9wV2Fsa0V4Y2VwdGlvbiwgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJLy8gUmVzZXQgdGhlIHRyZWUgZmlsdGVyIHRvIHNjYW4gdGhpcyBjb21taXQgYW5kIHBhcmVudHMuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0FuZFJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BbmRSZXZGaWx0ZXIuamF2YQppbmRleCAwMDE5ZTBjLi5kZmI4M2I0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0FuZFJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQW5kUmV2RmlsdGVyLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKiAgICAgICAgICAgIHNlY29uZCBmaWx0ZXIgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBib3RoIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhLCBmaW5hbCBSZXZGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXIgYSwgUmV2RmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMKQogCQkJcmV0dXJuIGI7CiAJCWlmIChiID09IEFMTCkKQEAgLTg4LDcgKzg4LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoUmV2RmlsdGVyW10gbGlzdCkgewogCQlpZiAobGlzdC5sZW5ndGggPT0gMikKIAkJCXJldHVybiBjcmVhdGUobGlzdFswXSwgbGlzdFsxXSk7CiAJCWlmIChsaXN0Lmxlbmd0aCA8IDIpCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CiAJCWlmIChsaXN0LnNpemUoKSA8IDIpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmF0TGVhc3RUd29GaWx0ZXJzTmVlZGVkKTsKIAkJZmluYWwgUmV2RmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBSZXZGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlCaW5hcnkoZmluYWwgUmV2RmlsdGVyIG9uZSwgZmluYWwgUmV2RmlsdGVyIHR3bykgeworCQlCaW5hcnkoUmV2RmlsdGVyIG9uZSwgUmV2RmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCQlyZXF1aXJlc0NvbW1pdEJvZHkgPSBhLnJlcXVpcmVzQ29tbWl0Qm9keSgpCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIGEuaW5jbHVkZSh3YWxrZXIsIGMpICYmIGIuaW5jbHVkZSh3YWxrZXIsIGMpOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlMaXN0KGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKKwkJTGlzdChSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJCQlzdWJmaWx0ZXJzID0gbGlzdDsKIAogCQkJYm9vbGVhbiByY2IgPSBmYWxzZTsKQEAgLTE2OSwxMCArMTY5LDEwIEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKLQkJCWZvciAoZmluYWwgUmV2RmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CisJCQlmb3IgKFJldkZpbHRlciBmIDogc3ViZmlsdGVycykgewogCQkJCWlmICghZi5pbmNsdWRlKHdhbGtlciwgYykpCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQXV0aG9yUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0F1dGhvclJldkZpbHRlci5qYXZhCmluZGV4IGUwMGZlYWYuLjMzNGQ0ZjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQXV0aG9yUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BdXRob3JSZXZGaWx0ZXIuamF2YQpAQCAtODEsNyArODEsNyBAQAogCQkvLyBEb24ndCBwZXJtaXQgdXMgdG8gYmUgY3JlYXRlZC4KIAl9CiAKLQlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoUmV2Q29tbWl0IGNtaXQpIHsKIAkJZmluYWwgYnl0ZVtdIHJhdyA9IGNtaXQuZ2V0UmF3QnVmZmVyKCk7CiAJCWZpbmFsIGludCBiID0gUmF3UGFyc2VVdGlscy5hdXRob3IocmF3LCAwKTsKIAkJaWYgKGIgPCAwKQpAQCAtOTEsMTIgKzkxLDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF0dGVyblNlYXJjaCBleHRlbmRzIFBhdHRlcm5NYXRjaFJldkZpbHRlciB7Ci0JCVBhdHRlcm5TZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVBhdHRlcm5TZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCwgdHJ1ZSwgdHJ1ZSwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCkBAIC0xMDcsMTIgKzEwNywxMiBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlN0cmluZ1NlYXJjaCBleHRlbmRzIFN1YlN0cmluZ1JldkZpbHRlciB7Ci0JCVN1YlN0cmluZ1NlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJU3ViU3RyaW5nU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXRUaW1lUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YQppbmRleCA5ZjRmMTBmLi4zODgwNTE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YQpAQCAtNjQsNyArNjQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHBvaW50IGluIHRpbWUgdG8gY3V0IG9uLgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIG9uIG9yIGJlZm9yZSA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmVmb3JlKGZpbmFsIERhdGUgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUoRGF0ZSB0cykgewogCQlyZXR1cm4gYmVmb3JlKHRzLmdldFRpbWUoKSk7CiAJfQogCkBAIC03NSw3ICs3NSw3IEBACiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24sIGluIG1pbGxpc2Vjb25kcwogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIG9uIG9yIGJlZm9yZSA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmVmb3JlKGZpbmFsIGxvbmcgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUobG9uZyB0cykgewogCQlyZXR1cm4gbmV3IEJlZm9yZSh0cyk7CiAJfQogCkBAIC04Niw3ICs4Niw3IEBACiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24uCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYWZ0ZXIgPGNvZGU+dHM8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKGZpbmFsIERhdGUgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBhZnRlcihEYXRlIHRzKSB7CiAJCXJldHVybiBhZnRlcih0cy5nZXRUaW1lKCkpOwogCX0KIApAQCAtOTcsNyArOTcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHBvaW50IGluIHRpbWUgdG8gY3V0IG9uLCBpbiBtaWxsaXNlY29uZHMuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYWZ0ZXIgPGNvZGU+dHM8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKGZpbmFsIGxvbmcgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBhZnRlcihsb25nIHRzKSB7CiAJCXJldHVybiBuZXcgQWZ0ZXIodHMpOwogCX0KIApAQCAtMTA5LDcgKzEwOSw3IEBACiAJICogQHBhcmFtIHVudGlsIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvZmYuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZS90aW1lcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZXR3ZWVuKGZpbmFsIERhdGUgc2luY2UsIGZpbmFsIERhdGUgdW50aWwpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZXR3ZWVuKERhdGUgc2luY2UsIERhdGUgdW50aWwpIHsKIAkJcmV0dXJuIGJldHdlZW4oc2luY2UuZ2V0VGltZSgpLCB1bnRpbC5nZXRUaW1lKCkpOwogCX0KIApAQCAtMTIxLDEzICsxMjEsMTMgQEAKIAkgKiBAcGFyYW0gdW50aWwgdGhlIHBvaW50IGluIHRpbWUgdG8gY3V0IG9mZiwgaW4gbWlsbGlzY29uZHMuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZS90aW1lcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZXR3ZWVuKGZpbmFsIGxvbmcgc2luY2UsIGZpbmFsIGxvbmcgdW50aWwpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZXR3ZWVuKGxvbmcgc2luY2UsIGxvbmcgdW50aWwpIHsKIAkJcmV0dXJuIG5ldyBCZXR3ZWVuKHNpbmNlLCB1bnRpbCk7CiAJfQogCiAJZmluYWwgaW50IHdoZW47CiAKLQlDb21taXRUaW1lUmV2RmlsdGVyKGZpbmFsIGxvbmcgdHMpIHsKKwlDb21taXRUaW1lUmV2RmlsdGVyKGxvbmcgdHMpIHsKIAkJd2hlbiA9IChpbnQpICh0cyAvIDEwMDApOwogCX0KIApAQCAtMTQ0LDEyICsxNDQsMTIgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBCZWZvcmUgZXh0ZW5kcyBDb21taXRUaW1lUmV2RmlsdGVyIHsKLQkJQmVmb3JlKGZpbmFsIGxvbmcgdHMpIHsKKwkJQmVmb3JlKGxvbmcgdHMpIHsKIAkJCXN1cGVyKHRzKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjbWl0LmdldENvbW1pdFRpbWUoKSA8PSB3aGVuOwpAQCAtMTYzLDEyICsxNjMsMTIgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBBZnRlciBleHRlbmRzIENvbW1pdFRpbWVSZXZGaWx0ZXIgewotCQlBZnRlcihmaW5hbCBsb25nIHRzKSB7CisJCUFmdGVyKGxvbmcgdHMpIHsKIAkJCXN1cGVyKHRzKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCS8vIFNpbmNlIHRoZSB3YWxrZXIgc29ydHMgY29tbWl0cyBieSBjb21taXQgdGltZSB3ZSBjYW4gYmUKQEAgLTE5MCwxMyArMTkwLDEzIEBACiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmV0d2VlbiBleHRlbmRzIENvbW1pdFRpbWVSZXZGaWx0ZXIgewogCQlwcml2YXRlIGZpbmFsIGludCB1bnRpbDsKIAotCQlCZXR3ZWVuKGZpbmFsIGxvbmcgc2luY2UsIGZpbmFsIGxvbmcgdW50aWwpIHsKKwkJQmV0d2Vlbihsb25nIHNpbmNlLCBsb25nIHVudGlsKSB7CiAJCQlzdXBlcihzaW5jZSk7CiAJCQl0aGlzLnVudGlsID0gKGludCkgKHVudGlsIC8gMTAwMCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGNtaXQpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJCXRocm93cyBTdG9wV2Fsa0V4Y2VwdGlvbiwgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gY21pdC5nZXRDb21taXRUaW1lKCkgPD0gdW50aWwgJiYgY21pdC5nZXRDb21taXRUaW1lKCkgPj0gd2hlbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0dGVyUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdHRlclJldkZpbHRlci5qYXZhCmluZGV4IDRhMWIzYTYuLjM3Yzg0MGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0dGVyUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXR0ZXJSZXZGaWx0ZXIuamF2YQpAQCAtODEsNyArODEsNyBAQAogCQkvLyBEb24ndCBwZXJtaXQgdXMgdG8gYmUgY3JlYXRlZC4KIAl9CiAKLQlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoUmV2Q29tbWl0IGNtaXQpIHsKIAkJZmluYWwgYnl0ZVtdIHJhdyA9IGNtaXQuZ2V0UmF3QnVmZmVyKCk7CiAJCWZpbmFsIGludCBiID0gUmF3UGFyc2VVdGlscy5jb21taXR0ZXIocmF3LCAwKTsKIAkJaWYgKGIgPCAwKQpAQCAtOTEsMTIgKzkxLDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF0dGVyblNlYXJjaCBleHRlbmRzIFBhdHRlcm5NYXRjaFJldkZpbHRlciB7Ci0JCVBhdHRlcm5TZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVBhdHRlcm5TZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCwgdHJ1ZSwgdHJ1ZSwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCkBAIC0xMDcsMTIgKzEwNywxMiBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlN0cmluZ1NlYXJjaCBleHRlbmRzIFN1YlN0cmluZ1JldkZpbHRlciB7Ci0JCVN1YlN0cmluZ1NlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJU3ViU3RyaW5nU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9NZXNzYWdlUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YQppbmRleCBmMWY0MDY1Li40ODBhYWEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YQpAQCAtODEsNyArODEsNyBAQAogCQkvLyBEb24ndCBwZXJtaXQgdXMgdG8gYmUgY3JlYXRlZC4KIAl9CiAKLQlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoUmV2Q29tbWl0IGNtaXQpIHsKIAkJZmluYWwgYnl0ZVtdIHJhdyA9IGNtaXQuZ2V0UmF3QnVmZmVyKCk7CiAJCWZpbmFsIGludCBiID0gUmF3UGFyc2VVdGlscy5jb21taXRNZXNzYWdlKHJhdywgMCk7CiAJCWlmIChiIDwgMCkKQEAgLTkwLDEzICs5MCwxMyBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhdHRlcm5TZWFyY2ggZXh0ZW5kcyBQYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIgewotCQlQYXR0ZXJuU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlQYXR0ZXJuU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQsIHRydWUsIHRydWUsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRQogCQkJCQl8IFBhdHRlcm4uRE9UQUxMKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCkBAIC0xMDcsMTIgKzEwNywxMiBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlN0cmluZ1NlYXJjaCBleHRlbmRzIFN1YlN0cmluZ1JldkZpbHRlciB7Ci0JCVN1YlN0cmluZ1NlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJU3ViU3RyaW5nU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Ob3RSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTm90UmV2RmlsdGVyLmphdmEKaW5kZXggODRiN2Y2Yi4uNjlkZWM1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Ob3RSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL05vdFJldkZpbHRlci5qYXZhCkBAIC02MSwxMyArNjEsMTMgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlciB0byBuZWdhdGUuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IGRvZXMgdGhlIHJldmVyc2Ugb2YgPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKFJldkZpbHRlciBhKSB7CiAJCXJldHVybiBuZXcgTm90UmV2RmlsdGVyKGEpOwogCX0KIAogCXByaXZhdGUgZmluYWwgUmV2RmlsdGVyIGE7CiAKLQlwcml2YXRlIE5vdFJldkZpbHRlcihmaW5hbCBSZXZGaWx0ZXIgb25lKSB7CisJcHJpdmF0ZSBOb3RSZXZGaWx0ZXIoUmV2RmlsdGVyIG9uZSkgewogCQlhID0gb25lOwogCX0KIApAQCAtNzksNyArNzksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gIWEuaW5jbHVkZSh3YWxrZXIsIGMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9PclJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9PclJldkZpbHRlci5qYXZhCmluZGV4IGExNDc2NGEuLjFjZWYxMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvT3JSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL09yUmV2RmlsdGVyLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKiAgICAgICAgICAgIHNlY29uZCBmaWx0ZXIgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXIgYSwgZmluYWwgUmV2RmlsdGVyIGIpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoUmV2RmlsdGVyIGEsIFJldkZpbHRlciBiKSB7CiAJCWlmIChhID09IEFMTCB8fCBiID09IEFMTCkKIAkJCXJldHVybiBBTEw7CiAJCXJldHVybiBuZXcgQmluYXJ5KGEsIGIpOwpAQCAtODYsNyArODYsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXJbXSBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKFJldkZpbHRlcltdIGxpc3QpIHsKIAkJaWYgKGxpc3QubGVuZ3RoID09IDIpCiAJCQlyZXR1cm4gY3JlYXRlKGxpc3RbMF0sIGxpc3RbMV0pOwogCQlpZiAobGlzdC5sZW5ndGggPCAyKQpAQCAtMTA0LDcgKzEwNCw3IEBACiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CiAJCWlmIChsaXN0LnNpemUoKSA8IDIpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmF0TGVhc3RUd29GaWx0ZXJzTmVlZGVkKTsKIAkJZmluYWwgUmV2RmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBSZXZGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlCaW5hcnkoZmluYWwgUmV2RmlsdGVyIG9uZSwgZmluYWwgUmV2RmlsdGVyIHR3bykgeworCQlCaW5hcnkoUmV2RmlsdGVyIG9uZSwgUmV2RmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCQlyZXF1aXJlc0NvbW1pdEJvZHkgPSBhLnJlcXVpcmVzQ29tbWl0Qm9keSgpCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIGEuaW5jbHVkZSh3YWxrZXIsIGMpIHx8IGIuaW5jbHVkZSh3YWxrZXIsIGMpOwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlMaXN0KGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKKwkJTGlzdChSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJCQlzdWJmaWx0ZXJzID0gbGlzdDsKIAogCQkJYm9vbGVhbiByY2IgPSBmYWxzZTsKQEAgLTE2NywxMCArMTY3LDEwIEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKLQkJCWZvciAoZmluYWwgUmV2RmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CisJCQlmb3IgKFJldkZpbHRlciBmIDogc3ViZmlsdGVycykgewogCQkJCWlmIChmLmluY2x1ZGUod2Fsa2VyLCBjKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1BhdHRlcm5NYXRjaFJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIuamF2YQppbmRleCBlZGNlMjI0Li40ZjQxZWRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1BhdHRlcm5NYXRjaFJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUGF0dGVybk1hdGNoUmV2RmlsdGVyLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKiBAcmV0dXJuIHNhbWUgcGF0dGVybiwgYnV0IHJlLWVuY29kZWQgdG8gbWF0Y2ggb3VyIGZ1bm55IHJhdyBVVEYtOAogCSAqICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3Q2hhclNlcXVlbmNlfS4KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBmb3JjZVRvUmF3KGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZvcmNlVG9SYXcoU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZShwYXR0ZXJuVGV4dCk7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgbmVlZGxlID0gbmV3IFN0cmluZ0J1aWxkZXIoYi5sZW5ndGgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspCkBAIC0xMjgsNyArMTI4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGNtaXQpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNvbXBpbGVkUGF0dGVybi5yZXNldCh0ZXh0KGNtaXQpKS5tYXRjaGVzKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGaWx0ZXIuamF2YQppbmRleCA5MDY4YzU3Li4zOWYwZDYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmlsdGVyLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQWxsRmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE5vbmVGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0xODQsNyArMTg0LDcgQEAKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE5vTWVyZ2VzRmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQlyZXR1cm4gYy5nZXRQYXJlbnRDb3VudCgpIDwgMjsKIAkJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1lcmdlQmFzZUZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykgewogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhbm5vdEJlQ29tYmluZWQpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmxhZ0ZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEKaW5kZXggODIyNWU0ZC4uYzY3YzQ0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHRlc3QuCiAJICogQHJldHVybiBmaWx0ZXIgdGhhdCBzZWxlY3RzIG9ubHkgY29tbWl0cyB3aXRoIGZsYWcgPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzKGZpbmFsIFJldkZsYWcgYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhcyhSZXZGbGFnIGEpIHsKIAkJZmluYWwgUmV2RmxhZ1NldCBzID0gbmV3IFJldkZsYWdTZXQoKTsKIAkJcy5hZGQoYSk7CiAJCXJldHVybiBuZXcgSGFzQWxsKHMpOwpAQCAtNzYsOSArNzYsOSBAQAogCSAqICAgICAgICAgICAgc2V0IG9mIGZsYWdzIHRvIHRlc3QuCiAJICogQHJldHVybiBmaWx0ZXIgdGhhdCBzZWxlY3RzIG9ubHkgY29tbWl0cyB3aXRoIGFsbCBmbGFncyBpbiA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoZmluYWwgUmV2RmxhZy4uLiBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQWxsKFJldkZsYWcuLi4gYSkgewogCQlmaW5hbCBSZXZGbGFnU2V0IHNldCA9IG5ldyBSZXZGbGFnU2V0KCk7Ci0JCWZvciAoZmluYWwgUmV2RmxhZyBmbGFnIDogYSkKKwkJZm9yIChSZXZGbGFnIGZsYWcgOiBhKQogCQkJc2V0LmFkZChmbGFnKTsKIAkJcmV0dXJuIG5ldyBIYXNBbGwoc2V0KTsKIAl9CkBAIC05MCw3ICs5MCw3IEBACiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYWxsIGZsYWdzIGluIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChmaW5hbCBSZXZGbGFnU2V0IGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoUmV2RmxhZ1NldCBhKSB7CiAJCXJldHVybiBuZXcgSGFzQWxsKG5ldyBSZXZGbGFnU2V0KGEpKTsKIAl9CiAKQEAgLTEwMSw5ICsxMDEsOSBAQAogCSAqICAgICAgICAgICAgc2V0IG9mIGZsYWdzIHRvIHRlc3QuCiAJICogQHJldHVybiBmaWx0ZXIgdGhhdCBzZWxlY3RzIG9ubHkgY29tbWl0cyB3aXRoIGFueSBmbGFnIGluIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FueShmaW5hbCBSZXZGbGFnLi4uIGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbnkoUmV2RmxhZy4uLiBhKSB7CiAJCWZpbmFsIFJldkZsYWdTZXQgc2V0ID0gbmV3IFJldkZsYWdTZXQoKTsKLQkJZm9yIChmaW5hbCBSZXZGbGFnIGZsYWcgOiBhKQorCQlmb3IgKFJldkZsYWcgZmxhZyA6IGEpCiAJCQlzZXQuYWRkKGZsYWcpOwogCQlyZXR1cm4gbmV3IEhhc0FueShzZXQpOwogCX0KQEAgLTExNSwxMyArMTE1LDEzIEBACiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYW55IGZsYWcgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KGZpbmFsIFJldkZsYWdTZXQgYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FueShSZXZGbGFnU2V0IGEpIHsKIAkJcmV0dXJuIG5ldyBIYXNBbnkobmV3IFJldkZsYWdTZXQoYSkpOwogCX0KIAogCWZpbmFsIFJldkZsYWdTZXQgZmxhZ3M7CiAKLQlSZXZGbGFnRmlsdGVyKGZpbmFsIFJldkZsYWdTZXQgbSkgeworCVJldkZsYWdGaWx0ZXIoUmV2RmxhZ1NldCBtKSB7CiAJCWZsYWdzID0gbTsKIAl9CiAKQEAgLTEzOCwxMiArMTM4LDEyIEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzQWxsIGV4dGVuZHMgUmV2RmxhZ0ZpbHRlciB7Ci0JCUhhc0FsbChmaW5hbCBSZXZGbGFnU2V0IG0pIHsKKwkJSGFzQWxsKFJldkZsYWdTZXQgbSkgewogCQkJc3VwZXIobSk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjLmhhc0FsbChmbGFncyk7CkBAIC0xNTYsMTIgKzE1NiwxMiBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIEhhc0FueSBleHRlbmRzIFJldkZsYWdGaWx0ZXIgewotCQlIYXNBbnkoZmluYWwgUmV2RmxhZ1NldCBtKSB7CisJCUhhc0FueShSZXZGbGFnU2V0IG0pIHsKIAkJCXN1cGVyKG0pOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYy5oYXNBbnkoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9TdWJTdHJpbmdSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvU3ViU3RyaW5nUmV2RmlsdGVyLmphdmEKaW5kZXggM2U2YjE0OC4uNTQ2NTBkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9TdWJTdHJpbmdSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1N1YlN0cmluZ1JldkZpbHRlci5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJICogICAgICAgICBpZiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlci5QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXJ9CiAJICogICAgICAgICBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FmZShmaW5hbCBTdHJpbmcgcGF0dGVybikgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYWZlKFN0cmluZyBwYXR0ZXJuKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGgoKTsgaSsrKSB7CiAJCQlmaW5hbCBjaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChpKTsKIAkJCXN3aXRjaCAoYykgewpAQCAtOTYsMTMgKzk2LDEzIEBACiAJICogICAgICAgICAgICB0aGUge0BsaW5rICNzYWZlKFN0cmluZyl9IGFzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtZXRhCiAJICogICAgICAgICAgICBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIGxpdGVyYWxzLgogCSAqLwotCXByb3RlY3RlZCBTdWJTdHJpbmdSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJcHJvdGVjdGVkIFN1YlN0cmluZ1JldkZpbHRlcihTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJcGF0dGVybiA9IG5ldyBSYXdTdWJTdHJpbmdQYXR0ZXJuKHBhdHRlcm5UZXh0KTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjbWl0KQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBwYXR0ZXJuLm1hdGNoKHRleHQoY21pdCkpID49IDA7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhCmluZGV4IDNmMDY0ZTMuLjRiMjcyYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhCkBAIC00OSw2ICs0OSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNjQsOCArMTY2LDggQEAKIAkJCQl9IGVsc2UgewogCQkJCQlmaW5hbCBTdHJpbmcgZGVjb2RlZDsKIAkJCQkJaWYgKGlzVXRmOChpbikpIHsKLQkJCQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZSgKLQkJCQkJCQkJUmF3UGFyc2VVdGlscy5VVEY4X0NIQVJTRVQsIGluLCAzLCBpbi5sZW5ndGgpOworCQkJCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsCisJCQkJCQkJCWluLCAzLCBpbi5sZW5ndGgpOwogCQkJCQkJdXRmOEJvbSA9IHRydWU7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoaW4pOwpAQCAtMjIyLDcgKzIyNCw3IEBACiAJCQlib3Mud3JpdGUoMHhFRik7CiAJCQlib3Mud3JpdGUoMHhCQik7CiAJCQlib3Mud3JpdGUoMHhCRik7Ci0JCQlib3Mud3JpdGUodGV4dC5nZXRCeXRlcyhSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVC5uYW1lKCkpKTsKKwkJCWJvcy53cml0ZSh0ZXh0LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCW91dCA9IGJvcy50b0J5dGVBcnJheSgpOwogCQl9IGVsc2UgewogCQkJb3V0ID0gQ29uc3RhbnRzLmVuY29kZSh0ZXh0KTsKQEAgLTI1Miw3ICsyNTQsNyBAQAogCQlzdXBlci5jbGVhcigpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGhhc2goZmluYWwgYnl0ZVtdIHJhd1RleHQpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBoYXNoKGJ5dGVbXSByYXdUZXh0KSB7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCkuZGlnZXN0KHJhd1RleHQpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUNvbmZpZy5qYXZhCmluZGV4IDE5ZmM2M2UuLmMyZTZhNDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVDb25maWcuamF2YQpAQCAtOTgsNyArOTgsNyBAQAogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyB0byBvcGVuIGF0IGEgdGltZS4gT3BlbiBwYWNrcyBjb3VudAogCSAqICAgICAgICAgICAgYWdhaW5zdCB0aGUgcHJvY2VzcyBsaW1pdHMKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRPcGVuRmlsZXMoZmluYWwgaW50IGZkTGltaXQpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRPcGVuRmlsZXMoaW50IGZkTGltaXQpIHsKIAkJcGFja2VkR2l0T3BlbkZpbGVzID0gZmRMaW1pdDsKIAl9CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgYnl0ZXMgb2YgaGVhcCBtZW1vcnkgdG8gZGVkaWNhdGUgdG8gY2FjaGluZwogCSAqICAgICAgICAgICAgcGFjayBmaWxlIGRhdGEuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TGltaXQoZmluYWwgbG9uZyBuZXdMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdExpbWl0KGxvbmcgbmV3TGltaXQpIHsKIAkJcGFja2VkR2l0TGltaXQgPSBuZXdMaW1pdDsKIAl9CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogCSAqIEBwYXJhbSBuZXdTaXplCiAJICogICAgICAgICAgICBzaXplIGluIGJ5dGVzIG9mIGEgc2luZ2xlIHdpbmRvdyByZWFkIGluIGZyb20gdGhlIHBhY2sgZmlsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRXaW5kb3dTaXplKGZpbmFsIGludCBuZXdTaXplKSB7CisJcHVibGljIHZvaWQgc2V0UGFja2VkR2l0V2luZG93U2l6ZShpbnQgbmV3U2l6ZSkgewogCQlwYWNrZWRHaXRXaW5kb3dTaXplID0gbmV3U2l6ZTsKIAl9CiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogCSAqICAgICAgICAgICAgZm9yIHdpbmRvd3M7IGZhbHNlIHJlYWRzIGVudGlyZSB3aW5kb3cgaW50byBhIGJ5dGVbXSB3aXRoCiAJICogICAgICAgICAgICBzdGFuZGFyZCByZWFkIGNhbGxzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE1NQVAoZmluYWwgYm9vbGVhbiB1c2VtbWFwKSB7CisJcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TU1BUChib29sZWFuIHVzZW1tYXApIHsKIAkJcGFja2VkR2l0TU1BUCA9IHVzZW1tYXA7CiAJfQogCkBAIC0xODksNyArMTg5LDcgQEAKIAkgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNhY2hlIGluIGRlbHRhIGJhc2UgY2FjaGUgZm9yCiAJICogICAgICAgICAgICBpbmZsYXRlZCwgcmVjZW50bHkgYWNjZXNzZWQgb2JqZWN0cywgd2l0aG91dCBkZWx0YSBjaGFpbnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RGVsdGFCYXNlQ2FjaGVMaW1pdChmaW5hbCBpbnQgbmV3TGltaXQpIHsKKwlwdWJsaWMgdm9pZCBzZXREZWx0YUJhc2VDYWNoZUxpbWl0KGludCBuZXdMaW1pdCkgewogCQlkZWx0YUJhc2VDYWNoZUxpbWl0ID0gbmV3TGltaXQ7CiAJfQogCkBAIC0yMTEsNyArMjExLDcgQEAKIAkgKiAgICAgICAgICAgIGFycmF5LCB3aGlsZSBvYmplY3RzIGJpZ2dlciB0aGFuIHRoaXMgc2l6ZSByZXF1aXJlIHVzaW5nIGFuCiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0U3RyZWFtfS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJlYW1GaWxlVGhyZXNob2xkKGZpbmFsIGludCBuZXdMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoaW50IG5ld0xpbWl0KSB7CiAJCXN0cmVhbUZpbGVUaHJlc2hvbGQgPSBuZXdMaW1pdDsKIAl9CiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9LgogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgV2luZG93Q2FjaGVDb25maWcgZnJvbUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwdWJsaWMgV2luZG93Q2FjaGVDb25maWcgZnJvbUNvbmZpZyhDb25maWcgcmMpIHsKIAkJc2V0UGFja2VkR2l0T3BlbkZpbGVzKHJjLmdldEludCgKIAkJCQkiY29yZSIsIG51bGwsICJwYWNrZWRnaXRvcGVuZmlsZXMiLCBnZXRQYWNrZWRHaXRPcGVuRmlsZXMoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJc2V0UGFja2VkR2l0TGltaXQocmMuZ2V0TG9uZygKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9wYWNrL1BhY2tDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9wYWNrL1BhY2tDb25maWcuamF2YQppbmRleCA0ODRjZGUyLi4yNTZlNDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvcGFjay9QYWNrQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhCkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCSAqIEBwYXJhbSByYwogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byByZWFkIHByb3BlcnRpZXMgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyB2b2lkIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCXNldE1heERlbHRhRGVwdGgocmMuZ2V0SW50KCJwYWNrIiwgImRlcHRoIiwgZ2V0TWF4RGVsdGFEZXB0aCgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlzZXREZWx0YVNlYXJjaFdpbmRvd1NpemUocmMuZ2V0SW50KAogCQkJCSJwYWNrIiwgIndpbmRvdyIsIGdldERlbHRhU2VhcmNoV2luZG93U2l6ZSgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsay5qYXZhCmluZGV4IDIzMTRjZjEuLmNlODk5NWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrLmphdmEKQEAgLTExNSwxMSArMTE1LDEzIEBACiAJICoKIAkgKiBAcGFyYW0gcmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgotCSAqIEByZXR1cm4gZ2VuZXJhdG9yIG92ZXIgc3VibW9kdWxlIGluZGV4IGVudHJpZXMKKwkgKiBAcmV0dXJuIGdlbmVyYXRvciBvdmVyIHN1Ym1vZHVsZSBpbmRleCBlbnRyaWVzLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisJICogICAgICAgICBmb3IgY2FsbGluZyB7QGxpbmsgI2Nsb3NlKCl9LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3VibW9kdWxlV2FsayBmb3JJbmRleChSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBUaGUgY2FsbGVyIGNsb3NlcyBpdAogCQlTdWJtb2R1bGVXYWxrIGdlbmVyYXRvciA9IG5ldyBTdWJtb2R1bGVXYWxrKHJlcG9zaXRvcnkpOwogCQl0cnkgewogCQkJRGlyQ2FjaGUgaW5kZXggPSByZXBvc2l0b3J5LnJlYWREaXJDYWNoZSgpOwpAQCAtMzY5LDcgKzM3MSw3IEBACiAJICogICAgICAgICAgICB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgU3VibW9kdWxlV2FsayhSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7CiAJCXJlcG9Db25maWcgPSByZXBvc2l0b3J5LmdldENvbmZpZygpOwogCQl3YWxrID0gbmV3IFRyZWVXYWxrKHJlcG9zaXRvcnkpOwpAQCAtMzg2LDcgKzM4OCw3IEBACiAJICogICAgICAgICAgICAuZ2l0bW9kdWxlcyBjb25maWcgb2JqZWN0CiAJICogQHJldHVybiB0aGlzIGdlbmVyYXRvcgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldE1vZHVsZXNDb25maWcoZmluYWwgQ29uZmlnIGNvbmZpZykgeworCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldE1vZHVsZXNDb25maWcoQ29uZmlnIGNvbmZpZykgewogCQltb2R1bGVzQ29uZmlnID0gY29uZmlnOwogCQlsb2FkUGF0aE5hbWVzKCk7CiAJCXJldHVybiB0aGlzOwpAQCAtNDA1LDcgKzQwNyw3IEBACiAJICogICAgICAgICAgICB0cmVlIGNvbnRhaW5pbmcgLmdpdG1vZHVsZXMKIAkgKiBAcmV0dXJuIHRoaXMgZ2VuZXJhdG9yCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZSkgeworCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFJvb3RUcmVlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHRyZWUpIHsKIAkJcm9vdFRyZWUgPSB0cmVlOwogCQltb2R1bGVzQ29uZmlnID0gbnVsbDsKIAkJcGF0aFRvTmFtZSA9IG51bGw7CkBAIC00MjYsNyArNDI4LDcgQEAKIAkgKiBAcmV0dXJuIHRoaXMgZ2VuZXJhdG9yCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CiAJCXAucmVzZXQod2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgaWQpOwogCQlyb290VHJlZSA9IHA7CkBAIC01NjAsNyArNTYyLDcgQEAKIAkgKiBAcmV0dXJuIHRoaXMgZ2VuZXJhdG9yCiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0VHJlZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBpdGVyYXRvcikKKwlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRUcmVlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXJhdG9yKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQl3YWxrLmFkZFRyZWUoaXRlcmF0b3IpOwogCQlyZXR1cm4gdGhpczsKQEAgLTU3OCw3ICs1ODAsNyBAQAogCSAqIEB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIGFueS4KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRUcmVlKGZpbmFsIEFueU9iamVjdElkIHRyZWVJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRUcmVlKEFueU9iamVjdElkIHRyZWVJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd2Fsay5hZGRUcmVlKHRyZWVJZCk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTc1NCwxMyArNzU2LDExIEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIE9iamVjdElkIGdldEhlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZXRSZXBvc2l0b3J5KCk7Ci0JCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KIAkJCXJldHVybiBzdWJSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQl9IGZpbmFsbHkgewotCQkJc3ViUmVwby5jbG9zZSgpOwogCQl9CiAJfQogCkBAIC03NzEsMTQgKzc3MSwxMiBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SGVhZFJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdldFJlcG9zaXRvcnkoKTsKLQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgeworCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IGdldFJlcG9zaXRvcnkoKSkgeworCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQkJUmVmIGhlYWQgPSBzdWJSZXBvLmV4YWN0UmVmKENvbnN0YW50cy5IRUFEKTsKIAkJCXJldHVybiBoZWFkICE9IG51bGwgPyBoZWFkLmdldExlYWYoKS5nZXROYW1lKCkgOiBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJc3ViUmVwby5jbG9zZSgpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9BbWF6b25TMy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQW1hem9uUzMuamF2YQppbmRleCBkN2M1YjlkLi5hMGZjNTdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9BbWF6b25TMy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTI4LDE0ICsxMjgsMTQgQEAKIAkJU0lHTkVEX0hFQURFUlMuYWRkKCJkYXRlIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2lnbmVkSGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NpZ25lZEhlYWRlcihTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBTdHJpbmcgbmFtZUxDID0gU3RyaW5nVXRpbHMudG9Mb3dlckNhc2UobmFtZSk7CiAJCXJldHVybiBTSUdORURfSEVBREVSUy5jb250YWlucyhuYW1lTEMpIHx8IG5hbWVMQy5zdGFydHNXaXRoKCJ4LWFtei0iKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b0NsZWFuU3RyaW5nKGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0KSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvQ2xlYW5TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgdiA6IGxpc3QpIHsKKwkJZm9yIChTdHJpbmcgdiA6IGxpc3QpIHsKIAkJCWlmIChzLmxlbmd0aCgpID4gMCkKIAkJCQlzLmFwcGVuZCgnLCcpOwogCQkJcy5hcHBlbmQodi5yZXBsYWNlQWxsKCJcbiIsICIiKS50cmltKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQlyZXR1cm4gcy50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmUoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtLCBmaW5hbCBTdHJpbmcgaykgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmUoTWFwPFN0cmluZywgU3RyaW5nPiBtLCBTdHJpbmcgaykgewogCQlmaW5hbCBTdHJpbmcgciA9IG0ucmVtb3ZlKGspOwogCQlyZXR1cm4gciAhPSBudWxsID8gciA6ICIiOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMjgzLDcgKzI4Myw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgc2VuZGluZyB0aGUgcmVxdWVzdCB3YXMgbm90IHBvc3NpYmxlLgogCSAqLwotCXB1YmxpYyBVUkxDb25uZWN0aW9uIGdldChmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5KQorCXB1YmxpYyBVUkxDb25uZWN0aW9uIGdldChTdHJpbmcgYnVja2V0LCBTdHJpbmcga2V5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZm9yIChpbnQgY3VyQXR0ZW1wdCA9IDA7IGN1ckF0dGVtcHQgPCBtYXhBdHRlbXB0czsgY3VyQXR0ZW1wdCsrKSB7CiAJCQlmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjID0gb3BlbigiR0VUIiwgYnVja2V0LCBrZXkpOyAvLyROT04tTkxTLTEkCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWNyeXB0aW9uIGNvdWxkIG5vdCBiZSBjb25maWd1cmVkLgogCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBkZWNyeXB0KGZpbmFsIFVSTENvbm5lY3Rpb24gdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZGVjcnlwdChVUkxDb25uZWN0aW9uIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBlbmNyeXB0aW9uLmRlY3J5cHQodS5nZXRJbnB1dFN0cmVhbSgpKTsKIAl9CiAKQEAgLTMzNiw3ICszMzYsNyBAQAogCSAqICAgICAgICAgICAgIHNlbmRpbmcgdGhlIHJlcXVlc3Qgd2FzIG5vdCBwb3NzaWJsZSwgb3IgdGhlIHJlc3BvbnNlIFhNTAogCSAqICAgICAgICAgICAgIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgcHJvcGVybHkuCiAJICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0KGZpbmFsIFN0cmluZyBidWNrZXQsIFN0cmluZyBwcmVmaXgpCisJcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0KFN0cmluZyBidWNrZXQsIFN0cmluZyBwcmVmaXgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiAhcHJlZml4LmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKIAkJCXByZWZpeCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKQEAgLTM1OSw3ICszNTksNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlbGV0aW9uIGZhaWxlZCBkdWUgdG8gY29tbXVuaWNhdGlvbnMgZXJyb3IuCiAJICovCi0JcHVibGljIHZvaWQgZGVsZXRlKGZpbmFsIFN0cmluZyBidWNrZXQsIGZpbmFsIFN0cmluZyBrZXkpCisJcHVibGljIHZvaWQgZGVsZXRlKFN0cmluZyBidWNrZXQsIFN0cmluZyBrZXkpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmb3IgKGludCBjdXJBdHRlbXB0ID0gMDsgY3VyQXR0ZW1wdCA8IG1heEF0dGVtcHRzOyBjdXJBdHRlbXB0KyspIHsKIAkJCWZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGMgPSBvcGVuKCJERUxFVEUiLCBidWNrZXQsIGtleSk7IC8vJE5PTi1OTFMtMSQKQEAgLTM5Niw3ICszOTYsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGNyZWF0aW9uL3VwZGF0aW5nIGZhaWxlZCBkdWUgdG8gY29tbXVuaWNhdGlvbnMgZXJyb3IuCiAJICovCi0JcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyBidWNrZXQsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIGJ5dGVbXSBkYXRhKQorCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcgYnVja2V0LCBTdHJpbmcga2V5LCBieXRlW10gZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChlbmNyeXB0aW9uICE9IFdhbGtFbmNyeXB0aW9uLk5PTkUpIHsKIAkJCS8vIFdlIGhhdmUgdG8gY29weSB0byBwcm9kdWNlIHRoZSBjaXBoZXIgdGV4dCBhbnl3YXkgc28gdXNlCkBAIC01MjQsMTIgKzUyNCwxMSBAQAogCQkJCUpHaXRUZXh0LmdldCgpLmFtYXpvblMzQWN0aW9uRmFpbGVkLCBhY3Rpb24sIGtleSwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YoSHR0cFN1cHBvcnQucmVzcG9uc2UoYykpLAogCQkJCWMuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpKTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gZXJyb3JTdHJlYW0gPSBjLmdldEVycm9yU3RyZWFtKCk7Ci0JCWlmIChlcnJvclN0cmVhbSA9PSBudWxsKSB7CisJCWlmIChjLmdldEVycm9yU3RyZWFtKCkgPT0gbnVsbCkgewogCQkJcmV0dXJuIGVycjsKIAkJfQogCi0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gZXJyb3JTdHJlYW0gPSBjLmdldEVycm9yU3RyZWFtKCkpIHsKIAkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOwogCQkJZm9yICg7OykgewpAQCAtNTQ1LDEzICs1NDQsMTEgQEAKIAkJCWlmIChidWYubGVuZ3RoID4gMCkgewogCQkJCWVyci5pbml0Q2F1c2UobmV3IElPRXhjZXB0aW9uKCJcbiIgKyBuZXcgU3RyaW5nKGJ1ZikpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZXJyb3JTdHJlYW0uY2xvc2UoKTsKIAkJfQogCQlyZXR1cm4gZXJyOwogCX0KIAotCUlPRXhjZXB0aW9uIG1heEF0dGVtcHRzKGZpbmFsIFN0cmluZyBhY3Rpb24sIGZpbmFsIFN0cmluZyBrZXkpIHsKKwlJT0V4Y2VwdGlvbiBtYXhBdHRlbXB0cyhTdHJpbmcgYWN0aW9uLCBTdHJpbmcga2V5KSB7CiAJCXJldHVybiBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJSkdpdFRleHQuZ2V0KCkuYW1hem9uUzNBY3Rpb25GYWlsZWRHaXZpbmdVcCwgYWN0aW9uLCBrZXksCiAJCQkJSW50ZWdlci52YWx1ZU9mKG1heEF0dGVtcHRzKSkpOwpAQCAtNjAwLDEwICs1OTcsMTAgQEAKIAkJcmV0dXJuIGM7CiAJfQogCi0Jdm9pZCBhdXRob3JpemUoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGF1dGhvcml6ZShIdHRwVVJMQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlcUhkciA9IGMuZ2V0UmVxdWVzdFByb3BlcnRpZXMoKTsKIAkJZmluYWwgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBzaWdIZHIgPSBuZXcgVHJlZU1hcDw+KCk7Ci0JCWZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IHJlcUhkci5lbnRyeVNldCgpKSB7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IHJlcUhkci5lbnRyeVNldCgpKSB7CiAJCQlmaW5hbCBTdHJpbmcgaGRyID0gZW50cnkuZ2V0S2V5KCk7CiAJCQlpZiAoaXNTaWduZWRIZWFkZXIoaGRyKSkKIAkJCQlzaWdIZHIucHV0KFN0cmluZ1V0aWxzLnRvTG93ZXJDYXNlKGhkciksIHRvQ2xlYW5TdHJpbmcoZW50cnkuZ2V0VmFsdWUoKSkpOwpAQCAtNjIyLDcgKzYxOSw3IEBACiAJCXMuYXBwZW5kKHJlbW92ZShzaWdIZHIsICJkYXRlIikpOyAvLyROT04tTkxTLTEkCiAJCXMuYXBwZW5kKCdcbicpOwogCi0JCWZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogc2lnSGRyLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBzaWdIZHIuZW50cnlTZXQoKSkgewogCQkJcy5hcHBlbmQoZS5nZXRLZXkoKSk7CiAJCQlzLmFwcGVuZCgnOicpOwogCQkJcy5hcHBlbmQoZS5nZXRWYWx1ZSgpKTsKQEAgLTYzOCw3ICs2MzUsNyBAQAogCQl0cnkgewogCQkJZmluYWwgTWFjIG0gPSBNYWMuZ2V0SW5zdGFuY2UoSE1BQyk7CiAJCQltLmluaXQocHJpdmF0ZUtleSk7Ci0JCQlzZWMgPSBCYXNlNjQuZW5jb2RlQnl0ZXMobS5kb0ZpbmFsKHMudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKTsKKwkJCXNlYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhtLmRvRmluYWwocy50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSk7CiAJCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubm9ITUFDc3VwcG9ydCwgSE1BQywgZS5nZXRNZXNzYWdlKCkpKTsKIAkJfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBlKSB7CkBAIC02NDcsNyArNjQ0LDcgQEAKIAkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkF1dGhvcml6YXRpb24iLCAiQVdTICIgKyBwdWJsaWNLZXkgKyAiOiIgKyBzZWMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCX0KIAotCXN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMoZmluYWwgRmlsZSBhdXRoRmlsZSkKKwlzdGF0aWMgUHJvcGVydGllcyBwcm9wZXJ0aWVzKEZpbGUgYXV0aEZpbGUpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhdXRoRmlsZSkpIHsKQEAgLTY2Nyw3ICs2NjQsNyBAQAogCiAJCXByaXZhdGUgU3RyaW5nQnVpbGRlciBkYXRhOwogCi0JCUxpc3RQYXJzZXIoZmluYWwgU3RyaW5nIGJuLCBmaW5hbCBTdHJpbmcgcCkgeworCQlMaXN0UGFyc2VyKFN0cmluZyBibiwgU3RyaW5nIHApIHsKIAkJCWJ1Y2tldCA9IGJuOwogCQkJcHJlZml4ID0gcDsKIAkJfQpAQCAtNzMwLDcgKzcyNyw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY2hhcmFjdGVycyhmaW5hbCBjaGFyW10gY2gsIGZpbmFsIGludCBzLCBmaW5hbCBpbnQgbikKKwkJcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzLCBpbnQgbikKIAkJCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIAkJCWlmIChkYXRhICE9IG51bGwpCiAJCQkJZGF0YS5hcHBlbmQoY2gsIHMsIG4pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZUNvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VDb25uZWN0aW9uLmphdmEKaW5kZXggYzhkMWQyMi4uZjYwNDVmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZUNvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlQ29ubmVjdGlvbi5qYXZhCkBAIC04NSw3ICs4NSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBSZWYgZ2V0UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIGZpbmFsIFJlZiBnZXRSZWYoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIGFkdmVydGlzZWRSZWZzLmdldChuYW1lKTsKIAl9CiAKQEAgLTEzMiw3ICsxMzIsNyBAQAogCSAqICAgICAgICAgICAgd2lsbCBiZSB3cmFwcGVkIGluIGFuIHVubW9kaWZpYWJsZSB3YXkgdG8gcHJvdGVjdCBpdCwgYnV0IGl0CiAJICogICAgICAgICAgICBkb2VzIG5vdCBnZXQgY29waWVkLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGF2YWlsYWJsZShmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IGFsbCkgeworCXByb3RlY3RlZCB2b2lkIGF2YWlsYWJsZShNYXA8U3RyaW5nLCBSZWY+IGFsbCkgewogCQlhZHZlcnRpc2VkUmVmcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChhbGwpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YQppbmRleCBlOTIyN2UzLi4zOGVhZTFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YQpAQCAtMTIyLDcgKzEyMiw3IEBACiAJLyoqIEV4dHJhIG9iamVjdHMgdGhlIHJlbW90ZSBoYXMsIGJ1dCB3aGljaCBhcmVuJ3Qgb2ZmZXJlZCBhcyByZWZzLiAqLwogCXByb3RlY3RlZCBmaW5hbCBTZXQ8T2JqZWN0SWQ+IGFkZGl0aW9uYWxIYXZlcyA9IG5ldyBIYXNoU2V0PD4oKTsKIAotCUJhc2VQYWNrQ29ubmVjdGlvbihmaW5hbCBQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKKwlCYXNlUGFja0Nvbm5lY3Rpb24oUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CiAJCXRyYW5zcG9ydCA9IChUcmFuc3BvcnQpIHBhY2tUcmFuc3BvcnQ7CiAJCWxvY2FsID0gdHJhbnNwb3J0LmxvY2FsOwogCQl1cmkgPSB0cmFuc3BvcnQudXJpOwpAQCAtMjc0LDcgKzI3NCw3IEBACiAJICogICAgICAgICAgICBvcHRpb24gc3RyaW5nCiAJICogQHJldHVybiB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FwYWJsZU9mKGZpbmFsIFN0cmluZyBvcHRpb24pIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhcGFibGVPZihTdHJpbmcgb3B0aW9uKSB7CiAJCXJldHVybiByZW1vdGVDYXBhYmxpdGllcy5jb250YWlucyhvcHRpb24pOwogCX0KIApAQCAtMjg3LDcgKzI4Nyw3IEBACiAJICogICAgICAgICAgICBvcHRpb24gd2Ugd2FudAogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSByZXF1ZXN0ZWQgb3B0aW9uIGlzIHN1cHBvcnRlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdhbnRDYXBhYmlsaXR5KGZpbmFsIFN0cmluZ0J1aWxkZXIgYiwgZmluYWwgU3RyaW5nIG9wdGlvbikgeworCXByb3RlY3RlZCBib29sZWFuIHdhbnRDYXBhYmlsaXR5KFN0cmluZ0J1aWxkZXIgYiwgU3RyaW5nIG9wdGlvbikgewogCQlpZiAoIWlzQ2FwYWJsZU9mKG9wdGlvbikpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWIuYXBwZW5kKCcgJyk7CkBAIC0zMTQsNyArMzE0LDcgQEAKIAkJcmV0dXJuIFVzZXJBZ2VudC5nZXRBZ2VudChyZW1vdGVDYXBhYmxpdGllcywgc3VwZXIuZ2V0UGVlclVzZXJBZ2VudCgpKTsKIAl9CiAKLQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih1cmksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZUFkdmVydGlzZW1lbnRzT2YsIG5hbWUpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0ZldGNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IDEzODMwNDUuLjBkZmNkODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YQpAQCAtNDUsOCArNDUsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTU1LDcgKzUzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUGFja1Byb3RvY29sRXhjZXB0aW9uOwpAQCAtMjAwLDYgKzE5NywxMyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9BTExPV19SRUFDSEFCTEVfU0hBMV9JTl9XQU5UID0gR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FMTE9XX1JFQUNIQUJMRV9TSEExX0lOX1dBTlQ7CiAKKwkvKioKKwkgKiBUaGUgY2xpZW50IHNwZWNpZmllZCBhIGZpbHRlciBleHByZXNzaW9uLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9GSUxURVIgPSBHaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fRklMVEVSOworCiAJcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGs7CiAKIAkvKiogQWxsIGNvbW1pdHMgdGhhdCBhcmUgaW1tZWRpYXRlbHkgcmVhY2hhYmxlIGJ5IGEgbG9jYWwgcmVmLiAqLwpAQCAtMjQyLDEzICsyNDYsMTYgQEAKIAogCXByaXZhdGUgUGFja2V0TGluZU91dCBwY2tTdGF0ZTsKIAorCS8qKiBJZiBub3QgLTEsIHRoZSBtYXhpbXVtIGJsb2Igc2l6ZSB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuICovCisJcHJpdmF0ZSBmaW5hbCBsb25nIGZpbHRlckJsb2JMaW1pdDsKKwogCS8qKgogCSAqIENyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHRvIGZldGNoIHVzaW5nIHRoZSBuYXRpdmUgZ2l0IHRyYW5zcG9ydC4KIAkgKgogCSAqIEBwYXJhbSBwYWNrVHJhbnNwb3J0CiAJICogICAgICAgICAgICB0aGUgdHJhbnNwb3J0LgogCSAqLwotCXB1YmxpYyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbihmaW5hbCBQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKKwlwdWJsaWMgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24oUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CiAJCXN1cGVyKHBhY2tUcmFuc3BvcnQpOwogCiAJCWlmIChsb2NhbCAhPSBudWxsKSB7CkBAIC0yNjIsNiArMjY5LDcgQEAKIAkJfQogCQlpbmNsdWRlVGFncyA9IHRyYW5zcG9ydC5nZXRUYWdPcHQoKSAhPSBUYWdPcHQuTk9fVEFHUzsKIAkJdGhpblBhY2sgPSB0cmFuc3BvcnQuaXNGZXRjaFRoaW4oKTsKKwkJZmlsdGVyQmxvYkxpbWl0ID0gdHJhbnNwb3J0LmdldEZpbHRlckJsb2JMaW1pdCgpOwogCiAJCWlmIChsb2NhbCAhPSBudWxsKSB7CiAJCQl3YWxrID0gbmV3IFJldldhbGsobG9jYWwpOwpAQCAtMjg4LDcgKzI5Niw3IEBACiAKIAkJZmluYWwgYm9vbGVhbiBtaW5pbWFsTmVnb3RpYXRpb247CiAKLQkJRmV0Y2hDb25maWcoZmluYWwgQ29uZmlnIGMpIHsKKwkJRmV0Y2hDb25maWcoQ29uZmlnIGMpIHsKIAkJCWFsbG93T2ZzRGVsdGEgPSBjLmdldEJvb2xlYW4oInJlcGFjayIsICJ1c2VkZWx0YWJhc2VvZmZzZXQiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQltaW5pbWFsTmVnb3RpYXRpb24gPSBjLmdldEJvb2xlYW4oImZldGNoIiwgInVzZW1pbmltYWxuZWdvdGlhdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlmYWxzZSk7CkBAIC0zMzEsNyArMzM5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJCWxvY2tNZXNzYWdlID0gbWVzc2FnZTsKIAl9CiAKQEAgLTQxMCw5ICs0MTgsOSBAQAogCQlyZXR1cm4gbG9jYWwuZ2V0Q29uZmlnKCkuZ2V0KEZldGNoQ29uZmlnOjpuZXcpOwogCX0KIAotCXByaXZhdGUgaW50IG1heFRpbWVXYW50ZWQoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnRzKSB7CisJcHJpdmF0ZSBpbnQgbWF4VGltZVdhbnRlZChDb2xsZWN0aW9uPFJlZj4gd2FudHMpIHsKIAkJaW50IG1heFRpbWUgPSAwOwotCQlmb3IgKGZpbmFsIFJlZiByIDogd2FudHMpIHsKKwkJZm9yIChSZWYgciA6IHdhbnRzKSB7CiAJCQl0cnkgewogCQkJCWZpbmFsIFJldk9iamVjdCBvYmogPSB3YWxrLnBhcnNlQW55KHIuZ2V0T2JqZWN0SWQoKSk7CiAJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJldkNvbW1pdCkgewpAQCAtNDI3LDEwICs0MzUsOSBAQAogCQlyZXR1cm4gbWF4VGltZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya1JlYWNoYWJsZShmaW5hbCBTZXQ8T2JqZWN0SWQ+IGhhdmUsIGZpbmFsIGludCBtYXhUaW1lKQorCXByaXZhdGUgdm9pZCBtYXJrUmVhY2hhYmxlKFNldDxPYmplY3RJZD4gaGF2ZSwgaW50IG1heFRpbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBsb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHJlZnMudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgciA6IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQlPYmplY3RJZCBpZCA9IHIuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCWlmIChpZCA9PSBudWxsKQogCQkJCWlkID0gci5nZXRPYmplY3RJZCgpOwpAQCAtNDgyLDEwICs0ODksMTAgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBzZW5kV2FudHMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBib29sZWFuIHNlbmRXYW50cyhDb2xsZWN0aW9uPFJlZj4gd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUGFja2V0TGluZU91dCBwID0gc3RhdGVsZXNzUlBDID8gcGNrU3RhdGUgOiBwY2tPdXQ7CiAJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGZpbmFsIFJlZiByIDogd2FudCkgeworCQlmb3IgKFJlZiByIDogd2FudCkgewogCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByLmdldE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkgewogCQkJCWNvbnRpbnVlOwpAQCAtNTI0LDYgKzUzMSwxMSBAQAogCQlpZiAoZmlyc3QpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQorCQlpZiAoZmlsdGVyQmxvYkxpbWl0ID09IDApIHsKKwkJCXAud3JpdGVTdHJpbmcoT1BUSU9OX0ZJTFRFUiArICIgYmxvYjpub25lIik7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIGlmIChmaWx0ZXJCbG9iTGltaXQgPiAwKSB7CisJCQlwLndyaXRlU3RyaW5nKE9QVElPTl9GSUxURVIgKyAiIGJsb2I6bGltaXQ9IiArIGZpbHRlckJsb2JMaW1pdCk7IC8vJE5PTi1OTFMtMSQKKwkJfQogCQlwLmVuZCgpOwogCQlvdXROZWVkc0VuZCA9IGZhbHNlOwogCQlyZXR1cm4gdHJ1ZTsKQEAgLTU2NCwxMSArNTc2LDE2IEBACiAJCQkJCU9QVElPTl9NVUxUSV9BQ0tfREVUQUlMRUQpKTsKIAkJfQogCisJCWlmIChmaWx0ZXJCbG9iTGltaXQgPj0gMCAmJiAhd2FudENhcGFiaWxpdHkobGluZSwgT1BUSU9OX0ZJTFRFUikpIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24odXJpLAorCQkJCQlKR2l0VGV4dC5nZXQoKS5maWx0ZXJSZXF1aXJlc0NhcGFiaWxpdHkpOworCQl9CisKIAkJYWRkVXNlckFnZW50Q2FwYWJpbGl0eShsaW5lKTsKIAkJcmV0dXJuIGxpbmUudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbmVnb3RpYXRlKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSB2b2lkIG5lZ290aWF0ZShQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJQ2FuY2VsbGVkRXhjZXB0aW9uIHsKIAkJZmluYWwgTXV0YWJsZU9iamVjdElkIGFja0lkID0gbmV3IE11dGFibGVPYmplY3RJZCgpOwogCQlpbnQgcmVzdWx0c1BlbmRpbmcgPSAwOwpAQCAtNzY4LDcgKzc4NSw3IEBACiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQkJZmluYWwgYm9vbGVhbiByZW1vdGVLbm93c0lzQ29tbW9uID0gYy5oYXMoQ09NTU9OKTsKIAkJCQlpZiAoYy5oYXMoQURWRVJUSVNFRCkpIHsKIAkJCQkJLy8gUmVtb3RlIGFkdmVydGlzZWQgdGhpcywgYW5kIHdlIGhhdmUgaXQsIGhlbmNlIGNvbW1vbi4KQEAgLTc4OSwxNCArODA2LDE0IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIG1hcmtSZWZzQWR2ZXJ0aXNlZCgpIHsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFJlZnMoKSkgeworCQlmb3IgKFJlZiByIDogZ2V0UmVmcygpKSB7CiAJCQltYXJrQWR2ZXJ0aXNlZChyLmdldE9iamVjdElkKCkpOwogCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCW1hcmtBZHZlcnRpc2VkKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya0FkdmVydGlzZWQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcml2YXRlIHZvaWQgbWFya0FkdmVydGlzZWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJdHJ5IHsKIAkJCXdhbGsucGFyc2VBbnkoaWQpLmFkZChBRFZFUlRJU0VEKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVhZEVycm9yKSB7CkBAIC04MDQsNyArODIxLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrQ29tbW9uKGZpbmFsIFJldk9iamVjdCBvYmosIGZpbmFsIEFja05hY2tSZXN1bHQgYW5yKQorCXByaXZhdGUgdm9pZCBtYXJrQ29tbW9uKFJldk9iamVjdCBvYmosIEFja05hY2tSZXN1bHQgYW5yKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHN0YXRlbGVzc1JQQyAmJiBhbnIgPT0gQWNrTmFja1Jlc3VsdC5BQ0tfQ09NTU9OICYmICFvYmouaGFzKFNUQVRFKSkgewogCQkJU3RyaW5nQnVpbGRlciBzOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IGVlNmYyOWUuLjY5NjI0ZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQAogCSAqIEBwYXJhbSBwYWNrVHJhbnNwb3J0CiAJICogICAgICAgICAgICB0aGUgdHJhbnNwb3J0LgogCSAqLwotCXB1YmxpYyBCYXNlUGFja1B1c2hDb25uZWN0aW9uKGZpbmFsIFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgeworCXB1YmxpYyBCYXNlUGFja1B1c2hDb25uZWN0aW9uKFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgewogCQlzdXBlcihwYWNrVHJhbnNwb3J0KTsKIAkJdGhpblBhY2sgPSB0cmFuc3BvcnQuaXNQdXNoVGhpbigpOwogCQlhdG9taWMgPSB0cmFuc3BvcnQuaXNQdXNoQXRvbWljKCk7CkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJCQkJCQlwdXNoT3B0aW9ucy50b1N0cmluZygpKSk7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZlVwZGF0ZXMpIHsKIAkJCWlmICghY2FwYWJsZURlbGV0ZVJlZnMgJiYgcnJ1LmlzRGVsZXRlKCkpIHsKIAkJCQlycnUuc2V0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9OT0RFTEVURSk7CiAJCQkJY29udGludWU7CkBAIC0yOTQsNyArMjk0LDcgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgdHJhbnNtaXRPcHRpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBTdHJpbmcgcHVzaE9wdGlvbiA6IHB1c2hPcHRpb25zKSB7CisJCWZvciAoU3RyaW5nIHB1c2hPcHRpb24gOiBwdXNoT3B0aW9ucykgewogCQkJcGNrT3V0LndyaXRlU3RyaW5nKHB1c2hPcHRpb24pOwogCQl9CiAKQEAgLTMzMiwxNyArMzMyLDE3IEBACiAJCVNldDxPYmplY3RJZD4gcmVtb3RlT2JqZWN0cyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJU2V0PE9iamVjdElkPiBuZXdPYmplY3RzID0gbmV3IEhhc2hTZXQ8PigpOwogCi0JCXRyeSAoZmluYWwgUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAorCQl0cnkgKFBhY2tXcml0ZXIgd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIodHJhbnNwb3J0LmdldFBhY2tDb25maWcoKSwKIAkJCQlsb2NhbC5uZXdPYmplY3RSZWFkZXIoKSkpIHsKIAotCQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFJlZnMoKSkgeworCQkJZm9yIChSZWYgciA6IGdldFJlZnMoKSkgewogCQkJCS8vIG9ubHkgYWRkIG9iamVjdHMgdGhhdCB3ZSBhY3R1YWxseSBoYXZlCiAJCQkJT2JqZWN0SWQgb2lkID0gci5nZXRPYmplY3RJZCgpOwogCQkJCWlmIChsb2NhbC5oYXNPYmplY3Qob2lkKSkKIAkJCQkJcmVtb3RlT2JqZWN0cy5hZGQob2lkKTsKIAkJCX0KIAkJCXJlbW90ZU9iamVjdHMuYWRkQWxsKGFkZGl0aW9uYWxIYXZlcyk7Ci0JCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSByIDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgciA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKIAkJCQlpZiAoIU9iamVjdElkLnplcm9JZCgpLmVxdWFscyhyLmdldE5ld09iamVjdElkKCkpKQogCQkJCQluZXdPYmplY3RzLmFkZChyLmdldE5ld09iamVjdElkKCkpOwogCQkJfQpAQCAtMzY1LDcgKzM2NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVhZFN0YXR1c1JlcG9ydChmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMpCisJcHJpdmF0ZSB2b2lkIHJlYWRTdGF0dXNSZXBvcnQoTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWZVcGRhdGVzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHVucGFja0xpbmUgPSByZWFkU3RyaW5nTG9uZ1RpbWVvdXQoKTsKIAkJaWYgKCF1bnBhY2tMaW5lLnN0YXJ0c1dpdGgoInVucGFjayAiKSkgLy8kTk9OLU5MUy0xJApAQCAtNDExLDcgKzQxMSw3IEBACiAJCQkJcnJ1LnNldE1lc3NhZ2UobWVzc2FnZSk7CiAJCQl9CiAJCX0KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5BV0FJVElOR19SRVBPUlQpCiAJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmV4cGVjdGVkUmVwb3J0Rm9yUmVmTm90UmVjZWl2ZWQgLCB1cmksIHJydS5nZXRSZW1vdGVOYW1lKCkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VSZWNlaXZlUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKaW5kZXggZTk3ZjcxYS4uYzQyNmUzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKQEAgLTMwNiw3ICszMDYsNyBAQAogCSAqIEBwYXJhbSBpbnRvCiAJICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeS4KIAkgKi8KLQlwcm90ZWN0ZWQgQmFzZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgaW50bykgeworCXByb3RlY3RlZCBCYXNlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBpbnRvKSB7CiAJCWRiID0gaW50bzsKIAkJd2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKIApAQCAtMzQwLDcgKzM0MCw3IEBACiAJCWZpbmFsIGxvbmcgbWF4RGlzY2FyZEJ5dGVzOwogCQlmaW5hbCBTaWduZWRQdXNoQ29uZmlnIHNpZ25lZFB1c2g7CiAKLQkJUmVjZWl2ZUNvbmZpZyhmaW5hbCBDb25maWcgY29uZmlnKSB7CisJCVJlY2VpdmVDb25maWcoQ29uZmlnIGNvbmZpZykgewogCQkJYWxsb3dDcmVhdGVzID0gdHJ1ZTsKIAkJCWFsbG93RGVsZXRlcyA9ICFjb25maWcuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsICJkZW55ZGVsZXRlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQlhbGxvd05vbkZhc3RGb3J3YXJkcyA9ICFjb25maWcuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsIC8vJE5PTi1OTFMtMSQKQEAgLTU0OCw3ICs1NDgsNyBAQAogCSAqICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHdyaXRpbmcgb3V0cHV0IGFuZCBkb2VzIG5vdCBwZXJmb3JtIHRoZQogCSAqICAgICAgICAgICAgaW5pdGlhbCBhZHZlcnRpc2luZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShmaW5hbCBib29sZWFuIHR3b1dheSkgeworCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGJvb2xlYW4gdHdvV2F5KSB7CiAJCWJpRGlyZWN0aW9uYWxQaXBlID0gdHdvV2F5OwogCX0KIApAQCAtNTkyLDcgKzU5Miw3IEBACiAJICogICAgICAgICAgICBhc3N1bWUgYWxsIHJlY2VpdmVkIG9iamVjdHMgYXJlIHZhbGlkLgogCSAqIEBzZWUgI3NldE9iamVjdENoZWNrZXIoT2JqZWN0Q2hlY2tlcikKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja1JlY2VpdmVkT2JqZWN0cyhmaW5hbCBib29sZWFuIGNoZWNrKSB7CisJcHVibGljIHZvaWQgc2V0Q2hlY2tSZWNlaXZlZE9iamVjdHMoYm9vbGVhbiBjaGVjaykgewogCQlpZiAoY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciA9PSBudWxsKQogCQkJc2V0T2JqZWN0Q2hlY2tlcihuZXcgT2JqZWN0Q2hlY2tlcigpKTsKIAkJZWxzZSBpZiAoIWNoZWNrICYmIG9iamVjdENoZWNrZXIgIT0gbnVsbCkKQEAgLTYyNiw3ICs2MjYsNyBAQAogCSAqIEBwYXJhbSBjYW5DcmVhdGUKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBwZXJtaXQgY3JlYXRlIHJlZiBjb21tYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDcmVhdGVzKGZpbmFsIGJvb2xlYW4gY2FuQ3JlYXRlKSB7CisJcHVibGljIHZvaWQgc2V0QWxsb3dDcmVhdGVzKGJvb2xlYW4gY2FuQ3JlYXRlKSB7CiAJCWFsbG93Q3JlYXRlcyA9IGNhbkNyZWF0ZTsKIAl9CiAKQEAgLTY0NSw3ICs2NDUsNyBAQAogCSAqIEBwYXJhbSBjYW5EZWxldGUKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBwZXJtaXQgZGVsZXRlIHJlZiBjb21tYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGVzKGZpbmFsIGJvb2xlYW4gY2FuRGVsZXRlKSB7CisJcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGVzKGJvb2xlYW4gY2FuRGVsZXRlKSB7CiAJCWFsbG93QW55RGVsZXRlcyA9IGNhbkRlbGV0ZTsKIAl9CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCB0aGUgY2xpZW50IHRvIGFzayBmb3Igbm9uLWZhc3QtZm9yd2FyZAogCSAqICAgICAgICAgICAgdXBkYXRlcyBvZiBhbiBleGlzdGluZyByZWYuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dOb25GYXN0Rm9yd2FyZHMoZmluYWwgYm9vbGVhbiBjYW5SZXdpbmQpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd05vbkZhc3RGb3J3YXJkcyhib29sZWFuIGNhblJld2luZCkgewogCQlhbGxvd05vbkZhc3RGb3J3YXJkcyA9IGNhblJld2luZDsKIAl9CiAKQEAgLTc0MSw3ICs3NDEsNyBAQAogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSByZXBvc2l0b3J5CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJcmVmTG9nSWRlbnQgPSBwaTsKIAl9CiAKQEAgLTc3OCw3ICs3NzgsNyBAQAogCSAqIEBwYXJhbSBhZHZlcnRpc2VSZWZzSG9vawogCSAqICAgICAgICAgICAgdGhlIGhvb2s7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soZmluYWwgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKKwlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgewogCQlpZiAoYWR2ZXJ0aXNlUmVmc0hvb2sgIT0gbnVsbCkKIAkJCXRoaXMuYWR2ZXJ0aXNlUmVmc0hvb2sgPSBhZHZlcnRpc2VSZWZzSG9vazsKIAkJZWxzZQpAQCAtNzk1LDcgKzc5NSw3IEBACiAJICogQHBhcmFtIHJlZkZpbHRlcgogCSAqICAgICAgICAgICAgdGhlIGZpbHRlcjsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoZmluYWwgUmVmRmlsdGVyIHJlZkZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CiAJCXRoaXMucmVmRmlsdGVyID0gcmVmRmlsdGVyICE9IG51bGwgPyByZWZGaWx0ZXIgOiBSZWZGaWx0ZXIuREVGQVVMVDsKIAl9CiAKQEAgLTgxNiw3ICs4MTYsNyBAQAogCSAqICAgICAgICAgICAgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpdGggdGhlCiAJICogICAgICAgICAgICBjb25uZWN0ZWQgY2xpZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIApAQCAtODYxLDcgKzg2MSw3IEBACiAJICogQHBhcmFtIGxpbWl0CiAJICogICAgICAgICAgICB0aGUgR2l0IG9iamVjdCBzaXplIGxpbWl0LiBJZiB6ZXJvIHRoZW4gdGhlcmUgaXMgbm90IGxpbWl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heE9iamVjdFNpemVMaW1pdChmaW5hbCBsb25nIGxpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0TWF4T2JqZWN0U2l6ZUxpbWl0KGxvbmcgbGltaXQpIHsKIAkJbWF4T2JqZWN0U2l6ZUxpbWl0ID0gbGltaXQ7CiAJfQogCkBAIC04NzQsNyArODc0LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwYWNrIHNpemUgbGltaXQsIGluIGJ5dGVzCiAJICogQHNpbmNlIDMuMwogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFBhY2tTaXplTGltaXQoZmluYWwgbG9uZyBsaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldE1heFBhY2tTaXplTGltaXQobG9uZyBsaW1pdCkgewogCQlpZiAobGltaXQgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkucmVjZWl2ZVBhY2tJbnZhbGlkTGltaXQsIExvbmcudmFsdWVPZihsaW1pdCkpKTsKQEAgLTEwMzEsNyArMTAzMSw3IEBACiAJICogICAgICAgICAgICBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoZSBob29rLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtdXN0IG5vdCBlbmQgd2l0aCBhbiBMRiwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW4gTEYuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEVycm9yKGZpbmFsIFN0cmluZyB3aGF0KSB7CisJcHVibGljIHZvaWQgc2VuZEVycm9yKFN0cmluZyB3aGF0KSB7CiAJCWlmIChyZWZzID09IG51bGwpIHsKIAkJCWlmIChhZHZlcnRpc2VFcnJvciA9PSBudWxsKQogCQkJCWFkdmVydGlzZUVycm9yID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTEwNjQsNyArMTA2NCw3IEBACiAJICogICAgICAgICAgICBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoZSBob29rLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtdXN0IG5vdCBlbmQgd2l0aCBhbiBMRiwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW4gTEYuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoZmluYWwgU3RyaW5nIHdoYXQpIHsKKwlwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShTdHJpbmcgd2hhdCkgewogCQltc2dPdXRXcmFwcGVyLndyaXRlKENvbnN0YW50cy5lbmNvZGUod2hhdCArICJcbiIpKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtMTIxMyw3ICsxMjEzLDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhmaW5hbCBSZWZBZHZlcnRpc2VyIGFkdikKKwlwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoUmVmQWR2ZXJ0aXNlciBhZHYpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiB7CiAJCWlmIChhZHZlcnRpc2VFcnJvciAhPSBudWxsKSB7CiAJCQlhZHYud3JpdGVPbmUoIkVSUiAiICsgYWR2ZXJ0aXNlRXJyb3IpOyAvLyROT04tTkxTLTEkCkBAIC0xNDQwLDcgKzE0NDAsNyBAQAogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgcGFjayBpcyBleHBlY3RlZCBiYXNlZCBvbiB0aGUgbGlzdCBvZiBjb21tYW5kcy4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkUGFjaygpIHsKLQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQlpZiAoY21kLmdldFR5cGUoKSAhPSBSZWNlaXZlQ29tbWFuZC5UeXBlLkRFTEVURSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTUyNiwyMSArMTUyNiwyMSBAQAogCQl9CiAJCXBhcnNlciA9IG51bGw7CiAKLQkJdHJ5IChmaW5hbCBPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsoZGIpKSB7CisJCXRyeSAoT2JqZWN0V2FsayBvdyA9IG5ldyBPYmplY3RXYWxrKGRiKSkgewogCQkJaWYgKGJhc2VPYmplY3RzICE9IG51bGwpIHsKIAkJCQlvdy5zb3J0KFJldlNvcnQuVE9QTyk7CiAJCQkJaWYgKCFiYXNlT2JqZWN0cy5pc0VtcHR5KCkpCiAJCQkJCW93LnNvcnQoUmV2U29ydC5CT1VOREFSWSwgdHJ1ZSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlc3VsdC5OT1RfQVRURU1QVEVEKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoY21kLmdldFR5cGUoKSA9PSBSZWNlaXZlQ29tbWFuZC5UeXBlLkRFTEVURSkKIAkJCQkJY29udGludWU7CiAJCQkJb3cubWFya1N0YXJ0KG93LnBhcnNlQW55KGNtZC5nZXROZXdJZCgpKSk7CiAJCQl9Ci0JCQlmb3IgKGZpbmFsIE9iamVjdElkIGhhdmUgOiBhZHZlcnRpc2VkSGF2ZXMpIHsKKwkJCWZvciAoT2JqZWN0SWQgaGF2ZSA6IGFkdmVydGlzZWRIYXZlcykgewogCQkJCVJldk9iamVjdCBvID0gb3cucGFyc2VBbnkoaGF2ZSk7CiAJCQkJb3cubWFya1VuaW50ZXJlc3Rpbmcobyk7CiAKQEAgLTE1OTYsNyArMTU5Niw3IEBACiAJICogVmFsaWRhdGUgdGhlIGNvbW1hbmQgbGlzdC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbW1hbmRzKCkgewotCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCWZpbmFsIFJlZiByZWYgPSBjbWQuZ2V0UmVmKCk7CiAJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlc3VsdC5OT1RfQVRURU1QVEVEKQogCQkJCWNvbnRpbnVlOwpAQCAtMTc2MSw3ICsxNzYxLDcgQEAKIAkgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgY29tbWFuZCBsaXN0IGNvbnRhaW5pbmcgb25seSB0aG9zZSBjb21tYW5kcyB3aXRoIHRoZQogCSAqICAgICAgICAgZGVzaXJlZCBzdGF0dXMuCiAJICovCi0JcHJvdGVjdGVkIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGZpbHRlckNvbW1hbmRzKGZpbmFsIFJlc3VsdCB3YW50KSB7CisJcHJvdGVjdGVkIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGZpbHRlckNvbW1hbmRzKFJlc3VsdCB3YW50KSB7CiAJCXJldHVybiBSZWNlaXZlQ29tbWFuZC5maWx0ZXIoY29tbWFuZHMsIHdhbnQpOwogCX0KIApAQCAtMTgxNSw3ICsxODE1LDcgQEAKIAkJaWYgKHVucGFja0Vycm9yICE9IG51bGwpIHsKIAkJCW91dC5zZW5kU3RyaW5nKCJ1bnBhY2sgZXJyb3IgIiArIHVucGFja0Vycm9yLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCWlmIChmb3JDbGllbnQpIHsKLQkJCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJCQlvdXQuc2VuZFN0cmluZygibmcgIiArIGNtZC5nZXRSZWZOYW1lKCkgLy8kTk9OLU5MUy0xJAogCQkJCQkJCSsgIiBuL2EgKHVucGFja2VyIGVycm9yKSIpOyAvLyROT04tTkxTLTEkCiAJCQkJfQpAQCAtMTgyNSw3ICsxODI1LDcgQEAKIAogCQlpZiAoZm9yQ2xpZW50KQogCQkJb3V0LnNlbmRTdHJpbmcoInVucGFjayBvayIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJaWYgKGNtZC5nZXRSZXN1bHQoKSA9PSBSZXN1bHQuT0spIHsKIAkJCQlpZiAoZm9yQ2xpZW50KQogCQkJCQlvdXQuc2VuZFN0cmluZygib2sgIiArIGNtZC5nZXRSZWZOYW1lKCkpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IDM5ZWZhYmYuLjQ0OWY1MjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00Nyw4ICs0Nyw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTk4LDcgKzk2LDcgQEAKIAogCXByaXZhdGUgUGFja0xvY2sgcGFja0xvY2s7CiAKLQlCdW5kbGVGZXRjaENvbm5lY3Rpb24oVHJhbnNwb3J0IHRyYW5zcG9ydEJ1bmRsZSwgZmluYWwgSW5wdXRTdHJlYW0gc3JjKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlCdW5kbGVGZXRjaENvbm5lY3Rpb24oVHJhbnNwb3J0IHRyYW5zcG9ydEJ1bmRsZSwgSW5wdXRTdHJlYW0gc3JjKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJhbnNwb3J0ID0gdHJhbnNwb3J0QnVuZGxlOwogCQliaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzcmMpOwogCQl0cnkgewpAQCAtMTU1LDEyICsxNTMsMTIgQEAKIAkJYXZhaWxhYmxlKGF2YWlsKTsKIAl9CiAKLQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih0cmFuc3BvcnQudXJpLAogCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZUFkdmVydGlzZW1lbnRzT2YsIG5hbWUpKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyByZWFkTGluZShmaW5hbCBieXRlW10gaGRyYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIHJlYWRMaW5lKGJ5dGVbXSBoZHJidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVN0cmluZ0J1aWxkZXIgbGluZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwogCQl3aGlsZSAoIWRvbmUpIHsKQEAgLTIxMiw3ICsyMTAsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtMjI4LDEzICsyMjYsMTMgQEAKIAkJaWYgKHByZXJlcXMuaXNFbXB0eSgpKQogCQkJcmV0dXJuOwogCi0JCXRyeSAoZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgewogCQkJZmluYWwgUmV2RmxhZyBQUkVSRVEgPSBydy5uZXdGbGFnKCJQUkVSRVEiKTsgLy8kTk9OLU5MUy0xJAogCQkJZmluYWwgUmV2RmxhZyBTRUVOID0gcncubmV3RmxhZygiU0VFTiIpOyAvLyROT04tTkxTLTEkCiAKIAkJCWZpbmFsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nID0gbmV3IEhhc2hNYXA8PigpOwogCQkJZmluYWwgTGlzdDxSZXZPYmplY3Q+IGNvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJCWZvciAoZmluYWwgTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBwcmVyZXFzLmVudHJ5U2V0KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBwcmVyZXFzLmVudHJ5U2V0KCkpIHsKIAkJCQlPYmplY3RJZCBwID0gZS5nZXRLZXkoKTsKIAkJCQl0cnkgewogCQkJCQlmaW5hbCBSZXZDb21taXQgYyA9IHJ3LnBhcnNlQ29tbWl0KHApOwpAQCAtMjU0LDEzICsyNTIsMTMgQEAKIAkJCQl0aHJvdyBuZXcgTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbih0cmFuc3BvcnQudXJpLAogCQkJCQkJbWlzc2luZyk7CiAKLQkJCU1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzOworCQkJTGlzdDxSZWY+IGxvY2FsUmVmczsKIAkJCXRyeSB7Ci0JCQkJbG9jYWxSZWZzID0gdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOworCQkJCWxvY2FsUmVmcyA9IHRyYW5zcG9ydC5sb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydC51cmksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJCX0KLQkJCWZvciAoZmluYWwgUmVmIHIgOiBsb2NhbFJlZnMudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIHIgOiBsb2NhbFJlZnMpIHsKIAkJCQl0cnkgewogCQkJCQlydy5tYXJrU3RhcnQocncucGFyc2VDb21taXQoci5nZXRPYmplY3RJZCgpKSk7CiAJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVhZEVycm9yKSB7CkBAIC0yODQsNyArMjgyLDcgQEAKIAkJCX0KIAogCQkJaWYgKHJlbWFpbmluZyA+IDApIHsKLQkJCQlmb3IgKGZpbmFsIFJldk9iamVjdCBvIDogY29tbWl0cykgeworCQkJCWZvciAoUmV2T2JqZWN0IG8gOiBjb21taXRzKSB7CiAJCQkJCWlmICghby5oYXMoU0VFTikpCiAJCQkJCQltaXNzaW5nLnB1dChvLCBwcmVyZXFzLmdldChvKSk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YQppbmRleCAzNWFjNzc5Li5mMmEyNjFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YQpAQCAtMTUxLDcgKzE1MSw3IEBACiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICBvYmplY3QgdG8gcGFjay4gTXVsdGlwbGUgcmVmcyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgb2JqZWN0LgogCSAqLwotCXB1YmxpYyB2b2lkIGluY2x1ZGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIHZvaWQgaW5jbHVkZShTdHJpbmcgbmFtZSwgQW55T2JqZWN0SWQgaWQpIHsKIAkJYm9vbGVhbiB2YWxpZFJlZk5hbWUgPSBSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKG5hbWUpIHx8IENvbnN0YW50cy5IRUFELmVxdWFscyhuYW1lKTsKIAkJaWYgKCF2YWxpZFJlZk5hbWUpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRSZWZOYW1lLCBuYW1lKSk7CkBAIC0xNjksNyArMTY5LDcgQEAKIAkgKiBAcGFyYW0gcgogCSAqICAgICAgICAgICAgdGhlIHJlZiB0byBpbmNsdWRlLgogCSAqLwotCXB1YmxpYyB2b2lkIGluY2x1ZGUoZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgdm9pZCBpbmNsdWRlKFJlZiByKSB7CiAJCWluY2x1ZGUoci5nZXROYW1lKCksIHIuZ2V0T2JqZWN0SWQoKSk7CiAKIAkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQpAQCAtMTkyLDcgKzE5Miw3IEBACiAJICogICAgICAgICAgICBwYXJzZWQgYW5kIG5vdCBkaXNwb3NlZCBpbiBvcmRlciB0byBtYXhpbWl6ZSB0aGUgYW1vdW50IG9mCiAJICogICAgICAgICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBidW5kbGUgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIGFzc3VtZShmaW5hbCBSZXZDb21taXQgYykgeworCXB1YmxpYyB2b2lkIGFzc3VtZShSZXZDb21taXQgYykgewogCQlpZiAoYyAhPSBudWxsKQogCQkJYXNzdW1lLmFkZChjKTsKIAl9CkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJCWZpbmFsIEhhc2hTZXQ8T2JqZWN0SWQ+IGluYyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCWZpbmFsIEhhc2hTZXQ8T2JqZWN0SWQ+IGV4YyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCWluYy5hZGRBbGwoaW5jbHVkZS52YWx1ZXMoKSk7Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCByIDogYXNzdW1lKQorCQkJZm9yIChSZXZDb21taXQgciA6IGFzc3VtZSkKIAkJCQlleGMuYWRkKHIuZ2V0SWQoKSk7CiAJCQlwYWNrV3JpdGVyLnNldEluZGV4RGlzYWJsZWQodHJ1ZSk7CiAJCQlwYWNrV3JpdGVyLnNldERlbHRhQmFzZUFzT2Zmc2V0KHRydWUpOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJCQl3LndyaXRlKCdcbicpOwogCiAJCQlmaW5hbCBjaGFyW10gdG1wID0gbmV3IGNoYXJbQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIXTsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IGEgOiBhc3N1bWUpIHsKKwkJCWZvciAoUmV2Q29tbWl0IGEgOiBhc3N1bWUpIHsKIAkJCQl3LndyaXRlKCctJyk7CiAJCQkJYS5jb3B5VG8odG1wLCB3KTsKIAkJCQlpZiAoYS5nZXRSYXdCdWZmZXIoKSAhPSBudWxsKSB7CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkJCQl9CiAJCQkJdy53cml0ZSgnXG4nKTsKIAkJCX0KLQkJCWZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0SWQ+IGUgOiBpbmNsdWRlLmVudHJ5U2V0KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0SWQ+IGUgOiBpbmNsdWRlLmVudHJ5U2V0KCkpIHsKIAkJCQllLmdldFZhbHVlKCkuY29weVRvKHRtcCwgdyk7CiAJCQkJdy53cml0ZSgnICcpOwogCQkJCXcud3JpdGUoZS5nZXRLZXkoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Db25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Db25uZWN0aW9uLmphdmEKaW5kZXggYmNjNTExMC4uZDRjNTE0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Nvbm5lY3Rpb24uamF2YQpAQCAtOTUsNyArOTUsNyBAQAogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcmVmIHRvIG9idGFpbi4KIAkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgcmVmOyBudWxsIGlmIHRoZSByZW1vdGUgZGlkIG5vdCBhZHZlcnRpc2UgdGhpcyByZWYuCiAJICovCi0JcHVibGljIFJlZiBnZXRSZWYoZmluYWwgU3RyaW5nIG5hbWUpOworCXB1YmxpYyBSZWYgZ2V0UmVmKFN0cmluZyBuYW1lKTsKIAogCS8qKgogCSAqIHtAaW5oZXJpdERvY30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uLmphdmEKaW5kZXggMmZjNWViMi4uNzI4OWNlNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uLmphdmEKQEAgLTUzLDcgKzUzLDkgQEAKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CkBAIC0xMDcsNyArMTA5LDcgQEAKIAkgKiAgICAgICAgICAgIHBvcnQgd2lsbCBiZSBjaG9zZW4gb24gYWxsIG5ldHdvcmsgaW50ZXJmYWNlcy4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRGFlbW9uKGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIpIHsKKwlwdWJsaWMgRGFlbW9uKEluZXRTb2NrZXRBZGRyZXNzIGFkZHIpIHsKIAkJbXlBZGRyZXNzID0gYWRkcjsKIAkJcHJvY2Vzc29ycyA9IG5ldyBUaHJlYWRHcm91cCgiR2l0LURhZW1vbiIpOyAvLyROT04tTkxTLTEkCiAKQEAgLTE1MywxMiArMTU1LDE3IEBACiAKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgRGFlbW9uQ2xpZW50IGRjLAotCQkJCQkJCWZpbmFsIFJlcG9zaXRvcnkgZGIpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQkJCQlmaW5hbCBSZXBvc2l0b3J5IGRiLAorCQkJCQkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQorCQkJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CiAJCQkJCQlVcGxvYWRQYWNrIHVwID0gdXBsb2FkUGFja0ZhY3RvcnkuY3JlYXRlKGRjLCBkYik7CiAJCQkJCQlJbnB1dFN0cmVhbSBpbiA9IGRjLmdldElucHV0U3RyZWFtKCk7CiAJCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gZGMuZ2V0T3V0cHV0U3RyZWFtKCk7CisJCQkJCQlpZiAoZXh0cmFQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCQkJCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoZXh0cmFQYXJhbWV0ZXJzKTsKKwkJCQkJCX0KIAkJCQkJCXVwLnVwbG9hZChpbiwgb3V0LCBudWxsKTsKIAkJCQkJfQogCQkJCX0sIG5ldyBEYWVtb25TZXJ2aWNlKCJyZWNlaXZlLXBhY2siLCAicmVjZWl2ZXBhY2siKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTY4LDcgKzE3NSw5IEBACiAKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgRGFlbW9uQ2xpZW50IGRjLAotCQkJCQkJCWZpbmFsIFJlcG9zaXRvcnkgZGIpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQkJCQlmaW5hbCBSZXBvc2l0b3J5IGRiLAorCQkJCQkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQorCQkJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CiAJCQkJCQlSZWNlaXZlUGFjayBycCA9IHJlY2VpdmVQYWNrRmFjdG9yeS5jcmVhdGUoZGMsIGRiKTsKQEAgLTIwMCw3ICsyMDksNyBAQAogCXB1YmxpYyBzeW5jaHJvbml6ZWQgRGFlbW9uU2VydmljZSBnZXRTZXJ2aWNlKFN0cmluZyBuYW1lKSB7CiAJCWlmICghbmFtZS5zdGFydHNXaXRoKCJnaXQtIikpIC8vJE5PTi1OTFMtMSQKIAkJCW5hbWUgPSAiZ2l0LSIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgRGFlbW9uU2VydmljZSBzIDogc2VydmljZXMpIHsKKwkJZm9yIChEYWVtb25TZXJ2aWNlIHMgOiBzZXJ2aWNlcykgewogCQkJaWYgKHMuZ2V0Q29tbWFuZE5hbWUoKS5lcXVhbHMobmFtZSkpCiAJCQkJcmV0dXJuIHM7CiAJCX0KQEAgLTIyNCw3ICsyMzMsNyBAQAogCSAqICAgICAgICAgICAgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpdGggdGhlCiAJICogICAgICAgICAgICBjb25uZWN0ZWQgY2xpZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIApAQCAtNDExLDcgKzQyMCw3IEBACiAJCX0KIAl9CiAKLQl2b2lkIHN0YXJ0Q2xpZW50KGZpbmFsIFNvY2tldCBzKSB7CisJdm9pZCBzdGFydENsaWVudChTb2NrZXQgcykgewogCQlmaW5hbCBEYWVtb25DbGllbnQgZGMgPSBuZXcgRGFlbW9uQ2xpZW50KHRoaXMpOwogCiAJCWZpbmFsIFNvY2tldEFkZHJlc3MgcGVlciA9IHMuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpOwpAQCAtNDQ1LDggKzQ1NCw4IEBACiAJCX0uc3RhcnQoKTsKIAl9CiAKLQlzeW5jaHJvbml6ZWQgRGFlbW9uU2VydmljZSBtYXRjaFNlcnZpY2UoZmluYWwgU3RyaW5nIGNtZCkgewotCQlmb3IgKGZpbmFsIERhZW1vblNlcnZpY2UgZCA6IHNlcnZpY2VzKSB7CisJc3luY2hyb25pemVkIERhZW1vblNlcnZpY2UgbWF0Y2hTZXJ2aWNlKFN0cmluZyBjbWQpIHsKKwkJZm9yIChEYWVtb25TZXJ2aWNlIGQgOiBzZXJ2aWNlcykgewogCQkJaWYgKGQuaGFuZGxlcyhjbWQpKQogCQkJCXJldHVybiBkOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25DbGllbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhCmluZGV4IGE5NzMxYWMuLjUxYzQ5MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhCkBAIC01MCw2ICs1MCw4IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKQEAgLTY2LDExICs2OCwxMSBAQAogCiAJcHJpdmF0ZSBPdXRwdXRTdHJlYW0gcmF3T3V0OwogCi0JRGFlbW9uQ2xpZW50KGZpbmFsIERhZW1vbiBkKSB7CisJRGFlbW9uQ2xpZW50KERhZW1vbiBkKSB7CiAJCWRhZW1vbiA9IGQ7CiAJfQogCi0Jdm9pZCBzZXRSZW1vdGVBZGRyZXNzKGZpbmFsIEluZXRBZGRyZXNzIGlhKSB7CisJdm9pZCBzZXRSZW1vdGVBZGRyZXNzKEluZXRBZGRyZXNzIGlhKSB7CiAJCXBlZXIgPSBpYTsKIAl9CiAKQEAgLTExMCw3ICsxMTIsNyBAQAogCQlyZXR1cm4gcmF3T3V0OwogCX0KIAotCXZvaWQgZXhlY3V0ZShmaW5hbCBTb2NrZXQgc29jaykgdGhyb3dzIElPRXhjZXB0aW9uLAorCXZvaWQgZXhlY3V0ZShTb2NrZXQgc29jaykgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sIFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJcmF3SW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFtKCkpOwogCQlyYXdPdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29jay5nZXRPdXRwdXRTdHJlYW0oKSk7CkBAIC0xMTgsNiArMTIwLDE0IEBACiAJCWlmICgwIDwgZGFlbW9uLmdldFRpbWVvdXQoKSkKIAkJCXNvY2suc2V0U29UaW1lb3V0KGRhZW1vbi5nZXRUaW1lb3V0KCkgKiAxMDAwKTsKIAkJU3RyaW5nIGNtZCA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3SW4pLnJlYWRTdHJpbmdSYXcoKTsKKworCQlDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzID0gbnVsbDsKKworCQlpbnQgbnVsbnVsID0gY21kLmluZGV4T2YoIlwwXDAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobnVsbnVsICE9IC0xKSB7CisJCQlleHRyYVBhcmFtZXRlcnMgPSBBcnJheXMuYXNMaXN0KGNtZC5zdWJzdHJpbmcobnVsbnVsICsgMikuc3BsaXQoIlwwIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwogCQlmaW5hbCBpbnQgbnVsID0gY21kLmluZGV4T2YoJ1wwJyk7CiAJCWlmIChudWwgPj0gMCkgewogCQkJLy8gTmV3ZXIgY2xpZW50cyBoaWRlIGEgImhvc3QiIGhlYWRlciBiZWhpbmQgdGhpcyBieXRlLgpAQCAtMTMxLDYgKzE0MSw2IEBACiAJCWlmIChzcnYgPT0gbnVsbCkKIAkJCXJldHVybjsKIAkJc29jay5zZXRTb1RpbWVvdXQoMCk7Ci0JCXNydi5leGVjdXRlKHRoaXMsIGNtZCk7CisJCXNydi5leGVjdXRlKHRoaXMsIGNtZCwgZXh0cmFQYXJhbWV0ZXJzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25TZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25TZXJ2aWNlLmphdmEKaW5kZXggNzEyZWIyMi4uNmQyYmVlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uU2VydmljZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vblNlcnZpY2UuamF2YQpAQCAtNDUsNyArNDUsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuU2VjdGlvblBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwpAQCAtNjUsNyArNjcsNyBAQAogCiAJcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRhYmxlOwogCi0JRGFlbW9uU2VydmljZShmaW5hbCBTdHJpbmcgY21kTmFtZSwgZmluYWwgU3RyaW5nIGNmZ05hbWUpIHsKKwlEYWVtb25TZXJ2aWNlKFN0cmluZyBjbWROYW1lLCBTdHJpbmcgY2ZnTmFtZSkgewogCQljb21tYW5kID0gY21kTmFtZS5zdGFydHNXaXRoKCJnaXQtIikgPyBjbWROYW1lIDogImdpdC0iICsgY21kTmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWNvbmZpZ0tleSA9IGNmZyAtPiBuZXcgU2VydmljZUNvbmZpZyhEYWVtb25TZXJ2aWNlLnRoaXMsIGNmZywgY2ZnTmFtZSk7CiAJCW92ZXJyaWRhYmxlID0gdHJ1ZTsKQEAgLTk2LDcgKzk4LDcgQEAKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBhbGxvdyB0aGlzIHNlcnZpY2UgdG8gYmUgdXNlZDsge0Bjb2RlIGZhbHNlfQogCSAqICAgICAgICAgICAgdG8gZGVueSBpdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlZCA9IG9uOwogCX0KIApAQCAtMTIwLDcgKzEyMiw3IEBACiAJICogICAgICAgICAgICBlbmFibGVkIHN0YXRlIHdpdGggdGhlIDxjb2RlPmRhZW1vbi5zZXJ2aWNlbmFtZTwvY29kZT4gY29uZmlnCiAJICogICAgICAgICAgICBzZXR0aW5nLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRhYmxlKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRPdmVycmlkYWJsZShib29sZWFuIG9uKSB7CiAJCW92ZXJyaWRhYmxlID0gb247CiAJfQogCkBAIC0xNDAsMTkgKzE0MiwyMCBAQAogCSAqICAgICAgICAgICAgaW5wdXQgbGluZSBmcm9tIHRoZSBjbGllbnQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgY29tbWFuZCBjYW4gYWNjZXB0IHRoZSBnaXZlbiBjb21tYW5kIGxpbmUuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlcyhmaW5hbCBTdHJpbmcgY29tbWFuZExpbmUpIHsKKwlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzKFN0cmluZyBjb21tYW5kTGluZSkgewogCQlyZXR1cm4gY29tbWFuZC5sZW5ndGgoKSArIDEgPCBjb21tYW5kTGluZS5sZW5ndGgoKQogCQkJCSYmIGNvbW1hbmRMaW5lLmNoYXJBdChjb21tYW5kLmxlbmd0aCgpKSA9PSAnICcKIAkJCQkmJiBjb21tYW5kTGluZS5zdGFydHNXaXRoKGNvbW1hbmQpOwogCX0KIAotCXZvaWQgZXhlY3V0ZShmaW5hbCBEYWVtb25DbGllbnQgY2xpZW50LCBmaW5hbCBTdHJpbmcgY29tbWFuZExpbmUpCisJdm9pZCBleGVjdXRlKERhZW1vbkNsaWVudCBjbGllbnQsIFN0cmluZyBjb21tYW5kTGluZSwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIG5hbWUgPSBjb21tYW5kTGluZS5zdWJzdHJpbmcoY29tbWFuZC5sZW5ndGgoKSArIDEpOwogCQl0cnkgKFJlcG9zaXRvcnkgZGIgPSBjbGllbnQuZ2V0RGFlbW9uKCkub3BlblJlcG9zaXRvcnkoY2xpZW50LCBuYW1lKSkgewogCQkJaWYgKGlzRW5hYmxlZEZvcihkYikpIHsKLQkJCQlleGVjdXRlKGNsaWVudCwgZGIpOworCQkJCWV4ZWN1dGUoY2xpZW50LCBkYiwgZXh0cmFQYXJhbWV0ZXJzKTsKIAkJCX0KIAkJfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIGUpIHsKIAkJCS8vIEFuIGVycm9yIHdoZW4gb3BlbmluZyB0aGUgcmVwbyBtZWFucyB0aGUgY2xpZW50IGlzIGV4cGVjdGluZyBhIHJlZgpAQCAtMTYyLDEzICsxNjUsMTQgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWRGb3IoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWRGb3IoUmVwb3NpdG9yeSBkYikgewogCQlpZiAoaXNPdmVycmlkYWJsZSgpKQogCQkJcmV0dXJuIGRiLmdldENvbmZpZygpLmdldChjb25maWdLZXkpLmVuYWJsZWQ7CiAJCXJldHVybiBpc0VuYWJsZWQoKTsKIAl9CiAKLQlhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoRGFlbW9uQ2xpZW50IGNsaWVudCwgUmVwb3NpdG9yeSBkYikKKwlhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoRGFlbW9uQ2xpZW50IGNsaWVudCwgUmVwb3NpdG9yeSBkYiwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGVmYXVsdFNzaFNlc3Npb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YQppbmRleCBhNzQ5ZmJjLi41Zjc0ZTcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogY2xhc3MgRGVmYXVsdFNzaFNlc3Npb25GYWN0b3J5IGV4dGVuZHMgSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5IHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZShmaW5hbCBPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIGZpbmFsIFNlc3Npb24gc2Vzc2lvbikgeworCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZShPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIFNlc3Npb24gc2Vzc2lvbikgewogCQkvLyBObyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQuCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hIZWFkUmVjb3JkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YQppbmRleCA0MjFlZjIxLi4zNGFiMzYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogCiAJVVJJaXNoIHNvdXJjZVVSSTsKIAotCXZvaWQgd3JpdGUoZmluYWwgV3JpdGVyIHB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGUoV3JpdGVyIHB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgdHlwZTsKIAkJZmluYWwgU3RyaW5nIG5hbWU7CiAJCWlmIChzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoUl9IRUFEUykpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKaW5kZXggMTE3ZTg0NC4uYzQzYWIxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKQEAgLTEwNiwxMiArMTA2LDEyIEBACiAKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzOwogCi0JRmV0Y2hQcm9jZXNzKGZpbmFsIFRyYW5zcG9ydCB0LCBmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGYpIHsKKwlGZXRjaFByb2Nlc3MoVHJhbnNwb3J0IHQsIENvbGxlY3Rpb248UmVmU3BlYz4gZikgewogCQl0cmFuc3BvcnQgPSB0OwogCQl0b0ZldGNoID0gZjsKIAl9CiAKLQl2b2lkIGV4ZWN1dGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkKKwl2b2lkIGV4ZWN1dGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZldGNoUmVzdWx0IHJlc3VsdCkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWFza0Zvci5jbGVhcigpOwogCQlsb2NhbFVwZGF0ZXMuY2xlYXIoKTsKQEAgLTEyMyw3ICsxMjMsNyBAQAogCQkJZXhlY3V0ZUltcChtb25pdG9yLCByZXN1bHQpOwogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKLQkJCWZvciAoZmluYWwgUGFja0xvY2sgbG9jayA6IHBhY2tMb2NrcykKKwkJCWZvciAoUGFja0xvY2sgbG9jayA6IHBhY2tMb2NrcykKIAkJCQlsb2NrLnVubG9jaygpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCQlyZXN1bHQuc2V0QWR2ZXJ0aXNlZFJlZnModHJhbnNwb3J0LmdldFVSSSgpLCBjb25uLmdldFJlZnNNYXAoKSk7CiAJCQlyZXN1bHQucGVlclVzZXJBZ2VudCA9IGNvbm4uZ2V0UGVlclVzZXJBZ2VudCgpOwogCQkJZmluYWwgU2V0PFJlZj4gbWF0Y2hlZCA9IG5ldyBIYXNoU2V0PD4oKTsKLQkJCWZvciAoZmluYWwgUmVmU3BlYyBzcGVjIDogdG9GZXRjaCkgeworCQkJZm9yIChSZWZTcGVjIHNwZWMgOiB0b0ZldGNoKSB7CiAJCQkJaWYgKHNwZWMuZ2V0U291cmNlKCkgPT0gbnVsbCkKIAkJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCQlKR2l0VGV4dC5nZXQoKS5zb3VyY2VSZWZOb3RTcGVjaWZpZWRGb3JSZWZzcGVjLCBzcGVjKSk7CkBAIC0xNzYsNyArMTc2LDcgQEAKIAkJCQkvLwogCQkJCWhhdmUuYWRkQWxsKGFza0Zvci5rZXlTZXQoKSk7CiAJCQkJYXNrRm9yLmNsZWFyKCk7Ci0JCQkJZm9yIChmaW5hbCBSZWYgciA6IGFkZGl0aW9uYWxUYWdzKSB7CisJCQkJZm9yIChSZWYgciA6IGFkZGl0aW9uYWxUYWdzKSB7CiAJCQkJCU9iamVjdElkIGlkID0gci5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJCQlpZiAoaWQgPT0gbnVsbCkKIAkJCQkJCWlkID0gci5nZXRPYmplY3RJZCgpOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJCQkJLm5ld0JhdGNoVXBkYXRlKCkKIAkJCQkuc2V0QWxsb3dOb25GYXN0Rm9yd2FyZHModHJ1ZSkKIAkJCQkuc2V0UmVmTG9nTWVzc2FnZSgiZmV0Y2giLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgKGZpbmFsIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKKwkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7CiAJCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yKSB7CiAJCQkJKChCYXRjaGluZ1Byb2dyZXNzTW9uaXRvcikgbW9uaXRvcikuc2V0RGVsYXlTdGFydCgKIAkJCQkJCTI1MCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGZldGNoT2JqZWN0cyhmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwlwcml2YXRlIHZvaWQgZmV0Y2hPYmplY3RzKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQljb25uLnNldFBhY2tMb2NrTWVzc2FnZSgiamdpdCBmZXRjaCAiICsgdHJhbnNwb3J0LnVyaSk7IC8vJE5PTi1OTFMtMSQKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQkJCQlKR2l0VGV4dC5nZXQoKS5wZWVyRGlkTm90U3VwcGx5QUNvbXBsZXRlT2JqZWN0R3JhcGgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjbG9zZUNvbm5lY3Rpb24oZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KSB7CisJcHJpdmF0ZSB2b2lkIGNsb3NlQ29ubmVjdGlvbihGZXRjaFJlc3VsdCByZXN1bHQpIHsKIAkJaWYgKGNvbm4gIT0gbnVsbCkgewogCQkJY29ubi5jbG9zZSgpOwogCQkJcmVzdWx0LmFkZE1lc3NhZ2VzKGNvbm4uZ2V0TWVzc2FnZXMoKSk7CkBAIC0yOTUsMTIgKzI5NSwxMiBAQAogCQkvLyBuZXcgY29ubmVjdGlvbiBoYXMgb2ZmZXJlZCB0byB1cy4KIAkJLy8KIAkJZmluYWwgSGFzaE1hcDxPYmplY3RJZCwgUmVmPiBhdmFpbCA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGNvbm4uZ2V0UmVmcygpKQorCQlmb3IgKFJlZiByIDogY29ubi5nZXRSZWZzKCkpCiAJCQlhdmFpbC5wdXQoci5nZXRPYmplY3RJZCgpLCByKTsKIAogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudHMgPSBuZXcgQXJyYXlMaXN0PD4oYXNrRm9yLnZhbHVlcygpKTsKIAkJYXNrRm9yLmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgUmVmIHdhbnQgOiB3YW50cykgeworCQlmb3IgKFJlZiB3YW50IDogd2FudHMpIHsKIAkJCWZpbmFsIFJlZiBuZXdSZWYgPSBhdmFpbC5nZXQod2FudC5nZXRPYmplY3RJZCgpKTsKIAkJCWlmIChuZXdSZWYgIT0gbnVsbCkgewogCQkJCWFza0Zvci5wdXQobmV3UmVmLmdldE9iamVjdElkKCksIG5ld1JlZik7CkBAIC0zMTEsNyArMzExLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVUcmFja2luZ1JlZlVwZGF0ZShmaW5hbCBPYmplY3RJZCB3YW50KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYWNraW5nUmVmVXBkYXRlKE9iamVjdElkIHdhbnQpIHsKIAkJZmluYWwgSXRlcmF0b3I8VHJhY2tpbmdSZWZVcGRhdGU+IGkgPSBsb2NhbFVwZGF0ZXMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CiAJCQlmaW5hbCBUcmFja2luZ1JlZlVwZGF0ZSB1ID0gaS5uZXh0KCk7CkBAIC0zMjAsNyArMzIwLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVGZXRjaEhlYWRSZWNvcmQoZmluYWwgT2JqZWN0SWQgd2FudCkgeworCXByaXZhdGUgdm9pZCByZW1vdmVGZXRjaEhlYWRSZWNvcmQoT2JqZWN0SWQgd2FudCkgewogCQlmaW5hbCBJdGVyYXRvcjxGZXRjaEhlYWRSZWNvcmQ+IGkgPSBmZXRjaEhlYWRVcGRhdGVzLml0ZXJhdG9yKCk7CiAJCXdoaWxlIChpLmhhc05leHQoKSkgewogCQkJZmluYWwgRmV0Y2hIZWFkUmVjb3JkIGZoID0gaS5uZXh0KCk7CkBAIC0zMjksNyArMzI5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGVGRVRDSF9IRUFEKGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlRkVUQ0hfSEVBRChGZXRjaFJlc3VsdCByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgbWV0YSA9IHRyYW5zcG9ydC5sb2NhbC5nZXREaXJlY3RvcnkoKTsKIAkJaWYgKG1ldGEgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTMzOCw3ICszMzgsNyBAQAogCQkJaWYgKGxvY2subG9jaygpKSB7CiAJCQkJdHJ5IChXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCiAJCQkJCQlsb2NrLmdldE91dHB1dFN0cmVhbSgpKSkgewotCQkJCQlmb3IgKGZpbmFsIEZldGNoSGVhZFJlY29yZCBoIDogZmV0Y2hIZWFkVXBkYXRlcykgeworCQkJCQlmb3IgKEZldGNoSGVhZFJlY29yZCBoIDogZmV0Y2hIZWFkVXBkYXRlcykgewogCQkJCQkJaC53cml0ZSh3KTsKIAkJCQkJCXJlc3VsdC5hZGQoaCk7CiAJCQkJCX0KQEAgLTM1MiwxMCArMzUyLDEwIEBACiAKIAlwcml2YXRlIGJvb2xlYW4gYXNrRm9ySXNDb21wbGV0ZSgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewotCQkJdHJ5IChmaW5hbCBPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsodHJhbnNwb3J0LmxvY2FsKSkgewotCQkJCWZvciAoZmluYWwgT2JqZWN0SWQgd2FudCA6IGFza0Zvci5rZXlTZXQoKSkKKwkJCXRyeSAoT2JqZWN0V2FsayBvdyA9IG5ldyBPYmplY3RXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKKwkJCQlmb3IgKE9iamVjdElkIHdhbnQgOiBhc2tGb3Iua2V5U2V0KCkpCiAJCQkJCW93Lm1hcmtTdGFydChvdy5wYXJzZUFueSh3YW50KSk7Ci0JCQkJZm9yIChmaW5hbCBSZWYgcmVmIDogbG9jYWxSZWZzKCkudmFsdWVzKCkpCisJCQkJZm9yIChSZWYgcmVmIDogbG9jYWxSZWZzKCkudmFsdWVzKCkpCiAJCQkJCW93Lm1hcmtVbmludGVyZXN0aW5nKG93LnBhcnNlQW55KHJlZi5nZXRPYmplY3RJZCgpKSk7CiAJCQkJb3cuY2hlY2tDb25uZWN0aXZpdHkoKTsKIAkJCX0KQEAgLTM2NywxNSArMzY3LDE1IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZXhwYW5kV2lsZGNhcmQoZmluYWwgUmVmU3BlYyBzcGVjLCBmaW5hbCBTZXQ8UmVmPiBtYXRjaGVkKQorCXByaXZhdGUgdm9pZCBleHBhbmRXaWxkY2FyZChSZWZTcGVjIHNwZWMsIFNldDxSZWY+IG1hdGNoZWQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBSZWYgc3JjIDogY29ubi5nZXRSZWZzKCkpIHsKKwkJZm9yIChSZWYgc3JjIDogY29ubi5nZXRSZWZzKCkpIHsKIAkJCWlmIChzcGVjLm1hdGNoU291cmNlKHNyYykgJiYgbWF0Y2hlZC5hZGQoc3JjKSkKIAkJCQl3YW50KHNyYywgc3BlYy5leHBhbmRGcm9tU291cmNlKHNyYykpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFNpbmdsZShmaW5hbCBSZWZTcGVjIHNwZWMsIGZpbmFsIFNldDxSZWY+IG1hdGNoZWQpCisJcHJpdmF0ZSB2b2lkIGV4cGFuZFNpbmdsZShSZWZTcGVjIHNwZWMsIFNldDxSZWY+IG1hdGNoZWQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJU3RyaW5nIHdhbnQgPSBzcGVjLmdldFNvdXJjZSgpOwogCQlpZiAoT2JqZWN0SWQuaXNJZCh3YW50KSkgewpAQCAtMzk1LDcgKzM5NSw3IEBACiAJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZXhwYW5kQXV0b0ZvbGxvd1RhZ3MoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWY+IGFkZGl0aW9uYWxUYWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gaGF2ZVJlZnMgPSBsb2NhbFJlZnMoKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBjb25uLmdldFJlZnMoKSkgewogCQkJaWYgKCFpc1RhZyhyKSkKIAkJCQljb250aW51ZTsKIApAQCAtNDE5LDcgKzQxOSw3IEBACiAKIAlwcml2YXRlIHZvaWQgZXhwYW5kRmV0Y2hUYWdzKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gaGF2ZVJlZnMgPSBsb2NhbFJlZnMoKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBjb25uLmdldFJlZnMoKSkgewogCQkJaWYgKCFpc1RhZyhyKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNDM0LDEyICs0MzQsMTIgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCB3YW50VGFnKGZpbmFsIFJlZiByKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgd2FudFRhZyhSZWYgcikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXdhbnQociwgbmV3IFJlZlNwZWMoKS5zZXRTb3VyY2Uoci5nZXROYW1lKCkpCiAJCQkJLnNldERlc3RpbmF0aW9uKHIuZ2V0TmFtZSgpKS5zZXRGb3JjZVVwZGF0ZSh0cnVlKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHdhbnQoZmluYWwgUmVmIHNyYywgZmluYWwgUmVmU3BlYyBzcGVjKQorCXByaXZhdGUgdm9pZCB3YW50KFJlZiBzcmMsIFJlZlNwZWMgc3BlYykKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCBuZXdJZCA9IHNyYy5nZXRPYmplY3RJZCgpOwogCQlpZiAobmV3SWQgPT0gbnVsbCkgewpAQCAtNDk3LDEyICs0OTcsMTUgQEAKIAogCXByaXZhdGUgdm9pZCBkZWxldGVTdGFsZVRyYWNraW5nUmVmcyhGZXRjaFJlc3VsdCByZXN1bHQsCiAJCQlCYXRjaFJlZlVwZGF0ZSBiYXRjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU2V0PFJlZj4gcHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQ8PigpOwotCQlmb3IgKGZpbmFsIFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkgewotCQkJZmluYWwgU3RyaW5nIHJlZm5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiB0b0ZldGNoKSB7CisJCVNldDxSZWY+IHByb2Nlc3NlZCA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJZm9yIChSZWYgcmVmIDogbG9jYWxSZWZzKCkudmFsdWVzKCkpIHsKKwkJCWlmIChyZWYuaXNTeW1ib2xpYygpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlTdHJpbmcgcmVmbmFtZSA9IHJlZi5nZXROYW1lKCk7CisJCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHRvRmV0Y2gpIHsKIAkJCQlpZiAoc3BlYy5tYXRjaERlc3RpbmF0aW9uKHJlZm5hbWUpKSB7Ci0JCQkJCWZpbmFsIFJlZlNwZWMgcyA9IHNwZWMuZXhwYW5kRnJvbURlc3RpbmF0aW9uKHJlZm5hbWUpOworCQkJCQlSZWZTcGVjIHMgPSBzcGVjLmV4cGFuZEZyb21EZXN0aW5hdGlvbihyZWZuYW1lKTsKIAkJCQkJaWYgKHJlc3VsdC5nZXRBZHZlcnRpc2VkUmVmKHMuZ2V0U291cmNlKCkpID09IG51bGwKIAkJCQkJCQkmJiBwcm9jZXNzZWQuYWRkKHJlZikpIHsKIAkJCQkJCWRlbGV0ZVRyYWNraW5nUmVmKHJlc3VsdCwgYmF0Y2gsIHMsIHJlZik7CkBAIC01MjYsMTEgKzUyOSwxMSBAQAogCQliYXRjaC5hZGRDb21tYW5kKHVwZGF0ZS5hc1JlY2VpdmVDb21tYW5kKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWcoZmluYWwgUmVmIHIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFnKFJlZiByKSB7CiAJCXJldHVybiBpc1RhZyhyLmdldE5hbWUoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZyhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWcoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChDb25zdGFudHMuUl9UQUdTKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFJlc3VsdC5qYXZhCmluZGV4IDI2NjdlYzMuLmFkNGM1ZTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUmVzdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hSZXN1bHQuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCQlzdWJtb2R1bGVzID0gbmV3IEhhc2hNYXA8PigpOwogCX0KIAotCXZvaWQgYWRkKGZpbmFsIEZldGNoSGVhZFJlY29yZCByKSB7CisJdm9pZCBhZGQoRmV0Y2hIZWFkUmVjb3JkIHIpIHsKIAkJaWYgKCFyLm5vdEZvck1lcmdlKQogCQkJZm9yTWVyZ2UuYWRkKHIpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0dpdFByb3RvY29sQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9HaXRQcm90b2NvbENvbnN0YW50cy5qYXZhCmluZGV4IDIwMzExNDcuLjEwY2Q3NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0dpdFByb3RvY29sQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvR2l0UHJvdG9jb2xDb25zdGFudHMuamF2YQpAQCAtMTA4LDYgKzEwOCwxNCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9TSEFMTE9XID0gInNoYWxsb3ciOyAvLyROT04tTkxTLTEkCiAKIAkvKioKKwkgKiBUaGUgY2xpZW50IHdhbnRzIHRoZSAiZGVlcGVuIiBjb21tYW5kIHRvIGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvCisJICogdGhlIGNsaWVudCdzIHNoYWxsb3cgY29tbWl0cy4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fREVFUEVOX1JFTEFUSVZFID0gImRlZXBlbi1yZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgogCSAqIFRoZSBjbGllbnQgZG9lcyBub3Qgd2FudCBwcm9ncmVzcyBtZXNzYWdlcyBhbmQgd2lsbCBpZ25vcmUgdGhlbS4KIAkgKgogCSAqIEBzaW5jZSAzLjIKQEAgLTE1Miw2ICsxNjAsMTMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUFVTSF9DRVJUID0gInB1c2gtY2VydCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgorCSAqIFRoZSBjbGllbnQgc3BlY2lmaWVkIGEgZmlsdGVyIGV4cHJlc3Npb24uCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKIAkgKiBUaGUgY2xpZW50IHN1cHBvcnRzIGF0b21pYyBwdXNoZXMuIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHRoZSBzZXJ2ZXIKIAkgKiB3aWxsIHVwZGF0ZSBhbGwgcmVmcyB3aXRoaW4gb25lIGF0b21pYyB0cmFuc2FjdGlvbi4KIAkgKgpAQCAtMjE1LDYgKzIzMCwyMCBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUFVTSF9PUFRJT05TID0gInB1c2gtb3B0aW9ucyI7IC8vJE5PTi1OTFMtMSQKIAorCS8qKgorCSAqIFRoZSBzZXJ2ZXIgc3VwcG9ydHMgbGlzdGluZyByZWZzIHVzaW5nIHByb3RvY29sIHYyLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTFNfUkVGUyA9ICJscy1yZWZzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNlcnZlciBzdXBwb3J0cyBmZXRjaCB1c2luZyBwcm90b2NvbCB2Mi4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0ZFVENIID0gImZldGNoIjsgLy8kTk9OLU5MUy0xJAorCiAJc3RhdGljIGVudW0gTXVsdGlBY2sgewogCQlPRkYsIENPTlRJTlVFLCBERVRBSUxFRDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9ITUFDU0hBMU5vbmNlR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9ITUFDU0hBMU5vbmNlR2VuZXJhdG9yLmphdmEKaW5kZXggNmMyNmI3MC4uMTQxNTMzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSE1BQ1NIQTFOb25jZUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0hNQUNTSEExTm9uY2VHZW5lcmF0b3IuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJfQogCiAJCVN0cmluZyBpbnB1dCA9IHBhdGggKyAiOiIgKyBTdHJpbmcudmFsdWVPZih0aW1lc3RhbXApOyAvLyROT04tTkxTLTEkCi0JCWJ5dGVbXSByYXdIbWFjID0gbWFjLmRvRmluYWwoaW5wdXQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYnl0ZVtdIHJhd0htYWMgPSBtYWMuZG9GaW5hbChpbnB1dC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBMb25nLnRvU3RyaW5nKHRpbWVzdGFtcCkgKyAiLSIgKyB0b0hleChyYXdIbWFjKTsgLy8kTk9OLU5MUy0xJAogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSHR0cEF1dGhNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0h0dHBBdXRoTWV0aG9kLmphdmEKaW5kZXggYzQwZDk2My4uZmIwMzE5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSHR0cEF1dGhNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9IdHRwQXV0aE1ldGhvZC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9BVVRIT1JJWkFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX1dXV19BVVRIRU5USUNBVEU7CiAKQEAgLTUxLDYgKzUxLDcgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTU5LDcgKzYwLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OwpAQCAtMTYwLDEwICsxNjAsMTAgQEAKIAkJZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gY29ubi5nZXRIZWFkZXJGaWVsZHMoKTsKIAkJSHR0cEF1dGhNZXRob2QgYXV0aGVudGljYXRpb24gPSBUeXBlLk5PTkUubWV0aG9kKEVNUFRZX1NUUklORyk7CiAKLQkJZm9yIChmaW5hbCBFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKIAkJCWlmIChIRFJfV1dXX0FVVEhFTlRJQ0FURS5lcXVhbHNJZ25vcmVDYXNlKGVudHJ5LmdldEtleSgpKSkgewogCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCQkJZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogZW50cnkuZ2V0VmFsdWUoKSkgewogCQkJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgIT0gMCkgewogCQkJCQkJCWZpbmFsIFN0cmluZ1tdIHZhbHVlUGFydCA9IHZhbHVlLnNwbGl0KAogCQkJCQkJCQkJU0NIRU1BX05BTUVfU0VQQVJBVE9SLCAyKTsKQEAgLTMwNywxNSArMzA3LDE1IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBhdXRob3JpemUoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHsKKwkJdm9pZCBhdXRob3JpemUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKIAkJCXRoaXMudXNlciA9IHVzZXJuYW1lOwogCQkJdGhpcy5wYXNzID0gcGFzc3dvcmQ7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBjb25maWd1cmVSZXF1ZXN0KGZpbmFsIEh0dHBDb25uZWN0aW9uIGNvbm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgY29uZmlndXJlUmVxdWVzdChIdHRwQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJU3RyaW5nIGlkZW50ID0gdXNlciArICI6IiArIHBhc3M7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBlbmMgPSBCYXNlNjQuZW5jb2RlQnl0ZXMoaWRlbnQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCVN0cmluZyBlbmMgPSBCYXNlNjQuZW5jb2RlQnl0ZXMoaWRlbnQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoSERSX0FVVEhPUklaQVRJT04sIHR5cGUuZ2V0U2NoZW1lTmFtZSgpCiAJCQkJCSsgIiAiICsgZW5jKTsgLy8kTk9OLU5MUy0xJAogCQl9CkBAIC0zMjMsNyArMzIzLDcgQEAKIAogCS8qKiBQZXJmb3JtcyBIVFRQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4gKi8KIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWdlc3QgZXh0ZW5kcyBIdHRwQXV0aE1ldGhvZCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBQUk5HID0gbmV3IFJhbmRvbSgpOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZWN1cmVSYW5kb20gUFJORyA9IG5ldyBTZWN1cmVSYW5kb20oKTsKIAogCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zOwogCkBAIC0zNDYsMTQgKzM0NiwxNCBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgYXV0aG9yaXplKGZpbmFsIFN0cmluZyB1c2VybmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB7CisJCXZvaWQgYXV0aG9yaXplKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CiAJCQl0aGlzLnVzZXIgPSB1c2VybmFtZTsKIAkJCXRoaXMucGFzcyA9IHBhc3N3b3JkOwogCQl9CiAKIAkJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCiAJCUBPdmVycmlkZQotCQl2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoZmluYWwgSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBjb25maWd1cmVSZXF1ZXN0KEh0dHBDb25uZWN0aW9uIGNvbm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAKIAkJCWZpbmFsIFN0cmluZyByZWFsbSA9IHBhcmFtcy5nZXQoInJlYWxtIik7IC8vJE5PTi1OTFMtMSQKQEAgLTQzMCwxNSArNDMwLDE1IEBACiAKIAkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEgoU3RyaW5nIGRhdGEpIHsKIAkJCU1lc3NhZ2VEaWdlc3QgbWQgPSBuZXdNRDUoKTsKLQkJCW1kLnVwZGF0ZShkYXRhLmdldEJ5dGVzKFVURl84KSk7CisJCQltZC51cGRhdGUoZGF0YS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQlyZXR1cm4gTEhFWChtZC5kaWdlc3QoKSk7CiAJCX0KIAogCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgS0QoU3RyaW5nIHNlY3JldCwgU3RyaW5nIGRhdGEpIHsKIAkJCU1lc3NhZ2VEaWdlc3QgbWQgPSBuZXdNRDUoKTsKLQkJCW1kLnVwZGF0ZShzZWNyZXQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCW1kLnVwZGF0ZShzZWNyZXQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJbWQudXBkYXRlKChieXRlKSAnOicpOwotCQkJbWQudXBkYXRlKGRhdGEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCW1kLnVwZGF0ZShkYXRhLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCXJldHVybiBMSEVYKG1kLmRpZ2VzdCgpKTsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhCmluZGV4IDczMzg0YTEuLmQ0OTQyNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAgKiBUaGlzIGlzIGEgaGFjayBmb3Ige0BsaW5rIFdhbGtFbmNyeXB0aW9ufSB0byBjcmVhdGUgYW55IGNpcGhlciBjb25maWd1cmVkIGJ5CiAgKiB0aGUgZW5kLXVzZXIuIFVzaW5nIHRoaXMgY2xhc3MgYWxsb3dzIEpHaXQgdG8gdmlvbGF0ZSBFcnJvclByb25lJ3Mgc2VjdXJpdHkKICAqIHJlY29tbWVuZGF0aW9ucyAoPGEKLSAqIGhyZWY9Imh0dHA6Ly9lcnJvcnByb25lLmluZm8vYnVncGF0dGVybi9JbnNlY3VyZUNyeXB0b1VzYWdlIgorICogaHJlZj0iaHR0cHM6Ly9lcnJvcnByb25lLmluZm8vYnVncGF0dGVybi9JbnNlY3VyZUNyeXB0b1VzYWdlIgogICogPkluc2VjdXJlQ3J5cHRvVXNhZ2U8L2E+KSwgd2hpY2ggaXMgbm90IHNlY3VyZS4KICAqLwogY2xhc3MgSW5zZWN1cmVDaXBoZXJGYWN0b3J5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hDb25maWdTZXNzaW9uRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEKaW5kZXggMmEyMjJmYi4uZWFiM2IzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Db25maWdSZXBvc2l0b3J5OworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Db25maWdSZXBvc2l0b3J5LkNvbmZpZzsKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaDsKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKQEAgLTIyMiwxMCArMjIzLDMwIEBACiAJCQlzZXNzaW9uLnNldFVzZXJJbmZvKG5ldyBDcmVkZW50aWFsc1Byb3ZpZGVyVXNlckluZm8oc2Vzc2lvbiwKIAkJCQkJY3JlZGVudGlhbHNQcm92aWRlcikpOwogCQl9CisJCXNhZmVDb25maWcoc2Vzc2lvbiwgaGMuZ2V0Q29uZmlnKCkpOwogCQljb25maWd1cmUoaGMsIHNlc3Npb24pOwogCQlyZXR1cm4gc2Vzc2lvbjsKIAl9CiAKKwlwcml2YXRlIHZvaWQgc2FmZUNvbmZpZyhTZXNzaW9uIHNlc3Npb24sIENvbmZpZyBjZmcpIHsKKwkJLy8gRW5zdXJlIHRoYXQgSnNjaCBjaGVja3MgYWxsIGNvbmZpZ3VyZWQgYWxnb3JpdGhtcywgbm90IGp1c3QgaXRzCisJCS8vIGJ1aWx0LWluIG9uZXMuIE90aGVyd2lzZSBpdCBtYXkgcHJvcG9zZSBhbiBhbGdvcml0aG0gZm9yIHdoaWNoIGl0CisJCS8vIGRvZXNuJ3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiwgYW5kIHRoZW4gcnVuIGludG8gYW4gTlBFIGlmIHRoYXQKKwkJLy8gYWxnb3JpdGhtIGVuZHMgdXAgYmVpbmcgY2hvc2VuLgorCQljb3B5Q29uZmlnVmFsdWVUb1Nlc3Npb24oc2Vzc2lvbiwgY2ZnLCAiQ2lwaGVycyIsICJDaGVja0NpcGhlcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNvcHlDb25maWdWYWx1ZVRvU2Vzc2lvbihzZXNzaW9uLCBjZmcsICJLZXhBbGdvcml0aG1zIiwgIkNoZWNrS2V4ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNvcHlDb25maWdWYWx1ZVRvU2Vzc2lvbihzZXNzaW9uLCBjZmcsICJIb3N0S2V5QWxnb3JpdGhtcyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkiQ2hlY2tTaWduYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIHZvaWQgY29weUNvbmZpZ1ZhbHVlVG9TZXNzaW9uKFNlc3Npb24gc2Vzc2lvbiwgQ29uZmlnIGNmZywKKwkJCVN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKwkJU3RyaW5nIHZhbHVlID0gY2ZnLmdldFZhbHVlKGZyb20pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2Vzc2lvbi5zZXRDb25maWcodG8sIHZhbHVlKTsKKwkJfQorCX0KKwogCXByaXZhdGUgdm9pZCBzZXRVc2VyTmFtZShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyB1c2VyTmFtZSkgewogCQkvLyBKc2NoIDAuMS41NCBwaWNrcyB1cCB0aGUgdXNlciBuYW1lIGZyb20gdGhlIHNzaCBjb25maWcsIGV2ZW4gaWYgYW4KIAkJLy8gZXhwbGljaXQgdXNlciBuYW1lIHdhcyBnaXZlbiEgV2UgbXVzdCBjb3JyZWN0IHRoYXQgaWYgfi8uc3NoL2NvbmZpZwpAQCAtMzA5LDcgKzMzMCw3IEBACiAJICogQHRocm93cyBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gY291bGQgbm90IGJlIGNyZWF0ZWQuCiAJICovCi0JcHJvdGVjdGVkIEpTY2ggZ2V0SlNjaChmaW5hbCBPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIEpTY2ggZ2V0SlNjaChPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CiAJCWlmIChkZWZhdWx0SlNjaCA9PSBudWxsKSB7CiAJCQlkZWZhdWx0SlNjaCA9IGNyZWF0ZURlZmF1bHRKU2NoKGZzKTsKIAkJCWlmIChkZWZhdWx0SlNjaC5nZXRDb25maWdSZXBvc2l0b3J5KCkgPT0gbnVsbCkgewpAQCAtMzUxLDEzICszNzIsMTUgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgSlNjaCBjcmVhdGVEZWZhdWx0SlNjaChGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24gewogCQlmaW5hbCBKU2NoIGpzY2ggPSBuZXcgSlNjaCgpOworCQlKU2NoLnNldENvbmZpZygic3NoLXJzYSIsIEpTY2guZ2V0Q29uZmlnKCJzaWduYXR1cmUucnNhIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJSlNjaC5zZXRDb25maWcoInNzaC1kc3MiLCBKU2NoLmdldENvbmZpZygic2lnbmF0dXJlLmRzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWNvbmZpZ3VyZUpTY2goanNjaCk7CiAJCWtub3duSG9zdHMoanNjaCwgZnMpOwogCQlpZGVudGl0aWVzKGpzY2gsIGZzKTsKIAkJcmV0dXJuIGpzY2g7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBrbm93bkhvc3RzKGZpbmFsIEpTY2ggc2NoLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIHZvaWQga25vd25Ib3N0cyhKU2NoIHNjaCwgRlMgZnMpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBob21lID0gZnMudXNlckhvbWUoKTsKIAkJaWYgKGhvbWUgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTM3MSw3ICszOTQsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZGVudGl0aWVzKGZpbmFsIEpTY2ggc2NoLCBGUyBmcykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgaWRlbnRpdGllcyhKU2NoIHNjaCwgRlMgZnMpIHsKIAkJZmluYWwgRmlsZSBob21lID0gZnMudXNlckhvbWUoKTsKIAkJaWYgKGhvbWUgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTM4Myw3ICs0MDYsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkSWRlbnRpdHkoZmluYWwgSlNjaCBzY2gsIGZpbmFsIEZpbGUgcHJpdikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZElkZW50aXR5KEpTY2ggc2NoLCBGaWxlIHByaXYpIHsKIAkJaWYgKHByaXYuaXNGaWxlKCkpIHsKIAkJCXRyeSB7CiAJCQkJc2NoLmFkZElkZW50aXR5KHByaXYuZ2V0QWJzb2x1dGVQYXRoKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaFNlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hTZXNzaW9uLmphdmEKaW5kZXggMDgxZDA1Ny4uZTNlZjgzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaFNlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoU2Vzc2lvbi5qYXZhCkBAIC04Miw3ICs4Miw3IEBACiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgdGhlIFVSSSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlbW90ZSBjb25uZWN0aW9uCiAJICovCi0JcHVibGljIEpzY2hTZXNzaW9uKGZpbmFsIFNlc3Npb24gc2Vzc2lvbiwgVVJJaXNoIHVyaSkgeworCXB1YmxpYyBKc2NoU2Vzc2lvbihTZXNzaW9uIHNlc3Npb24sIFVSSWlzaCB1cmkpIHsKIAkJc29jayA9IHNlc3Npb247CiAJCXRoaXMudXJpID0gdXJpOwogCX0KQEAgLTE0NSw3ICsxNDUsNyBAQAogCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJCSAqICAgICAgICAgICAgIG9uIHByb2JsZW1zIG9wZW5pbmcgc3RyZWFtcwogCQkgKi8KLQkJSnNjaFByb2Nlc3MoZmluYWwgU3RyaW5nIGNvbW1hbmROYW1lLCBpbnQgdG1zKQorCQlKc2NoUHJvY2VzcyhTdHJpbmcgY29tbWFuZE5hbWUsIGludCB0bXMpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJdGltZW91dCA9IHRtczsKIAkJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkMuamF2YQppbmRleCBlM2YyODdiLi5lNjg4ZjYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDLmphdmEKQEAgLTIxMSw5ICsyMTEsNyBAQAogCQl0aGlzLmhvc3RzLmNsZWFyKCk7CiAJCXRoaXMubGFzdE1vZGlmaWVkID0gdGhpcy5uZXRyYy5sYXN0TW9kaWZpZWQoKTsKIAotCQlCdWZmZXJlZFJlYWRlciByID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobmV0cmMpKTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKG5ldHJjKSkpIHsKIAkJCVN0cmluZyBsaW5lID0gbnVsbDsKIAogCQkJTmV0UkNFbnRyeSBlbnRyeSA9IG5ldyBOZXRSQ0VudHJ5KCk7CkBAIC0zMTUsMTMgKzMxMyw2IEBACiAJCQkJaG9zdHMucHV0KGVudHJ5Lm1hY2hpbmUsIGVudHJ5KTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChyICE9IG51bGwpCi0JCQkJCXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWcuamF2YQppbmRleCA0NjYwYzQwLi5mNWNjZGM4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZy5qYXZhCkBAIC0xODYsNyArMTg2LDcgQEAKIAkvKiogU3RhdGUgcmVhZCBmcm9tIHRoZSBjb25maWcgZmlsZSwgcGx1cyB7QGxpbmsgSG9zdH1zIGNyZWF0ZWQgZnJvbSBpdC4gKi8KIAlwcml2YXRlIFN0YXRlIHN0YXRlOwogCi0JT3BlblNzaENvbmZpZyhmaW5hbCBGaWxlIGgsIGZpbmFsIEZpbGUgY2ZnKSB7CisJT3BlblNzaENvbmZpZyhGaWxlIGgsIEZpbGUgY2ZnKSB7CiAJCWhvbWUgPSBoOwogCQljb25maWdGaWxlID0gY2ZnOwogCQlzdGF0ZSA9IG5ldyBTdGF0ZSgpOwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUuCiAJICogQHJldHVybiByIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgbmFtZS4gTmV2ZXIgbnVsbC4KIAkgKi8KLQlwdWJsaWMgSG9zdCBsb29rdXAoZmluYWwgU3RyaW5nIGhvc3ROYW1lKSB7CisJcHVibGljIEhvc3QgbG9va3VwKFN0cmluZyBob3N0TmFtZSkgewogCQlmaW5hbCBTdGF0ZSBjYWNoZSA9IHJlZnJlc2goKTsKIAkJSG9zdCBoID0gY2FjaGUuaG9zdHMuZ2V0KGhvc3ROYW1lKTsKIAkJaWYgKGggIT0gbnVsbCkgewpAQCAtMjExLDcgKzIxMSw3IEBACiAJCS8vIEluaXRpYWxpemUgd2l0aCBkZWZhdWx0IGVudHJpZXMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgYmVmb3JlIHRoZQogCQkvLyBmaXJzdCBIb3N0IGJsb2NrLgogCQlmdWxsQ29uZmlnLm1lcmdlKGNhY2hlLmVudHJpZXMuZ2V0KEhvc3RFbnRyeS5ERUZBVUxUX05BTUUpKTsKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBIb3N0RW50cnk+IGUgOiBjYWNoZS5lbnRyaWVzLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBIb3N0RW50cnk+IGUgOiBjYWNoZS5lbnRyaWVzLmVudHJ5U2V0KCkpIHsKIAkJCVN0cmluZyBrZXkgPSBlLmdldEtleSgpOwogCQkJaWYgKGlzSG9zdE1hdGNoKGtleSwgaG9zdE5hbWUpKSB7CiAJCQkJZnVsbENvbmZpZy5tZXJnZShlLmdldFZhbHVlKCkpOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJCXJldHVybiBzdGF0ZTsKIAl9CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBIb3N0RW50cnk+IHBhcnNlKElucHV0U3RyZWFtIGluKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgSG9zdEVudHJ5PiBtID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKQEAgLTMzMiwxNCArMzMyLDE0IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVxdW90ZShTdHJpbmcgdmFsdWUpIHsKIAkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgJiYgdmFsdWUuZW5kc1dpdGgoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJJiYgdmFsdWUubGVuZ3RoKCkgPiAxKQogCQkJcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpOwogCQlyZXR1cm4gdmFsdWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vd3MoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vd3MoU3RyaW5nIHZhbHVlKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgewogCQkJaWYgKCFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIodmFsdWUuY2hhckF0KGkpKSkKQEAgLTM0OCw3ICszNDgsNyBAQAogCQlyZXR1cm4gYi50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEJvb2xlYW4geWVzbm8oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB5ZXNubyhTdHJpbmcgdmFsdWUpIHsKIAkJaWYgKFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UoInllcyIsIHZhbHVlKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKIAkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CkBAIC0zNjUsNyArMzY1LDcgQEAKIAkJcmV0dXJuIG5ldyBGaWxlKGhvbWUsIHBhdGgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBwb3NpdGl2ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgcG9zaXRpdmUoU3RyaW5nIHZhbHVlKSB7CiAJCWlmICh2YWx1ZSAhPSBudWxsKSB7CiAJCQl0cnkgewogCQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlVW5zaWduZWRJbnQodmFsdWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlcmF0aW9uUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVyYXRpb25SZXN1bHQuamF2YQppbmRleCA0MjMxNzk4Li4wOGY3ZjBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVyYXRpb25SZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVyYXRpb25SZXN1bHQuamF2YQpAQCAtMTA3LDcgKzEwNyw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSByZWYgdG8gb2J0YWluLgogCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZWY7IG51bGwgaWYgdGhlIHJlbW90ZSBkaWQgbm90IGFkdmVydGlzZSB0aGlzIHJlZi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgUmVmIGdldEFkdmVydGlzZWRSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgZmluYWwgUmVmIGdldEFkdmVydGlzZWRSZWYoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIGFkdmVydGlzZWRSZWZzLmdldChuYW1lKTsKIAl9CiAKQEAgLTEyOSwxNiArMTI5LDE2IEBACiAJICogQHJldHVybiBzdGF0dXMgb2YgdGhlIGxvY2FsIHJlZjsgbnVsbCBpZiB0aGlzIGxvY2FsIHJlZiB3YXMgbm90IHRvdWNoZWQKIAkgKiAgICAgICAgIGR1cmluZyB0aGlzIG9wZXJhdGlvbi4KIAkgKi8KLQlwdWJsaWMgVHJhY2tpbmdSZWZVcGRhdGUgZ2V0VHJhY2tpbmdSZWZVcGRhdGUoZmluYWwgU3RyaW5nIGxvY2FsTmFtZSkgeworCXB1YmxpYyBUcmFja2luZ1JlZlVwZGF0ZSBnZXRUcmFja2luZ1JlZlVwZGF0ZShTdHJpbmcgbG9jYWxOYW1lKSB7CiAJCXJldHVybiB1cGRhdGVzLmdldChsb2NhbE5hbWUpOwogCX0KIAotCXZvaWQgc2V0QWR2ZXJ0aXNlZFJlZnMoZmluYWwgVVJJaXNoIHUsIGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gYXIpIHsKKwl2b2lkIHNldEFkdmVydGlzZWRSZWZzKFVSSWlzaCB1LCBNYXA8U3RyaW5nLCBSZWY+IGFyKSB7CiAJCXVyaSA9IHU7CiAJCWFkdmVydGlzZWRSZWZzID0gYXI7CiAJfQogCi0Jdm9pZCBhZGQoZmluYWwgVHJhY2tpbmdSZWZVcGRhdGUgdSkgeworCXZvaWQgYWRkKFRyYWNraW5nUmVmVXBkYXRlIHUpIHsKIAkJdXBkYXRlcy5wdXQodS5nZXRMb2NhbE5hbWUoKSwgdSk7CiAJfQogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJcmV0dXJuIG1lc3NhZ2VCdWZmZXIgIT0gbnVsbCA/IG1lc3NhZ2VCdWZmZXIudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCiAJfQogCi0Jdm9pZCBhZGRNZXNzYWdlcyhmaW5hbCBTdHJpbmcgbXNnKSB7CisJdm9pZCBhZGRNZXNzYWdlcyhTdHJpbmcgbXNnKSB7CiAJCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7CiAJCQlpZiAobWVzc2FnZUJ1ZmZlciA9PSBudWxsKQogCQkJCW1lc3NhZ2VCdWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlci5qYXZhCmluZGV4IGFmNWEwYjcuLjQ5YWNiNGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyLmphdmEKQEAgLTIwMCw3ICsyMDAsNyBAQAogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdGhlIHBhcnNlciB3aWxsIHJlYWQuCiAJICovCi0JcHJvdGVjdGVkIFBhY2tQYXJzZXIoZmluYWwgT2JqZWN0RGF0YWJhc2Ugb2RiLCBmaW5hbCBJbnB1dFN0cmVhbSBzcmMpIHsKKwlwcm90ZWN0ZWQgUGFja1BhcnNlcihPYmplY3REYXRhYmFzZSBvZGIsIElucHV0U3RyZWFtIHNyYykgewogCQlvYmplY3REYXRhYmFzZSA9IG9kYi5uZXdDYWNoZWREYXRhYmFzZSgpOwogCQlpbiA9IHNyYzsKIApAQCAtMjMyLDcgKzIzMiw3IEBACiAJICogQHBhcmFtIGFsbG93CiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBhIHRoaW4gcGFjay4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd1RoaW4oZmluYWwgYm9vbGVhbiBhbGxvdykgeworCXB1YmxpYyB2b2lkIHNldEFsbG93VGhpbihib29sZWFuIGFsbG93KSB7CiAJCWFsbG93VGhpbiA9IGFsbG93OwogCX0KIApAQCAtMzc5LDcgKzM3OSw3IEBACiAJICogQHBhcmFtIG9jCiAJICogICAgICAgICAgICB0aGUgY2hlY2tlciBpbnN0YW5jZTsgbnVsbCB0byBkaXNhYmxlIG9iamVjdCBjaGVja2luZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RDaGVja2VyKGZpbmFsIE9iamVjdENoZWNrZXIgb2MpIHsKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RDaGVja2VyKE9iamVjdENoZWNrZXIgb2MpIHsKIAkJb2JqQ2hlY2sgPSBvYzsKIAl9CiAKQEAgLTM5OSw3ICszOTksNyBAQAogCSAqIEBwYXJhbSBvbgogCSAqICAgICAgICAgICAgdHJ1ZSB0byBlbmFibGUgdGhlIGRlZmF1bHQgY2hlY2tlcjsgZmFsc2UgdG8gZGlzYWJsZSBpdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RDaGVja2luZyhmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0T2JqZWN0Q2hlY2tpbmcoYm9vbGVhbiBvbikgewogCQlzZXRPYmplY3RDaGVja2VyKG9uID8gbmV3IE9iamVjdENoZWNrZXIoKSA6IG51bGwpOwogCX0KIApAQCAtNjI5LDcgKzYyOSw3IEBACiAJCXJlc29sdmluZy5lbmRUYXNrKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQorCXByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBsYXN0ID0gZW50cnlDb3VudDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKQEAgLTgxOSw3ICs4MTksNyBAQAogCQlyZXR1cm4gaW5mbzsKIAl9CiAKLQlwcml2YXRlIFVucmVzb2x2ZWREZWx0YSByZW1vdmVCYXNlQnlJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByaXZhdGUgVW5yZXNvbHZlZERlbHRhIHJlbW92ZUJhc2VCeUlkKEFueU9iamVjdElkIGlkKSB7CiAJCWZpbmFsIERlbHRhQ2hhaW4gZCA9IGJhc2VCeUlkLmdldChpZCk7CiAJCXJldHVybiBkICE9IG51bGwgPyBkLnJlbW92ZSgpIDogbnVsbDsKIAl9CkBAIC04NjUsNyArODY1LDcgQEAKIAkJcmV0dXJuIGZpcnN0OwogCX0KIAotCXByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzV2l0aEV4dGVybmFsQmFzZXMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQorCXByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzV2l0aEV4dGVybmFsQmFzZXMoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZ3Jvd0VudHJpZXMoYmFzZUJ5SWQuc2l6ZSgpKTsKIApAQCAtODczLDcgKzg3Myw3IEBACiAJCQliYXNlT2JqZWN0SWRzID0gbmV3IE9iamVjdElkU3ViY2xhc3NNYXA8PigpOwogCiAJCWZpbmFsIExpc3Q8RGVsdGFDaGFpbj4gbWlzc2luZyA9IG5ldyBBcnJheUxpc3Q8Pig2NCk7Ci0JCWZvciAoZmluYWwgRGVsdGFDaGFpbiBiYXNlSWQgOiBiYXNlQnlJZCkgeworCQlmb3IgKERlbHRhQ2hhaW4gYmFzZUlkIDogYmFzZUJ5SWQpIHsKIAkJCWlmIChiYXNlSWQuaGVhZCA9PSBudWxsKQogCQkJCWNvbnRpbnVlOwogCkBAIC05MDUsNyArOTA1LDcgQEAKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmRvd25sb2FkQ2FuY2VsbGVkRHVyaW5nSW5kZXhpbmcpOwogCQl9CiAKLQkJZm9yIChmaW5hbCBEZWx0YUNoYWluIGJhc2UgOiBtaXNzaW5nKSB7CisJCWZvciAoRGVsdGFDaGFpbiBiYXNlIDogbWlzc2luZykgewogCQkJaWYgKGJhc2UuaGVhZCAhPSBudWxsKQogCQkJCXRocm93IG5ldyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGJhc2UsICJkZWx0YSBiYXNlIik7IC8vJE5PTi1OTFMtMSQKIAkJfQpAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCB3aG9sZShmaW5hbCBsb25nIHBvcywgZmluYWwgaW50IHR5cGUsIGZpbmFsIGxvbmcgc3opCisJcHJpdmF0ZSB2b2lkIHdob2xlKGxvbmcgcG9zLCBpbnQgdHlwZSwgbG9uZyBzeikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVNIQTEgb2JqZWN0RGlnZXN0ID0gb2JqZWN0SGFzaGVyLnJlc2V0KCk7CiAJCW9iamVjdERpZ2VzdC51cGRhdGUoQ29uc3RhbnRzLmVuY29kZWRUeXBlU3RyaW5nKHR5cGUpKTsKQEAgLTEwNzYsNyArMTA3Niw2IEBACiAJCWZpbmFsIGJ5dGVbXSBkYXRhOwogCQlpZiAodHlwZSA9PSBDb25zdGFudHMuT0JKX0JMT0IpIHsKIAkJCWJ5dGVbXSByZWFkQnVmZmVyID0gYnVmZmVyKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKFNvdXJjZS5JTlBVVCwgc3opOwogCQkJQmxvYk9iamVjdENoZWNrZXIgY2hlY2tlciA9IG51bGw7CiAJCQlpZiAob2JqQ2hlY2sgIT0gbnVsbCkgewogCQkJCWNoZWNrZXIgPSBvYmpDaGVjay5uZXdCbG9iT2JqZWN0Q2hlY2tlcigpOwpAQCAtMTA4NSwxNSArMTA4NCwxNiBAQAogCQkJCWNoZWNrZXIgPSBCbG9iT2JqZWN0Q2hlY2tlci5OVUxMX0NIRUNLRVI7CiAJCQl9CiAJCQlsb25nIGNudCA9IDA7Ci0JCQl3aGlsZSAoY250IDwgc3opIHsKLQkJCQlpbnQgciA9IGluZi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCWlmIChyIDw9IDApCi0JCQkJCWJyZWFrOwotCQkJCW9iamVjdERpZ2VzdC51cGRhdGUocmVhZEJ1ZmZlciwgMCwgcik7Ci0JCQkJY2hlY2tlci51cGRhdGUocmVhZEJ1ZmZlciwgMCwgcik7Ci0JCQkJY250ICs9IHI7CisJCQl0cnkgKElucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoU291cmNlLklOUFVULCBzeikpIHsKKwkJCQl3aGlsZSAoY250IDwgc3opIHsKKwkJCQkJaW50IHIgPSBpbmYucmVhZChyZWFkQnVmZmVyKTsKKwkJCQkJaWYgKHIgPD0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQlvYmplY3REaWdlc3QudXBkYXRlKHJlYWRCdWZmZXIsIDAsIHIpOworCQkJCQljaGVja2VyLnVwZGF0ZShyZWFkQnVmZmVyLCAwLCByKTsKKwkJCQkJY250ICs9IHI7CisJCQkJfQogCQkJfQotCQkJaW5mLmNsb3NlKCk7CiAJCQlvYmplY3REaWdlc3QuZGlnZXN0KHRlbXBPYmplY3RJZCk7CiAJCQljaGVja2VyLmVuZEJsb2IodGVtcE9iamVjdElkKTsKIAkJCWRhdGEgPSBudWxsOwpAQCAtMTE2MiwzMyArMTE2MiwyOSBAQAogCQlmaW5hbCBieXRlW10gcmVhZEJ1ZmZlciA9IGJ1ZmZlcigpOwogCQlmaW5hbCBieXRlW10gY3VyQnVmZmVyID0gbmV3IGJ5dGVbcmVhZEJ1ZmZlci5sZW5ndGhdOwogCQlsb25nIHN6ID0gaW5mby5zaXplOwotCQlJbnB1dFN0cmVhbSBwY2sgPSBudWxsOwogCQl0cnkgKE9iamVjdFN0cmVhbSBjdXIgPSByZWFkQ3Vycy5vcGVuKG9iaiwgaW5mby50eXBlKS5vcGVuU3RyZWFtKCkpIHsKIAkJCWlmIChjdXIuZ2V0U2l6ZSgpICE9IHN6KSB7CiAJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuY29sbGlzaW9uT24sIG9iai5uYW1lKCkpKTsKIAkJCX0KLQkJCXBjayA9IGluZmxhdGUoU291cmNlLkRBVEFCQVNFLCBzeik7Ci0JCQl3aGlsZSAoMCA8IHN6KSB7Ci0JCQkJaW50IG4gPSAoaW50KSBNYXRoLm1pbihyZWFkQnVmZmVyLmxlbmd0aCwgc3opOwotCQkJCUlPLnJlYWRGdWxseShjdXIsIGN1ckJ1ZmZlciwgMCwgbik7Ci0JCQkJSU8ucmVhZEZ1bGx5KHBjaywgcmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQkJaWYgKGN1ckJ1ZmZlcltpXSAhPSByZWFkQnVmZmVyW2ldKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQKLQkJCQkJCQkJLmdldCgpLmNvbGxpc2lvbk9uLCBvYmoubmFtZSgpKSk7CisJCQl0cnkgKElucHV0U3RyZWFtIHBjayA9IGluZmxhdGUoU291cmNlLkRBVEFCQVNFLCBzeikpIHsKKwkJCQl3aGlsZSAoMCA8IHN6KSB7CisJCQkJCWludCBuID0gKGludCkgTWF0aC5taW4ocmVhZEJ1ZmZlci5sZW5ndGgsIHN6KTsKKwkJCQkJSU8ucmVhZEZ1bGx5KGN1ciwgY3VyQnVmZmVyLCAwLCBuKTsKKwkJCQkJSU8ucmVhZEZ1bGx5KHBjaywgcmVhZEJ1ZmZlciwgMCwgbik7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJCQlpZiAoY3VyQnVmZmVyW2ldICE9IHJlYWRCdWZmZXJbaV0pIHsKKwkJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5jb2xsaXNpb25Pbiwgb2JqLm5hbWUoKSkpOworCQkJCQkJfQogCQkJCQl9CisJCQkJCXN6IC09IG47CiAJCQkJfQotCQkJCXN6IC09IG47CiAJCQl9CiAJCX0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24gbm90TG9jYWwpIHsKIAkJCS8vIFRoaXMgaXMgT0ssIHdlIGRvbid0IGhhdmUgYSBjb3B5IG9mIHRoZSBvYmplY3QgbG9jYWxseQotCQkJLy8gYnV0IHRoZSBBUEkgdGhyb3dzIHdoZW4gd2UgdHJ5IHRvIHJlYWQgaXQgYXMgdXN1YWxseSBpdHMKKwkJCS8vIGJ1dCB0aGUgQVBJIHRocm93cyB3aGVuIHdlIHRyeSB0byByZWFkIGl0IGFzIHVzdWFsbHkgaXQncwogCQkJLy8gYW4gZXJyb3IgdG8gcmVhZCBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0LgotCQl9IGZpbmFsbHkgewotCQkJaWYgKHBjayAhPSBudWxsKSB7Ci0JCQkJcGNrLmNsb3NlKCk7Ci0JCQl9CiAJCX0KIAl9CiAKQEAgLTEyMjgsNyArMTIyNCw3IEBACiAJfQogCiAJLy8gQ29uc3VtZSBleGFjdGx5IG9uZSBieXRlIGZyb20gdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIGl0LgotCXByaXZhdGUgaW50IHJlYWRGcm9tKGZpbmFsIFNvdXJjZSBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBpbnQgcmVhZEZyb20oU291cmNlIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJBdmFpbCA9PSAwKQogCQkJZmlsbChzcmMsIDEpOwogCQliQXZhaWwtLTsKQEAgLTEyMzYsMTMgKzEyMzIsMTMgQEAKIAl9CiAKIAkvLyBDb25zdW1lIGNudCBieXRlcyBmcm9tIHRoZSBidWZmZXIuCi0Jdm9pZCB1c2UoZmluYWwgaW50IGNudCkgeworCXZvaWQgdXNlKGludCBjbnQpIHsKIAkJYk9mZnNldCArPSBjbnQ7CiAJCWJBdmFpbCAtPSBjbnQ7CiAJfQogCiAJLy8gRW5zdXJlIGF0IGxlYXN0IG5lZWQgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiBpbiB7QGxpbmsgI2J1Zn0uCi0JaW50IGZpbGwoZmluYWwgU291cmNlIHNyYywgZmluYWwgaW50IG5lZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaW50IGZpbGwoU291cmNlIHNyYywgaW50IG5lZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlIChiQXZhaWwgPCBuZWVkKSB7CiAJCQlpbnQgbmV4dCA9IGJPZmZzZXQgKyBiQXZhaWw7CiAJCQlpbnQgZnJlZSA9IGJ1Zi5sZW5ndGggLSBuZXh0OwpAQCAtMTY0MCwyMyArMTYzNiwyMyBAQAogCQlwdWJsaWMgbG9uZyBzaXplOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbmZsYXRlQW5kU2tpcChmaW5hbCBTb3VyY2Ugc3JjLCBmaW5hbCBsb25nIGluZmxhdGVkU2l6ZSkKKwlwcml2YXRlIHZvaWQgaW5mbGF0ZUFuZFNraXAoU291cmNlIHNyYywgbG9uZyBpbmZsYXRlZFNpemUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKHNyYywgaW5mbGF0ZWRTaXplKTsKLQkJSU8uc2tpcEZ1bGx5KGluZiwgaW5mbGF0ZWRTaXplKTsKLQkJaW5mLmNsb3NlKCk7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShzcmMsIGluZmxhdGVkU2l6ZSkpIHsKKwkJCUlPLnNraXBGdWxseShpbmYsIGluZmxhdGVkU2l6ZSk7CisJCX0KIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSBpbmZsYXRlQW5kUmV0dXJuKGZpbmFsIFNvdXJjZSBzcmMsIGZpbmFsIGxvbmcgaW5mbGF0ZWRTaXplKQorCXByaXZhdGUgYnl0ZVtdIGluZmxhdGVBbmRSZXR1cm4oU291cmNlIHNyYywgbG9uZyBpbmZsYXRlZFNpemUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gZHN0ID0gbmV3IGJ5dGVbKGludCkgaW5mbGF0ZWRTaXplXTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShzcmMsIGluZmxhdGVkU2l6ZSk7Ci0JCUlPLnJlYWRGdWxseShpbmYsIGRzdCwgMCwgZHN0Lmxlbmd0aCk7Ci0JCWluZi5jbG9zZSgpOworCQl0cnkgKElucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoc3JjLCBpbmZsYXRlZFNpemUpKSB7CisJCQlJTy5yZWFkRnVsbHkoaW5mLCBkc3QsIDAsIGRzdC5sZW5ndGgpOworCQl9CiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbmZsYXRlKGZpbmFsIFNvdXJjZSBzcmMsIGZpbmFsIGxvbmcgaW5mbGF0ZWRTaXplKQorCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5mbGF0ZShTb3VyY2Ugc3JjLCBsb25nIGluZmxhdGVkU2l6ZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWluZmxhdGVyLm9wZW4oc3JjLCBpbmZsYXRlZFNpemUpOwogCQlyZXR1cm4gaW5mbGF0ZXI7CkBAIC0xNjY1LDcgKzE2NjEsNyBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbHRhQ2hhaW4gZXh0ZW5kcyBPYmplY3RJZE93bmVyTWFwLkVudHJ5IHsKIAkJVW5yZXNvbHZlZERlbHRhIGhlYWQ7CiAKLQkJRGVsdGFDaGFpbihmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCQlEZWx0YUNoYWluKEFueU9iamVjdElkIGlkKSB7CiAJCQlzdXBlcihpZCk7CiAJCX0KIApAQCAtMTY3Niw3ICsxNjcyLDcgQEAKIAkJCXJldHVybiByOwogCQl9CiAKLQkJdm9pZCBhZGQoZmluYWwgVW5yZXNvbHZlZERlbHRhIGQpIHsKKwkJdm9pZCBhZGQoVW5yZXNvbHZlZERlbHRhIGQpIHsKIAkJCWQubmV4dCA9IGhlYWQ7CiAJCQloZWFkID0gZDsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2VkT2JqZWN0SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2VkT2JqZWN0SW5mby5qYXZhCmluZGV4IDgwZmMwYjQuLjU5ZDFiNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tlZE9iamVjdEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZWRPYmplY3RJbmZvLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0IHRoZSBuZXcgaW5zdGFuY2UgdHJhY2tzLgogCSAqLwotCXB1YmxpYyBQYWNrZWRPYmplY3RJbmZvKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIFBhY2tlZE9iamVjdEluZm8oQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIApAQCAtOTUsNyArOTUsNyBAQAogCSAqIEBwYXJhbSBvZmZzZXQKIAkgKiAgICAgICAgICAgIG9mZnNldCB3aGVyZSB3cml0dGVuIG9iamVjdCBzdGFydHMKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoZmluYWwgbG9uZyBvZmZzZXQpIHsKKwlwdWJsaWMgdm9pZCBzZXRPZmZzZXQobG9uZyBvZmZzZXQpIHsKIAkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CiAJfQogCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkgKiAgICAgICAgICAgIGluZmxhdGVkIGxlbmd0aCBhbmQgZGVsdGEgYmFzZSByZWZlcmVuY2UpIGFzIGNvbXB1dGVkIGJ5CiAJICogICAgICAgICAgICB7QGxpbmsgamF2YS51dGlsLnppcC5DUkMzMn0uCiAJICovCi0JcHVibGljIHZvaWQgc2V0Q1JDKGZpbmFsIGludCBjcmMpIHsKKwlwdWJsaWMgdm9pZCBzZXRDUkMoaW50IGNyYykgewogCQl0aGlzLmNyYyA9IGNyYzsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVJbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEKaW5kZXggODcwNjRlMS4uY2M1NTZmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEKQEAgLTc0LDYgKzc0LDEzIEBACiAJLyoqIE1hZ2ljIHJldHVybiBmcm9tIHtAbGluayAjcmVhZFN0cmluZygpfSB3aGVuIGEgZmx1c2ggcGFja2V0IGlzIGZvdW5kLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORCA9IG5ldyBTdHJpbmdCdWlsZGVyKDApLnRvU3RyaW5nKCk7IAkvKiBtdXN0IG5vdCBzdHJpbmcgcG9vbCAqLwogCisJLyoqCisJICogTWFnaWMgcmV0dXJuIGZyb20ge0BsaW5rICNyZWFkU3RyaW5nKCl9IHdoZW4gYSBkZWxpbSBwYWNrZXQgaXMgZm91bmQuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU0gPSBuZXcgU3RyaW5nQnVpbGRlcigwKS50b1N0cmluZygpOyAJLyogbXVzdCBub3Qgc3RyaW5nIHBvb2wgKi8KKwogCXN0YXRpYyBlbnVtIEFja05hY2tSZXN1bHQgewogCQkvKiogTkFLICovCiAJCU5BSywKQEAgLTExNSw3ICsxMjIsNyBAQAogCQl0aGlzLmxpbWl0ID0gbGltaXQ7CiAJfQogCi0JQWNrTmFja1Jlc3VsdCByZWFkQUNLKGZpbmFsIE11dGFibGVPYmplY3RJZCByZXR1cm5lZElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCUFja05hY2tSZXN1bHQgcmVhZEFDSyhNdXRhYmxlT2JqZWN0SWQgcmV0dXJuZWRJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIGxpbmUgPSByZWFkU3RyaW5nKCk7CiAJCWlmIChsaW5lLmxlbmd0aCgpID09IDApCiAJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmV4cGVjdGVkQUNLTkFLRm91bmRFT0YpOwpAQCAtMTQ3LDYgKzE1NCw3IEBACiAJICogdXNlIHtAbGluayAjcmVhZFN0cmluZ1JhdygpfSBpbnN0ZWFkLgogCSAqCiAJICogQHJldHVybiB0aGUgc3RyaW5nLiB7QGxpbmsgI0VORH0gaWYgdGhlIHN0cmluZyB3YXMgdGhlIG1hZ2ljIGZsdXNoCisJICogICAgICAgICBwYWNrZXQsIHtAbGluayAjREVMSU19IGlmIHRoZSBzdHJpbmcgd2FzIHRoZSBtYWdpYyBERUxJTQogCSAqICAgICAgICAgcGFja2V0LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gY2Fubm90IGJlIHJlYWQuCkBAIC0xNTcsNiArMTY1LDEwIEBACiAJCQlsb2cuZGVidWcoImdpdDwgMDAwMCIpOyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gRU5EOwogCQl9CisJCWlmIChsZW4gPT0gMSkgeworCQkJbG9nLmRlYnVnKCJnaXQ8IDAwMDEiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIERFTElNOworCQl9CiAKIAkJbGVuIC09IDQ7IC8vIGxlbmd0aCBoZWFkZXIgKDQgYnl0ZXMpCiAJCWlmIChsZW4gPT0gMCkgewpAQCAtMjMyLDYgKzI0NCw4IEBACiAKIAkJaWYgKGxlbiA9PSAwKSB7CiAJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsZW4gPT0gMSkgeworCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSBpZiAobGVuIDwgNCkgewogCQkJdGhyb3cgaW52YWxpZEhlYWRlcigpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0LmphdmEKaW5kZXggNDhiZGQwMS4uYTI2ZDFkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXQuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogCSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0KIAkgKiAgICAgICAgICAgIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgUGFja2V0TGluZU91dChmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisJcHVibGljIFBhY2tldExpbmVPdXQoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewogCQlvdXQgPSBvdXRwdXRTdHJlYW07CiAJCWxlbmJ1ZmZlciA9IG5ldyBieXRlWzVdOwogCQlmbHVzaE9uRW5kID0gdHJ1ZTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBwYWNrZXQgY291bGQgbm90IGJlIHdyaXR0ZW4sIHRoZSBzdHJlYW0gaXMgY29ycnVwdGVkIGFzCiAJICogICAgICAgICAgICAgdGhlIHBhY2tldCBtYXkgaGF2ZSBiZWVuIG9ubHkgcGFydGlhbGx5IHdyaXR0ZW4uCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUGFja2V0KENvbnN0YW50cy5lbmNvZGUocykpOwogCX0KIApAQCAtMTQ3LDYgKzE0NywyMCBAQAogCX0KIAogCS8qKgorCSAqIFdyaXRlIGEgcGFja2V0IGRlbGltIG1hcmtlciAoMDAwMSkuCisJICoKKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgbWFya2VyIGNvdWxkIG5vdCBiZSB3cml0dGVuLCB0aGUgc3RyZWFtIGlzIGNvcnJ1cHRlZAorCSAqICAgICAgICAgICAgIGFzIHRoZSBtYXJrZXIgbWF5IGhhdmUgYmVlbiBvbmx5IHBhcnRpYWxseSB3cml0dGVuLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZURlbGltKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZm9ybWF0TGVuZ3RoKDEpOworCQlvdXQud3JpdGUobGVuYnVmZmVyLCAwLCA0KTsKKwkJbG9nLmRlYnVnKCJnaXQ+IDAwMDEiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgogCSAqIFdyaXRlIGEgcGFja2V0IGVuZCBtYXJrZXIsIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhIGZsdXNoIGNvbW1hbmQuCiAJICogPHA+CiAJICogVGVjaG5pY2FsbHkgdGhpcyBpcyBhIG1hZ2ljYWwgcGFja2V0IHR5cGUgd2hpY2ggY2FuIGJlIGRldGVjdGVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Qcm9ncmVzc1NwaW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhCmluZGV4IDQxYWY4MDcuLjIzNjQ0MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC0xNDEsNyArMTQxLDcgQEAKIAlwcml2YXRlIHZvaWQgd3JpdGUoU3RyaW5nIHMpIHsKIAkJaWYgKHdyaXRlKSB7CiAJCQl0cnkgewotCQkJCW91dC53cml0ZShzLmdldEJ5dGVzKFVURl84KSk7CisJCQkJb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJCW91dC5mbHVzaCgpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCXdyaXRlID0gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVJZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlSWRlbnQuamF2YQppbmRleCBmOWZkZGJlLi4xNzhjODBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVJZGVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZUlkZW50LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlscy5sYXN0SW5kZXhPZlRyaW07CiAKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKQEAgLTk1LDcgKzk1LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFB1c2hDZXJ0aWZpY2F0ZUlkZW50IHBhcnNlKFN0cmluZyBzdHIpIHsKIAkJTXV0YWJsZUludGVnZXIgcCA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOwotCQlieXRlW10gcmF3ID0gc3RyLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIHJhdyA9IHN0ci5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJaW50IHR6QmVnaW4gPSByYXcubGVuZ3RoIC0gMTsKIAkJdHpCZWdpbiA9IGxhc3RJbmRleE9mVHJpbShyYXcsICcgJywgdHpCZWdpbik7CiAJCWlmICh0ekJlZ2luIDwgMCB8fCByYXdbdHpCZWdpbl0gIT0gJyAnKSB7CkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCQlpZEVuZCA9IHJhdy5sZW5ndGg7CiAJCQl9CiAJCX0KLQkJU3RyaW5nIGlkID0gbmV3IFN0cmluZyhyYXcsIDAsIGlkRW5kLCBVVEZfOCk7CisJCVN0cmluZyBpZCA9IG5ldyBTdHJpbmcocmF3LCAwLCBpZEVuZCwgQ0hBUlNFVCk7CiAKIAkJcmV0dXJuIG5ldyBQdXNoQ2VydGlmaWNhdGVJZGVudChzdHIsIGlkLCB3aGVuICogMTAwMEwsIHR6KTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVTdG9yZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlU3RvcmUuamF2YQppbmRleCBhYjU4YTMzLi43ZjVhMzQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVTdG9yZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZVN0b3JlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZS5UWVBFX0ZJTEU7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAkgKiBAcmV0dXJuIGl0ZXJhYmxlIG92ZXIgY2VydGlmaWNhdGVzOyBtdXN0IGJlIGZ1bGx5IGl0ZXJhdGVkIGluIG9yZGVyIHRvCiAJICogICAgICAgICBjbG9zZSByZXNvdXJjZXMuCiAJICovCi0JcHVibGljIEl0ZXJhYmxlPFB1c2hDZXJ0aWZpY2F0ZT4gZ2V0QWxsKGZpbmFsIFN0cmluZyByZWZOYW1lKSB7CisJcHVibGljIEl0ZXJhYmxlPFB1c2hDZXJ0aWZpY2F0ZT4gZ2V0QWxsKFN0cmluZyByZWZOYW1lKSB7CiAJCXJldHVybiBuZXcgSXRlcmFibGU8UHVzaENlcnRpZmljYXRlPigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFB1c2hDZXJ0aWZpY2F0ZT4gaXRlcmF0b3IoKSB7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJT2JqZWN0TG9hZGVyIGxvYWRlciA9CiAJCQkJdHcuZ2V0T2JqZWN0UmVhZGVyKCkub3Blbih0dy5nZXRPYmplY3RJZCgwKSwgT0JKX0JMT0IpOwogCQl0cnkgKElucHV0U3RyZWFtIGluID0gbG9hZGVyLm9wZW5TdHJlYW0oKTsKLQkJCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIFVURl84KSkpIHsKKwkJCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIENIQVJTRVQpKSkgewogCQkJcmV0dXJuIFB1c2hDZXJ0aWZpY2F0ZVBhcnNlci5mcm9tUmVhZGVyKHIpOwogCQl9CiAJfQpAQCAtNDczLDcgKzQ3Myw3IEBACiAKIAkJRGlyQ2FjaGVFZGl0b3IgZWRpdG9yID0gZGMuZWRpdG9yKCk7CiAJCVN0cmluZyBjZXJ0VGV4dCA9IHBjLmNlcnQudG9UZXh0KCkgKyBwYy5jZXJ0LmdldFNpZ25hdHVyZSgpOwotCQlmaW5hbCBPYmplY3RJZCBjZXJ0SWQgPSBpbnNlcnRlci5pbnNlcnQoT0JKX0JMT0IsIGNlcnRUZXh0LmdldEJ5dGVzKFVURl84KSk7CisJCWZpbmFsIE9iamVjdElkIGNlcnRJZCA9IGluc2VydGVyLmluc2VydChPQkpfQkxPQiwgY2VydFRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlib29sZWFuIGFueSA9IGZhbHNlOwogCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IHBjLmNlcnQuZ2V0Q29tbWFuZHMoKSkgewogCQkJaWYgKGJ5UmVmICE9IG51bGwgJiYgIWNvbW1hbmRzRXF1YWwoY21kLCBieVJlZi5nZXQoY21kLmdldFJlZk5hbWUoKSkpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQppbmRleCAzMjAxNzMyLi40NzBhM2MwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMTI0LDEwICsxMjQsMTAgQEAKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0aGlzLndhbGtlciA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCk7CiAJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotCQl0aGlzLnRvUHVzaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy50b1B1c2ggPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAJCXRoaXMub3V0ID0gb3V0OwogCQl0aGlzLnB1c2hPcHRpb25zID0gdHJhbnNwb3J0LmdldFB1c2hPcHRpb25zKCk7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gpIHsKIAkJCWlmICh0aGlzLnRvUHVzaC5wdXQocnJ1LmdldFJlbW90ZU5hbWUoKSwgcnJ1KSAhPSBudWxsKQogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVSZW1vdGVSZWZVcGRhdGVJc0lsbGVnYWwsIHJydS5nZXRSZW1vdGVOYW1lKCkpKTsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCSAqICAgICAgICAgICAgIHdoZW4gc29tZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3BlcmF0aW9uLCBsaWtlIEkvTywgcHJvdG9jb2wKIAkgKiAgICAgICAgICAgICBlcnJvciwgb3IgbG9jYWwgZGF0YWJhc2UgY29uc2lzdGVuY3kgZXJyb3IuCiAJICovCi0JUHVzaFJlc3VsdCBleGVjdXRlKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCVB1c2hSZXN1bHQgZXhlY3V0ZShQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQltb25pdG9yLmJlZ2luVGFzayhQUk9HUkVTU19PUEVOSU5HX0NPTk5FQ1RJT04sCkBAIC0xNzYsNyArMTc2LDcgQEAKIAkJCX0KIAkJCWlmICghdHJhbnNwb3J0LmlzRHJ5UnVuKCkpCiAJCQkJdXBkYXRlVHJhY2tpbmdSZWZzKCk7Ci0JCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgewogCQkJCWZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHRydSA9IHJydS5nZXRUcmFja2luZ1JlZlVwZGF0ZSgpOwogCQkJCWlmICh0cnUgIT0gbnVsbCkKIAkJCQkJcmVzLmFkZCh0cnUpOwpAQCAtMTkwLDggKzE5MCw4IEBACiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHByZXBhcmVSZW1vdGVVcGRhdGVzKCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlib29sZWFuIGF0b21pYyA9IHRyYW5zcG9ydC5pc1B1c2hBdG9taWMoKTsKLQkJZmluYWwgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQlmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CiAJCQlmaW5hbCBSZWYgYWR2ZXJ0aXNlZFJlZiA9IGNvbm5lY3Rpb24uZ2V0UmVmKHJydS5nZXRSZW1vdGVOYW1lKCkpOwogCQkJT2JqZWN0SWQgYWR2ZXJ0aXNlZE9sZCA9IG51bGw7CiAJCQlpZiAoYWR2ZXJ0aXNlZFJlZiAhPSBudWxsKSB7CkBAIC0yNzcsMTMgKzI3NywxMyBAQAogCX0KIAogCXByaXZhdGUgdm9pZCBtb2RpZnlVcGRhdGVzRm9yRHJ5UnVuKCkgewotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpCisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLk5PVF9BVFRFTVBURUQpCiAJCQkJcnJ1LnNldFN0YXR1cyhTdGF0dXMuT0spOwogCX0KIAogCXByaXZhdGUgdm9pZCB1cGRhdGVUcmFja2luZ1JlZnMoKSB7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKIAkJCWZpbmFsIFN0YXR1cyBzdGF0dXMgPSBycnUuZ2V0U3RhdHVzKCk7CiAJCQlpZiAocnJ1Lmhhc1RyYWNraW5nUmVmVXBkYXRlKCkKIAkJCQkJJiYgKHN0YXR1cyA9PSBTdGF0dXMuVVBfVE9fREFURSB8fCBzdGF0dXMgPT0gU3RhdHVzLk9LKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFJlc3VsdC5qYXZhCmluZGV4IDhiYWU1YTUuLjU0NTI3MDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hSZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUmVzdWx0LmphdmEKQEAgLTgyLDcgKzgyLDcgQEAKIAkgKiAgICAgICAgICAgIHJlbW90ZSByZWYgbmFtZQogCSAqIEByZXR1cm4gc3RhdHVzIG9mIHJlbW90ZSByZWYgdXBkYXRlCiAJICovCi0JcHVibGljIFJlbW90ZVJlZlVwZGF0ZSBnZXRSZW1vdGVVcGRhdGUoZmluYWwgU3RyaW5nIHJlZk5hbWUpIHsKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlIGdldFJlbW90ZVVwZGF0ZShTdHJpbmcgcmVmTmFtZSkgewogCQlyZXR1cm4gcmVtb3RlVXBkYXRlcy5nZXQocmVmTmFtZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZUNvbW1hbmQuamF2YQppbmRleCBlMTRkMThmLi5kNjFhZWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVDb21tYW5kLmphdmEKQEAgLTcxMyw3ICs3MTMsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICB0aGUgbmV3IHN0YXR1cyBjb2RlIGZvciB0aGlzIGNvbW1hbmQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0KGZpbmFsIFJlc3VsdCBzKSB7CisJcHVibGljIHZvaWQgc2V0UmVzdWx0KFJlc3VsdCBzKSB7CiAJCXNldFJlc3VsdChzLCBudWxsKTsKIAl9CiAKQEAgLTcyNSw3ICs3MjUsNyBAQAogCSAqIEBwYXJhbSBtCiAJICogICAgICAgICAgICBvcHRpb25hbCBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIG5ldyBzdGF0dXMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0KGZpbmFsIFJlc3VsdCBzLCBmaW5hbCBTdHJpbmcgbSkgeworCXB1YmxpYyB2b2lkIHNldFJlc3VsdChSZXN1bHQgcywgU3RyaW5nIG0pIHsKIAkJc3RhdHVzID0gczsKIAkJbWVzc2FnZSA9IG07CiAJfQpAQCAtNzcwLDcgKzc3MCw3IEBACiAJICogICAgICAgICAgICByZWNlaXZlLXBhY2sgc2Vzc2lvbi4KIAkgKiBAc2luY2UgMi4wCiAJICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBCYXNlUmVjZWl2ZVBhY2sgcnApIHsKKwlwdWJsaWMgdm9pZCBleGVjdXRlKEJhc2VSZWNlaXZlUGFjayBycCkgewogCQl0cnkgewogCQkJU3RyaW5nIGV4cFRhcmdldCA9IGdldE9sZFN5bXJlZigpOwogCQkJYm9vbGVhbiBkZXRhY2ggPSBnZXROZXdTeW1yZWYoKSAhPSBudWxsCkBAIC04MTgsMTEgKzgxOCwxMSBAQAogCQl9CiAJfQogCi0Jdm9pZCBzZXRSZWYoZmluYWwgUmVmIHIpIHsKKwl2b2lkIHNldFJlZihSZWYgcikgewogCQlyZWYgPSByOwogCX0KIAotCXZvaWQgc2V0VHlwZShmaW5hbCBUeXBlIHQpIHsKKwl2b2lkIHNldFR5cGUoVHlwZSB0KSB7CiAJCXR5cGUgPSB0OwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrLmphdmEKaW5kZXggN2M1ZjMyYS4uMzVmYjBiMTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2suamF2YQpAQCAtODgsNyArODgsNyBAQAogCSAqIEBwYXJhbSBpbnRvCiAJICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBpbnRvKSB7CisJcHVibGljIFJlY2VpdmVQYWNrKFJlcG9zaXRvcnkgaW50bykgewogCQlzdXBlcihpbnRvKTsKIAkJcHJlUmVjZWl2ZSA9IFByZVJlY2VpdmVIb29rLk5VTEw7CiAJCXBvc3RSZWNlaXZlID0gUG9zdFJlY2VpdmVIb29rLk5VTEw7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAkgKiBAcGFyYW0gaAogCSAqICAgICAgICAgICAgdGhlIGhvb2sgaW5zdGFuY2U7IG1heSBiZSBudWxsIHRvIGRpc2FibGUgdGhlIGhvb2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0UHJlUmVjZWl2ZUhvb2soZmluYWwgUHJlUmVjZWl2ZUhvb2sgaCkgeworCXB1YmxpYyB2b2lkIHNldFByZVJlY2VpdmVIb29rKFByZVJlY2VpdmVIb29rIGgpIHsKIAkJcHJlUmVjZWl2ZSA9IGggIT0gbnVsbCA/IGggOiBQcmVSZWNlaXZlSG9vay5OVUxMOwogCX0KIApAQCAtMTc4LDcgKzE3OCw3IEBACiAJICogQHBhcmFtIGgKIAkgKiAgICAgICAgICAgIHRoZSBob29rIGluc3RhbmNlOyBtYXkgYmUgbnVsbCB0byBkaXNhYmxlIHRoZSBob29rLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RSZWNlaXZlSG9vayhmaW5hbCBQb3N0UmVjZWl2ZUhvb2sgaCkgeworCXB1YmxpYyB2b2lkIHNldFBvc3RSZWNlaXZlSG9vayhQb3N0UmVjZWl2ZUhvb2sgaCkgewogCQlwb3N0UmVjZWl2ZSA9IGggIT0gbnVsbCA/IGggOiBQb3N0UmVjZWl2ZUhvb2suTlVMTDsKIAl9CiAKQEAgLTI4OCw3ICsyODgsNyBAQAogCQkJCWlmIChlY2hvQ29tbWFuZEZhaWx1cmVzICYmIG1zZ091dCAhPSBudWxsKSB7CiAJCQkJCXNlbmRTdGF0dXNSZXBvcnQoZmFsc2UsIHVucGFja0Vycm9yLCBuZXcgUmVwb3J0ZXIoKSB7CiAJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXZvaWQgc2VuZFN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCXZvaWQgc2VuZFN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJCQltc2dPdXQud3JpdGUoQ29uc3RhbnRzLmVuY29kZShzICsgIlxuIikpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CiAJCQkJCX0pOwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJCQkJfQogCQkJCXNlbmRTdGF0dXNSZXBvcnQodHJ1ZSwgdW5wYWNrRXJyb3IsIG5ldyBSZXBvcnRlcigpIHsKIAkJCQkJQE92ZXJyaWRlCi0JCQkJCXZvaWQgc2VuZFN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJdm9pZCBzZW5kU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKHMgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJfSk7CkBAIC0zMDksNyArMzA5LDcgQEAKIAkJCX0gZWxzZSBpZiAobXNnT3V0ICE9IG51bGwpIHsKIAkJCQlzZW5kU3RhdHVzUmVwb3J0KGZhbHNlLCB1bnBhY2tFcnJvciwgbmV3IFJlcG9ydGVyKCkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJdm9pZCBzZW5kU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQl2b2lkIHNlbmRTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCQltc2dPdXQud3JpdGUoQ29uc3RhbnRzLmVuY29kZShzICsgIlxuIikpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQl9KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkFkdmVydGlzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkFkdmVydGlzZXIuamF2YQppbmRleCA1ZWIxNjYxLi5kYzE4NzFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZBZHZlcnRpc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmQWR2ZXJ0aXNlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fU1lNUkVGOwogCkBAIC01MywxMSArNTMsMTIgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CkBAIC02NSw3ICs2Niw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkNvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmVmTWFwOwogCiAvKioKICAqIFN1cHBvcnQgZm9yIHRoZSBzdGFydCBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFja30gYW5kCkBAIC03NCw3ICs3NCw3IEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmQWR2ZXJ0aXNlciB7CiAJLyoqIEFkdmVydGlzZXIgd2hpY2ggZnJhbWVzIGxpbmVzIGluIGEge0BsaW5rIFBhY2tldExpbmVPdXR9IGZvcm1hdC4gKi8KIAlwdWJsaWMgc3RhdGljIGNsYXNzIFBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyIGV4dGVuZHMgUmVmQWR2ZXJ0aXNlciB7Ci0JCXByaXZhdGUgZmluYWwgQ2hhcnNldEVuY29kZXIgdXRmOCA9IFVURl84Lm5ld0VuY29kZXIoKTsKKwkJcHJpdmF0ZSBmaW5hbCBDaGFyc2V0RW5jb2RlciB1dGY4ID0gQ0hBUlNFVC5uZXdFbmNvZGVyKCk7CiAJCXByaXZhdGUgZmluYWwgUGFja2V0TGluZU91dCBwY2tPdXQ7CiAKIAkJcHJpdmF0ZSBieXRlW10gYmluQXJyID0gbmV3IGJ5dGVbMjU2XTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHdyaXRlT25lKGZpbmFsIENoYXJTZXF1ZW5jZSBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU9uZShDaGFyU2VxdWVuY2UgbGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXBja091dC53cml0ZVN0cmluZyhsaW5lLnRvU3RyaW5nKCkpOwogCQl9CiAKQEAgLTE3Niw2ICsxNzYsMTEgQEAKIAogCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwogCisJcHJpdmF0ZSBib29sZWFuIHVzZVByb3RvY29sVjI7CisKKwkvKiBvbmx5IHVzZWQgaW4gcHJvdG9jb2wgdjIgKi8KKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gc3ltcmVmcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwogCS8qKgogCSAqIEluaXRpYWxpemUgdGhpcyBhZHZlcnRpc2VyIHdpdGggYSByZXBvc2l0b3J5IGZvciBwZWVsaW5nIHRhZ3MuCiAJICoKQEAgLTE4Nyw2ICsxOTIsMTYgQEAKIAl9CiAKIAkvKioKKwkgKiBAcGFyYW0gYgorCSAqICAgICAgICAgICAgICB0cnVlIGlmIHRoaXMgYWR2ZXJ0aXNlciBzaG91bGQgYWR2ZXJ0aXNlIHVzaW5nIHRoZSBwcm90b2NvbAorCSAqICAgICAgICAgICAgICB2MiBmb3JtYXQsIGZhbHNlIG90aGVyd2lzZQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVc2VQcm90b2NvbFYyKGJvb2xlYW4gYikgeworCQl1c2VQcm90b2NvbFYyID0gYjsKKwl9CisKKwkvKioKIAkgKiBUb2dnbGUgdGFnIHBlZWxpbmcuCiAJICogPHA+CiAJICogPHA+CkBAIC0xOTksNyArMjE0LDcgQEAKIAkgKiAgICAgICAgICAgIHRydWUgdG8gc2hvdyB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlIG9mIGEgdGFnIGFzIHRoZSBzcGVjaWFsCiAJICogICAgICAgICAgICByZWYgPGNvZGU+JHRhZ157fTwvY29kZT4gOyBmYWxzZSB0byBvbWl0IGl0IGZyb20gdGhlIG91dHB1dC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXJlZlRhZ3MoZmluYWwgYm9vbGVhbiBkZXJlZikgeworCXB1YmxpYyB2b2lkIHNldERlcmVmVGFncyhib29sZWFuIGRlcmVmKSB7CiAJCWRlcmVmVGFncyA9IGRlcmVmOwogCX0KIApAQCAtMjUzLDcgKzI2OCwxMSBAQAogCSAqIEBzaW5jZSAzLjYKIAkgKi8KIAlwdWJsaWMgdm9pZCBhZGRTeW1yZWYoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgewotCQlhZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9TWU1SRUYsIGZyb20gKyAnOicgKyB0byk7CisJCWlmICh1c2VQcm90b2NvbFYyKSB7CisJCQlzeW1yZWZzLnB1dChmcm9tLCB0byk7CisJCX0gZWxzZSB7CisJCQlhZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9TWU1SRUYsIGZyb20gKyAnOicgKyB0byk7CisJCX0KIAl9CiAKIAkvKioKQEAgLTI2NywxMyArMjg2LDU1IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBmYWlsZWQgdG8gd3JpdGUgb3V0IGFuCiAJICogICAgICAgICAgICAgYWR2ZXJ0aXNlbWVudCByZWNvcmQuCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjc2VuZChDb2xsZWN0aW9uKX0gaW5zdGVhZC4KIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBTZXQ8T2JqZWN0SWQ+IHNlbmQoTWFwPFN0cmluZywgUmVmPiByZWZzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKFJlZiByZWYgOiBnZXRTb3J0ZWRSZWZzKHJlZnMpKSB7Ci0JCQlpZiAocmVmLmdldE9iamVjdElkKCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKKwkJcmV0dXJuIHNlbmQocmVmcy52YWx1ZXMoKSk7CisJfQogCi0JCQlhZHZlcnRpc2VBbnkocmVmLmdldE9iamVjdElkKCksIHJlZi5nZXROYW1lKCkpOworCS8qKgorCSAqIEZvcm1hdCBhbiBhZHZlcnRpc2VtZW50IGZvciB0aGUgc3VwcGxpZWQgcmVmcy4KKwkgKgorCSAqIEBwYXJhbSByZWZzCisJICogICAgICAgICAgICB6ZXJvIG9yIG1vcmUgcmVmcyB0byBmb3JtYXQgZm9yIHRoZSBjbGllbnQuIFRoZSBjb2xsZWN0aW9uIGlzCisJICogICAgICAgICAgICBzb3J0ZWQgYmVmb3JlIGRpc3BsYXkgaWYgbmVjZXNzYXJ5LCBhbmQgdGhlcmVmb3JlIG1heSBhcHBlYXIKKwkgKiAgICAgICAgICAgIGluIGFueSBvcmRlci4KKwkgKiBAcmV0dXJuIHNldCBvZiBPYmplY3RJZHMgdGhhdCB3ZXJlIGFkdmVydGlzZWQgdG8gdGhlIGNsaWVudC4KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZhaWxlZCB0byB3cml0ZSBvdXQgYW4KKwkgKiAgICAgICAgICAgICBhZHZlcnRpc2VtZW50IHJlY29yZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIFNldDxPYmplY3RJZD4gc2VuZChDb2xsZWN0aW9uPFJlZj4gcmVmcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZm9yIChSZWYgcmVmIDogUmVmQ29tcGFyYXRvci5zb3J0KHJlZnMpKSB7CisJCQkvLyBUT0RPKGpybikgcmV2aXZlIHRoZSBTb3J0ZWRNYXAgb3B0aW1pemF0aW9uIGUuZy4gYnkgaW50cm9kdWNpbmcKKwkJCS8vIFNvcnRlZExpc3QKKwkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldE9iamVjdElkKCk7CisJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAodXNlUHJvdG9jb2xWMikgeworCQkJCVN0cmluZyBzeW1yZWZQYXJ0ID0gc3ltcmVmcy5jb250YWluc0tleShyZWYuZ2V0TmFtZSgpKQorCQkJCQkJPyAoIiBzeW1yZWYtdGFyZ2V0OiIgKyBzeW1yZWZzLmdldChyZWYuZ2V0TmFtZSgpKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJOiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyBwZWVsUGFydCA9ICIiOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKGRlcmVmVGFncykgeworCQkJCQlpZiAoIXJlZi5pc1BlZWxlZCgpICYmIHJlcG9zaXRvcnkgIT0gbnVsbCkgeworCQkJCQkJcmVmID0gcmVwb3NpdG9yeS5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKKwkJCQkJfQorCQkJCQlPYmplY3RJZCBwZWVsZWRPYmplY3RJZCA9IHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpOworCQkJCQlpZiAocGVlbGVkT2JqZWN0SWQgIT0gbnVsbCkgeworCQkJCQkJcGVlbFBhcnQgPSAiIHBlZWxlZDoiICsgcGVlbGVkT2JqZWN0SWQuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CisJCQkJd3JpdGVPbmUob2JqZWN0SWQuZ2V0TmFtZSgpICsgIiAiICsgcmVmLmdldE5hbWUoKSArIHN5bXJlZlBhcnQgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyBwZWVsUGFydCArICJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWFkdmVydGlzZUFueShvYmplY3RJZCwgcmVmLmdldE5hbWUoKSk7CiAKIAkJCWlmICghZGVyZWZUYWdzKQogCQkJCWNvbnRpbnVlOwpAQCAtMjgxLDcgKzM0Miw3IEBACiAJCQlpZiAoIXJlZi5pc1BlZWxlZCgpKSB7CiAJCQkJaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkKIAkJCQkJY29udGludWU7Ci0JCQkJcmVmID0gcmVwb3NpdG9yeS5wZWVsKHJlZik7CisJCQkJcmVmID0gcmVwb3NpdG9yeS5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCX0KIAogCQkJaWYgKHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCkBAIC0yOTAsMTMgKzM1MSw2IEBACiAJCXJldHVybiBzZW50OwogCX0KIAotCXByaXZhdGUgSXRlcmFibGU8UmVmPiBnZXRTb3J0ZWRSZWZzKE1hcDxTdHJpbmcsIFJlZj4gYWxsKSB7Ci0JCWlmIChhbGwgaW5zdGFuY2VvZiBSZWZNYXAKLQkJCQl8fCAoYWxsIGluc3RhbmNlb2YgU29ydGVkTWFwICYmICgoU29ydGVkTWFwKSBhbGwpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSkKLQkJCXJldHVybiBhbGwudmFsdWVzKCk7Ci0JCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsLnZhbHVlcygpKTsKLQl9Ci0KIAkvKioKIAkgKiBBZHZlcnRpc2Ugb25lIG9iamVjdCBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIG1hZ2ljIHtAY29kZSAuaGF2ZX0uCiAJICogPHA+CkBAIC0zMjQsMTMgKzM3OCwxMyBAQAogCQlyZXR1cm4gZmlyc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueU9uY2UoQW55T2JqZWN0SWQgb2JqLCBmaW5hbCBTdHJpbmcgcmVmTmFtZSkKKwlwcml2YXRlIHZvaWQgYWR2ZXJ0aXNlQW55T25jZShBbnlPYmplY3RJZCBvYmosIFN0cmluZyByZWZOYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFzZW50LmNvbnRhaW5zKG9iaikpCiAJCQlhZHZlcnRpc2VBbnkob2JqLCByZWZOYW1lKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWR2ZXJ0aXNlQW55KEFueU9iamVjdElkIG9iaiwgZmluYWwgU3RyaW5nIHJlZk5hbWUpCisJcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueShBbnlPYmplY3RJZCBvYmosIFN0cmluZyByZWZOYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc2VudC5hZGQob2JqLnRvT2JqZWN0SWQoKSk7CiAJCWFkdmVydGlzZUlkKG9iaiwgcmVmTmFtZSk7CkBAIC0zNTEsNyArNDA1LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZhaWxlZCB0byB3cml0ZSBvdXQgYW4KIAkgKiAgICAgICAgICAgICBhZHZlcnRpc2VtZW50IHJlY29yZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZHZlcnRpc2VJZChmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIHJlZk5hbWUpCisJcHVibGljIHZvaWQgYWR2ZXJ0aXNlSWQoQW55T2JqZWN0SWQgaWQsIFN0cmluZyByZWZOYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG1wTGluZS5zZXRMZW5ndGgoMCk7CiAJCWlkLmNvcHlUbyh0bXBJZCwgdG1wTGluZSk7CkBAIC0zNjEsNyArNDE1LDcgQEAKIAkJCWZpcnN0ID0gZmFsc2U7CiAJCQlpZiAoIWNhcGFibGl0aWVzLmlzRW1wdHkoKSkgewogCQkJCXRtcExpbmUuYXBwZW5kKCdcMCcpOwotCQkJCWZvciAoZmluYWwgU3RyaW5nIGNhcE5hbWUgOiBjYXBhYmxpdGllcykgeworCQkJCWZvciAoU3RyaW5nIGNhcE5hbWUgOiBjYXBhYmxpdGllcykgewogCQkJCQl0bXBMaW5lLmFwcGVuZCgnICcpOwogCQkJCQl0bXBMaW5lLmFwcGVuZChjYXBOYW1lKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkZpbHRlci5qYXZhCmluZGV4IGJiZTRmODQuLjk5MmRkYzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkZpbHRlci5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBSZWZGaWx0ZXIgREVGQVVMVCA9IG5ldyBSZWZGaWx0ZXIoKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIgKGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgeworCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIgKE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgewogCQkJcmV0dXJuIHJlZnM7CiAJCX0KIAl9OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCmluZGV4IGUxYjMwNmUuLmFmZDNhZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKiAgICAgICAgICAgIHJlZiBzcGVjIGNvbXBvbmVudCAtIHN0cmluZyB0byB0ZXN0LiBDYW4gYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgcHJvdmlkZWQgc3RyaW5nIGlzIGEgd2lsZGNhcmQgcmVmIHNwZWMgY29tcG9uZW50LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dpbGRjYXJkKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2lsZGNhcmQoU3RyaW5nIHMpIHsKIAkJcmV0dXJuIHMgIT0gbnVsbCAmJiBzLmNvbnRhaW5zKCIqIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTIyMiwxMSArMjIyLDExIEBACiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gaXMgaW52YWxpZC4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyhmaW5hbCBTdHJpbmcgc3BlYykgeworCXB1YmxpYyBSZWZTcGVjKFN0cmluZyBzcGVjKSB7CiAJCXRoaXMoc3BlYywgV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpOwogCX0KIAotCXByaXZhdGUgUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHApIHsKKwlwcml2YXRlIFJlZlNwZWMoUmVmU3BlYyBwKSB7CiAJCWZvcmNlID0gcC5pc0ZvcmNlVXBkYXRlKCk7CiAJCXdpbGRjYXJkID0gcC5pc1dpbGRjYXJkKCk7CiAJCXNyY05hbWUgPSBwLmdldFNvdXJjZSgpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJICogICAgICAgICAgICBuZXcgdmFsdWUgZm9yIGZvcmNlIHVwZGF0ZSBpbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UuCiAJICogQHJldHVybiBhIG5ldyBSZWZTcGVjIHdpdGggZm9yY2UgdXBkYXRlIGFzIHNwZWNpZmllZC4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBzZXRGb3JjZVVwZGF0ZShmaW5hbCBib29sZWFuIGZvcmNlVXBkYXRlKSB7CisJcHVibGljIFJlZlNwZWMgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBmb3JjZVVwZGF0ZSkgewogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKIAkJci5mb3JjZSA9IGZvcmNlVXBkYXRlOwogCQlyZXR1cm4gcjsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCSAqICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgZXhpc3RpbmcgZGVzdGluYXRpb24gZGlzYWdyZWVzIHdpdGggdGhlCiAJICogICAgICAgICAgICAgd2lsZGNhcmQgc3RhdHVzIG9mIHRoZSBuZXcgc291cmNlLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIHNldFNvdXJjZShmaW5hbCBTdHJpbmcgc291cmNlKSB7CisJcHVibGljIFJlZlNwZWMgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CiAJCXIuc3JjTmFtZSA9IGNoZWNrVmFsaWQoc291cmNlKTsKIAkJaWYgKGlzV2lsZGNhcmQoci5zcmNOYW1lKSAmJiByLmRzdE5hbWUgPT0gbnVsbCkKQEAgLTMzMiw3ICszMzIsNyBAQAogCSAqICAgICAgICAgICAgIG9mIHRoZSBleGlzdGluZyBzb3VyY2UgZGlzYWdyZWVzIHdpdGggdGhlIHdpbGRjYXJkIHN0YXR1cyBvZgogCSAqICAgICAgICAgICAgIHRoZSBuZXcgZGVzdGluYXRpb24uCiAJICovCi0JcHVibGljIFJlZlNwZWMgc2V0RGVzdGluYXRpb24oZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7CisJcHVibGljIFJlZlNwZWMgc2V0RGVzdGluYXRpb24oU3RyaW5nIGRlc3RpbmF0aW9uKSB7CiAJCWZpbmFsIFJlZlNwZWMgciA9IG5ldyBSZWZTcGVjKHRoaXMpOwogCQlyLmRzdE5hbWUgPSBjaGVja1ZhbGlkKGRlc3RpbmF0aW9uKTsKIAkJaWYgKGlzV2lsZGNhcmQoci5kc3ROYW1lKSAmJiByLnNyY05hbWUgPT0gbnVsbCkKQEAgLTM3Miw3ICszNzIsNyBAQAogCSAqICAgICAgICAgICAgcmVmIG5hbWUgdGhhdCBzaG91bGQgYmUgdGVzdGVkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXMgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShmaW5hbCBTdHJpbmcgcikgeworCXB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKFN0cmluZyByKSB7CiAJCXJldHVybiBtYXRjaChyLCBnZXRTb3VyY2UoKSk7CiAJfQogCkBAIC0zODMsNyArMzgzLDcgQEAKIAkgKiAgICAgICAgICAgIHJlZiB3aG9zZSBuYW1lIHNob3VsZCBiZSB0ZXN0ZWQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lcyBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKGZpbmFsIFJlZiByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hTb3VyY2UoUmVmIHIpIHsKIAkJcmV0dXJuIG1hdGNoKHIuZ2V0TmFtZSgpLCBnZXRTb3VyY2UoKSk7CiAJfQogCkBAIC0zOTQsNyArMzk0LDcgQEAKIAkgKiAgICAgICAgICAgIHJlZiBuYW1lIHRoYXQgc2hvdWxkIGJlIHRlc3RlZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgcikgeworCXB1YmxpYyBib29sZWFuIG1hdGNoRGVzdGluYXRpb24oU3RyaW5nIHIpIHsKIAkJcmV0dXJuIG1hdGNoKHIsIGdldERlc3RpbmF0aW9uKCkpOwogCX0KIApAQCAtNDA1LDcgKzQwNSw3IEBACiAJICogICAgICAgICAgICByZWYgd2hvc2UgbmFtZSBzaG91bGQgYmUgdGVzdGVkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXMgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKGZpbmFsIFJlZiByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihSZWYgcikgewogCQlyZXR1cm4gbWF0Y2goci5nZXROYW1lKCksIGdldERlc3RpbmF0aW9uKCkpOwogCX0KIApAQCAtNDI1LDcgKzQyNSw3IEBACiAJICogICAgICAgICAgICAgd2hlbiB0aGUgUmVmU3BlYyB3YXMgY29uc3RydWN0ZWQgd2l0aCB3aWxkY2FyZCBtb2RlIHRoYXQKIAkgKiAgICAgICAgICAgICBkb2Vzbid0IHJlcXVpcmUgbWF0Y2hpbmcgd2lsZGNhcmRzLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2UoZmluYWwgU3RyaW5nIHIpIHsKKwlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKFN0cmluZyByKSB7CiAJCWlmIChhbGxvd01pc21hdGNoZWRXaWxkY2FyZHMgIT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRFeHBhbmRXaWxkY2FyZCk7CkBAIC00MzMsNyArNDMzLDcgQEAKIAkJcmV0dXJuIGlzV2lsZGNhcmQoKSA/IG5ldyBSZWZTcGVjKHRoaXMpLmV4cGFuZEZyb21Tb3VyY2VJbXAocikgOiB0aGlzOwogCX0KIAotCXByaXZhdGUgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlSW1wKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2VJbXAoU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgU3RyaW5nIHBzcmMgPSBzcmNOYW1lLCBwZHN0ID0gZHN0TmFtZTsKIAkJd2lsZGNhcmQgPSBmYWxzZTsKIAkJc3JjTmFtZSA9IG5hbWU7CkBAIC00NTcsNyArNDU3LDcgQEAKIAkgKiAgICAgICAgICAgICB3aGVuIHRoZSBSZWZTcGVjIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHdpbGRjYXJkIG1vZGUgdGhhdAogCSAqICAgICAgICAgICAgIGRvZXNuJ3QgcmVxdWlyZSBtYXRjaGluZyB3aWxkY2FyZHMuCiAJICovCi0JcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShmaW5hbCBSZWYgcikgeworCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2UoUmVmIHIpIHsKIAkJcmV0dXJuIGV4cGFuZEZyb21Tb3VyY2Uoci5nZXROYW1lKCkpOwogCX0KIApAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJICogICAgICAgICAgICAgd2hlbiB0aGUgUmVmU3BlYyB3YXMgY29uc3RydWN0ZWQgd2l0aCB3aWxkY2FyZCBtb2RlIHRoYXQKIAkgKiAgICAgICAgICAgICBkb2Vzbid0IHJlcXVpcmUgbWF0Y2hpbmcgd2lsZGNhcmRzLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgcikgeworCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihTdHJpbmcgcikgewogCQlpZiAoYWxsb3dNaXNtYXRjaGVkV2lsZGNhcmRzICE9IFdpbGRjYXJkTW9kZS5SRVFVSVJFX01BVENIKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRXhwYW5kV2lsZGNhcmQpOwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJCXJldHVybiBpc1dpbGRjYXJkKCkgPyBuZXcgUmVmU3BlYyh0aGlzKS5leHBhbmRGcm9tRHN0SW1wKHIpIDogdGhpczsKIAl9CiAKLQlwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbURzdEltcChmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgUmVmU3BlYyBleHBhbmRGcm9tRHN0SW1wKFN0cmluZyBuYW1lKSB7CiAJCWZpbmFsIFN0cmluZyBwc3JjID0gc3JjTmFtZSwgcGRzdCA9IGRzdE5hbWU7CiAJCXdpbGRjYXJkID0gZmFsc2U7CiAJCXNyY05hbWUgPSBleHBhbmRXaWxkY2FyZChuYW1lLCBwZHN0LCBwc3JjKTsKQEAgLTUwOCwxMSArNTA4LDExIEBACiAJICogICAgICAgICAgICAgd2hlbiB0aGUgUmVmU3BlYyB3YXMgY29uc3RydWN0ZWQgd2l0aCB3aWxkY2FyZCBtb2RlIHRoYXQKIAkgKiAgICAgICAgICAgICBkb2Vzbid0IHJlcXVpcmUgbWF0Y2hpbmcgd2lsZGNhcmRzLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihmaW5hbCBSZWYgcikgeworCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihSZWYgcikgewogCQlyZXR1cm4gZXhwYW5kRnJvbURlc3RpbmF0aW9uKHIuZ2V0TmFtZSgpKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2goZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBzKSB7CisJcHJpdmF0ZSBib29sZWFuIG1hdGNoKFN0cmluZyBuYW1lLCBTdHJpbmcgcykgewogCQlpZiAocyA9PSBudWxsKQogCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoaXNXaWxkY2FyZChzKSkgewpAQCAtNTQxLDcgKzU0MSw3IEBACiAJCXJldHVybiBzcGVjOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBTdHJpbmcgcykgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcykgewogCQlpZiAocy5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKIAkJCXJldHVybiBmYWxzZTsKIAkJaWYgKHMuY29udGFpbnMoIi8vIikpIC8vJE5PTi1OTFMtMSQKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJCWlmICghKG9iaiBpbnN0YW5jZW9mIFJlZlNwZWMpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmaW5hbCBSZWZTcGVjIGIgPSAoUmVmU3BlYykgb2JqOwpAQCAtNTg0LDcgKzU4NCw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKIAkJaWYgKGEgPT0gYikKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEKaW5kZXggN2I4ODJlYy4uMGE2MjFmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEKQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgb25lIG9mIHRoZSBVUklzIHdpdGhpbiB0aGUgcmVtb3RlJ3MgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxSZW1vdGVDb25maWc+IGdldEFsbFJlbW90ZUNvbmZpZ3MoZmluYWwgQ29uZmlnIHJjKQorCXB1YmxpYyBzdGF0aWMgTGlzdDxSZW1vdGVDb25maWc+IGdldEFsbFJlbW90ZUNvbmZpZ3MoQ29uZmlnIHJjKQogCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PihyYwogCQkJCS5nZXRTdWJzZWN0aW9ucyhTRUNUSU9OKSk7CkBAIC0xMjAsNyArMTIwLDcgQEAKIAogCQlmaW5hbCBMaXN0PFJlbW90ZUNvbmZpZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KG5hbWVzCiAJCQkJLnNpemUoKSk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIG5hbWUgOiBuYW1lcykKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKQogCQkJcmVzdWx0LmFkZChuZXcgUmVtb3RlQ29uZmlnKHJjLCBuYW1lKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTYwLDcgKzE2MCw3IEBACiAJICogQHRocm93cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBvbmUgb2YgdGhlIFVSSXMgd2l0aGluIHRoZSByZW1vdGUncyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIFJlbW90ZUNvbmZpZyhmaW5hbCBDb25maWcgcmMsIGZpbmFsIFN0cmluZyByZW1vdGVOYW1lKQorCXB1YmxpYyBSZW1vdGVDb25maWcoQ29uZmlnIHJjLCBTdHJpbmcgcmVtb3RlTmFtZSkKIAkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQluYW1lID0gcmVtb3RlTmFtZTsKIApAQCAtMTcwLDEyICsxNzAsMTIgQEAKIAkJdmxzdCA9IHJjLmdldFN0cmluZ0xpc3QoU0VDVElPTiwgbmFtZSwgS0VZX1VSTCk7CiAJCU1hcDxTdHJpbmcsIFN0cmluZz4gaW5zdGVhZE9mID0gZ2V0UmVwbGFjZW1lbnRzKHJjLCBLRVlfSU5TVEVBRE9GKTsKIAkJdXJpcyA9IG5ldyBBcnJheUxpc3Q8Pih2bHN0Lmxlbmd0aCk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiB2bHN0KSB7CisJCWZvciAoU3RyaW5nIHMgOiB2bHN0KSB7CiAJCQl1cmlzLmFkZChuZXcgVVJJaXNoKHJlcGxhY2VVcmkocywgaW5zdGVhZE9mKSkpOwogCQl9CiAJCVN0cmluZ1tdIHBsc3QgPSByYy5nZXRTdHJpbmdMaXN0KFNFQ1RJT04sIG5hbWUsIEtFWV9QVVNIVVJMKTsKIAkJcHVzaFVSSXMgPSBuZXcgQXJyYXlMaXN0PD4ocGxzdC5sZW5ndGgpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogcGxzdCkgeworCQlmb3IgKFN0cmluZyBzIDogcGxzdCkgewogCQkJcHVzaFVSSXMuYWRkKG5ldyBVUklpc2gocykpOwogCQl9CiAJCWlmIChwdXNoVVJJcy5pc0VtcHR5KCkpIHsKQEAgLTIyMywyNiArMjIzLDI2IEBACiAJICogQHBhcmFtIHJjCiAJICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRvIHN0b3JlIG91cnNlbHZlcyBpbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShmaW5hbCBDb25maWcgcmMpIHsKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29uZmlnIHJjKSB7CiAJCWZpbmFsIExpc3Q8U3RyaW5nPiB2bHN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkJdmxzdC5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFVSSWlzaCB1IDogZ2V0VVJJcygpKQorCQlmb3IgKFVSSWlzaCB1IDogZ2V0VVJJcygpKQogCQkJdmxzdC5hZGQodS50b1ByaXZhdGVTdHJpbmcoKSk7CiAJCXJjLnNldFN0cmluZ0xpc3QoU0VDVElPTiwgZ2V0TmFtZSgpLCBLRVlfVVJMLCB2bHN0KTsKIAogCQl2bHN0LmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgVVJJaXNoIHUgOiBnZXRQdXNoVVJJcygpKQorCQlmb3IgKFVSSWlzaCB1IDogZ2V0UHVzaFVSSXMoKSkKIAkJCXZsc3QuYWRkKHUudG9Qcml2YXRlU3RyaW5nKCkpOwogCQlyYy5zZXRTdHJpbmdMaXN0KFNFQ1RJT04sIGdldE5hbWUoKSwgS0VZX1BVU0hVUkwsIHZsc3QpOwogCiAJCXZsc3QuY2xlYXIoKTsKLQkJZm9yIChmaW5hbCBSZWZTcGVjIHUgOiBnZXRGZXRjaFJlZlNwZWNzKCkpCisJCWZvciAoUmVmU3BlYyB1IDogZ2V0RmV0Y2hSZWZTcGVjcygpKQogCQkJdmxzdC5hZGQodS50b1N0cmluZygpKTsKIAkJcmMuc2V0U3RyaW5nTGlzdChTRUNUSU9OLCBnZXROYW1lKCksIEtFWV9GRVRDSCwgdmxzdCk7CiAKIAkJdmxzdC5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFJlZlNwZWMgdSA6IGdldFB1c2hSZWZTcGVjcygpKQorCQlmb3IgKFJlZlNwZWMgdSA6IGdldFB1c2hSZWZTcGVjcygpKQogCQkJdmxzdC5hZGQodS50b1N0cmluZygpKTsKIAkJcmMuc2V0U3RyaW5nTGlzdChTRUNUSU9OLCBnZXROYW1lKCksIEtFWV9QVVNILCB2bHN0KTsKIApAQCAtMjc3LDcgKzI3Nyw3IEBACiAJCQlyYy5zZXRJbnQoU0VDVElPTiwgZ2V0TmFtZSgpLCBrZXksIGN1cnJlbnRWYWx1ZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVuc2V0KGZpbmFsIENvbmZpZyByYywgZmluYWwgU3RyaW5nIGtleSkgeworCXByaXZhdGUgdm9pZCB1bnNldChDb25maWcgcmMsIFN0cmluZyBrZXkpIHsKIAkJcmMudW5zZXQoU0VDVElPTiwgZ2V0TmFtZSgpLCBrZXkpOwogCX0KIApAQCAtMzM1LDcgKzMzNSw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IFVSSSB0byBhZGQgdG8gdGhpcyByZW1vdGUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRVUkkoZmluYWwgVVJJaXNoIHRvQWRkKSB7CisJcHVibGljIGJvb2xlYW4gYWRkVVJJKFVSSWlzaCB0b0FkZCkgewogCQlpZiAodXJpcy5jb250YWlucyh0b0FkZCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiB1cmlzLmFkZCh0b0FkZCk7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBVUkkgdG8gcmVtb3ZlIGZyb20gdGhpcyByZW1vdGUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVVUkkoZmluYWwgVVJJaXNoIHRvUmVtb3ZlKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlVVJJKFVSSWlzaCB0b1JlbW92ZSkgewogCQlyZXR1cm4gdXJpcy5yZW1vdmUodG9SZW1vdmUpOwogCX0KIApAQCAtMzY4LDcgKzM2OCw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IFVSSSB0byBhZGQgdG8gdGhpcyByZW1vdGUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRQdXNoVVJJKGZpbmFsIFVSSWlzaCB0b0FkZCkgeworCXB1YmxpYyBib29sZWFuIGFkZFB1c2hVUkkoVVJJaXNoIHRvQWRkKSB7CiAJCWlmIChwdXNoVVJJcy5jb250YWlucyh0b0FkZCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiBwdXNoVVJJcy5hZGQodG9BZGQpOwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJICogICAgICAgICAgICB0aGUgVVJJIHRvIHJlbW92ZSBmcm9tIHRoaXMgcmVtb3RlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgVVJJIHdhcyBhZGRlZDsgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuCiAJICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUHVzaFVSSShmaW5hbCBVUklpc2ggdG9SZW1vdmUpIHsKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVQdXNoVVJJKFVSSWlzaCB0b1JlbW92ZSkgewogCQlyZXR1cm4gcHVzaFVSSXMucmVtb3ZlKHRvUmVtb3ZlKTsKIAl9CiAKQEAgLTQwMSw3ICs0MDEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyBzcGVjaWZpY2F0aW9uIHRvIGFkZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmljYXRpb24gd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRGZXRjaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CisJcHVibGljIGJvb2xlYW4gYWRkRmV0Y2hSZWZTcGVjKFJlZlNwZWMgcykgewogCQlpZiAoZmV0Y2guY29udGFpbnMocykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiBmZXRjaC5hZGQocyk7CkBAIC00MTQsNyArNDE0LDcgQEAKIAkgKiAgICAgICAgICAgIGxpc3Qgb2YgZmV0Y2ggc3BlY2lmaWNhdGlvbnMgdG8gc2V0LiBMaXN0IGlzIGNvcGllZCwgaXQgY2FuIGJlCiAJICogICAgICAgICAgICBtb2RpZmllZCBhZnRlciB0aGlzIGNhbGwuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2hSZWZTcGVjcyhmaW5hbCBMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CisJcHVibGljIHZvaWQgc2V0RmV0Y2hSZWZTcGVjcyhMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJCWZldGNoLmNsZWFyKCk7CiAJCWZldGNoLmFkZEFsbChzcGVjcyk7CiAJfQpAQCAtNDI2LDcgKzQyNiw3IEBACiAJICogICAgICAgICAgICBsaXN0IG9mIHB1c2ggc3BlY2lmaWNhdGlvbnMgdG8gc2V0LiBMaXN0IGlzIGNvcGllZCwgaXQgY2FuIGJlCiAJICogICAgICAgICAgICBtb2RpZmllZCBhZnRlciB0aGlzIGNhbGwuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UHVzaFJlZlNwZWNzKGZpbmFsIExpc3Q8UmVmU3BlYz4gc3BlY3MpIHsKKwlwdWJsaWMgdm9pZCBzZXRQdXNoUmVmU3BlY3MoTGlzdDxSZWZTcGVjPiBzcGVjcykgewogCQlwdXNoLmNsZWFyKCk7CiAJCXB1c2guYWRkQWxsKHNwZWNzKTsKIAl9CkBAIC00MzgsNyArNDM4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpY2F0aW9uIHRvIHJlbW92ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmljYXRpb24gZXhpc3RlZCBhbmQgd2FzIHJlbW92ZWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRmV0Y2hSZWZTcGVjKGZpbmFsIFJlZlNwZWMgcykgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZUZldGNoUmVmU3BlYyhSZWZTcGVjIHMpIHsKIAkJcmV0dXJuIGZldGNoLnJlbW92ZShzKTsKIAl9CiAKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyBzcGVjaWZpY2F0aW9uIHRvIGFkZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmljYXRpb24gd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRQdXNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRQdXNoUmVmU3BlYyhSZWZTcGVjIHMpIHsKIAkJaWYgKHB1c2guY29udGFpbnMocykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiBwdXNoLmFkZChzKTsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gdG8gcmVtb3ZlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiBleGlzdGVkIGFuZCB3YXMgcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQdXNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVQdXNoUmVmU3BlYyhSZWZTcGVjIHMpIHsKIAkJcmV0dXJuIHB1c2gucmVtb3ZlKHMpOwogCX0KIApAQCAtNTIwLDcgKzUyMCw3IEBACiAJICogQHBhcmFtIG9wdGlvbgogCSAqICAgICAgICAgICAgbWV0aG9kIHRvIHVzZSB3aGVuIGhhbmRsaW5nIGFubm90YXRlZCB0YWdzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ09wdChmaW5hbCBUYWdPcHQgb3B0aW9uKSB7CisJcHVibGljIHZvaWQgc2V0VGFnT3B0KFRhZ09wdCBvcHRpb24pIHsKIAkJdGFnb3B0ID0gb3B0aW9uICE9IG51bGwgPyBvcHRpb24gOiBUYWdPcHQuQVVUT19GT0xMT1c7CiAJfQogCkBAIC01NDEsNyArNTQxLDcgQEAKIAkgKiBAcGFyYW0gbQogCSAqICAgICAgICAgICAgdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IGRlbGV0ZSByZW1vdGUgcmVmcyBkdXJpbmcgcHVzaC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaXJyb3IoZmluYWwgYm9vbGVhbiBtKSB7CisJcHVibGljIHZvaWQgc2V0TWlycm9yKGJvb2xlYW4gbSkgewogCQltaXJyb3IgPSBtOwogCX0KIApAQCAtNTYyLDcgKzU2Miw3IEBACiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGlzCiAJICogICAgICAgICAgICByZW1vdGUuICBBIHRpbWVvdXQgb2YgMCB3aWxsIGJsb2NrIGluZGVmaW5pdGVseS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVSZWZVcGRhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCmluZGV4IDNlOWIxNmUuLjkzMTY1M2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCkBAIC00ODEsNyArNDgxLDcgQEAKIAkJZXhwZWN0ZWRPbGRPYmplY3RJZCA9IGlkOwogCX0KIAotCXZvaWQgc2V0U3RhdHVzKGZpbmFsIFN0YXR1cyBzdGF0dXMpIHsKKwl2b2lkIHNldFN0YXR1cyhTdGF0dXMgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApAQCAtNDg5LDcgKzQ4OSw3IEBACiAJCXRoaXMuZmFzdEZvcndhcmQgPSBmYXN0Rm9yd2FyZDsKIAl9CiAKLQl2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwl2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKIAl9CiAKQEAgLTUwMSw3ICs1MDEsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHdoZW4gSS9PIGVycm9yIG9jY3VycmVkIGR1cmluZyB1cGRhdGUKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUcmFja2luZ1JlZihmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVHJhY2tpbmdSZWYoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoaXNEZWxldGUoKSkKIAkJCXRyYWNraW5nUmVmVXBkYXRlLnNldFJlc3VsdChsb2NhbFVwZGF0ZS5kZWxldGUod2FsaykpOwogCQllbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEKaW5kZXggMTUzMzhhMy4uMzEwMGNiNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YQpAQCAtMTMzLDcgKzEzMyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcmVhZChmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCByID0gMDsKIAkJd2hpbGUgKGxlbiA+IDApIHsKIAkJCW5lZWREYXRhUGFja2V0KCk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJcHJvZ3Jlc3NCdWZmZXIgPSBwa3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRvUHJvZ3Jlc3NMaW5lKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGRvUHJvZ3Jlc3NMaW5lKFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCU1hdGNoZXIgbWF0Y2hlcjsKIAogCQltYXRjaGVyID0gUF9CT1VOREVELm1hdGNoZXIobXNnKTsKQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJb3V0LndyaXRlKG1zZy5nZXRCeXRlcygpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYmVnaW5UYXNrKGZpbmFsIGludCB0b3RhbFdvcmtVbml0cykgeworCXByaXZhdGUgdm9pZCBiZWdpblRhc2soaW50IHRvdGFsV29ya1VuaXRzKSB7CiAJCW1vbml0b3IuYmVnaW5UYXNrKHJlbW90ZShjdXJyZW50VGFzayksIHRvdGFsV29ya1VuaXRzKTsKIAl9CiAKQEAgLTI1NCw3ICsyNTQsNyBAQAogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIHJlYWRTdHJpbmcoZmluYWwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFN0cmluZyByZWFkU3RyaW5nKGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSByYXcgPSBuZXcgYnl0ZVtsZW5dOwogCQlJTy5yZWFkRnVsbHkocmF3SW4sIHJhdywgMCwgbGVuKTsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCByYXcsIDAsIGxlbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW0uamF2YQppbmRleCBhZjY1ODI3Li5iMmNjMWI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtLmphdmEKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqICAgICAgICAgICAgc3RyZWFtIHRoYXQgdGhlIHBhY2tldHMgYXJlIHdyaXR0ZW4gb250by4gVGhpcyBzdHJlYW0gc2hvdWxkCiAJICogICAgICAgICAgICBiZSBhdHRhY2hlZCB0byBhIFNpZGVCYW5kSW5wdXRTdHJlYW0gb24gdGhlIHJlbW90ZSBzaWRlLgogCSAqLwotCXB1YmxpYyBTaWRlQmFuZE91dHB1dFN0cmVhbShmaW5hbCBpbnQgY2hhbiwgZmluYWwgaW50IHN6LCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHsKKwlwdWJsaWMgU2lkZUJhbmRPdXRwdXRTdHJlYW0oaW50IGNoYW4sIGludCBzeiwgT3V0cHV0U3RyZWFtIG9zKSB7CiAJCWlmIChjaGFuIDw9IDAgfHwgY2hhbiA+IDI1NSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmNoYW5uZWxNdXN0QmVJblJhbmdlMV8yNTUsCkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlICgwIDwgbGVuKSB7CiAJCQlpbnQgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoIC0gY250OwogCQkJaWYgKGNudCA9PSBIRFJfU0laRSAmJiBjYXBhY2l0eSA8IGxlbikgewpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoY250ID09IGJ1ZmZlci5sZW5ndGgpCiAJCQl3cml0ZUJ1ZmZlcigpOwogCQlidWZmZXJbY250KytdID0gKGJ5dGUpIGI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZFByb2dyZXNzTW9uaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRQcm9ncmVzc01vbml0b3IuamF2YQppbmRleCAzNjU1NDVhLi44YTNlNGVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZFByb2dyZXNzTW9uaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAogCXByaXZhdGUgYm9vbGVhbiB3cml0ZTsKIAotCVNpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgeworCVNpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yKE91dHB1dFN0cmVhbSBvcykgewogCQlvdXQgPSBvczsKIAkJd3JpdGUgPSB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hTZXNzaW9uRmFjdG9yeS5qYXZhCmluZGV4IGUwMDIyMzMuLmFlMzU3ZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YQpAQCAtODAsNyArODAsNyBAQAogCSAqICAgICAgICAgICAgZmFjdG9yeSBmb3IgZnV0dXJlIHNlc3Npb25zIHRvIGJlIGNyZWF0ZWQgdGhyb3VnaC4gSWYgbnVsbCB0aGUKIAkgKiAgICAgICAgICAgIGRlZmF1bHQgZmFjdG9yeSB3aWxsIGJlIHJlc3RvcmVkLnMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5zdGFuY2UoZmluYWwgU3NoU2Vzc2lvbkZhY3RvcnkgbmV3RmFjdG9yeSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShTc2hTZXNzaW9uRmFjdG9yeSBuZXdGYWN0b3J5KSB7CiAJCWlmIChuZXdGYWN0b3J5ICE9IG51bGwpCiAJCQlJTlNUQU5DRSA9IG5ld0ZhY3Rvcnk7CiAJCWVsc2UKQEAgLTEyMSw3ICsxMjEsNyBAQAogCSAqICAgICAgICAgICAge0BsaW5rICNnZXRTZXNzaW9uKFVSSWlzaCwgQ3JlZGVudGlhbHNQcm92aWRlciwgRlMsIGludCl9CiAJICogICAgICAgICAgICBtZXRob2QuCiAJICovCi0JcHVibGljIHZvaWQgcmVsZWFzZVNlc3Npb24oZmluYWwgUmVtb3RlU2Vzc2lvbiBzZXNzaW9uKSB7CisJcHVibGljIHZvaWQgcmVsZWFzZVNlc3Npb24oUmVtb3RlU2Vzc2lvbiBzZXNzaW9uKSB7CiAJCXNlc3Npb24uZGlzY29ubmVjdCgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RhZ09wdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVGFnT3B0LmphdmEKaW5kZXggZTExMzRlOC4uY2QxNzkxMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVGFnT3B0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVGFnT3B0LmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIG9wdGlvbjsKIAotCXByaXZhdGUgVGFnT3B0KGZpbmFsIFN0cmluZyBvKSB7CisJcHJpdmF0ZSBUYWdPcHQoU3RyaW5nIG8pIHsKIAkJb3B0aW9uID0gbzsKIAl9CiAKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAJICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRleHQgdmFsdWUuCiAJICogQHJldHVybiB0aGUgb3B0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgcGFzc2VkIHBhcmFtZXRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRhZ09wdCBmcm9tT3B0aW9uKGZpbmFsIFN0cmluZyBvKSB7CisJcHVibGljIHN0YXRpYyBUYWdPcHQgZnJvbU9wdGlvbihTdHJpbmcgbykgewogCQlpZiAobyA9PSBudWxsIHx8IG8ubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybiBBVVRPX0ZPTExPVzsKLQkJZm9yIChmaW5hbCBUYWdPcHQgdGFnb3B0IDogdmFsdWVzKCkpIHsKKwkJZm9yIChUYWdPcHQgdGFnb3B0IDogdmFsdWVzKCkpIHsKIAkJCWlmICh0YWdvcHQub3B0aW9uKCkuZXF1YWxzKG8pKQogCQkJCXJldHVybiB0YWdvcHQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zZmVyQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc2ZlckNvbmZpZy5qYXZhCmluZGV4IDRjNzA3MjUuLjRhZTFjY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zZmVyQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNmZXJDb25maWcuamF2YQpAQCAtNjIsOCArNjIsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiAKIC8qKgotICogVGhlIHN0YW5kYXJkICJ0cmFuc2ZlciIsICJmZXRjaCIsICJyZWNlaXZlIiwgYW5kICJ1cGxvYWRwYWNrIiBjb25maWd1cmF0aW9uCi0gKiBwYXJhbWV0ZXJzLgorICogVGhlIHN0YW5kYXJkICJ0cmFuc2ZlciIsICJmZXRjaCIsICJwcm90b2NvbCIsICJyZWNlaXZlIiwgYW5kICJ1cGxvYWRwYWNrIgorICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICovCiBwdWJsaWMgY2xhc3MgVHJhbnNmZXJDb25maWcgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGU0NLID0gImZzY2siOyAvLyROT04tTkxTLTEkCkBAIC05Miw2ICs5MiwzMyBAQAogCQlJR05PUkU7CiAJfQogCisJLyoqCisJICogQSBnaXQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBmb3Igd2hpY2ggdmVyc2lvbnMgb2YgdGhlIEdpdCBwcm90b2NvbCB0byBwcmVmZXIuCisJICogVXNlZCBpbiBwcm90b2NvbC52ZXJzaW9uLgorCSAqLworCWVudW0gUHJvdG9jb2xWZXJzaW9uIHsKKwkJVjAoIjAiKSwgLy8kTk9OLU5MUy0xJAorCQlWMigiMiIpOyAvLyROT04tTkxTLTEkCisKKwkJZmluYWwgU3RyaW5nIG5hbWU7CisKKwkJUHJvdG9jb2xWZXJzaW9uKFN0cmluZyBuYW1lKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQl9CisKKwkJc3RhdGljIEBOdWxsYWJsZSBQcm90b2NvbFZlcnNpb24gcGFyc2UoQE51bGxhYmxlIFN0cmluZyBuYW1lKSB7CisJCQlpZiAobmFtZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlmb3IgKFByb3RvY29sVmVyc2lvbiB2IDogUHJvdG9jb2xWZXJzaW9uLnZhbHVlcygpKSB7CisJCQkJaWYgKHYubmFtZS5lcXVhbHMobmFtZSkpIHsKKwkJCQkJcmV0dXJuIHY7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZmV0Y2hGc2NrOwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiByZWNlaXZlRnNjazsKIAlwcml2YXRlIGZpbmFsIFN0cmluZyBmc2NrU2tpcExpc3Q7CkBAIC0xMDEsMzIgKzEyOCwzNiBAQAogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBzYWZlRm9yTWFjT1M7CiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFsbG93VGlwU2hhMUluV2FudDsKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWxsb3dSZWFjaGFibGVTaGExSW5XYW50OworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBhbGxvd0ZpbHRlcjsKKwlmaW5hbCBATnVsbGFibGUgUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbjsKIAlmaW5hbCBTdHJpbmdbXSBoaWRlUmVmczsKIAotCVRyYW5zZmVyQ29uZmlnKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlUcmFuc2ZlckNvbmZpZyhSZXBvc2l0b3J5IGRiKSB7CiAJCXRoaXMoZGIuZ2V0Q29uZmlnKCkpOwogCX0KIAotCVRyYW5zZmVyQ29uZmlnKGZpbmFsIENvbmZpZyByYykgewotCQlib29sZWFuIGZzY2sgPSByYy5nZXRCb29sZWFuKCJ0cmFuc2ZlciIsICJmc2Nrb2JqZWN0cyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZldGNoRnNjayA9IHJjLmdldEJvb2xlYW4oImZldGNoIiwgImZzY2tvYmplY3RzIiwgZnNjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWNlaXZlRnNjayA9IHJjLmdldEJvb2xlYW4oInJlY2VpdmUiLCAiZnNja29iamVjdHMiLCBmc2NrKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZzY2tTa2lwTGlzdCA9IHJjLmdldFN0cmluZyhGU0NLLCBudWxsLCAic2tpcExpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhbGxvd0ludmFsaWRQZXJzb25JZGVudCA9IHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93SW52YWxpZFBlcnNvbklkZW50IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCXNhZmVGb3JXaW5kb3dzID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAic2FmZUZvcldpbmRvd3MiLCAvLyROT04tTkxTLTEkCisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJVHJhbnNmZXJDb25maWcoQ29uZmlnIHJjKSB7CisJCWJvb2xlYW4gZnNjayA9IHJjLmdldEJvb2xlYW4oInRyYW5zZmVyIiwgImZzY2tvYmplY3RzIiwgZmFsc2UpOworCQlmZXRjaEZzY2sgPSByYy5nZXRCb29sZWFuKCJmZXRjaCIsICJmc2Nrb2JqZWN0cyIsIGZzY2spOworCQlyZWNlaXZlRnNjayA9IHJjLmdldEJvb2xlYW4oInJlY2VpdmUiLCAiZnNja29iamVjdHMiLCBmc2NrKTsKKwkJZnNja1NraXBMaXN0ID0gcmMuZ2V0U3RyaW5nKEZTQ0ssIG51bGwsICJza2lwTGlzdCIpOworCQlhbGxvd0ludmFsaWRQZXJzb25JZGVudCA9IHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93SW52YWxpZFBlcnNvbklkZW50IiwKKwkJCQlmYWxzZSk7CisJCXNhZmVGb3JXaW5kb3dzID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAic2FmZUZvcldpbmRvd3MiLAogCQkJCQkJU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpOwotCQlzYWZlRm9yTWFjT1MgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJzYWZlRm9yTWFjT1MiLCAvLyROT04tTkxTLTEkCisJCXNhZmVGb3JNYWNPUyA9IHJjLmdldEJvb2xlYW4oRlNDSywgInNhZmVGb3JNYWNPUyIsCiAJCQkJCQlTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc01hY09TKCkpOwogCiAJCWlnbm9yZSA9IEVudW1TZXQubm9uZU9mKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLmNsYXNzKTsKIAkJRW51bVNldDxPYmplY3RDaGVja2VyLkVycm9yVHlwZT4gc2V0ID0gRW51bVNldAogCQkJCS5ub25lT2YoT2JqZWN0Q2hlY2tlci5FcnJvclR5cGUuY2xhc3MpOwogCQlmb3IgKFN0cmluZyBrZXkgOiByYy5nZXROYW1lcyhGU0NLKSkgewotCQkJaWYgKGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2tpcExpc3QiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAiYWxsb3dMZWFkaW5nWmVyb0ZpbGVNb2RlIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgImFsbG93SW52YWxpZFBlcnNvbklkZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNhZmVGb3JXaW5kb3dzIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNhZmVGb3JNYWNPUyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNraXBMaXN0IikKKwkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJhbGxvd0xlYWRpbmdaZXJvRmlsZU1vZGUiKQorCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgImFsbG93SW52YWxpZFBlcnNvbklkZW50IikKKwkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJzYWZlRm9yV2luZG93cyIpCisJCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2FmZUZvck1hY09TIikpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMTQ1LDE1ICsxNzYsMTggQEAKIAkJCX0KIAkJfQogCQlpZiAoIXNldC5jb250YWlucyhPYmplY3RDaGVja2VyLkVycm9yVHlwZS5aRVJPX1BBRERFRF9GSUxFTU9ERSkKLQkJCQkmJiByYy5nZXRCb29sZWFuKEZTQ0ssICJhbGxvd0xlYWRpbmdaZXJvRmlsZU1vZGUiLCBmYWxzZSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCSYmIHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93TGVhZGluZ1plcm9GaWxlTW9kZSIsIGZhbHNlKSkgewogCQkJaWdub3JlLmFkZChPYmplY3RDaGVja2VyLkVycm9yVHlwZS5aRVJPX1BBRERFRF9GSUxFTU9ERSk7CiAJCX0KIAogCQlhbGxvd1RpcFNoYTFJbldhbnQgPSByYy5nZXRCb29sZWFuKAotCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93dGlwc2hhMWlud2FudCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJInVwbG9hZHBhY2siLCAiYWxsb3d0aXBzaGExaW53YW50IiwgZmFsc2UpOwogCQlhbGxvd1JlYWNoYWJsZVNoYTFJbldhbnQgPSByYy5nZXRCb29sZWFuKAotCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93cmVhY2hhYmxlc2hhMWlud2FudCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWhpZGVSZWZzID0gcmMuZ2V0U3RyaW5nTGlzdCgidXBsb2FkcGFjayIsIG51bGwsICJoaWRlcmVmcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkidXBsb2FkcGFjayIsICJhbGxvd3JlYWNoYWJsZXNoYTFpbndhbnQiLCBmYWxzZSk7CisJCWFsbG93RmlsdGVyID0gcmMuZ2V0Qm9vbGVhbigKKwkJCQkidXBsb2FkcGFjayIsICJhbGxvd2ZpbHRlciIsIGZhbHNlKTsKKwkJcHJvdG9jb2xWZXJzaW9uID0gUHJvdG9jb2xWZXJzaW9uLnBhcnNlKHJjLmdldFN0cmluZygicHJvdG9jb2wiLCBudWxsLCAidmVyc2lvbiIpKTsKKwkJaGlkZVJlZnMgPSByYy5nZXRTdHJpbmdMaXN0KCJ1cGxvYWRwYWNrIiwgbnVsbCwgImhpZGVyZWZzIik7CiAJfQogCiAJLyoqCkBAIC0yMjAsNiArMjU0LDE0IEBACiAJfQogCiAJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGNsaWVudHMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSBhICJmaWx0ZXIiIGxpbmUKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbGxvd0ZpbHRlcigpIHsKKwkJcmV0dXJuIGFsbG93RmlsdGVyOworCX0KKworCS8qKgogCSAqIEdldCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmRmlsdGVyfSByZXNwZWN0aW5nIGNvbmZpZ3VyZWQKIAkgKiBoaWRkZW4gcmVmcy4KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQppbmRleCA4ZGI3OTZhLi5kMzQyZWY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQpAQCAtNDYsMTEgKzQ2LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKQEAgLTY0LDcgKzYzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xNDQsMTcgKzE0Myw4IEBACiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzY2FuKENsYXNzTG9hZGVyIGxkciwgVVJMIHVybCkgewotCQlCdWZmZXJlZFJlYWRlciBicjsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIHVybEluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmxJbiwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgY2Fubm90IHJlYWQgZnJvbSB0aGUgc2VydmljZSBsaXN0LCBnbyB0byB0aGUgbmV4dC4KLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgeworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKQEAgLTE2NywxNSArMTU3LDggQEAKIAkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbW1lbnQpLnRyaW0oKTsKIAkJCQlsb2FkKGxkciwgbGluZSk7CiAJCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgZmFpbGVkIGR1cmluZyBhIHJlYWQsIGlnbm9yZSB0aGUgZXJyb3IuCi0JCQkvLwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlici5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSB0aGUgY2xvc2UgZXJyb3I7IHdlIGFyZSBvbmx5IHJlYWRpbmcuCi0JCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZSBlcnJvcnMKIAkJfQogCX0KIApAQCAtMjg4LDcgKzI3MSw3IEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdHJhbnNwb3J0IGNhbm5vdCBvcGVuIHRoaXMgVVJJLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgU3RyaW5nIHJlbW90ZSkKKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKFJlcG9zaXRvcnkgbG9jYWwsIFN0cmluZyByZW1vdGUpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24sCiAJCQlUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhbCwgcmVtb3RlLCBPcGVyYXRpb24uRkVUQ0gpOwpAQCAtNDEwLDcgKzM5Myw3IEBACiAJICogICAgICAgICAgICAgaWYgcHJvdmlkZWQgcmVtb3RlIGNvbmZpZ3VyYXRpb24gZG9lc24ndCBoYXZlIGFueSBVUkkKIAkgKiAgICAgICAgICAgICBhc3NvY2lhdGVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgUmVtb3RlQ29uZmlnIGNmZykKKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKFJlcG9zaXRvcnkgbG9jYWwsIFJlbW90ZUNvbmZpZyBjZmcpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhbCwgY2ZnLCBPcGVyYXRpb24uRkVUQ0gpOwogCX0KQEAgLTQ5NSw3ICs0NzgsNyBAQAogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgTGlzdDxVUklpc2g+IHVyaXMgPSBnZXRVUklzKGNmZywgb3ApOwogCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0cyA9IG5ldyBBcnJheUxpc3Q8Pih1cmlzLnNpemUoKSk7Ci0JCWZvciAoZmluYWwgVVJJaXNoIHVyaSA6IHVyaXMpIHsKKwkJZm9yIChVUklpc2ggdXJpIDogdXJpcykgewogCQkJZmluYWwgVHJhbnNwb3J0IHRuID0gb3Blbihsb2NhbCwgdXJpLCBjZmcuZ2V0TmFtZSgpKTsKIAkJCXRuLmFwcGx5Q29uZmlnKGNmZyk7CiAJCQl0cmFuc3BvcnRzLmFkZCh0bik7CkBAIC01MTksNyArNTAyLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9lc05vdEV4aXN0KGZpbmFsIFJlbW90ZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvZXNOb3RFeGlzdChSZW1vdGVDb25maWcgY2ZnKSB7CiAJCXJldHVybiBjZmcuZ2V0VVJJcygpLmlzRW1wdHkoKSAmJiBjZmcuZ2V0UHVzaFVSSXMoKS5pc0VtcHR5KCk7CiAJfQogCkBAIC01MzYsNyArNTE5LDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQgY2Fubm90IG9wZW4gdGhpcyBVUkkuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKQorCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKGxvY2FsLCB1cmksIG51bGwpOwogCX0KQEAgLTYzOCw3ICs2MjEsNyBAQAogCQlmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8PigpOwogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHByb2NSZWZzID0gZXhwYW5kUHVzaFdpbGRjYXJkc0ZvcihkYiwgc3BlY3MpOwogCi0JCWZvciAoZmluYWwgUmVmU3BlYyBzcGVjIDogcHJvY1JlZnMpIHsKKwkJZm9yIChSZWZTcGVjIHNwZWMgOiBwcm9jUmVmcykgewogCQkJU3RyaW5nIHNyY1NwZWMgPSBzcGVjLmdldFNvdXJjZSgpOwogCQkJZmluYWwgUmVmIHNyY1JlZiA9IGRiLmZpbmRSZWYoc3JjU3BlYyk7CiAJCQlpZiAoc3JjUmVmICE9IG51bGwpCkBAIC03MDUsMTIgKzY4OCwxMiBAQAogCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248UmVmU3BlYz4gZXhwYW5kUHVzaFdpbGRjYXJkc0ZvcigKIAkJCWZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gc3BlY3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IGxvY2FsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHByb2NSZWZzID0gbmV3IEhhc2hTZXQ8PigpOworCQlmaW5hbCBMaXN0PFJlZj4gbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CisJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CiAKLQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiBzcGVjcykgeworCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHNwZWNzKSB7CiAJCQlpZiAoc3BlYy5pc1dpbGRjYXJkKCkpIHsKLQkJCQlmb3IgKGZpbmFsIFJlZiBsb2NhbFJlZiA6IGxvY2FsUmVmcy52YWx1ZXMoKSkgeworCQkJCWZvciAoUmVmIGxvY2FsUmVmIDogbG9jYWxSZWZzKSB7CiAJCQkJCWlmIChzcGVjLm1hdGNoU291cmNlKGxvY2FsUmVmKSkKIAkJCQkJCXByb2NSZWZzLmFkZChzcGVjLmV4cGFuZEZyb21Tb3VyY2UobG9jYWxSZWYpKTsKIAkJCQl9CkBAIC03MjQsNyArNzA3LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFRyYWNraW5nUmVmTmFtZShmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKIAkJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gZmV0Y2hTcGVjcykgewogCQkvLyB0cnkgdG8gZmluZCBtYXRjaGluZyB0cmFja2luZyByZWZzCi0JCWZvciAoZmluYWwgUmVmU3BlYyBmZXRjaFNwZWMgOiBmZXRjaFNwZWNzKSB7CisJCWZvciAoUmVmU3BlYyBmZXRjaFNwZWMgOiBmZXRjaFNwZWNzKSB7CiAJCQlpZiAoZmV0Y2hTcGVjLm1hdGNoU291cmNlKHJlbW90ZU5hbWUpKSB7CiAJCQkJaWYgKGZldGNoU3BlYy5pc1dpbGRjYXJkKCkpCiAJCQkJCXJldHVybiBmZXRjaFNwZWMuZXhwYW5kRnJvbVNvdXJjZShyZW1vdGVOYW1lKQpAQCAtODA3LDYgKzc5MCw4IEBACiAJLyoqIFNob3VsZCByZWZzIG5vIGxvbmdlciBvbiB0aGUgc291cmNlIGJlIHBydW5lZCBmcm9tIHRoZSBkZXN0aW5hdGlvbj8gKi8KIAlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRGVsZXRlZFJlZnM7CiAKKwlwcml2YXRlIGxvbmcgZmlsdGVyQmxvYkxpbWl0ID0gLTE7CisKIAkvKiogVGltZW91dCBpbiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUuICovCiAJcHJpdmF0ZSBpbnQgdGltZW91dDsKIApAQCAtODMzLDcgKzgxOCw3IEBACiAJICogICAgICAgICAgICB0aGUgVVJJIHVzZWQgdG8gYWNjZXNzIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gVGhpcyBtdXN0IGJlIHRoZQogCSAqICAgICAgICAgICAgVVJJIHBhc3NlZCB0byB7QGxpbmsgI29wZW4oUmVwb3NpdG9yeSwgVVJJaXNoKX0uCiAJICovCi0JcHJvdGVjdGVkIFRyYW5zcG9ydChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CisJcHJvdGVjdGVkIFRyYW5zcG9ydChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKSB7CiAJCWZpbmFsIFRyYW5zZmVyQ29uZmlnIHRjID0gbG9jYWwuZ2V0Q29uZmlnKCkuZ2V0KFRyYW5zZmVyQ29uZmlnLktFWSk7CiAJCXRoaXMubG9jYWwgPSBsb2NhbDsKIAkJdGhpcy51cmkgPSB1cmk7CkBAIC04NDgsNyArODMzLDcgQEAKIAkgKiBAcGFyYW0gdXJpCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2h9IG9iamVjdC4KIAkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNwb3J0KGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlwcm90ZWN0ZWQgVHJhbnNwb3J0KFVSSWlzaCB1cmkpIHsKIAkJdGhpcy51cmkgPSB1cmk7CiAJCXRoaXMubG9jYWwgPSBudWxsOwogCQl0aGlzLm9iamVjdENoZWNrZXIgPSBuZXcgT2JqZWN0Q2hlY2tlcigpOwpAQCAtODgxLDcgKzg2Niw3IEBACiAJICogQHBhcmFtIHdoZXJlCiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGlvblVwbG9hZFBhY2soZmluYWwgU3RyaW5nIHdoZXJlKSB7CisJcHVibGljIHZvaWQgc2V0T3B0aW9uVXBsb2FkUGFjayhTdHJpbmcgd2hlcmUpIHsKIAkJaWYgKHdoZXJlICE9IG51bGwgJiYgd2hlcmUubGVuZ3RoKCkgPiAwKQogCQkJb3B0aW9uVXBsb2FkUGFjayA9IHdoZXJlOwogCQllbHNlCkBAIC05MDMsNyArODg4LDcgQEAKIAkgKiBAcGFyYW0gb3B0aW9uCiAJICogICAgICAgICAgICBtZXRob2QgdG8gdXNlIHdoZW4gaGFuZGxpbmcgYW5ub3RhdGVkIHRhZ3MuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGFnT3B0KGZpbmFsIFRhZ09wdCBvcHRpb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRUYWdPcHQoVGFnT3B0IG9wdGlvbikgewogCQl0YWdvcHQgPSBvcHRpb24gIT0gbnVsbCA/IG9wdGlvbiA6IFRhZ09wdC5BVVRPX0ZPTExPVzsKIAl9CiAKQEAgLTkyNyw3ICs5MTIsNyBAQAogCSAqICAgICAgICAgICAgd2hlbiBpdCBzaG91bGRuJ3QKIAkgKiBAc2VlIFBhY2tUcmFuc3BvcnQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaFRoaW4oZmluYWwgYm9vbGVhbiBmZXRjaFRoaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaFRoaW4oYm9vbGVhbiBmZXRjaFRoaW4pIHsKIAkJdGhpcy5mZXRjaFRoaW4gPSBmZXRjaFRoaW47CiAJfQogCkBAIC05NTAsNyArOTM1LDcgQEAKIAkgKiAgICAgICAgICAgIHJlY2VpdmVkIG9iamVjdHMgYXJlIHZhbGlkLgogCSAqIEBzZWUgI3NldE9iamVjdENoZWNrZXIoT2JqZWN0Q2hlY2tlcikKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0ZldGNoZWRPYmplY3RzKGZpbmFsIGJvb2xlYW4gY2hlY2spIHsKKwlwdWJsaWMgdm9pZCBzZXRDaGVja0ZldGNoZWRPYmplY3RzKGJvb2xlYW4gY2hlY2spIHsKIAkJaWYgKGNoZWNrICYmIG9iamVjdENoZWNrZXIgPT0gbnVsbCkKIAkJCXNldE9iamVjdENoZWNrZXIobmV3IE9iamVjdENoZWNrZXIoKSk7CiAJCWVsc2UgaWYgKCFjaGVjayAmJiBvYmplY3RDaGVja2VyICE9IG51bGwpCkBAIC0xMDI1LDcgKzEwMTAsNyBAQAogCSAqICAgICAgICAgICAgZmFsc2Ugd2hlbiBpdCBzaG91bGRuJ3QKIAkgKiBAc2VlIFBhY2tUcmFuc3BvcnQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXNoVGhpbihmaW5hbCBib29sZWFuIHB1c2hUaGluKSB7CisJcHVibGljIHZvaWQgc2V0UHVzaFRoaW4oYm9vbGVhbiBwdXNoVGhpbikgewogCQl0aGlzLnB1c2hUaGluID0gcHVzaFRoaW47CiAJfQogCkBAIC0xMDUwLDcgKzEwMzUsNyBAQAogCSAqIEBzZWUgUGFja1RyYW5zcG9ydAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXNoQXRvbWljKGZpbmFsIGJvb2xlYW4gYXRvbWljKSB7CisJcHVibGljIHZvaWQgc2V0UHVzaEF0b21pYyhib29sZWFuIGF0b21pYykgewogCQl0aGlzLnB1c2hBdG9taWMgPSBhdG9taWM7CiAJfQogCkBAIC0xMDc3LDE3ICsxMDYyLDM0IEBACiAJICoKIAkgKiBAcGFyYW0gcmVtb3ZlIHRydWUgdG8gcmVtb3ZlIHJlZnMgdGhhdCBubyBsb25nZXIgZXhpc3QuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlRGVsZXRlZFJlZnMoZmluYWwgYm9vbGVhbiByZW1vdmUpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZW1vdmVEZWxldGVkUmVmcyhib29sZWFuIHJlbW92ZSkgewogCQlyZW1vdmVEZWxldGVkUmVmcyA9IHJlbW92ZTsKIAl9CiAKIAkvKioKKwkgKiBAcmV0dXJuIHRoZSBsYXN0IHZhbHVlIHBhc3NlZCB0byB7QGxpbmsgI3NldEZpbHRlckJsb2JMaW1pdH0sIG9yIC0xIGlmCisJICogICAgICAgICBpdCB3YXMgbmV2ZXIgaW52b2tlZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGxvbmcgZ2V0RmlsdGVyQmxvYkxpbWl0KCkgeworCQlyZXR1cm4gZmlsdGVyQmxvYkxpbWl0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBieXRlcyBleGNsdWRlIGJsb2JzIG9mIHNpemUgZ3JlYXRlciB0aGFuIHRoaXMKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsdGVyQmxvYkxpbWl0KGxvbmcgYnl0ZXMpIHsKKwkJZmlsdGVyQmxvYkxpbWl0ID0gYnl0ZXM7CisJfQorCisJLyoqCiAJICogQXBwbHkgcHJvdmlkZWQgcmVtb3RlIGNvbmZpZ3VyYXRpb24gb24gdGhpcyB0cmFuc3BvcnQuCiAJICoKIAkgKiBAcGFyYW0gY2ZnCiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIHRvIGFwcGx5IG9uIHRoaXMgdHJhbnNwb3J0LgogCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5Q29uZmlnKGZpbmFsIFJlbW90ZUNvbmZpZyBjZmcpIHsKKwlwdWJsaWMgdm9pZCBhcHBseUNvbmZpZyhSZW1vdGVDb25maWcgY2ZnKSB7CiAJCXNldE9wdGlvblVwbG9hZFBhY2soY2ZnLmdldFVwbG9hZFBhY2soKSk7CiAJCXNldE9wdGlvblJlY2VpdmVQYWNrKGNmZy5nZXRSZWNlaXZlUGFjaygpKTsKIAkJc2V0VGFnT3B0KGNmZy5nZXRUYWdPcHQoKSk7CkBAIC0xMTE2LDcgKzExMTgsNyBAQAogCSAqICAgICAgICAgICAgYW5kIG5vdCByZWFsbHkgdXBkYXRlIHJlbW90ZSByZWZzLCBmYWxzZSBvdGhlcndpc2UgLSB3aGVuIHB1c2gKIAkgKiAgICAgICAgICAgIHNob3VsZCBhY3Qgbm9ybWFsbHkuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RHJ5UnVuKGZpbmFsIGJvb2xlYW4gZHJ5UnVuKSB7CisJcHVibGljIHZvaWQgc2V0RHJ5UnVuKGJvb2xlYW4gZHJ5UnVuKSB7CiAJCXRoaXMuZHJ5UnVuID0gZHJ5UnVuOwogCX0KIApAQCAtMTEzNyw3ICsxMTM5LDcgQEAKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoaXMKIAkgKiAgICAgICAgICAgIHJlbW90ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiAKQEAgLTEyMDQsNyArMTIwNiw3IEBACiAJICogICAgICAgICAgICBudWxsIGlmIHB1c2ggb3B0aW9ucyBhcmUgdW5zdXBwb3J0ZWQKIAkgKiBAc2luY2UgNC41CiAJICovCi0JcHVibGljIHZvaWQgc2V0UHVzaE9wdGlvbnMoZmluYWwgTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zKSB7CisJcHVibGljIHZvaWQgc2V0UHVzaE9wdGlvbnMoTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zKSB7CiAJCXRoaXMucHVzaE9wdGlvbnMgPSBwdXNoT3B0aW9uczsKIAl9CiAKQEAgLTEyNTEsOSArMTI1Myw5IEBACiAJCQkvLyBvYmplY3QgdHJhbnNmZXIgb3ZlcmhlYWRzLgogCQkJLy8KIAkJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gdG1wID0gbmV3IEFycmF5TGlzdDw+KHRvRmV0Y2gpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHJlcXVlc3RlZCA6IHRvRmV0Y2gpIHsKKwkJCWZvciAoUmVmU3BlYyByZXF1ZXN0ZWQgOiB0b0ZldGNoKSB7CiAJCQkJZmluYWwgU3RyaW5nIHJlcVNyYyA9IHJlcXVlc3RlZC5nZXRTb3VyY2UoKTsKLQkJCQlmb3IgKGZpbmFsIFJlZlNwZWMgY29uZmlndXJlZCA6IGZldGNoKSB7CisJCQkJZm9yIChSZWZTcGVjIGNvbmZpZ3VyZWQgOiBmZXRjaCkgewogCQkJCQlmaW5hbCBTdHJpbmcgY2ZnU3JjID0gY29uZmlndXJlZC5nZXRTb3VyY2UoKTsKIAkJCQkJZmluYWwgU3RyaW5nIGNmZ0RzdCA9IGNvbmZpZ3VyZWQuZ2V0RGVzdGluYXRpb24oKTsKIAkJCQkJaWYgKGNmZ1NyYy5lcXVhbHMocmVxU3JjKSAmJiBjZmdEc3QgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKaW5kZXggYzYxOTFlY2ViLi42MTE4Y2I4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRBbWF6b25TMy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikKKwkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbmV3IERhdGFiYXNlUzMoYnVja2V0TmFtZSwgcmVzb2x2ZUtleShsb2NhdGlvbikpOwogCQl9CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJCWhhdmUuYWRkQWxsKHMzLmxpc3QoYnVja2V0LCByZXNvbHZlS2V5KCJwYWNrIikpKTsgLy8kTk9OLU5MUy0xJAogCiAJCQlmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcGFja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJCWZvciAoZmluYWwgU3RyaW5nIG4gOiBoYXZlKSB7CisJCQlmb3IgKFN0cmluZyBuIDogaGF2ZSkgewogCQkJCWlmICghbi5zdGFydHNXaXRoKCJwYWNrLSIpIHx8ICFuLmVuZHNXaXRoKCIucGFjayIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJY29udGludWU7CiAKQEAgLTI5MCw3ICsyOTAsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCUZpbGVTdHJlYW0gb3BlbihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRmlsZVN0cmVhbSBvcGVuKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgVVJMQ29ubmVjdGlvbiBjID0gczMuZ2V0KGJ1Y2tldCwgcmVzb2x2ZUtleShwYXRoKSk7CiAJCQlmaW5hbCBJbnB1dFN0cmVhbSByYXcgPSBjLmdldElucHV0U3RyZWFtKCk7CiAJCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IHMzLmRlY3J5cHQoYyk7CkBAIC0yOTksNyArMjk5LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGRlbGV0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgZGVsZXRlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXMzLmRlbGV0ZShidWNrZXQsIHJlc29sdmVLZXkocGF0aCkpOwogCQl9CiAKQEAgLTMxMSw3ICszMTEsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHBhdGgsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJczMucHV0KGJ1Y2tldCwgcmVzb2x2ZUtleShwYXRoKSwgZGF0YSk7CiAJCX0KIApAQCAtMzIzLDcgKzMyMyw3IEBACiAJCQlyZXR1cm4gYXZhaWw7CiAJCX0KIAotCQlwcml2YXRlIHZvaWQgcmVhZExvb3NlUmVmcyhmaW5hbCBUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKKwkJcHJpdmF0ZSB2b2lkIHJlYWRMb29zZVJlZnMoVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZvciAoZmluYWwgU3RyaW5nIG4gOiBzMy5saXN0KGJ1Y2tldCwgcmVzb2x2ZUtleShST09UX0RJUgpAQCAtMzM0LDE2ICszMzQsMTMgQEAKIAkJCX0KIAkJfQogCi0JCXByaXZhdGUgUmVmIHJlYWRSZWYoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsIGZpbmFsIFN0cmluZyBybikKKwkJcHJpdmF0ZSBSZWYgcmVhZFJlZihUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCwgU3RyaW5nIHJuKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJZmluYWwgU3RyaW5nIHM7CiAJCQlTdHJpbmcgcmVmID0gUk9PVF9ESVIgKyBybjsKIAkJCXRyeSB7Ci0JCQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIgPSBvcGVuUmVhZGVyKHJlZik7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gb3BlblJlYWRlcihyZWYpKSB7CiAJCQkJCXMgPSBici5yZWFkTGluZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWJyLmNsb3NlKCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vUmVmKSB7CiAJCQkJcmV0dXJuIG51bGw7CkBAIC0zNzcsNyArMzc0LDcgQEAKIAkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZ2V0VVJJKCksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnRyYW5zcG9ydEV4Y2VwdGlvbkJhZFJlZiwgcm4sIHMpKTsKIAkJfQogCi0JCXByaXZhdGUgU3RvcmFnZSBsb29zZShmaW5hbCBSZWYgcikgeworCQlwcml2YXRlIFN0b3JhZ2UgbG9vc2UoUmVmIHIpIHsKIAkJCWlmIChyICE9IG51bGwgJiYgci5nZXRTdG9yYWdlKCkgPT0gU3RvcmFnZS5QQUNLRUQpCiAJCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0VfUEFDS0VEOwogCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEKaW5kZXggODE2MTg3ZS4uMTEzMjUwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0QW5vbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YQpAQCAtMTEzLDExICsxMTMsMTEgQEAKIAkJfQogCX07CiAKLQlUcmFuc3BvcnRHaXRBbm9uKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRHaXRBbm9uKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJfQogCi0JVHJhbnNwb3J0R2l0QW5vbihmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0QW5vbihVUklpc2ggdXJpKSB7CiAJCXN1cGVyKHVyaSk7CiAJfQogCkBAIC0xNDIsNiArMTQyLDcgQEAKIAlTb2NrZXQgb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IHRtcyA9IGdldFRpbWVvdXQoKSA+IDAgPyBnZXRUaW1lb3V0KCkgKiAxMDAwIDogMDsKIAkJZmluYWwgaW50IHBvcnQgPSB1cmkuZ2V0UG9ydCgpID4gMCA/IHVyaS5nZXRQb3J0KCkgOiBHSVRfUE9SVDsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQ2xvc2VkIGJ5IHRoZSBjYWxsZXIKIAkJZmluYWwgU29ja2V0IHMgPSBuZXcgU29ja2V0KCk7CiAJCXRyeSB7CiAJCQlmaW5hbCBJbmV0QWRkcmVzcyBob3N0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHVyaS5nZXRIb3N0KCkpOwpAQCAtMTYyLDcgKzE2Myw3IEBACiAJCXJldHVybiBzOwogCX0KIAotCXZvaWQgc2VydmljZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUGFja2V0TGluZU91dCBwY2tPdXQpCisJdm9pZCBzZXJ2aWNlKFN0cmluZyBuYW1lLCBQYWNrZXRMaW5lT3V0IHBja091dCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgY21kID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJY21kLmFwcGVuZChuYW1lKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0U3NoLmphdmEKaW5kZXggYmM4NWU2Zi4uZDU5ZmUzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0U3NoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0U3NoLmphdmEKQEAgLTE0MSwxMiArMTQxLDEyIEBACiAJCX0KIAl9OwogCi0JVHJhbnNwb3J0R2l0U3NoKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRHaXRTc2goUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkgewogCQlzdXBlcihsb2NhbCwgdXJpKTsKIAkJaW5pdFNzaFNlc3Npb25GYWN0b3J5KCk7CiAJfQogCi0JVHJhbnNwb3J0R2l0U3NoKGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRHaXRTc2goVVJJaXNoIHVyaSkgewogCQlzdXBlcih1cmkpOwogCQlpbml0U3NoU2Vzc2lvbkZhY3RvcnkoKTsKIAl9CkBAIC0xNzYsNyArMTc2LDcgQEAKIAkJcmV0dXJuIG5ldyBTc2hQdXNoQ29ubmVjdGlvbigpOwogCX0KIAotCVN0cmluZyBjb21tYW5kRm9yKGZpbmFsIFN0cmluZyBleGUpIHsKKwlTdHJpbmcgY29tbWFuZEZvcihTdHJpbmcgZXhlKSB7CiAJCVN0cmluZyBwYXRoID0gdXJpLmdldFBhdGgoKTsKIAkJaWYgKHVyaS5nZXRTY2hlbWUoKSAhPSBudWxsICYmIHVyaS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiL34iKSkgLy8kTk9OLU5MUy0xJAogCQkJcGF0aCA9ICh1cmkuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7CkBAIC0zMTEsNiArMzExLDkgQEAKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCQllbmRPdXQoKTsKIAorCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgeworCQkJCXByb2Nlc3MuZGVzdHJveSgpOworCQkJfQogCQkJaWYgKGVycm9yVGhyZWFkICE9IG51bGwpIHsKIAkJCQl0cnkgewogCQkJCQllcnJvclRocmVhZC5oYWx0KCk7CkBAIC0zMjIsOCArMzI1LDYgQEAKIAkJCX0KIAogCQkJc3VwZXIuY2xvc2UoKTsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpCi0JCQkJcHJvY2Vzcy5kZXN0cm95KCk7CiAJCX0KIAl9CiAKQEAgLTM3Nyw2ICszNzgsOSBAQAogCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCWVuZE91dCgpOwogCisJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7CisJCQkJcHJvY2Vzcy5kZXN0cm95KCk7CisJCQl9CiAJCQlpZiAoZXJyb3JUaHJlYWQgIT0gbnVsbCkgewogCQkJCXRyeSB7CiAJCQkJCWVycm9yVGhyZWFkLmhhbHQoKTsKQEAgLTM4OCw4ICszOTIsNiBAQAogCQkJfQogCiAJCQlzdXBlci5jbG9zZSgpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YQppbmRleCBhMTgyNjIzLi5jMDhmNDAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhCkBAIC0yNzMsNyArMjczLDcgQEAKIAogCXByaXZhdGUgYm9vbGVhbiBzc2xGYWlsdXJlID0gZmFsc2U7CiAKLQlUcmFuc3BvcnRIdHRwKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpCisJVHJhbnNwb3J0SHR0cChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGxvY2FsLCB1cmkpOwogCQlzZXRVUkkodXJpKTsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuOQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVSSShmaW5hbCBVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVUkkoVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQljdXJyZW50VXJpID0gdXJpOwogCQkJYmFzZVVybCA9IHRvVVJMKHVyaSk7CkBAIC0zMTQsNyArMzE0LDcgQEAKIAkgKiBAcGFyYW0gdXJpCiAJICogQHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24KIAkgKi8KLQlUcmFuc3BvcnRIdHRwKGZpbmFsIFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCVRyYW5zcG9ydEh0dHAoVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCXN1cGVyKHVyaSk7CiAJCXNldFVSSSh1cmkpOwogCQlodHRwID0gbmV3IEh0dHBDb25maWcodXJpKTsKQEAgLTMzMiwxMCArMzMyLDI2IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gKGRlZmF1bHQpLCBzbWFydCBIVFRQIGlzIGVuYWJsZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VXNlU21hcnRIdHRwKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRVc2VTbWFydEh0dHAoYm9vbGVhbiBvbikgewogCQl1c2VTbWFydEh0dHAgPSBvbjsKIAl9CiAKKwlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgYnkgY2FsbGVyCisJcHJpdmF0ZSBGZXRjaENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihIdHRwQ29ubmVjdGlvbiBjLCBJbnB1dFN0cmVhbSBpbiwKKwkJCVN0cmluZyBzZXJ2aWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlCYXNlQ29ubmVjdGlvbiBmOworCQlpZiAoaXNTbWFydEh0dHAoYywgc2VydmljZSkpIHsKKwkJCXJlYWRTbWFydEhlYWRlcnMoaW4sIHNlcnZpY2UpOworCQkJZiA9IG5ldyBTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oaW4pOworCQl9IGVsc2UgeworCQkJLy8gQXNzdW1lIHRoaXMgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBzbWFydCBIVFRQIGZldGNoCisJCQkvLyBhbmQgZmFsbCBiYWNrIG9uIGR1bWIgb2JqZWN0IHdhbGtpbmcuCisJCQlmID0gbmV3RHVtYkNvbm5lY3Rpb24oaW4pOworCQl9CisJCWYuc2V0UGVlclVzZXJBZ2VudChjLmdldEhlYWRlckZpZWxkKEh0dHBTdXBwb3J0LkhEUl9TRVJWRVIpKTsKKwkJcmV0dXJuIChGZXRjaENvbm5lY3Rpb24pIGY7CisJfQorCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgRmV0Y2hDb25uZWN0aW9uIG9wZW5GZXRjaCgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sCkBAIC0zNDMsMjEgKzM1OSw4IEBACiAJCWZpbmFsIFN0cmluZyBzZXJ2aWNlID0gU1ZDX1VQTE9BRF9QQUNLOwogCQl0cnkgewogCQkJZmluYWwgSHR0cENvbm5lY3Rpb24gYyA9IGNvbm5lY3Qoc2VydmljZSk7Ci0JCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IG9wZW5JbnB1dFN0cmVhbShjKTsKLQkJCXRyeSB7Ci0JCQkJQmFzZUNvbm5lY3Rpb24gZjsKLQkJCQlpZiAoaXNTbWFydEh0dHAoYywgc2VydmljZSkpIHsKLQkJCQkJcmVhZFNtYXJ0SGVhZGVycyhpbiwgc2VydmljZSk7Ci0JCQkJCWYgPSBuZXcgU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKGluKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBc3N1bWUgdGhpcyBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHNtYXJ0IEhUVFAgZmV0Y2gKLQkJCQkJLy8gYW5kIGZhbGwgYmFjayBvbiBkdW1iIG9iamVjdCB3YWxraW5nLgotCQkJCQlmID0gbmV3RHVtYkNvbm5lY3Rpb24oaW4pOwotCQkJCX0KLQkJCQlmLnNldFBlZXJVc2VyQWdlbnQoYy5nZXRIZWFkZXJGaWVsZChIdHRwU3VwcG9ydC5IRFJfU0VSVkVSKSk7Ci0JCQkJcmV0dXJuIChGZXRjaENvbm5lY3Rpb24pIGY7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gb3BlbklucHV0U3RyZWFtKGMpKSB7CisJCQkJcmV0dXJuIGdldENvbm5lY3Rpb24oYywgaW4sIHNlcnZpY2UpOwogCQkJfQogCQl9IGNhdGNoIChOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXJyKSB7CiAJCQl0aHJvdyBlcnI7CkBAIC00ODAsNyArNDgzLDcgQEAKIAkJdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKIAl9CiAKLQlwcml2YXRlIEh0dHBDb25uZWN0aW9uIGNvbm5lY3QoZmluYWwgU3RyaW5nIHNlcnZpY2UpCisJcHJpdmF0ZSBIdHRwQ29ubmVjdGlvbiBjb25uZWN0KFN0cmluZyBzZXJ2aWNlKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJVVJMIHUgPSBnZXRTZXJ2aWNlVVJMKHNlcnZpY2UpOwogCQlpbnQgYXV0aEF0dGVtcHRzID0gMTsKQEAgLTc3Miw3ICs3NzUsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIFVSTCBnZXRTZXJ2aWNlVVJMKGZpbmFsIFN0cmluZyBzZXJ2aWNlKQorCXByaXZhdGUgVVJMIGdldFNlcnZpY2VVUkwoU3RyaW5nIHNlcnZpY2UpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC03OTYsMjEgKzc5OSw2IEBACiAJfQogCiAJLyoqCi0JICogT3BlbiBhbiBIVFRQIGNvbm5lY3Rpb24sIHNldHRpbmcgdGhlIGFjY2VwdC1lbmNvZGluZyByZXF1ZXN0IGhlYWRlciB0byBnemlwLgotCSAqCi0JICogQHBhcmFtIG1ldGhvZCBIVFRQIHJlcXVlc3QgbWV0aG9kCi0JICogQHBhcmFtIHUgdXJsIG9mIHRoZSBIVFRQIGNvbm5lY3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBIVFRQIGNvbm5lY3Rpb24KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMy4zCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjaHR0cE9wZW4oU3RyaW5nLCBVUkwsIEFjY2VwdEVuY29kaW5nKX0gaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBIdHRwQ29ubmVjdGlvbiBodHRwT3BlbihTdHJpbmcgbWV0aG9kLCBVUkwgdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGh0dHBPcGVuKG1ldGhvZCwgdSwgQWNjZXB0RW5jb2RpbmcuR1pJUCk7Ci0JfQotCi0JLyoqCiAJICogT3BlbiBhbiBIVFRQIGNvbm5lY3Rpb24uCiAJICoKIAkgKiBAcGFyYW0gbWV0aG9kIEhUVFAgcmVxdWVzdCBtZXRob2QKQEAgLTg3MywxOCArODYxLDE4IEBACiAJCXJldHVybiBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHVyaSwgd2h5KTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEh0dHAoZmluYWwgSHR0cENvbm5lY3Rpb24gYywgZmluYWwgU3RyaW5nIHNlcnZpY2UpIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEh0dHAoSHR0cENvbm5lY3Rpb24gYywgU3RyaW5nIHNlcnZpY2UpIHsKIAkJZmluYWwgU3RyaW5nIGV4cFR5cGUgPSAiYXBwbGljYXRpb24veC0iICsgc2VydmljZSArICItYWR2ZXJ0aXNlbWVudCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlmaW5hbCBTdHJpbmcgYWN0VHlwZSA9IGMuZ2V0Q29udGVudFR5cGUoKTsKIAkJcmV0dXJuIGV4cFR5cGUuZXF1YWxzKGFjdFR5cGUpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0d6aXBDb250ZW50KGZpbmFsIEh0dHBDb25uZWN0aW9uIGMpIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNHemlwQ29udGVudChIdHRwQ29ubmVjdGlvbiBjKSB7CiAJCXJldHVybiBFTkNPRElOR19HWklQLmVxdWFscyhjLmdldEhlYWRlckZpZWxkKEhEUl9DT05URU5UX0VOQ09ESU5HKSkKIAkJCQl8fCBFTkNPRElOR19YX0daSVAuZXF1YWxzKGMuZ2V0SGVhZGVyRmllbGQoSERSX0NPTlRFTlRfRU5DT0RJTkcpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVhZFNtYXJ0SGVhZGVycyhmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgU3RyaW5nIHNlcnZpY2UpCisJcHJpdmF0ZSB2b2lkIHJlYWRTbWFydEhlYWRlcnMoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBzZXJ2aWNlKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gQSBzbWFydCByZXBseSB3aWxsIGhhdmUgYSAnIycgYWZ0ZXIgdGhlIGZpcnN0IDQgYnl0ZXMsIGJ1dAogCQkvLyBhIGR1bWIgcmVwbHkgY2Fubm90IGNvbnRhaW4gYSAnIycgdW50aWwgYWZ0ZXIgYnl0ZSA0MS4gRG8gYQpAQCAtOTE1LDcgKzkwMyw3IEBACiAJY2xhc3MgSHR0cE9iamVjdERCIGV4dGVuZHMgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHsKIAkJcHJpdmF0ZSBmaW5hbCBVUkwgaHR0cE9iamVjdHNVcmw7CiAKLQkJSHR0cE9iamVjdERCKGZpbmFsIFVSTCBiKSB7CisJCUh0dHBPYmplY3REQihVUkwgYikgewogCQkJaHR0cE9iamVjdHNVcmwgPSBiOwogCQl9CiAKQEAgLTk0Miw3ICs5MzAsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikKKwkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbmV3IEh0dHBPYmplY3REQihuZXcgVVJMKGh0dHBPYmplY3RzVXJsLCBsb2NhdGlvbikpOwogCQl9CkBAIC05NzQsNyArOTYyLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlGaWxlU3RyZWFtIG9wZW4oZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVTdHJlYW0gb3BlbihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBvcGVuKHBhdGgsIEFjY2VwdEVuY29kaW5nLlVOU1BFQ0lGSUVEKTsKIAkJfQogCkBAIC0xMDQyLDE1ICsxMDMwLDE1IEBACiAJCQlyZXR1cm4gYXZhaWw7CiAJCX0KIAotCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBvdXRPZk9yZGVyQWR2ZXJ0aXNlbWVudChmaW5hbCBTdHJpbmcgbikgeworCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBvdXRPZk9yZGVyQWR2ZXJ0aXNlbWVudChTdHJpbmcgbikgewogCQkJcmV0dXJuIG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYWR2ZXJ0aXNlbWVudE9mQ2FtZUJlZm9yZSwgbiwgbikpOwogCQl9CiAKLQkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gaW52YWxpZEFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG4pIHsKKwkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gaW52YWxpZEFkdmVydGlzZW1lbnQoU3RyaW5nIG4pIHsKIAkJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRBZHZlcnRpc2VtZW50T2YsIG4pKTsKIAkJfQogCi0JCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG4pIHsKKwkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbikgewogCQkJcmV0dXJuIG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlQWR2ZXJ0aXNlbWVudHNPZiwgbikpOwogCQl9CiAKQEAgLTEwNjMsNyArMTA1MSw3IEBACiAJY2xhc3MgU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24gewogCQlwcml2YXRlIE11bHRpUmVxdWVzdFNlcnZpY2Ugc3ZjOwogCi0JCVNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbihmaW5hbCBJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQorCQlTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oSW5wdXRTdHJlYW0gYWR2ZXJ0aXNlbWVudCkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXN1cGVyKFRyYW5zcG9ydEh0dHAudGhpcyk7CiAJCQlzdGF0ZWxlc3NSUEMgPSB0cnVlOwpAQCAtMTA5Myw3ICsxMDgxLDcgQEAKIAl9CiAKIAljbGFzcyBTbWFydEh0dHBQdXNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24gewotCQlTbWFydEh0dHBQdXNoQ29ubmVjdGlvbihmaW5hbCBJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQorCQlTbWFydEh0dHBQdXNoQ29ubmVjdGlvbihJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJc3VwZXIoVHJhbnNwb3J0SHR0cC50aGlzKTsKIAkJCXN0YXRlbGVzc1JQQyA9IHRydWU7CkBAIC0xMzk2LDcgKzEzODQsNyBAQAogCWNsYXNzIE11bHRpUmVxdWVzdFNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKIAkJYm9vbGVhbiBmaW5hbFJlcXVlc3Q7CiAKLQkJTXVsdGlSZXF1ZXN0U2VydmljZShmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUpIHsKKwkJTXVsdGlSZXF1ZXN0U2VydmljZShTdHJpbmcgc2VydmljZU5hbWUpIHsKIAkJCXN1cGVyKHNlcnZpY2VOYW1lKTsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YQppbmRleCA0ZjE4ODBiLi5mYmIyYzQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydExvY2FsLmphdmEKQEAgLTE2MiwxMSArMTYyLDExIEBACiAJCXJlbW90ZUdpdERpciA9IGdpdERpcjsKIAl9CiAKLQlVcGxvYWRQYWNrIGNyZWF0ZVVwbG9hZFBhY2soZmluYWwgUmVwb3NpdG9yeSBkc3QpIHsKKwlVcGxvYWRQYWNrIGNyZWF0ZVVwbG9hZFBhY2soUmVwb3NpdG9yeSBkc3QpIHsKIAkJcmV0dXJuIG5ldyBVcGxvYWRQYWNrKGRzdCk7CiAJfQogCi0JUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkc3QpIHsKKwlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRzdCkgewogCQlyZXR1cm4gbmV3IFJlY2VpdmVQYWNrKGRzdCk7CiAJfQogCkBAIC0yMjksNyArMjI5LDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIGFueS4KIAkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBzcGF3bihmaW5hbCBTdHJpbmcgY21kKQorCXByb3RlY3RlZCBQcm9jZXNzIHNwYXduKFN0cmluZyBjbWQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCVN0cmluZ1tdIGFyZ3MgPSB7ICIuIiB9OyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEKaW5kZXggMzlmOTg5Ny4uZjEyOWJhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0U2Z0cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCX0KIAl9OwogCi0JVHJhbnNwb3J0U2Z0cChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0U2Z0cChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKSB7CiAJCXN1cGVyKGxvY2FsLCB1cmkpOwogCX0KIApAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCQl9CiAJCX0KIAotCQlTZnRwT2JqZWN0REIoZmluYWwgU2Z0cE9iamVjdERCIHBhcmVudCwgZmluYWwgU3RyaW5nIHApCisJCVNmdHBPYmplY3REQihTZnRwT2JqZWN0REIgcGFyZW50LCBTdHJpbmcgcCkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZnRwID0gbmV3U2Z0cCgpOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBuZXcgU2Z0cE9iamVjdERCKHRoaXMsIGxvY2F0aW9uKTsKIAkJfQpAQCAtMjQ2LDkgKzI0Niw5IEBACiAJCQkJZmlsZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCQkJbXRpbWVzID0gbmV3IEhhc2hNYXA8PigpOwogCi0JCQkJZm9yIChmaW5hbCBDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpCisJCQkJZm9yIChDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpCiAJCQkJCWZpbGVzLnB1dChlbnQuZ2V0RmlsZW5hbWUoKSwgZW50KTsKLQkJCQlmb3IgKGZpbmFsIENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkgeworCQkJCWZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CiAJCQkJCWZpbmFsIFN0cmluZyBuID0gZW50LmdldEZpbGVuYW1lKCk7CiAJCQkJCWlmICghbi5zdGFydHNXaXRoKCJwYWNrLSIpIHx8ICFuLmVuZHNXaXRoKCIucGFjayIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCWNvbnRpbnVlOwpAQCAtMjYzLDcgKzI2Myw3IEBACiAKIAkJCQlDb2xsZWN0aW9ucy5zb3J0KHBhY2tzLCBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIFN0cmluZyBvMSwgZmluYWwgU3RyaW5nIG8yKSB7CisJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbzEsIFN0cmluZyBvMikgewogCQkJCQkJcmV0dXJuIG10aW1lcy5nZXQobzIpLmludFZhbHVlKCkKIAkJCQkJCQkJLSBtdGltZXMuZ2V0KG8xKS5pbnRWYWx1ZSgpOwogCQkJCQl9CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlGaWxlU3RyZWFtIG9wZW4oZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVTdHJlYW0gb3BlbihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgU2Z0cEFUVFJTIGEgPSBmdHAubHN0YXQocGF0aCk7CiAJCQkJcmV0dXJuIG5ldyBGaWxlU3RyZWFtKGZ0cC5nZXQocGF0aCksIGEuZ2V0U2l6ZSgpKTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgZGVsZXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBkZWxldGVGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmdHAucm0ocGF0aCk7CiAJCQl9IGNhdGNoIChTZnRwRXhjZXB0aW9uIGplKSB7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgd3JpdGVGaWxlKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZyBsb2NrID0gcGF0aCArIExPQ0tfU1VGRklYOwogCQkJdHJ5IHsKIAkJCQlzdXBlci53cml0ZUZpbGUobG9jaywgZGF0YSk7CkBAIC00MTMsNyArNDEzLDcgQEAKIAkJCQkJCWplLmdldE1lc3NhZ2UoKSksIGplKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKKwkJCWZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CiAJCQkJZmluYWwgU3RyaW5nIG4gPSBlbnQuZ2V0RmlsZW5hbWUoKTsKIAkJCQlpZiAoIi4iLmVxdWFscyhuKSB8fCAiLi4iLmVxdWFscyhuKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWNvbnRpbnVlOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmJhZFJlZiwgbmFtZSwgbGluZSkpOwogCQl9CiAKLQkJcHJpdmF0ZSBTdG9yYWdlIGxvb3NlKGZpbmFsIFJlZiByKSB7CisJCXByaXZhdGUgU3RvcmFnZSBsb29zZShSZWYgcikgewogCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFN0b3JhZ2UoKSA9PSBTdG9yYWdlLlBBQ0tFRCkKIAkJCQlyZXR1cm4gU3RvcmFnZS5MT09TRV9QQUNLRUQ7CiAJCQlyZXR1cm4gU3RvcmFnZS5MT09TRTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEKaW5kZXggYTA0OGZlMy4uMDI2ZmQ4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEKQEAgLTM4Nyw3ICszODcsNyBAQAogCSAqIEBwYXJhbSB1CiAJICogICAgICAgICAgICB0aGUgc291cmNlIFVSTCB0byBjb252ZXJ0IGZyb20uCiAJICovCi0JcHVibGljIFVSSWlzaChmaW5hbCBVUkwgdSkgeworCXB1YmxpYyBVUklpc2goVVJMIHUpIHsKIAkJc2NoZW1lID0gdS5nZXRQcm90b2NvbCgpOwogCQlwYXRoID0gdS5nZXRQYXRoKCk7CiAJCXBhdGggPSBjbGVhbkxlYWRpbmdTbGFzaGVzKHBhdGgsIHNjaGVtZSk7CkBAIC00MTYsNyArNDE2LDcgQEAKIAkJLy8gQ29uZmlndXJlIG5vdGhpbmcuCiAJfQogCi0JcHJpdmF0ZSBVUklpc2goZmluYWwgVVJJaXNoIHUpIHsKKwlwcml2YXRlIFVSSWlzaChVUklpc2ggdSkgewogCQl0aGlzLnNjaGVtZSA9IHUuc2NoZW1lOwogCQl0aGlzLnJhd1BhdGggPSB1LnJhd1BhdGg7CiAJCXRoaXMucGF0aCA9IHUucGF0aDsKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgaG9zdC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0SG9zdChmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0SG9zdChTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIuaG9zdCA9IG47CiAJCXJldHVybiByOwpAQCAtNDczLDcgKzQ3Myw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBzY2hlbWUuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFNjaGVtZShmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0U2NoZW1lKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5zY2hlbWUgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTUwNCw3ICs1MDQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgcGF0aC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UGF0aChmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0UGF0aChTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucGF0aCA9IG47CiAJCXIucmF3UGF0aCA9IG47CkBAIC01MTksNyArNTE5LDcgQEAKIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRSYXdQYXRoKGZpbmFsIFN0cmluZyBuKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKwlwdWJsaWMgVVJJaXNoIHNldFJhd1BhdGgoU3RyaW5nIG4pIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucGF0aCA9IHVuZXNjYXBlKG4pOwogCQlyLnJhd1BhdGggPSBuOwpAQCAtNTQyLDcgKzU0Miw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB1c2VyLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRVc2VyKGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRVc2VyKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci51c2VyID0gbjsKIAkJcmV0dXJuIHI7CkBAIC01NjQsNyArNTY0LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHBhc3N3b3JkLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRQYXNzKGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRQYXNzKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5wYXNzID0gbjsKIAkJcmV0dXJuIHI7CkBAIC01ODYsNyArNTg2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHBvcnQuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFBvcnQoZmluYWwgaW50IG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFBvcnQoaW50IG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBvcnQgPSBuID4gMCA/IG4gOiAtMTsKIAkJcmV0dXJuIHI7CkBAIC02MTMsNyArNjEzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBVUklpc2gpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmaW5hbCBVUklpc2ggYiA9IChVUklpc2gpIG9iajsKQEAgLTYzMiw3ICs2MzIsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IGIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYSkgJiYgU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChiKSkKQEAgLTY1Nyw3ICs2NTcsNyBAQAogCQlyZXR1cm4gZm9ybWF0KGZhbHNlLCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGZpbmFsIGJvb2xlYW4gaW5jbHVkZVBhc3N3b3JkLCBib29sZWFuIGVzY2FwZU5vbkFzY2lpKSB7CisJcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGJvb2xlYW4gaW5jbHVkZVBhc3N3b3JkLCBib29sZWFuIGVzY2FwZU5vbkFzY2lpKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWlmIChnZXRTY2hlbWUoKSAhPSBudWxsKSB7CiAJCQlyLmFwcGVuZChnZXRTY2hlbWUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKaW5kZXggMDIwOWJlMS4uN2RlMDUwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQpAQCAtNDMsMTAgKzQzLDE1IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5DT01NQU5EX0ZFVENIOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5DT01NQU5EX0xTX1JFRlM7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9BR0VOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FMTE9XX1JFQUNIQUJMRV9TSEExX0lOX1dBTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9BTExPV19USVBfU0hBMV9JTl9XQU5UOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fREVFUEVOX1JFTEFUSVZFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fRklMVEVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fSU5DTFVERV9UQUc7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9NVUxUSV9BQ0s7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9NVUxUSV9BQ0tfREVUQUlMRUQ7CkBAIC02NywxMCArNzIsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOwpAQCAtODUsNyArOTMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkFzeW5jUmV2T2JqZWN0UXVldWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkJpdG1hcFdhbGtlcjsKQEAgLTEwMiw2ICsxMDksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrLlBhY2tTdGF0aXN0aWNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk11bHRpQWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXIuUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNmZXJDb25maWcuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5JbnRlcnJ1cHRUaW1lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTnVsbE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uVGltZW91dElucHV0U3RyZWFtOwpAQCAtMjM3LDYgKzI0NSwxMiBAQAogCS8qKiBUaW1lciB0byBtYW5hZ2Uge0BsaW5rICN0aW1lb3V0fS4gKi8KIAlwcml2YXRlIEludGVycnVwdFRpbWVyIHRpbWVyOwogCisJLyoqCisJICogV2hldGhlciB0aGUgY2xpZW50IHJlcXVlc3RlZCB0byB1c2UgcHJvdG9jb2wgVjIgdGhyb3VnaCBhIHNpZGUKKwkgKiBjaGFubmVsIChzdWNoIGFzIHRoZSBHaXQtUHJvdG9jb2wgSFRUUCBoZWFkZXIpLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBjbGllbnRSZXF1ZXN0ZWRWMjsKKwogCXByaXZhdGUgSW5wdXRTdHJlYW0gcmF3SW47CiAKIAlwcml2YXRlIFJlc3BvbnNlQnVmZmVyZWRPdXRwdXRTdHJlYW0gcmF3T3V0OwpAQCAtMjc4LDEyICsyOTIsMjIgQEAKIAkvKiogU2hhbGxvdyBjb21taXRzIHRoZSBjbGllbnQgYWxyZWFkeSBoYXMuICovCiAJcHJpdmF0ZSBmaW5hbCBTZXQ8T2JqZWN0SWQ+IGNsaWVudFNoYWxsb3dDb21taXRzID0gbmV3IEhhc2hTZXQ8PigpOwogCi0JLyoqIFNoYWxsb3cgY29tbWl0cyBvbiB0aGUgY2xpZW50IHdoaWNoIGFyZSBub3cgYmVjb21pbmcgdW5zaGFsbG93ICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KIAkvKiogRGVzaXJlZCBkZXB0aCBmcm9tIHRoZSBjbGllbnQgb24gYSBzaGFsbG93IHJlcXVlc3QuICovCiAJcHJpdmF0ZSBpbnQgZGVwdGg7CiAKKwkvKioKKwkgKiBDb21taXQgdGltZSBvZiB0aGUgbmV3ZXN0IG9iamVjdHMgdGhlIGNsaWVudCBoYXMgYXNrZWQgdXMgdXNpbmcKKwkgKiAtLXNoYWxsb3ctc2luY2Ugbm90IHRvIHNlbmQuIENhbm5vdCBiZSBub256ZXJvIGlmIGRlcHRoIGlzIG5vbnplcm8uCisJICovCisJcHJpdmF0ZSBpbnQgc2hhbGxvd1NpbmNlOworCisJLyoqCisJICogKFBvc3NpYmx5IHNob3J0KSByZWYgbmFtZXMsIGFuY2VzdG9ycyBvZiB3aGljaCB0aGUgY2xpZW50IGhhcyBhc2tlZCB1cworCSAqIG5vdCB0byBzZW5kIHVzaW5nIC0tc2hhbGxvdy1leGNsdWRlLiBDYW5ub3QgYmUgbm9uLW51bGwgaWYgZGVwdGggaXMKKwkgKiBub256ZXJvLgorCSAqLworCXByaXZhdGUgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzaGFsbG93RXhjbHVkZVJlZnM7CisKIAkvKiogQ29tbWl0IHRpbWUgb2YgdGhlIG9sZGVzdCBjb21tb24gY29tbWl0LCBpbiBzZWNvbmRzLiAqLwogCXByaXZhdGUgaW50IG9sZGVzdFRpbWU7CiAKQEAgLTMxNyw4ICszNDEsNyBAQAogCiAJcHJpdmF0ZSBQYWNrU3RhdGlzdGljcyBzdGF0aXN0aWNzOwogCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlwcml2YXRlIFVwbG9hZFBhY2tMb2dnZXIgbG9nZ2VyID0gVXBsb2FkUGFja0xvZ2dlci5OVUxMOworCXByaXZhdGUgbG9uZyBmaWx0ZXJCbG9iTGltaXQgPSAtMTsKIAogCS8qKgogCSAqIENyZWF0ZSBhIG5ldyBwYWNrIHVwbG9hZCBmb3IgYW4gb3BlbiByZXBvc2l0b3J5LgpAQCAtMzI2LDcgKzM0OSw3IEBACiAJICogQHBhcmFtIGNvcHlGcm9tCiAJICogICAgICAgICAgICB0aGUgc291cmNlIHJlcG9zaXRvcnkuCiAJICovCi0JcHVibGljIFVwbG9hZFBhY2soZmluYWwgUmVwb3NpdG9yeSBjb3B5RnJvbSkgeworCXB1YmxpYyBVcGxvYWRQYWNrKFJlcG9zaXRvcnkgY29weUZyb20pIHsKIAkJZGIgPSBjb3B5RnJvbTsKIAkJd2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKIAkJd2Fsay5zZXRSZXRhaW5Cb2R5KGZhbHNlKTsKQEAgLTQxNSw3ICs0MzgsNyBAQAogCSAqICAgICAgICAgICAgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpdGggdGhlCiAJICogICAgICAgICAgICBjb25uZWN0ZWQgY2xpZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIApAQCAtNDQyLDcgKzQ2NSw3IEBACiAJICogICAgICAgICAgICBjb21tYW5kcyBiZWZvcmUgd3JpdGluZyBvdXRwdXQgYW5kIGRvZXMgbm90IHBlcmZvcm0gdGhlCiAJICogICAgICAgICAgICBpbml0aWFsIGFkdmVydGlzaW5nLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGZpbmFsIGJvb2xlYW4gdHdvV2F5KSB7CisJcHVibGljIHZvaWQgc2V0QmlEaXJlY3Rpb25hbFBpcGUoYm9vbGVhbiB0d29XYXkpIHsKIAkJYmlEaXJlY3Rpb25hbFBpcGUgPSB0d29XYXk7CiAJfQogCkBAIC01NDUsNyArNTY4LDcgQEAKIAkgKiBAcGFyYW0gYWR2ZXJ0aXNlUmVmc0hvb2sKIAkgKiAgICAgICAgICAgIHRoZSBob29rOyBtYXkgYmUgbnVsbCB0byBzaG93IGFsbCByZWZzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKGZpbmFsIEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CisJcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKIAkJaWYgKGFkdmVydGlzZVJlZnNIb29rICE9IG51bGwpCiAJCQl0aGlzLmFkdmVydGlzZVJlZnNIb29rID0gYWR2ZXJ0aXNlUmVmc0hvb2s7CiAJCWVsc2UKQEAgLTU2NCw3ICs1ODcsNyBAQAogCSAqIEBwYXJhbSByZWZGaWx0ZXIKIAkgKiAgICAgICAgICAgIHRoZSBmaWx0ZXI7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmRmlsdGVyKGZpbmFsIFJlZkZpbHRlciByZWZGaWx0ZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoUmVmRmlsdGVyIHJlZkZpbHRlcikgewogCQl0aGlzLnJlZkZpbHRlciA9IHJlZkZpbHRlciAhPSBudWxsID8gcmVmRmlsdGVyIDogUmVmRmlsdGVyLkRFRkFVTFQ7CiAJfQogCkBAIC02MzksMjkgKzY2Miw2IEBACiAJfQogCiAJLyoqCi0JICogR2V0IHRoZSBjb25maWd1cmVkIGxvZ2dlci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgbG9nZ2VyLgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFByZVVwbG9hZEhvb2soKX0uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgVXBsb2FkUGFja0xvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsb2dnZXIuCi0JICoKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogICAgICAgICAgICB0aGUgbG9nZ2VyIGluc3RhbmNlLiBJZiBudWxsLCBubyBsb2dnaW5nIG9jY3Vycy4KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRQcmVVcGxvYWRIb29rKFByZVVwbG9hZEhvb2spfS4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihVcGxvYWRQYWNrTG9nZ2VyIGxvZ2dlcikgewotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQl9Ci0KLQkvKioKIAkgKiBDaGVjayB3aGV0aGVyIHRoZSBjbGllbnQgZXhwZWN0cyBhIHNpZGUtYmFuZCBzdHJlYW0uCiAJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsaWVudCBoYXMgYWR2ZXJ0aXNlZCBhIHNpZGUtYmFuZCBjYXBhYmlsaXR5LCBmYWxzZQpAQCAtNjgwLDggKzY4MCwzNCBAQAogCX0KIAogCS8qKgorCSAqIFNldCB0aGUgRXh0cmEgUGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgY2xpZW50LgorCSAqCisJICogPHA+VGhlc2UgYXJlIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdGhyb3VnaCBhIHNpZGUgY2hhbm5lbAorCSAqIHN1Y2ggYXMgdGhlIEdpdC1Qcm90b2NvbCBIVFRQIGhlYWRlciwgdG8gYWxsb3cgYSBjbGllbnQgdG8gcmVxdWVzdAorCSAqIGEgbmV3ZXIgcmVzcG9uc2UgZm9ybWF0IHdoaWxlIHJlbWFpbmluZyBjb21wYXRpYmxlIHdpdGggb2xkZXIgc2VydmVycworCSAqIHRoYXQgZG8gbm90IHVuZGVyc3RhbmQgZGlmZmVyZW50IHJlcXVlc3QgZm9ybWF0cy4KKwkgKgorCSAqIEBwYXJhbSBwYXJhbXMKKwkgKiAgICAgICAgICAgIHBhcmFtZXRlcnMgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCwgc3BsaXQgYXQgY29sb25zIG9yIE5VTAorCSAqICAgICAgICAgICAgYnl0ZXMuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4dHJhUGFyYW1ldGVycyhDb2xsZWN0aW9uPFN0cmluZz4gcGFyYW1zKSB7CisJCXRoaXMuY2xpZW50UmVxdWVzdGVkVjIgPSBwYXJhbXMuY29udGFpbnMoInZlcnNpb249MiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVzZVByb3RvY29sVjIoKSB7CisJCXJldHVybiBQcm90b2NvbFZlcnNpb24uVjIuZXF1YWxzKHRyYW5zZmVyQ29uZmlnLnByb3RvY29sVmVyc2lvbikKKwkJCQkmJiBjbGllbnRSZXF1ZXN0ZWRWMjsKKwl9CisKKwkvKioKIAkgKiBFeGVjdXRlIHRoZSB1cGxvYWQgdGFzayBvbiB0aGUgc29ja2V0LgogCSAqCisJICogPHA+SWYgdGhlIGNsaWVudCBwYXNzZWQgZXh0cmEgcGFyYW1ldGVycyAoZS5nLiwgInZlcnNpb249MiIpIHRocm91Z2ggYQorCSAqIHNpZGUgY2hhbm5lbCwgdGhlIGNhbGxlciBtdXN0IGNhbGwgc2V0RXh0cmFQYXJhbWV0ZXJzIGZpcnN0IHRvIHN1cHBseQorCSAqIHRoZW0uCisJICoKIAkgKiBAcGFyYW0gaW5wdXQKIAkgKiAgICAgICAgICAgIHJhdyBpbnB1dCB0byByZWFkIGNsaWVudCBjb21tYW5kcyBmcm9tLiBDYWxsZXIgbXVzdCBlbnN1cmUgdGhlCiAJICogICAgICAgICAgICBpbnB1dCBpcyBidWZmZXJlZCwgb3RoZXJ3aXNlIHJlYWQgcGVyZm9ybWFuY2UgbWF5IHN1ZmZlci4KQEAgLTcyMiw3ICs3NDgsMTEgQEAKIAogCQkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJhd0luKTsKIAkJCXBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KHJhd091dCk7Ci0JCQlzZXJ2aWNlKCk7CisJCQlpZiAodXNlUHJvdG9jb2xWMigpKSB7CisJCQkJc2VydmljZVYyKCk7CisJCQl9IGVsc2UgeworCQkJCXNlcnZpY2UoKTsKKwkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCW1zZ091dCA9IE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0U7CiAJCQl3YWxrLmNsb3NlKCk7CkBAIC03NDIsMjEgKzc3Miw2IEBACiAJICogQHJldHVybiBzdGF0aXN0aWNzIGFib3V0IHBhY2sgb3V0cHV0LCBpZiBhIHBhY2sgd2FzIHNlbnQuIE51bGwgaWYgbm8gcGFjawogCSAqICAgICAgICAgd2FzIHNlbnQsIHN1Y2ggYXMgZHVyaW5nIHRoZSBuZWdvdGlhdGlvbiBwaGFzZSBvZiBhIHNtYXJ0IEhUVFAKIAkgKiAgICAgICAgIGNvbm5lY3Rpb24sIG9yIGlmIHRoZSBjbGllbnQgd2FzIGFscmVhZHkgdXAtdG8tZGF0ZS4KLQkgKiBAc2luY2UgMy4wCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0U3RhdGlzdGljcygpfS4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBQYWNrV3JpdGVyLlN0YXRpc3RpY3MgZ2V0UGFja1N0YXRpc3RpY3MoKSB7Ci0JCXJldHVybiBzdGF0aXN0aWNzID09IG51bGwgPyBudWxsCi0JCQkJOiBuZXcgUGFja1dyaXRlci5TdGF0aXN0aWNzKHN0YXRpc3RpY3MpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUGFja1dyaXRlcidzIHN0YXRpc3RpY3MgaWYgYSBwYWNrIHdhcyBzZW50IHRvIHRoZSBjbGllbnQuCi0JICoKLQkgKiBAcmV0dXJuIHN0YXRpc3RpY3MgYWJvdXQgcGFjayBvdXRwdXQsIGlmIGEgcGFjayB3YXMgc2VudC4gTnVsbCBpZiBubyBwYWNrCi0JICogICAgICAgICB3YXMgc2VudCwgc3VjaCBhcyBkdXJpbmcgdGhlIG5lZ290aWF0aW9uIHBoYXNlIG9mIGEgc21hcnQgSFRUUAotCSAqICAgICAgICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIGNsaWVudCB3YXMgYWxyZWFkeSB1cC10by1kYXRlLgogCSAqIEBzaW5jZSA0LjEKIAkgKi8KIAlwdWJsaWMgUGFja1N0YXRpc3RpY3MgZ2V0U3RhdGlzdGljcygpIHsKQEAgLTc2NSw3ICs3ODAsNyBAQAogCiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZWY+IGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHJlZnMgPT0gbnVsbCkKLQkJCXNldEFkdmVydGlzZWRSZWZzKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpKTsKKwkJCXNldEFkdmVydGlzZWRSZWZzKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpKTsKIAkJcmV0dXJuIHJlZnM7CiAJfQogCkBAIC03NzQsNiArNzg5LDcgQEAKIAkJLy8gSWYgaXQncyBhIG5vbi1iaWRpIHJlcXVlc3QsIHdlIG5lZWQgdG8gcmVhZCB0aGUgZW50aXJlIHJlcXVlc3QgYmVmb3JlCiAJCS8vIHdyaXRpbmcgYSByZXNwb25zZS4gQnVmZmVyIHRoZSByZXNwb25zZSB1bnRpbCB0aGVuLgogCQlQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvciA9IG5ldyBQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvcigpOworCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSB7CiAJCQlpZiAoYmlEaXJlY3Rpb25hbFBpcGUpCiAJCQkJc2VuZEFkdmVydGlzZWRSZWZzKG5ldyBQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcihwY2tPdXQpKTsKQEAgLTgwMyw3ICs4MTksNyBAQAogCQkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCiAJCQkJdmVyaWZ5Q2xpZW50U2hhbGxvdygpOwogCQkJaWYgKGRlcHRoICE9IDApCi0JCQkJcHJvY2Vzc1NoYWxsb3coKTsKKwkJCQlwcm9jZXNzU2hhbGxvdyhudWxsLCB1bnNoYWxsb3dDb21taXRzLCB0cnVlKTsKIAkJCWlmICghY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKQogCQkJCXdhbGsuYXNzdW1lU2hhbGxvdyhjbGllbnRTaGFsbG93Q29tbWl0cyk7CiAJCQlzZW5kUGFjayA9IG5lZ290aWF0ZShhY2N1bXVsYXRvcik7CkBAIC04NTUsOCArODcxLDI4OCBAQAogCQkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKIAkJfQogCi0JCWlmIChzZW5kUGFjaykKLQkJCXNlbmRQYWNrKGFjY3VtdWxhdG9yKTsKKwkJaWYgKHNlbmRQYWNrKSB7CisJCQlzZW5kUGFjayhhY2N1bXVsYXRvciwgcmVmcyA9PSBudWxsID8gbnVsbCA6IHJlZnMudmFsdWVzKCksIHVuc2hhbGxvd0NvbW1pdHMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxzUmVmc1YyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIgYWR2ID0gbmV3IFBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyKHBja091dCk7CisJCVN0cmluZyBsaW5lOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZWZQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlib29sZWFuIG5lZWRUb0ZpbmRTeW1yZWZzID0gZmFsc2U7CisKKwkJYWR2LnNldFVzZVByb3RvY29sVjIodHJ1ZSk7CisKKwkJbGluZSA9IHBja0luLnJlYWRTdHJpbmcoKTsKKworCQkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IGFueSBjYXBhYmlsaXRpZXMsIHNvIHRoZSBuZXh0CisJCS8vIGxpbmUgaXMgREVMSU0gaWYgdGhlcmUgYXJlIGFyZ3VtZW50cyBvciBFTkQgaWYgbm90LgorCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uREVMSU0pIHsKKwkJCXdoaWxlICgobGluZSA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJCWlmIChsaW5lLmVxdWFscygicGVlbCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKKwkJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJzeW1yZWZzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQluZWVkVG9GaW5kU3ltcmVmcyA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoInJlZi1wcmVmaXggIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZWZQcmVmaXhlcy5hZGQobGluZS5zdWJzdHJpbmcoInJlZi1wcmVmaXggIi5sZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChsaW5lICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCX0KKwkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKKworCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnNUb1NlbmQ7CisJCWlmIChyZWZQcmVmaXhlcy5pc0VtcHR5KCkpIHsKKwkJCXJlZnNUb1NlbmQgPSBnZXRBZHZlcnRpc2VkT3JEZWZhdWx0UmVmcygpOworCQl9IGVsc2UgeworCQkJcmVmc1RvU2VuZCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWZvciAoU3RyaW5nIHJlZlByZWZpeCA6IHJlZlByZWZpeGVzKSB7CisJCQkJZm9yIChSZWYgcmVmIDogZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocmVmUHJlZml4KSkgeworCQkJCQlyZWZzVG9TZW5kLnB1dChyZWYuZ2V0TmFtZSgpLCByZWYpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChuZWVkVG9GaW5kU3ltcmVmcykgeworCQkJZmluZFN5bXJlZnMoYWR2LCByZWZzVG9TZW5kKTsKKwkJfQorCisJCWFkdi5zZW5kKHJlZnNUb1NlbmQpOworCQlhZHYuZW5kKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZldGNoVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvcHRpb25zID0gbmV3IEhhc2hTZXQ8PigpOworCisJCS8vIFBhY2tzIGFyZSBhbHdheXMgc2VudCBtdWx0aXBsZXhlZCBhbmQgdXNpbmcgZnVsbCA2NEsKKwkJLy8gbGVuZ3Rocy4KKwkJb3B0aW9ucy5hZGQoT1BUSU9OX1NJREVfQkFORF82NEspOworCisJCS8vIERlcGVuZGluZyBvbiB0aGUgcmVxdWVzdFZhbGlkYXRvciwgI3Byb2Nlc3NIYXZlTGluZXMgbWF5CisJCS8vIHJlcXVpcmUgdGhhdCBhZHZlcnRpc2VkIGJlIHNldC4gU2V0IGl0IG9ubHkgaW4gdGhlIHJlcXVpcmVkCisJCS8vIGNpcmN1bXN0YW5jZXMgKHRvIGF2b2lkIGEgZnVsbCByZWYgbG9va3VwIGluIHRoZSBjYXNlIHRoYXQKKwkJLy8gd2UgZG9uJ3QgbmVlZCBpdCkuCisJCWlmIChyZXF1ZXN0VmFsaWRhdG9yIGluc3RhbmNlb2YgVGlwUmVxdWVzdFZhbGlkYXRvciB8fAorCQkJCXJlcXVlc3RWYWxpZGF0b3IgaW5zdGFuY2VvZiBSZWFjaGFibGVDb21taXRUaXBSZXF1ZXN0VmFsaWRhdG9yIHx8CisJCQkJcmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIEFueVJlcXVlc3RWYWxpZGF0b3IpIHsKKwkJCWFkdmVydGlzZWQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCQl9IGVsc2UgeworCQkJYWR2ZXJ0aXNlZCA9IHJlZklkU2V0KGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCkudmFsdWVzKCkpOworCQl9CisKKwkJU3RyaW5nIGxpbmU7CisJCUxpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJYm9vbGVhbiBkb25lUmVjZWl2ZWQgPSBmYWxzZTsKKworCQkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IGFueSBjYXBhYmlsaXRpZXMsIHNvIHRoZSBuZXh0CisJCS8vIGxpbmUgaXMgREVMSU0uCisJCWlmICgobGluZSA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkRFTElNKSB7CisJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQl9CisKKwkJYm9vbGVhbiBpbmNsdWRlVGFnID0gZmFsc2U7CisJCWJvb2xlYW4gZmlsdGVyUmVjZWl2ZWQgPSBmYWxzZTsKKwkJd2hpbGUgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlpZiAobGluZS5zdGFydHNXaXRoKCJ3YW50ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3YW50SWRzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiaGF2ZSAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcGVlckhhcy5hZGQoT2JqZWN0SWQuZnJvbVN0cmluZyhsaW5lLnN1YnN0cmluZyg1KSkpOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscygiZG9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlkb25lUmVjZWl2ZWQgPSB0cnVlOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fVEhJTl9QQUNLKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9USElOX1BBQ0spOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fTk9fUFJPR1JFU1MpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX05PX1BST0dSRVNTKTsKKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX0lOQ0xVREVfVEFHKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9JTkNMVURFX1RBRyk7CisJCQkJaW5jbHVkZVRhZyA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9PRlNfREVMVEEpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX09GU19ERUxUQSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgic2hhbGxvdyAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJY2xpZW50U2hhbGxvd0NvbW1pdHMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoOCkpKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4gIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRlcHRoID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZyg3KSk7CisJCQkJaWYgKGRlcHRoIDw9IDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRGVwdGgsCisJCQkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpKSk7CisJCQkJfQorCQkJCWlmIChzaGFsbG93U2luY2UgIT0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlblNpbmNlV2l0aERlZXBlbik7CisJCQkJfQorCQkJCWlmIChzaGFsbG93RXhjbHVkZVJlZnMgIT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlbk5vdFdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4tbm90ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlMaXN0PFN0cmluZz4gZXhjbHVkZSA9IHNoYWxsb3dFeGNsdWRlUmVmczsKKwkJCQlpZiAoZXhjbHVkZSA9PSBudWxsKSB7CisJCQkJCWV4Y2x1ZGUgPSBzaGFsbG93RXhjbHVkZVJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQl9CisJCQkJZXhjbHVkZS5hZGQobGluZS5zdWJzdHJpbmcoMTEpKTsKKwkJCQlpZiAoZGVwdGggIT0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlbk5vdFdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX0RFRVBFTl9SRUxBVElWRSkpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fREVFUEVOX1JFTEFUSVZFKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4tc2luY2UgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNoYWxsb3dTaW5jZSA9IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMTMpKTsKKwkJCQlpZiAoc2hhbGxvd1NpbmNlIDw9IDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lc3RhbXAsIGxpbmUpKTsKKwkJCQl9CisJCQkJaWYgKGRlcHRoICE9ICAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuU2luY2VXaXRoRGVlcGVuKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKQorCQkJCQkmJiBsaW5lLnN0YXJ0c1dpdGgoT1BUSU9OX0ZJTFRFUiArICcgJykpIHsKKwkJCQlpZiAoZmlsdGVyUmVjZWl2ZWQpIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b29NYW55RmlsdGVycyk7CisJCQkJfQorCQkJCWZpbHRlclJlY2VpdmVkID0gdHJ1ZTsKKwkJCQlwYXJzZUZpbHRlcihsaW5lLnN1YnN0cmluZyhPUFRJT05fRklMVEVSLmxlbmd0aCgpICsgMSkpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5leHBlY3RlZFBhY2tldExpbmUsIGxpbmUpKTsKKwkJCX0KKwkJfQorCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCisJCWJvb2xlYW4gc2VjdGlvblNlbnQgPSBmYWxzZTsKKwkJQE51bGxhYmxlIExpc3Q8T2JqZWN0SWQ+IHNoYWxsb3dDb21taXRzID0gbnVsbDsKKwkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCWlmICghY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKSB7CisJCQl2ZXJpZnlDbGllbnRTaGFsbG93KCk7CisJCX0KKwkJaWYgKGRlcHRoICE9IDAgfHwgc2hhbGxvd1NpbmNlICE9IDAgfHwgc2hhbGxvd0V4Y2x1ZGVSZWZzICE9IG51bGwpIHsKKwkJCXNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDxPYmplY3RJZD4oKTsKKwkJCXByb2Nlc3NTaGFsbG93KHNoYWxsb3dDb21taXRzLCB1bnNoYWxsb3dDb21taXRzLCBmYWxzZSk7CisJCX0KKwkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCisJCQl3YWxrLmFzc3VtZVNoYWxsb3coY2xpZW50U2hhbGxvd0NvbW1pdHMpOworCisJCWlmIChkb25lUmVjZWl2ZWQpIHsKKwkJCXByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgT2JqZWN0SWQuemVyb0lkKCksIG5ldyBQYWNrZXRMaW5lT3V0KE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKTsKKwkJfSBlbHNlIHsKKwkJCXBja091dC53cml0ZVN0cmluZygiYWNrbm93bGVkZ21lbnRzXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChPYmplY3RJZCBpZCA6IHBlZXJIYXMpIHsKKwkJCQlpZiAod2Fsay5nZXRPYmplY3RSZWFkZXIoKS5oYXMoaWQpKSB7CisJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJfQorCQkJcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBPYmplY3RJZC56ZXJvSWQoKSwgbmV3IFBhY2tldExpbmVPdXQoTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpOworCQkJaWYgKG9rVG9HaXZlVXAoKSkgeworCQkJCXBja091dC53cml0ZVN0cmluZygicmVhZHlcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJOQUtcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlzZWN0aW9uU2VudCA9IHRydWU7CisJCX0KKworCQlpZiAoZG9uZVJlY2VpdmVkIHx8IG9rVG9HaXZlVXAoKSkgeworCQkJaWYgKHNoYWxsb3dDb21taXRzICE9IG51bGwpIHsKKwkJCQlpZiAoc2VjdGlvblNlbnQpCisJCQkJCXBja091dC53cml0ZURlbGltKCk7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93LWluZm9cbiIpOyAvLyROT04tTkxTLTEkCisJCQkJZm9yIChPYmplY3RJZCBvIDogc2hhbGxvd0NvbW1pdHMpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLmdldE5hbWUoKSArICdcbicpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWZvciAoT2JqZWN0SWQgbyA6IHVuc2hhbGxvd0NvbW1pdHMpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIG8uZ2V0TmFtZSgpICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJc2VjdGlvblNlbnQgPSB0cnVlOworCQkJfQorCisJCQlpZiAoc2VjdGlvblNlbnQpCisJCQkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJCXBja091dC53cml0ZVN0cmluZygicGFja2ZpbGVcbiIpOyAvLyROT04tTkxTLTEkCisJCQlzZW5kUGFjayhuZXcgUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IoKSwKKwkJCQkJaW5jbHVkZVRhZworCQkJCQkJPyBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChSX1RBR1MpCisJCQkJCQk6IG51bGwsCisJCQkJCXVuc2hhbGxvd0NvbW1pdHMpOworCQl9CisJCXBja091dC5lbmQoKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNvbW1hbmQgYW5kIHdlIHNob3VsZCB0ZWFyIGRvd24gdGhlCisJICogY29ubmVjdGlvbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gc2VydmVPbmVDb21tYW5kVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgY29tbWFuZDsKKwkJdHJ5IHsKKwkJCWNvbW1hbmQgPSBwY2tJbi5yZWFkU3RyaW5nKCk7CisJCX0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlb2YpIHsKKwkJCS8qIEVPRiB3aGVuIGF3YWl0aW5nIGNvbW1hbmQgaXMgZmluZSAqLworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGNvbW1hbmQgPT0gUGFja2V0TGluZUluLkVORCkgeworCQkJLy8gQSBibGFuayByZXF1ZXN0IGlzIHZhbGlkIGFjY29yZGluZworCQkJLy8gdG8gdGhlIHByb3RvY29sOyBkbyBub3RoaW5nIGluIHRoaXMKKwkJCS8vIGNhc2UuCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29tbWFuZC5lcXVhbHMoImNvbW1hbmQ9IiArIENPTU1BTkRfTFNfUkVGUykpIHsgLy8kTk9OLU5MUy0xJAorCQkJbHNSZWZzVjIoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY29tbWFuZC5lcXVhbHMoImNvbW1hbmQ9IiArIENPTU1BTkRfRkVUQ0gpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZldGNoVjIoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVua25vd25UcmFuc3BvcnRDb21tYW5kLCBjb21tYW5kKSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gY2FwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXBzLmFkZCgidmVyc2lvbiAyIik7IC8vJE5PTi1OTFMtMSQKKwkJY2Fwcy5hZGQoQ09NTUFORF9MU19SRUZTKTsKKwkJY2Fwcy5hZGQoCisJCQkJQ09NTUFORF9GRVRDSCArICc9JyArCisJCQkJKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKSA/IE9QVElPTl9GSUxURVIgKyAnICcgOiAiIikgKyAvLyROT04tTkxTLTEkCisJCQkJT1BUSU9OX1NIQUxMT1cpOworCQlyZXR1cm4gY2FwczsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VydmljZVYyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJpRGlyZWN0aW9uYWxQaXBlKSB7CisJCQkvLyBKdXN0IGxpa2UgaW4gc2VydmljZSgpLCB0aGUgY2FwYWJpbGl0eSBhZHZlcnRpc2VtZW50CisJCQkvLyBpcyBzZW50IG9ubHkgaWYgdGhpcyBpcyBhIGJpZGlyZWN0aW9uYWwgcGlwZS4gKElmCisJCQkvLyBub3QsIHRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gY2FsbAorCQkJLy8gc2VuZEFkdmVydGlzZWRSZWZzKCkgb24gaXRzIG93bi4pCisJCQlmb3IgKFN0cmluZyBzIDogZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKHMgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJcGNrT3V0LmVuZCgpOworCisJCQl3aGlsZSAoIXNlcnZlT25lQ29tbWFuZFYyKCkpIHsKKwkJCQkvLyBSZXBlYXQgdW50aWwgYW4gZW1wdHkgY29tbWFuZCBvciBFT0YuCisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJc2VydmVPbmVDb21tYW5kVjIoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXdoaWxlICgwIDwgcmF3SW4uc2tpcCgyMDQ4KSB8fCAwIDw9IHJhd0luLnJlYWQoKSkgeworCQkJCS8vIERpc2NhcmQgdW50aWwgRU9GLgorCQkJfQorCQkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKKwkJfQogCX0KIAogCXByaXZhdGUgc3RhdGljIFNldDxPYmplY3RJZD4gcmVmSWRTZXQoQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHsKQEAgLTg3NCw3ICsxMTcwLDIzIEBACiAJCXJldHVybiBpZHM7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaGFsbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvKgorCSAqIERldGVybWluZXMgd2hhdCAic2hhbGxvdyIgYW5kICJ1bnNoYWxsb3ciIGxpbmVzIHRvIHNlbmQgdG8gdGhlIHVzZXIuCisJICogVGhlIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gdG8gc2hhbGxvd0NvbW1pdHMgKGlmIG5vdCBudWxsKSBhbmQKKwkgKiB1bnNoYWxsb3dDb21taXRzLCBhbmQgYWxzbyB3cml0dGVuIHRvICNwY2tPdXQgKGlmIHdyaXRlVG9QY2tPdXQgaXMKKwkgKiB0cnVlKS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1NoYWxsb3coQE51bGxhYmxlIExpc3Q8T2JqZWN0SWQ+IHNoYWxsb3dDb21taXRzLAorCQkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cywKKwkJCWJvb2xlYW4gd3JpdGVUb1Bja091dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX0RFRVBFTl9SRUxBVElWRSkgfHwKKwkJCQlzaGFsbG93U2luY2UgIT0gMCB8fAorCQkJCXNoYWxsb3dFeGNsdWRlUmVmcyAhPSBudWxsKSB7CisJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBJbXBsZW1lbnQgZGVlcGVuLXJlbGF0aXZlLCBkZWVwZW4tc2luY2UsCisJCQkvLyBhbmQgZGVlcGVuLW5vdC4KKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKIAkJaW50IHdhbGtEZXB0aCA9IGRlcHRoIC0gMTsKIAkJdHJ5IChEZXB0aFdhbGsuUmV2V2FsayBkZXB0aFdhbGsgPSBuZXcgRGVwdGhXYWxrLlJldldhbGsoCiAJCQkJd2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgd2Fsa0RlcHRoKSkgewpAQCAtODk1LDE5ICsxMjA3LDI5IEBACiAJCQkJLy8gQ29tbWl0cyBhdCB0aGUgYm91bmRhcnkgd2hpY2ggYXJlbid0IGFscmVhZHkgc2hhbGxvdyBpbgogCQkJCS8vIHRoZSBjbGllbnQgbmVlZCB0byBiZSBtYXJrZWQgYXMgc3VjaAogCQkJCWlmIChjLmdldERlcHRoKCkgPT0gd2Fsa0RlcHRoCi0JCQkJCQkmJiAhY2xpZW50U2hhbGxvd0NvbW1pdHMuY29udGFpbnMoYykpCi0JCQkJCXBja091dC53cml0ZVN0cmluZygic2hhbGxvdyAiICsgby5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkmJiAhY2xpZW50U2hhbGxvd0NvbW1pdHMuY29udGFpbnMoYykpIHsKKwkJCQkJaWYgKHNoYWxsb3dDb21taXRzICE9IG51bGwpIHsKKwkJCQkJCXNoYWxsb3dDb21taXRzLmFkZChjLmNvcHkoKSk7CisJCQkJCX0KKwkJCQkJaWYgKHdyaXRlVG9QY2tPdXQpIHsKKwkJCQkJCXBja091dC53cml0ZVN0cmluZygic2hhbGxvdyAiICsgby5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CiAKIAkJCQkvLyBDb21taXRzIG5vdCBvbiB0aGUgYm91bmRhcnkgd2hpY2ggYXJlIHNoYWxsb3cgaW4gdGhlIGNsaWVudAogCQkJCS8vIG5lZWQgdG8gYmVjb21lIHVuc2hhbGxvd2VkCiAJCQkJaWYgKGMuZ2V0RGVwdGgoKSA8IHdhbGtEZXB0aAogCQkJCQkJJiYgY2xpZW50U2hhbGxvd0NvbW1pdHMucmVtb3ZlKGMpKSB7CiAJCQkJCXVuc2hhbGxvd0NvbW1pdHMuYWRkKGMuY29weSgpKTsKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIGMubmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAod3JpdGVUb1Bja091dCkgeworCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIGMubmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JCXBja091dC5lbmQoKTsKKwkJaWYgKHdyaXRlVG9QY2tPdXQpIHsKKwkJCXBja091dC5lbmQoKTsKKwkJfQogCX0KIAogCXByaXZhdGUgdm9pZCB2ZXJpZnlDbGllbnRTaGFsbG93KCkKQEAgLTk0NSwxMiArMTI2Nyw0NCBAQAogCSAqIEBwYXJhbSBhZHYKIAkgKiAgICAgICAgICAgIHRoZSBhZHZlcnRpc2VtZW50IGZvcm1hdHRlci4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgorCSAqICAgICAgICAgICAgdGhlIGZvcm1hdHRlciBmYWlsZWQgdG8gd3JpdGUgYW4gYWR2ZXJ0aXNlbWVudC4KIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgorCSAqICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKGZpbmFsIFJlZkFkdmVydGlzZXIgYWR2KSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2KSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24geworCQlzZW5kQWR2ZXJ0aXNlZFJlZnMoYWR2LCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSBhbiBhZHZlcnRpc2VtZW50IG9mIGF2YWlsYWJsZSByZWZzIGFuZCBjYXBhYmlsaXRpZXMuCisJICoKKwkgKiBAcGFyYW0gYWR2CisJICogICAgICAgICAgICB0aGUgYWR2ZXJ0aXNlbWVudCBmb3JtYXR0ZXIuCisJICogQHBhcmFtIHNlcnZpY2VOYW1lCisJICogICAgICAgICAgICBpZiBub3QgbnVsbCwgYWxzbyBvdXRwdXQgIiMgc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYQorCSAqICAgICAgICAgICAgZmx1c2ggcGFja2V0IGJlZm9yZSB0aGUgYWR2ZXJ0aXNlbWVudC4gVGhpcyBpcyByZXF1aXJlZAorCSAqICAgICAgICAgICAgaW4gdjAgb2YgdGhlIEhUVFAgcHJvdG9jb2wsIGRlc2NyaWJlZCBpbiBHaXQncworCSAqICAgICAgICAgICAgRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvaHR0cC1wcm90b2NvbC50eHQuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgorCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgaG9vayBkZW5pZWQgYWR2ZXJ0aXNlbWVudC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2LAorCQkJQE51bGxhYmxlIFN0cmluZyBzZXJ2aWNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorCQkJU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKKwkJaWYgKHVzZVByb3RvY29sVjIoKSkgeworCQkJLy8gVGhlIGVxdWl2YWxlbnQgaW4gdjIgaXMgb25seSB0aGUgY2FwYWJpbGl0aWVzCisJCQkvLyBhZHZlcnRpc2VtZW50LgorCQkJZm9yIChTdHJpbmcgcyA6IGdldFYyQ2FwYWJpbGl0eUFkdmVydGlzZW1lbnQoKSkgeworCQkJCWFkdi53cml0ZU9uZShzKTsKKwkJCX0KKwkJCWFkdi5lbmQoKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCXRyeSB7CiAJCQlhZHZlcnRpc2VSZWZzSG9vay5hZHZlcnRpc2VSZWZzKHRoaXMpOwogCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZmFpbCkgewpAQCAtOTYxLDYgKzEzMTUsMTAgQEAKIAkJCXRocm93IGZhaWw7CiAJCX0KIAorCQlpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgeworCQkJYWR2LndyaXRlT25lKCIjIHNlcnZpY2U9IiArIHNlcnZpY2VOYW1lICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCWFkdi5lbmQoKTsKKwkJfQogCQlhZHYuaW5pdChkYik7CiAJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9JTkNMVURFX1RBRyk7CiAJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9NVUxUSV9BQ0tfREVUQUlMRUQpOwpAQCAtOTgzLDYgKzEzNDEsOSBAQAogCQkJCXx8IHBvbGljeSA9PSBudWxsKQogCQkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0FMTE9XX1JFQUNIQUJMRV9TSEExX0lOX1dBTlQpOwogCQlhZHYuYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fQUdFTlQsIFVzZXJBZ2VudC5nZXQoKSk7CisJCWlmICh0cmFuc2ZlckNvbmZpZy5pc0FsbG93RmlsdGVyKCkpIHsKKwkJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9GSUxURVIpOworCQl9CiAJCWFkdi5zZXREZXJlZlRhZ3ModHJ1ZSk7CiAJCU1hcDxTdHJpbmcsIFJlZj4gYWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMgPSBnZXRBZHZlcnRpc2VkT3JEZWZhdWx0UmVmcygpOwogCQlmaW5kU3ltcmVmcyhhZHYsIGFkdmVydGlzZWRPckRlZmF1bHRSZWZzKTsKQEAgLTEwMjEsOCArMTM4MiwzNiBAQAogCQlyZXR1cm4gbXNnT3V0OwogCX0KIAorCXByaXZhdGUgdm9pZCBwYXJzZUZpbHRlcihTdHJpbmcgYXJnKSB0aHJvd3MgUGFja1Byb3RvY29sRXhjZXB0aW9uIHsKKwkJaWYgKGFyZy5lcXVhbHMoImJsb2I6bm9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbHRlckJsb2JMaW1pdCA9IDA7CisJCX0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoImJsb2I6bGltaXQ9IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdHJ5IHsKKwkJCQlmaWx0ZXJCbG9iTGltaXQgPSBMb25nLnBhcnNlTG9uZygKKwkJCQkJCWFyZy5zdWJzdHJpbmcoImJsb2I6bGltaXQ9Ii5sZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkCisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRmlsdGVyLAorCQkJCQkJCQlhcmcpKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBXZSBtdXN0IGhhdmUgKDEpIGVpdGhlciAiYmxvYjpub25lIiBvcgorCQkgKiAiYmxvYjpsaW1pdD0iIHNldCAoYmVjYXVzZSB3ZSBvbmx5IHN1cHBvcnQKKwkJICogYmxvYiBzaXplIGxpbWl0cyBmb3Igbm93KSwgYW5kICgyKSBpZiB0aGUKKwkJICogbGF0dGVyLCB0aGVuIGl0IG11c3QgYmUgbm9ubmVnYXRpdmUuIFRocm93CisJCSAqIGlmICgxKSBvciAoMikgaXMgbm90IG1ldC4KKwkJICovCisJCWlmIChmaWx0ZXJCbG9iTGltaXQgPCAwKSB7CisJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRmlsdGVyLAorCQkJCQkJCWFyZykpOworCQl9CisJfQorCiAJcHJpdmF0ZSB2b2lkIHJlY3ZXYW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gaXNGaXJzdCA9IHRydWU7CisJCWJvb2xlYW4gZmlsdGVyUmVjZWl2ZWQgPSBmYWxzZTsKIAkJZm9yICg7OykgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl0cnkgewpAQCAtMTA1MSw2ICsxNDQwLDE5IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAKKwkJCWlmICh0cmFuc2ZlckNvbmZpZy5pc0FsbG93RmlsdGVyKCkKKwkJCQkJJiYgbGluZS5zdGFydHNXaXRoKE9QVElPTl9GSUxURVIgKyAiICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgYXJnID0gbGluZS5zdWJzdHJpbmcoT1BUSU9OX0ZJTFRFUi5sZW5ndGgoKSArIDEpOworCisJCQkJaWYgKGZpbHRlclJlY2VpdmVkKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudG9vTWFueUZpbHRlcnMpOworCQkJCX0KKwkJCQlmaWx0ZXJSZWNlaXZlZCA9IHRydWU7CisKKwkJCQlwYXJzZUZpbHRlcihhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQlpZiAoIWxpbmUuc3RhcnRzV2l0aCgid2FudCAiKSB8fCBsaW5lLmxlbmd0aCgpIDwgNDUpIC8vJE5PTi1OTFMtMSQKIAkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmV4cGVjdGVkR290LCAid2FudCIsIGxpbmUpKTsgLy8kTk9OLU5MUy0xJAogCkBAIC0xMTIyLDcgKzE1MjQsNyBAQAogCQkJfQogCiAJCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7Ci0JCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCk7CisJCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCwgcGNrT3V0KTsKIAkJCQlpZiAoY29tbW9uQmFzZS5pc0VtcHR5KCkgfHwgbXVsdGlBY2sgIT0gTXVsdGlBY2suT0ZGKQogCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIk5BS1xuIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlpZiAobm9Eb25lICYmIHNlbnRSZWFkeSkgewpAQCAtMTEzNyw3ICsxNTM5LDcgQEAKIAkJCQlwZWVySGFzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CiAJCQkJYWNjdW11bGF0b3IuaGF2ZXMrKzsKIAkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoImRvbmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCk7CisJCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCwgcGNrT3V0KTsKIAogCQkJCWlmIChjb21tb25CYXNlLmlzRW1wdHkoKSkKIAkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJOQUtcbiIpOyAvLyROT04tTkxTLTEkCkBAIC0xMTUzLDcgKzE1NTUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBPYmplY3RJZCBwcm9jZXNzSGF2ZUxpbmVzKExpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMsIE9iamVjdElkIGxhc3QpCisJcHJpdmF0ZSBPYmplY3RJZCBwcm9jZXNzSGF2ZUxpbmVzKExpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMsIE9iamVjdElkIGxhc3QsIFBhY2tldExpbmVPdXQgb3V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcHJlVXBsb2FkSG9vay5vbkJlZ2luTmVnb3RpYXRlUm91bmQodGhpcywgd2FudElkcywgcGVlckhhcy5zaXplKCkpOwogCQlpZiAod2FudEFsbC5pc0VtcHR5KCkgJiYgIXdhbnRJZHMuaXNFbXB0eSgpKQpAQCAtMTE5OCwxMyArMTYwMCwxMyBAQAogCQkJCXN3aXRjaCAobXVsdGlBY2spIHsKIAkJCQljYXNlIE9GRjoKIAkJCQkJaWYgKGNvbW1vbkJhc2Uuc2l6ZSgpID09IDEpCi0JCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlicmVhazsKIAkJCQljYXNlIENPTlRJTlVFOgotCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbnRpbnVlXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgREVUQUlMRUQ6Ci0JCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIiBjb21tb25cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbW1vblxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0xMjMwLDEwICsxNjMyLDEwIEBACiAJCQkJCQljYXNlIE9GRjoKIAkJCQkJCQlicmVhazsKIAkJCQkJCWNhc2UgQ09OVElOVUU6Ci0JCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiBjb250aW51ZVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJCWJyZWFrOwogCQkJCQkJY2FzZSBERVRBSUxFRDoKLQkJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIHJlYWR5XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQkJc2VudFJlYWR5ID0gdHJ1ZTsKIAkJCQkJCQlicmVhazsKIAkJCQkJCX0KQEAgLTEyNDUsNyArMTY0Nyw3IEBACiAKIAkJaWYgKG11bHRpQWNrID09IE11bHRpQWNrLkRFVEFJTEVEICYmICFkaWRPa1RvR2l2ZVVwICYmIG9rVG9HaXZlVXAoKSkgewogCQkJT2JqZWN0SWQgaWQgPSBwZWVySGFzLmdldChwZWVySGFzLnNpemUoKSAtIDEpOwotCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgcmVhZHlcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIHJlYWR5XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQlzZW50UmVhZHkgPSB0cnVlOwogCQl9CiAKQEAgLTEzNDAsNyArMTc0Miw3IEBACiAJCQkJbmV3IFJlYWNoYWJsZUNvbW1pdFRpcFJlcXVlc3RWYWxpZGF0b3IoKS5jaGVja1dhbnRzKHVwLCB3YW50cyk7CiAJCQllbHNlIGlmICghd2FudHMuaXNFbXB0eSgpKSB7CiAJCQkJU2V0PE9iamVjdElkPiByZWZJZHMgPQotCQkJCQlyZWZJZFNldCh1cC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCkudmFsdWVzKCkpOworCQkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKTsKIAkJCQlmb3IgKE9iamVjdElkIG9iaiA6IHdhbnRzKSB7CiAJCQkJCWlmICghcmVmSWRzLmNvbnRhaW5zKG9iaikpCiAJCQkJCQl0aHJvdyBuZXcgV2FudE5vdFZhbGlkRXhjZXB0aW9uKG9iaik7CkBAIC0xMzYwLDcgKzE3NjIsNyBAQAogCQlwdWJsaWMgdm9pZCBjaGVja1dhbnRzKFVwbG9hZFBhY2sgdXAsIExpc3Q8T2JqZWN0SWQ+IHdhbnRzKQogCQkJCXRocm93cyBQYWNrUHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCWNoZWNrTm90QWR2ZXJ0aXNlZFdhbnRzKHVwLCB3YW50cywKLQkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpLnZhbHVlcygpKSk7CisJCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkpOwogCQl9CiAJfQogCkBAIC0xNDQzLDcgKzE4NDUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZENvbW1vbkJhc2UoZmluYWwgUmV2T2JqZWN0IG8pIHsKKwlwcml2YXRlIHZvaWQgYWRkQ29tbW9uQmFzZShSZXZPYmplY3QgbykgewogCQlpZiAoIW8uaGFzKENPTU1PTikpIHsKIAkJCW8uYWRkKENPTU1PTik7CiAJCQljb21tb25CYXNlLmFkZChvKTsKQEAgLTE0NzIsNyArMTg3NCw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gd2FudFNhdGlzZmllZChmaW5hbCBSZXZPYmplY3Qgd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGJvb2xlYW4gd2FudFNhdGlzZmllZChSZXZPYmplY3Qgd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHdhbnQuaGFzKFNBVElTRklFRCkpCiAJCQlyZXR1cm4gdHJ1ZTsKIApAQCAtMTQ5MywxMyArMTg5NSwyOSBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvKioKKwkgKiBTZW5kIHRoZSByZXF1ZXN0ZWQgb2JqZWN0cyB0byB0aGUgY2xpZW50LgorCSAqCisJICogQHBhcmFtIGFjY3VtdWxhdG9yCisJICogICAgICAgICAgICAgICAgd2hlcmUgdG8gd3JpdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgcGFjay4KKwkgKiBAcGFyYW0gYWxsVGFncworCSAqICAgICAgICAgICAgICAgIHJlZnMgdG8gc2VhcmNoIGZvciBhbm5vdGF0ZWQgdGFncyB0byBpbmNsdWRlIGluIHRoZSBwYWNrCisJICogICAgICAgICAgICAgICAgaWYgdGhlIHtAbGluayAjT1BUSU9OX0lOQ0xVREVfVEFHfSBjYXBhYmlsaXR5IHdhcworCSAqICAgICAgICAgICAgICAgIHJlcXVlc3RlZC4KKwkgKiBAcGFyYW0gdW5zaGFsbG93Q29tbWl0cworCSAqICAgICAgICAgICAgICAgIHNoYWxsb3cgY29tbWl0cyBvbiB0aGUgY2xpZW50IHRoYXQgYXJlIG5vdyBiZWNvbWluZworCSAqICAgICAgICAgICAgICAgIHVuc2hhbGxvdworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGdlbmVyYXRpbmcgb3Igd3JpdGluZyB0aGUgcGFjay4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2VuZFBhY2soUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IsCisJCQlATnVsbGFibGUgQ29sbGVjdGlvbjxSZWY+IGFsbFRhZ3MsCisJCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBib29sZWFuIHNpZGViYW5kID0gb3B0aW9ucy5jb250YWlucyhPUFRJT05fU0lERV9CQU5EKQogCQkJCXx8IG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX1NJREVfQkFORF82NEspOwogCQlpZiAoc2lkZWJhbmQpIHsKIAkJCXRyeSB7Ci0JCQkJc2VuZFBhY2sodHJ1ZSwgYWNjdW11bGF0b3IpOworCQkJCXNlbmRQYWNrKHRydWUsIGFjY3VtdWxhdG9yLCBhbGxUYWdzLCB1bnNoYWxsb3dDb21taXRzKTsKIAkJCX0gY2F0Y2ggKFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiBub1BhY2spIHsKIAkJCQkvLyBUaGlzIHdhcyBhbHJlYWR5IHJlcG9ydGVkIG9uIChiZWxvdykuCiAJCQkJdGhyb3cgbm9QYWNrOwpAQCAtMTUyMCw3ICsxOTM4LDcgQEAKIAkJCQkJdGhyb3cgZXJyOwogCQkJfQogCQl9IGVsc2UgewotCQkJc2VuZFBhY2soZmFsc2UsIGFjY3VtdWxhdG9yKTsKKwkJCXNlbmRQYWNrKGZhbHNlLCBhY2N1bXVsYXRvciwgYWxsVGFncywgdW5zaGFsbG93Q29tbWl0cyk7CiAJCX0KIAl9CiAKQEAgLTE1NDAsOSArMTk1OCwyOCBAQAogCQl9CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwkvKioKKwkgKiBTZW5kIHRoZSByZXF1ZXN0ZWQgb2JqZWN0cyB0byB0aGUgY2xpZW50LgorCSAqCisJICogQHBhcmFtIHNpZGViYW5kCisJICogICAgICAgICAgICAgICAgd2hldGhlciB0byB3cmFwIHRoZSBwYWNrIGluIHNpZGUtYmFuZCBwa3QtbGluZXMsCisJICogICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgd2l0aCBwcm9ncmVzcyBtZXNzYWdlcyBhbmQgZXJyb3JzLgorCSAqIEBwYXJhbSBhY2N1bXVsYXRvcgorCSAqICAgICAgICAgICAgICAgIHdoZXJlIHRvIHdyaXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhY2suCisJICogQHBhcmFtIGFsbFRhZ3MKKwkgKiAgICAgICAgICAgICAgICByZWZzIHRvIHNlYXJjaCBmb3IgYW5ub3RhdGVkIHRhZ3MgdG8gaW5jbHVkZSBpbiB0aGUgcGFjaworCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgI09QVElPTl9JTkNMVURFX1RBR30gY2FwYWJpbGl0eSB3YXMKKwkgKiAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHBhcmFtIHVuc2hhbGxvd0NvbW1pdHMKKwkgKiAgICAgICAgICAgICAgICBzaGFsbG93IGNvbW1pdHMgb24gdGhlIGNsaWVudCB0aGF0IGFyZSBub3cgYmVjb21pbmcKKwkgKiAgICAgICAgICAgICAgICB1bnNoYWxsb3cKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBnZW5lcmF0aW5nIG9yIHdyaXRpbmcgdGhlIHBhY2suCisJICovCiAJcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKGZpbmFsIGJvb2xlYW4gc2lkZWJhbmQsCi0JCQlQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCVBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248UmVmPiBhbGxUYWdzLAorCQkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUHJvZ3Jlc3NNb25pdG9yIHBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKIAkJT3V0cHV0U3RyZWFtIHBhY2tPdXQgPSByYXdPdXQ7CiAKQEAgLTE1ODMsMTEgKzIwMjAsMTggQEAKIAkJUGFja0NvbmZpZyBjZmcgPSBwYWNrQ29uZmlnOwogCQlpZiAoY2ZnID09IG51bGwpCiAJCQljZmcgPSBuZXcgUGFja0NvbmZpZyhkYik7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFBhY2tXcml0ZXIgaXMgcmVmZXJlbmNlZCBpbiB0aGUgZmluYWxseQorCQkJCQkJCQkJCS8vIGJsb2NrLCBhbmQgaXMgY2xvc2VkIHRoZXJlCiAJCWZpbmFsIFBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihjZmcsIHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksCiAJCQkJYWNjdW11bGF0b3IpOwogCQl0cnkgewogCQkJcHcuc2V0SW5kZXhEaXNhYmxlZCh0cnVlKTsKLQkJCXB3LnNldFVzZUNhY2hlZFBhY2tzKHRydWUpOworCQkJaWYgKGZpbHRlckJsb2JMaW1pdCA+PSAwKSB7CisJCQkJcHcuc2V0RmlsdGVyQmxvYkxpbWl0KGZpbHRlckJsb2JMaW1pdCk7CisJCQkJcHcuc2V0VXNlQ2FjaGVkUGFja3MoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlwdy5zZXRVc2VDYWNoZWRQYWNrcyh0cnVlKTsKKwkJCX0KIAkJCXB3LnNldFVzZUJpdG1hcHMoZGVwdGggPT0gMCAmJiBjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpOwogCQkJcHcuc2V0Q2xpZW50U2hhbGxvd0NvbW1pdHMoY2xpZW50U2hhbGxvd0NvbW1pdHMpOwogCQkJcHcuc2V0UmV1c2VEZWx0YUNvbW1pdHModHJ1ZSk7CkBAIC0xNTk1LDYgKzIwMzksOCBAQAogCQkJcHcuc2V0VGhpbihvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9USElOX1BBQ0spKTsKIAkJCXB3LnNldFJldXNlVmFsaWRhdGluZ09iamVjdHMoZmFsc2UpOwogCisJCQkvLyBPYmplY3RzIG5hbWVkIGRpcmVjdGx5IGJ5IHJlZmVyZW5jZXMgZ28gYXQgdGhlIGJlZ2lubmluZworCQkJLy8gb2YgdGhlIHBhY2suCiAJCQlpZiAoY29tbW9uQmFzZS5pc0VtcHR5KCkgJiYgcmVmcyAhPSBudWxsKSB7CiAJCQkJU2V0PE9iamVjdElkPiB0YWdUYXJnZXRzID0gbmV3IEhhc2hTZXQ8PigpOwogCQkJCWZvciAoUmVmIHJlZiA6IHJlZnMudmFsdWVzKCkpIHsKQEAgLTE2MjUsOCArMjA3MSw4IEBACiAJCQkJcncgPSBvdzsKIAkJCX0KIAotCQkJaWYgKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX0lOQ0xVREVfVEFHKSAmJiByZWZzICE9IG51bGwpIHsKLQkJCQlmb3IgKFJlZiByZWYgOiByZWZzLnZhbHVlcygpKSB7CisJCQlpZiAob3B0aW9ucy5jb250YWlucyhPUFRJT05fSU5DTFVERV9UQUcpICYmIGFsbFRhZ3MgIT0gbnVsbCkgeworCQkJCWZvciAoUmVmIHJlZiA6IGFsbFRhZ3MpIHsKIAkJCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKIAkJCQkJaWYgKG9iamVjdElkID09IG51bGwpIHsKIAkJCQkJCS8vIHNraXAgdW5ib3JuIGJyYW5jaApAQCAtMTY0NCw3ICsyMDkwLDcgQEAKIAkJCQkJfQogCiAJCQkJCWlmICghcmVmLmlzUGVlbGVkKCkpCi0JCQkJCQlyZWYgPSBkYi5wZWVsKHJlZik7CisJCQkJCQlyZWYgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAogCQkJCQlPYmplY3RJZCBwZWVsZWRJZCA9IHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJCQlvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwpAQCAtMTY2OSw3ICsyMTE1LDYgQEAKIAkJCXN0YXRpc3RpY3MgPSBwdy5nZXRTdGF0aXN0aWNzKCk7CiAJCQlpZiAoc3RhdGlzdGljcyAhPSBudWxsKSB7CiAJCQkJcG9zdFVwbG9hZEhvb2sub25Qb3N0VXBsb2FkKHN0YXRpc3RpY3MpOwotCQkJCWxvZ2dlci5vblBhY2tTdGF0aXN0aWNzKG5ldyBQYWNrV3JpdGVyLlN0YXRpc3RpY3Moc3RhdGlzdGljcykpOwogCQkJfQogCQkJcHcuY2xvc2UoKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTE0MThkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEdvb2dsZSBJbmMuCi0gKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLlBhY2tXcml0ZXI7Ci0KLS8qKgotICogTG9ncyBhY3Rpdml0eSB0aGF0IG9jY3VycmVkIHdpdGhpbgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2t9LgotICogPHA+Ci0gKiBJbXBsZW1lbnRvcnMgb2YgdGhlIGludGVyZmFjZSBhcmUgcmVzcG9uc2libGUgZm9yIGFzc29jaWF0aW5nIHRoZSBjdXJyZW50Ci0gKiB0aHJlYWQgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24sIGlmIHRoZXkgbmVlZCB0byBhbHNvIGluY2x1ZGUgY29ubmVjdGlvbgotICogaW5mb3JtYXRpb24uIE9uZSBtZXRob2QgaXMgdG8gdXNlIGEge0BsaW5rIGphdmEubGFuZy5UaHJlYWRMb2NhbH0gdG8gcmVtZW1iZXIKLSAqIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyBVcGxvYWRQYWNrLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUG9zdFVwbG9hZEhvb2t9IGluc3RlYWQKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBpbnRlcmZhY2UgVXBsb2FkUGFja0xvZ2dlciB7IC8vIFRPRE8gcmVtb3ZlIGluIEpHaXQgNS4wCi0JLyoqIEEgc2ltcGxlIG5vLW9wIGxvZ2dlci4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVwbG9hZFBhY2tMb2dnZXIgTlVMTCA9IG5ldyBVcGxvYWRQYWNrTG9nZ2VyKCkgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgb25QYWNrU3RhdGlzdGljcyhQYWNrV3JpdGVyLlN0YXRpc3RpY3Mgc3RhdHMpIHsKLQkJCS8vIERvIG5vdGhpbmcuCi0JCX0KLQl9OwotCi0JLyoqCi0JICogTm90aWNlIHRvIHRoZSBsb2dnZXIgYWZ0ZXIgYSBwYWNrIGhhcyBiZWVuIHNlbnQuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHMKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0aXN0aWNzIGFmdGVyIHNlbmRpbmcgYSBwYWNrIHRvIHRoZSBjbGllbnQuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyB2b2lkIG9uUGFja1N0YXRpc3RpY3MoUGFja1dyaXRlci5TdGF0aXN0aWNzIHN0YXRzKTsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXJDaGFpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlckNoYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTQ2NzIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlckNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExLCBHb29nbGUgSW5jLgotICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLlBhY2tXcml0ZXI7Ci0KLS8qKgotICogVXBsb2FkUGFja0xvZ2dlciB0aGF0IGRlbGVnYXRlcyB0byBhIGxpc3Qgb2Ygb3RoZXIgbG9nZ2Vycy4KLSAqIDxwPgotICogbG9nZ2VycyBhcmUgcnVuIGluIHRoZSBvcmRlciBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICoKLSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUG9zdFVwbG9hZEhvb2tDaGFpbn0KLSAqICAgICAgICAgICAgIGluc3RlYWQuCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgVXBsb2FkUGFja0xvZ2dlckNoYWluIGltcGxlbWVudHMgVXBsb2FkUGFja0xvZ2dlciB7Ci0JcHJpdmF0ZSBmaW5hbCBVcGxvYWRQYWNrTG9nZ2VyW10gbG9nZ2VyczsKLQlwcml2YXRlIGZpbmFsIGludCBjb3VudDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBsb2dnZXIgY2hhaW5pbmcgdGhlIGdpdmVuIGxvZ2dlcnMgdG9nZXRoZXIuCi0JICoKLQkgKiBAcGFyYW0gbG9nZ2VycwotCSAqICAgICAgICAgICAgbG9nZ2VycyB0byBleGVjdXRlLCBpbiBvcmRlci4KLQkgKiBAcmV0dXJuIGEgbmV3IGxvZ2dlciBjaGFpbiBvZiB0aGUgZ2l2ZW4gbG9nZ2Vycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwbG9hZFBhY2tMb2dnZXIgbmV3Q2hhaW4oCi0JCQlMaXN0PD8gZXh0ZW5kcyBVcGxvYWRQYWNrTG9nZ2VyPiBsb2dnZXJzKSB7Ci0JCVVwbG9hZFBhY2tMb2dnZXJbXSBuZXdMb2dnZXJzID0gbmV3IFVwbG9hZFBhY2tMb2dnZXJbbG9nZ2Vycy5zaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoVXBsb2FkUGFja0xvZ2dlciBsb2dnZXIgOiBsb2dnZXJzKQotCQkJaWYgKGxvZ2dlciAhPSBVcGxvYWRQYWNrTG9nZ2VyLk5VTEwpCi0JCQkJbmV3TG9nZ2Vyc1tpKytdID0gbG9nZ2VyOwotCQlpZiAoaSA9PSAwKQotCQkJcmV0dXJuIFVwbG9hZFBhY2tMb2dnZXIuTlVMTDsKLQkJZWxzZSBpZiAoaSA9PSAxKQotCQkJcmV0dXJuIG5ld0xvZ2dlcnNbMF07Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgVXBsb2FkUGFja0xvZ2dlckNoYWluKG5ld0xvZ2dlcnMsIGkpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgb25QYWNrU3RhdGlzdGljcyhQYWNrV3JpdGVyLlN0YXRpc3RpY3Mgc3RhdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQkJbG9nZ2Vyc1tpXS5vblBhY2tTdGF0aXN0aWNzKHN0YXRzKTsKLQl9Ci0KLQlwcml2YXRlIFVwbG9hZFBhY2tMb2dnZXJDaGFpbihVcGxvYWRQYWNrTG9nZ2VyW10gbG9nZ2VycywgaW50IGNvdW50KSB7Ci0JCXRoaXMubG9nZ2VycyA9IGxvZ2dlcnM7Ci0JCXRoaXMuY291bnQgPSBjb3VudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YQppbmRleCA2MTVlNDZiLi5iNDI0OGVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkRW5jcnlwdGlvbkFsZ29yaXRobSwgdikpOwogCX0KIAotCUlPRXhjZXB0aW9uIGVycm9yKGZpbmFsIFRocm93YWJsZSB3aHkpIHsKKwlJT0V4Y2VwdGlvbiBlcnJvcihUaHJvd2FibGUgd2h5KSB7CiAJCXJldHVybiBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAogCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZW5jcnlwdGlvbkVycm9yLAogCQkJCXdoeS5nZXRNZXNzYWdlKCkpLCB3aHkpOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB2YWxpZGF0ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1LCBmaW5hbCBTdHJpbmcgcHJlZml4KQorCQl2b2lkIHZhbGlkYXRlKEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXZhbGlkYXRlSW1wbCh1LCBwcmVmaXgsICIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CkBAIC0yNDAsMTkgKzI0MCwxOSBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgcmVxdWVzdChmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1LCBmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisJCXZvaWQgcmVxdWVzdChIdHRwVVJMQ29ubmVjdGlvbiB1LCBTdHJpbmcgcHJlZml4KSB7CiAJCQl1LnNldFJlcXVlc3RQcm9wZXJ0eShwcmVmaXggKyBKRVRTM1RfQ1JZUFRPX1ZFUiwgQ1JZUFRPX1ZFUik7CiAJCQl1LnNldFJlcXVlc3RQcm9wZXJ0eShwcmVmaXggKyBKRVRTM1RfQ1JZUFRPX0FMRywgY3J5cHRvQWxnKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHZhbGlkYXRlKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHUsIGZpbmFsIFN0cmluZyBwcmVmaXgpCisJCXZvaWQgdmFsaWRhdGUoSHR0cFVSTENvbm5lY3Rpb24gdSwgU3RyaW5nIHByZWZpeCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdmFsaWRhdGVJbXBsKHUsIHByZWZpeCwgQ1JZUFRPX1ZFUiwgY3J5cHRvQWxnKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlPdXRwdXRTdHJlYW0gZW5jcnlwdChmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU91dHB1dFN0cmVhbSBlbmNyeXB0KE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgQ2lwaGVyIGNpcGhlciA9IEluc2VjdXJlQ2lwaGVyRmFjdG9yeS5jcmVhdGUoY3J5cHRvQWxnKTsKIAkJCQljaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBzZWNyZXRLZXksIHBhcmFtU3BlYyk7CkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlJbnB1dFN0cmVhbSBkZWNyeXB0KGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBkZWNyeXB0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBDaXBoZXIgY2lwaGVyID0gSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmNyZWF0ZShjcnlwdG9BbGcpOwogCQkJCWNpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHNlY3JldEtleSwgcGFyYW1TcGVjKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YQppbmRleCA2NzA4OTY0Li45MzA3OTE0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0ZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00NCw4ICs0NCw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKQEAgLTU4LDcgKzU2LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tcG91bmRFeGNlcHRpb247CkBAIC0xOTAsNyArMTg3LDcgQEAKIAkvKiogSW5zZXJ0ZXIgdG8gcmVhZCBvYmplY3RzIGZyb20ge0BsaW5rICNsb2NhbH0uICovCiAJcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyOwogCi0JV2Fsa0ZldGNoQ29ubmVjdGlvbihmaW5hbCBXYWxrVHJhbnNwb3J0IHQsIGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSB3KSB7CisJV2Fsa0ZldGNoQ29ubmVjdGlvbihXYWxrVHJhbnNwb3J0IHQsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSB3KSB7CiAJCVRyYW5zcG9ydCB3dCA9IChUcmFuc3BvcnQpdDsKIAkJbG9jYWwgPSB3dC5sb2NhbDsKIAkJb2JqQ2hlY2sgPSB3dC5nZXRPYmplY3RDaGVja2VyKCk7CkBAIC0yNTksNyArMjU2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJCWxvY2tNZXNzYWdlID0gbWVzc2FnZTsKIAl9CiAKQEAgLTI2OCwxOCArMjY1LDE4IEBACiAJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCWluc2VydGVyLmNsb3NlKCk7CiAJCXJlYWRlci5jbG9zZSgpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVBhY2sgcCA6IHVuZmV0Y2hlZFBhY2tzKSB7CisJCWZvciAoUmVtb3RlUGFjayBwIDogdW5mZXRjaGVkUGFja3MpIHsKIAkJCWlmIChwLnRtcElkeCAhPSBudWxsKQogCQkJCXAudG1wSWR4LmRlbGV0ZSgpOwogCQl9Ci0JCWZvciAoZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHIgOiByZW1vdGVzKQorCQlmb3IgKFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSByIDogcmVtb3RlcykKIAkJCXIuY2xvc2UoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcXVldWVXYW50cyhmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudCkKKwlwcml2YXRlIHZvaWQgcXVldWVXYW50cyhDb2xsZWN0aW9uPFJlZj4gd2FudCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBIYXNoU2V0PE9iamVjdElkPiBpbldvcmtRdWV1ZSA9IG5ldyBIYXNoU2V0PD4oKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHdhbnQpIHsKKwkJZm9yIChSZWYgciA6IHdhbnQpIHsKIAkJCWZpbmFsIE9iamVjdElkIGlkID0gci5nZXRPYmplY3RJZCgpOwogCQkJaWYgKGlkID09IG51bGwpIHsKIAkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0zMDIsNyArMjk5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzKGZpbmFsIE9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2VzcyhPYmplY3RJZCBpZCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFJldk9iamVjdCBvYmo7CiAJCXRyeSB7CiAJCQlpZiAoaWQgaW5zdGFuY2VvZiBSZXZPYmplY3QpIHsKQEAgLTM0Miw3ICszMzksNyBAQAogCQlmZXRjaEVycm9ycy5yZW1vdmUoaWQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzQmxvYihmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0Jsb2IoUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlpZiAocmVhZGVyLmhhcyhvYmosIENvbnN0YW50cy5PQkpfQkxPQikpCiAJCQkJb2JqLmFkZChDT01QTEVURSk7CkBAIC0zNTYsNyArMzUzLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzVHJlZShmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1RyZWUoUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQl0cmVlV2Fsay5yZXNldChvYmopOwogCQkJd2hpbGUgKHRyZWVXYWxrLm5leHQoKSkgewpAQCAtMzg0LDIyICszODEsMjIgQEAKIAkJb2JqLmFkZChDT01QTEVURSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21taXQoZmluYWwgUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21taXQoUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFJldkNvbW1pdCBjb21taXQgPSAoUmV2Q29tbWl0KSBvYmo7CiAJCW1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShjb21taXQuZ2V0Q29tbWl0VGltZSgpKTsKIAkJbmVlZHMoY29tbWl0LmdldFRyZWUoKSk7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjb21taXQuZ2V0UGFyZW50cygpKQorCQlmb3IgKFJldkNvbW1pdCBwIDogY29tbWl0LmdldFBhcmVudHMoKSkKIAkJCW5lZWRzKHApOwogCQlvYmouYWRkKENPTVBMRVRFKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZyhmaW5hbCBSZXZPYmplY3Qgb2JqKSB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYWcoUmV2T2JqZWN0IG9iaikgewogCQlmaW5hbCBSZXZUYWcgdGFnID0gKFJldlRhZykgb2JqOwogCQluZWVkcyh0YWcuZ2V0T2JqZWN0KCkpOwogCQlvYmouYWRkKENPTVBMRVRFKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbmVlZHMoZmluYWwgUmV2T2JqZWN0IG9iaikgeworCXByaXZhdGUgdm9pZCBuZWVkcyhSZXZPYmplY3Qgb2JqKSB7CiAJCWlmIChvYmouaGFzKENPTVBMRVRFKSkKIAkJCXJldHVybjsKIAkJaWYgKCFvYmouaGFzKElOX1dPUktfUVVFVUUpKSB7CkBAIC00MDgsNyArNDA1LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBkb3dubG9hZE9iamVjdChmaW5hbCBQcm9ncmVzc01vbml0b3IgcG0sIGZpbmFsIEFueU9iamVjdElkIGlkKQorCXByaXZhdGUgdm9pZCBkb3dubG9hZE9iamVjdChQcm9ncmVzc01vbml0b3IgcG0sIEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWlmIChhbHJlYWR5SGF2ZShpZCkpCiAJCQlyZXR1cm47CkBAIC00NjIsNyArNDU5LDcgQEAKIAogCQkJCWlmIChwYWNrTmFtZUxpc3QgPT0gbnVsbCB8fCBwYWNrTmFtZUxpc3QuaXNFbXB0eSgpKQogCQkJCQljb250aW51ZTsKLQkJCQlmb3IgKGZpbmFsIFN0cmluZyBwYWNrTmFtZSA6IHBhY2tOYW1lTGlzdCkgeworCQkJCWZvciAoU3RyaW5nIHBhY2tOYW1lIDogcGFja05hbWVMaXN0KSB7CiAJCQkJCWlmIChwYWNrc0NvbnNpZGVyZWQuYWRkKHBhY2tOYW1lKSkKIAkJCQkJCXVuZmV0Y2hlZFBhY2tzLmFkZChuZXcgUmVtb3RlUGFjayh3cnIsIHBhY2tOYW1lKSk7CiAJCQkJfQpAQCAtNDc0LDcgKzQ3MSw3IEBACiAJCQkvLwogCQkJQ29sbGVjdGlvbjxXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2U+IGFsID0gZXhwYW5kT25lQWx0ZXJuYXRlKGlkLCBwbSk7CiAJCQlpZiAoYWwgIT0gbnVsbCAmJiAhYWwuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChmaW5hbCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYWx0IDogYWwpIHsKKwkJCQlmb3IgKFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBhbHQgOiBhbCkgewogCQkJCQlyZW1vdGVzLmFkZChhbHQpOwogCQkJCQlub1BhY2tzWWV0LmFkZChhbHQpOwogCQkJCQlub0FsdGVybmF0ZXNZZXQuYWRkKGFsdCk7CkBAIC00OTgsNyArNDk1LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5SGF2ZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBib29sZWFuIGFscmVhZHlIYXZlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJldHVybiByZWFkZXIuaGFzKGlkKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyb3IpIHsKQEAgLTY4OSwyMSArNjg2LDIxIEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxSZWZzQ29tcGxldGUoZmluYWwgU2V0PE9iamVjdElkPiBoYXZlKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzOworCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxSZWZzQ29tcGxldGUoU2V0PE9iamVjdElkPiBoYXZlKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJTGlzdDxSZWY+IHJlZnM7CiAJCXRyeSB7Ci0JCQlyZWZzID0gbG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7CisJCQlyZWZzID0gbG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQl0cnkgewogCQkJCW1hcmtMb2NhbE9iakNvbXBsZXRlKHJldldhbGsucGFyc2VBbnkoci5nZXRPYmplY3RJZCgpKSk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKIAkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmxvY2FsUmVmSXNNaXNzaW5nT2JqZWN0cywgci5nZXROYW1lKCkpLCByZWFkRXJyb3IpOwogCQkJfQogCQl9Ci0JCWZvciAoZmluYWwgT2JqZWN0SWQgaWQgOiBoYXZlKSB7CisJCWZvciAoT2JqZWN0SWQgaWQgOiBoYXZlKSB7CiAJCQl0cnkgewogCQkJCW1hcmtMb2NhbE9iakNvbXBsZXRlKHJldldhbGsucGFyc2VBbnkoaWQpKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHJlYWRFcnJvcikgewpAQCAtNzMyLDcgKzcyOSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya0xvY2FsQ29tbWl0c0NvbXBsZXRlKGZpbmFsIGludCB1bnRpbCkKKwlwcml2YXRlIHZvaWQgbWFya0xvY2FsQ29tbWl0c0NvbXBsZXRlKGludCB1bnRpbCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJZm9yICg7OykgewpAQCAtNzQyLDcgKzczOSw3IEBACiAJCQkJbG9jYWxDb21taXRRdWV1ZS5uZXh0KCk7CiAKIAkJCQltYXJrVHJlZUNvbXBsZXRlKGMuZ2V0VHJlZSgpKTsKLQkJCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5nZXRQYXJlbnRzKCkpCisJCQkJZm9yIChSZXZDb21taXQgcCA6IGMuZ2V0UGFyZW50cygpKQogCQkJCQlwdXNoTG9jYWxDb21taXQocCk7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewpAQCAtNzUwLDcgKzc0Nyw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcHVzaExvY2FsQ29tbWl0KGZpbmFsIFJldkNvbW1pdCBwKQorCXByaXZhdGUgdm9pZCBwdXNoTG9jYWxDb21taXQoUmV2Q29tbWl0IHApCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAocC5oYXMoTE9DQUxMWV9TRUVOKSkKIAkJCXJldHVybjsKQEAgLTc2MSw3ICs3NTgsNyBAQAogCQlsb2NhbENvbW1pdFF1ZXVlLmFkZChwKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya1RyZWVDb21wbGV0ZShmaW5hbCBSZXZUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIG1hcmtUcmVlQ29tcGxldGUoUmV2VHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAodHJlZS5oYXMoQ09NUExFVEUpKQogCQkJcmV0dXJuOwogCQl0cmVlLmFkZChDT01QTEVURSk7CkBAIC03OTUsNyArNzkyLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZWNvcmRFcnJvcihmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgVGhyb3dhYmxlIHdoYXQpIHsKKwlwcml2YXRlIHZvaWQgcmVjb3JkRXJyb3IoQW55T2JqZWN0SWQgaWQsIFRocm93YWJsZSB3aGF0KSB7CiAJCWZpbmFsIE9iamVjdElkIG9iaklkID0gaWQuY29weSgpOwogCQlMaXN0PFRocm93YWJsZT4gZXJyb3JzID0gZmV0Y2hFcnJvcnMuZ2V0KG9iaklkKTsKIAkJaWYgKGVycm9ycyA9PSBudWxsKSB7CkBAIC04MTYsNyArODEzLDcgQEAKIAogCQlQYWNrSW5kZXggaW5kZXg7CiAKLQkJUmVtb3RlUGFjayhmaW5hbCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYywgZmluYWwgU3RyaW5nIHBuKSB7CisJCVJlbW90ZVBhY2soV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIGMsIFN0cmluZyBwbikgewogCQkJY29ubmVjdGlvbiA9IGM7CiAJCQlwYWNrTmFtZSA9IHBuOwogCQkJaWR4TmFtZSA9IHBhY2tOYW1lLnN1YnN0cmluZygwLCBwYWNrTmFtZS5sZW5ndGgoKSAtIDUpICsgIi5pZHgiOyAvLyROT04tTkxTLTEkCkBAIC04MzQsNyArODMxLDcgQEAKIAkJCX0KIAkJfQogCi0JCXZvaWQgb3BlbkluZGV4KGZpbmFsIFByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBvcGVuSW5kZXgoUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaWYgKGluZGV4ICE9IG51bGwpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHRtcElkeCA9PSBudWxsKQpAQCAtODUzLDE3ICs4NTAsMTIgQEAKIAkJCXBtLmJlZ2luVGFzaygiR2V0ICIgKyBpZHhOYW1lLnN1YnN0cmluZygwLCAxMikgKyAiLi5pZHgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJcy5sZW5ndGggPCAwID8gUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04KIAkJCQkJCQk6IChpbnQpIChzLmxlbmd0aCAvIDEwMjQpKTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBJZHgpOwotCQkJCXRyeSB7Ci0JCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJaW50IGNudDsKLQkJCQkJd2hpbGUgKCFwbS5pc0NhbmNlbGxlZCgpICYmIChjbnQgPSBzLmluLnJlYWQoYnVmKSkgPj0gMCkgewotCQkJCQkJZm9zLndyaXRlKGJ1ZiwgMCwgY250KTsKLQkJCQkJCXBtLnVwZGF0ZShjbnQgLyAxMDI0KTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWZvcy5jbG9zZSgpOworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCkpIHsKKwkJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjA0OF07CisJCQkJaW50IGNudDsKKwkJCQl3aGlsZSAoIXBtLmlzQ2FuY2VsbGVkKCkgJiYgKGNudCA9IHMuaW4ucmVhZChidWYpKSA+PSAwKSB7CisJCQkJCWZvcy53cml0ZShidWYsIDAsIGNudCk7CisJCQkJCXBtLnVwZGF0ZShjbnQgLyAxMDI0KTsKIAkJCQl9CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKIAkJCQlGaWxlVXRpbHMuZGVsZXRlKHRtcElkeCk7CkBAIC04ODYsNyArODc4LDcgQEAKIAkJCX0KIAkJfQogCi0JCXZvaWQgZG93bmxvYWRQYWNrKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGRvd25sb2FkUGFjayhQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCVN0cmluZyBuYW1lID0gInBhY2svIiArIHBhY2tOYW1lOyAvLyROT04tTkxTLTEkCiAJCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuRmlsZVN0cmVhbSBzID0gY29ubmVjdGlvbi5vcGVuKG5hbWUpOwogCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1B1c2hDb25uZWN0aW9uLmphdmEKaW5kZXggY2Y1MGM1MS4uNGM3NTQyNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1B1c2hDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1B1c2hDb25uZWN0aW9uLmphdmEKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQkvLyByZWYgdXNpbmcgdGhlIGRpcmVjdG9yeSBuYW1lIGJlaW5nIGNyZWF0ZWQuCiAJCS8vCiAJCWZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CiAJCQlmaW5hbCBTdHJpbmcgbiA9IHUuZ2V0UmVtb3RlTmFtZSgpOwogCQkJaWYgKCFuLnN0YXJ0c1dpdGgoInJlZnMvIikgfHwgIVJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUobikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCXUuc2V0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9PVEhFUl9SRUFTT04pOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCS8vCiAJCWlmICghdXBkYXRlcy5pc0VtcHR5KCkpCiAJCQlzZW5kcGFjayh1cGRhdGVzLCBtb25pdG9yKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpCisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKQogCQkJdXBkYXRlQ29tbWFuZCh1KTsKIAogCQkvLyBJcyB0aGlzIGEgbmV3IHJlcG9zaXRvcnk/IElmIHNvIHdlIHNob3VsZCBjcmVhdGUgYWRkaXRpb25hbApAQCAtMTk2LDEwICsxOTYsMTAgQEAKIAkJaWYgKCFwYWNrZWRSZWZVcGRhdGVzLmlzRW1wdHkoKSkgewogCQkJdHJ5IHsKIAkJCQlyZWZXcml0ZXIud3JpdGVQYWNrZWRSZWZzKCk7Ci0JCQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHBhY2tlZFJlZlVwZGF0ZXMpCisJCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHBhY2tlZFJlZlVwZGF0ZXMpCiAJCQkJCXUuc2V0U3RhdHVzKFN0YXR1cy5PSyk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykgeworCQkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKSB7CiAJCQkJCXUuc2V0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9PVEhFUl9SRUFTT04pOwogCQkJCQl1LnNldE1lc3NhZ2UoZXJyLmdldE1lc3NhZ2UoKSk7CiAJCQkJfQpAQCAtMjI1LDE0ICsyMjUsMTQgQEAKIAkJU3RyaW5nIHBhdGhQYWNrID0gbnVsbDsKIAkJU3RyaW5nIHBhdGhJZHggPSBudWxsOwogCi0JCXRyeSAoZmluYWwgUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAorCQl0cnkgKFBhY2tXcml0ZXIgd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIodHJhbnNwb3J0LmdldFBhY2tDb25maWcoKSwKIAkJCQlsb2NhbC5uZXdPYmplY3RSZWFkZXIoKSkpIHsKIAogCQkJZmluYWwgU2V0PE9iamVjdElkPiBuZWVkID0gbmV3IEhhc2hTZXQ8PigpOwogCQkJZmluYWwgU2V0PE9iamVjdElkPiBoYXZlID0gbmV3IEhhc2hTZXQ8PigpOwotCQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgciA6IHVwZGF0ZXMpCisJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSByIDogdXBkYXRlcykKIAkJCQluZWVkLmFkZChyLmdldE5ld09iamVjdElkKCkpOwotCQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFJlZnMoKSkgeworCQkJZm9yIChSZWYgciA6IGdldFJlZnMoKSkgewogCQkJCWhhdmUuYWRkKHIuZ2V0T2JqZWN0SWQoKSk7CiAJCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCQloYXZlLmFkZChyLmdldFBlZWxlZE9iamVjdElkKCkpOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCQkJcmV0dXJuOwogCiAJCQlwYWNrTmFtZXMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogZGVzdC5nZXRQYWNrTmFtZXMoKSkKKwkJCWZvciAoU3RyaW5nIG4gOiBkZXN0LmdldFBhY2tOYW1lcygpKQogCQkJCXBhY2tOYW1lcy5wdXQobiwgbik7CiAKIAkJCWZpbmFsIFN0cmluZyBiYXNlID0gInBhY2stIiArIHdyaXRlci5jb21wdXRlTmFtZSgpLm5hbWUoKTsgLy8kTk9OLU5MUy0xJApAQCAtMjk1LDcgKzI5NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgc2FmZURlbGV0ZShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgdm9pZCBzYWZlRGVsZXRlKFN0cmluZyBwYXRoKSB7CiAJCWlmIChwYXRoICE9IG51bGwpIHsKIAkJCXRyeSB7CiAJCQkJZGVzdC5kZWxldGVGaWxlKHBhdGgpOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZGVsZXRlQ29tbWFuZChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSkgeworCXByaXZhdGUgdm9pZCBkZWxldGVDb21tYW5kKFJlbW90ZVJlZlVwZGF0ZSB1KSB7CiAJCWZpbmFsIFJlZiByID0gbmV3UmVmcy5yZW1vdmUodS5nZXRSZW1vdGVOYW1lKCkpOwogCQlpZiAociA9PSBudWxsKSB7CiAJCQkvLyBBbHJlYWR5IGdvbmUuCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGVDb21tYW5kKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1KSB7CisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbW1hbmQoUmVtb3RlUmVmVXBkYXRlIHUpIHsKIAkJdHJ5IHsKIAkJCWRlc3Qud3JpdGVSZWYodS5nZXRSZW1vdGVOYW1lKCksIHUuZ2V0TmV3T2JqZWN0SWQoKSk7CiAJCQluZXdSZWZzLnB1dCh1LmdldFJlbW90ZU5hbWUoKSwgbmV3IE9iamVjdElkUmVmLlVucGVlbGVkKApAQCAtMzU0LDcgKzM1NCw3IEBACiAJCQkJJiYgcGFja05hbWVzLmlzRW1wdHkoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlTmV3UmVwb3NpdG9yeShmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykKKwlwcml2YXRlIHZvaWQgY3JlYXRlTmV3UmVwb3NpdG9yeShMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgU3RyaW5nIHJlZiA9ICJyZWY6ICIgKyBwaWNrSEVBRCh1cGRhdGVzKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMzc0LDEyICszNzQsMTIgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwaWNrSEVBRChmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBwaWNrSEVBRChMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgewogCQkvLyBUcnkgdG8gdXNlIG1hc3RlciBpZiB0aGUgdXNlciBpcyBwdXNoaW5nIHRoYXQsIGl0IGlzIHRoZQogCQkvLyBkZWZhdWx0IGJyYW5jaCBhbmQgaXMgbGlrZWx5IHdoYXQgdGhleSB3YW50IHRvIHJlbWFpbiBhcwogCQkvLyB0aGUgZGVmYXVsdCBvbiB0aGUgbmV3IHJlbW90ZS4KIAkJLy8KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gdS5nZXRSZW1vdGVOYW1lKCk7CiAJCQlpZiAobi5lcXVhbHMoQ29uc3RhbnRzLlJfSEVBRFMgKyBDb25zdGFudHMuTUFTVEVSKSkKIAkJCQlyZXR1cm4gbjsKQEAgLTM4OCw3ICszODgsNyBAQAogCQkvLyBQaWNrIGFueSBicmFuY2gsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoZSB1c2VyIHB1c2hlZCBvbmx5CiAJCS8vIG9uZSB0byB0aGUgcmVtb3RlIHNpZGUuCiAJCS8vCi0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CiAJCQlmaW5hbCBTdHJpbmcgbiA9IHUuZ2V0UmVtb3RlTmFtZSgpOwogCQkJaWYgKG4uc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQkJcmV0dXJuIG47CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhCmluZGV4IDk2NWJlNTAuLmFhNzFjOTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgZGVsZXRpb24gZmFpbGVkLgogCSAqLwotCXZvaWQgZGVsZXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5kZWxldGluZ05vdFN1cHBvcnRlZCwgcGF0aCkpOwogCX0KIApAQCAtMjYzLDcgKzI2Myw3IEBACiAJICogICAgICAgICAgICAgd3JpdGluZyBpcyBub3Qgc3VwcG9ydGVkLCBvciBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBmaWxlCiAJICogICAgICAgICAgICAgZmFpbGVkLCBwb3NzaWJseSBkdWUgdG8gcGVybWlzc2lvbnMgb3IgcmVtb3RlIGRpc2sgZnVsbCwgZXRjLgogCSAqLwotCXZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlRmlsZShTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoT3V0cHV0U3RyZWFtIG9zID0gd3JpdGVGaWxlKHBhdGgsIG51bGwsIG51bGwpKSB7CiAJCQlvcy53cml0ZShkYXRhKTsKIAkJfQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGRlbGV0aW9uIGZhaWxlZC4KIAkgKi8KLQl2b2lkIGRlbGV0ZVJlZihmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGRlbGV0ZVJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlRmlsZShST09UX0RJUiArIG5hbWUpOwogCX0KIApAQCAtMjkxLDcgKzI5MSw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGRlbGV0aW9uIGZhaWxlZC4KIAkgKi8KLQl2b2lkIGRlbGV0ZVJlZkxvZyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGRlbGV0ZVJlZkxvZyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlRmlsZShST09UX0RJUiArIENvbnN0YW50cy5MT0dTICsgIi8iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTMwOSw3ICszMDksNyBAQAogCSAqICAgICAgICAgICAgIHdyaXRpbmcgaXMgbm90IHN1cHBvcnRlZCwgb3IgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZmlsZQogCSAqICAgICAgICAgICAgIGZhaWxlZCwgcG9zc2libHkgZHVlIHRvIHBlcm1pc3Npb25zIG9yIHJlbW90ZSBkaXNrIGZ1bGwsIGV0Yy4KIAkgKi8KLQl2b2lkIHdyaXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3RJZCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlUmVmKFN0cmluZyBuYW1lLCBPYmplY3RJZCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGI7CiAKIAkJYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIICsgMSk7CkBAIC0zMzMsOSArMzMzLDkgQEAKIAkgKiAgICAgICAgICAgICB3cml0aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGZpbGUKIAkgKiAgICAgICAgICAgICBmYWlsZWQsIHBvc3NpYmx5IGR1ZSB0byBwZXJtaXNzaW9ucyBvciByZW1vdGUgZGlzayBmdWxsLCBldGMuCiAJICovCi0Jdm9pZCB3cml0ZUluZm9QYWNrcyhmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcGFja05hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGVJbmZvUGFja3MoQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2tOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciB3ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IHBhY2tOYW1lcykgeworCQlmb3IgKFN0cmluZyBuIDogcGFja05hbWVzKSB7CiAJCQl3LmFwcGVuZCgiUCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJdy5hcHBlbmQobik7CiAJCQl3LmFwcGVuZCgnXG4nKTsKQEAgLTM2MSw3ICszNjEsNyBAQAogCSAqICAgICAgICAgICAgIGV4aXN0cywgb3IgYWZ0ZXIgaXQgd2FzIGRldGVybWluZWQgdG8gZXhpc3QgYnV0IGJlZm9yZSB0aGUKIAkgKiAgICAgICAgICAgICBzdHJlYW0gY291bGQgYmUgY3JlYXRlZC4KIAkgKi8KLQlCdWZmZXJlZFJlYWRlciBvcGVuUmVhZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCUJ1ZmZlcmVkUmVhZGVyIG9wZW5SZWFkZXIoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIElucHV0U3RyZWFtIGlzID0gb3BlbihwYXRoKS5pbjsKIAkJcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIENvbnN0YW50cy5DSEFSU0VUKSk7CiAJfQpAQCAtNDE0LDcgKzQxNCw3IEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIGZyb20gdGhlIHBhY2tlZCByZWZzIGZpbGUuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFBhY2tlZFJlZnMoZmluYWwgTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKKwlwcm90ZWN0ZWQgdm9pZCByZWFkUGFja2VkUmVmcyhNYXA8U3RyaW5nLCBSZWY+IGF2YWlsKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBvcGVuUmVhZGVyKFJPT1RfRElSICsgQ29uc3RhbnRzLlBBQ0tFRF9SRUZTKSkgewogCQkJcmVhZFBhY2tlZFJlZnNJbXBsKGF2YWlsLCBicik7CkBAIC00NzUsNyArNDc1LDcgQEAKIAkJICogICAgICAgICAgICBzdHJlYW0gY29udGFpbmluZyB0aGUgZmlsZSBkYXRhLiBUaGlzIHN0cmVhbSB3aWxsIGJlCiAJCSAqICAgICAgICAgICAgY2xvc2VkIGJ5IHRoZSBjYWxsZXIgd2hlbiByZWFkaW5nIGlzIGNvbXBsZXRlLgogCQkgKi8KLQkJRmlsZVN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpKSB7CisJCUZpbGVTdHJlYW0oSW5wdXRTdHJlYW0gaSkgewogCQkJaW4gPSBpOwogCQkJbGVuZ3RoID0gLTE7CiAJCX0KQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQkgKiAgICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcgdGhyb3VnaAogCQkgKiAgICAgICAgICAgIDxjb2RlPmk8L2NvZGU+LgogCQkgKi8KLQkJRmlsZVN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpLCBmaW5hbCBsb25nIG4pIHsKKwkJRmlsZVN0cmVhbShJbnB1dFN0cmVhbSBpLCBsb25nIG4pIHsKIAkJCWluID0gaTsKIAkJCWxlbmd0aCA9IG47CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKaW5kZXggMTZhNmY0YS4uNjBhY2QyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAKIAkgKiAgICAgICAgICAgIGlmIHRydWUsIGV4cG9ydHMgYWxsIHJlcG9zaXRvcmllcywgaWdub3JpbmcgdGhlIGNoZWNrIGZvciB0aGUKIAkgKiAgICAgICAgICAgIHtAY29kZSBnaXQtZGFlbW9uLWV4cG9ydC1va30gZmlsZXMuCiAJICovCi0JcHVibGljIEZpbGVSZXNvbHZlcihmaW5hbCBGaWxlIGJhc2VQYXRoLCBmaW5hbCBib29sZWFuIGV4cG9ydEFsbCkgeworCXB1YmxpYyBGaWxlUmVzb2x2ZXIoRmlsZSBiYXNlUGF0aCwgYm9vbGVhbiBleHBvcnRBbGwpIHsKIAkJdGhpcygpOwogCQlleHBvcnREaXJlY3RvcnkoYmFzZVBhdGgpOwogCQlzZXRFeHBvcnRBbGwoZXhwb3J0QWxsKTsKQEAgLTk1LDcgKzk1LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlcG9zaXRvcnkgb3BlbihmaW5hbCBDIHJlcSwgZmluYWwgU3RyaW5nIG5hbWUpCisJcHVibGljIFJlcG9zaXRvcnkgb3BlbihDIHJlcSwgU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiB7CiAJCWlmIChpc1VucmVhc29uYWJsZU5hbWUobmFtZSkpCiAJCQl0aHJvdyBuZXcgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJICoKIAkgKiBAcGFyYW0gZXhwb3J0IGEgYm9vbGVhbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRBbGwoZmluYWwgYm9vbGVhbiBleHBvcnQpIHsKKwlwdWJsaWMgdm9pZCBzZXRFeHBvcnRBbGwoYm9vbGVhbiBleHBvcnQpIHsKIAkJZXhwb3J0QWxsID0gZXhwb3J0OwogCX0KIApAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogICAgICAgICAgICBnaXQgcmVwb3NpdG9yeSwgYnV0IGFueSBkaXJlY3RvcnkgYmVsb3cgaXQgd2hpY2ggaGFzIGEgZmlsZQogCSAqICAgICAgICAgICAgbmFtZWQgPGNvZGU+Z2l0LWRhZW1vbi1leHBvcnQtb2s8L2NvZGU+IHdpbGwgYmUgcHVibGlzaGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGV4cG9ydERpcmVjdG9yeShmaW5hbCBGaWxlIGRpcikgeworCXB1YmxpYyB2b2lkIGV4cG9ydERpcmVjdG9yeShGaWxlIGRpcikgewogCQlleHBvcnRCYXNlLmFkZChkaXIpOwogCX0KIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJCXJldHVybiBuYW1lICsgQ29uc3RhbnRzLkRPVF9HSVRfRVhUOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbnJlYXNvbmFibGVOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VucmVhc29uYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybiB0cnVlOyAvLyBubyBlbXB0eSBwYXRocwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggYTc5MDBmMC4uNDcwZWQwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9BYnN0cmFjdFRyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YQpAQCAtMTc2LDcgKzE3Niw3IEBACiAJICogICAgICAgICAgICByb290IG9mIHRoZSByZXBvc2l0b3J5LiBBIHRyYWlsaW5nIHNsYXNoICgnLycpIGlzCiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIHRoZSBwcmVmaXggZG9lcyBub3QgZW5kIGluICcvJy4KIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgU3RyaW5nIHByZWZpeCkgeworCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihTdHJpbmcgcHJlZml4KSB7CiAJCXBhcmVudCA9IG51bGw7CiAKIAkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKQEAgLTIxMCw3ICsyMTAsNyBAQAogCSAqICAgICAgICAgICAgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeS4gQSB0cmFpbGluZyBzbGFzaCAoJy8nKSBpcwogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiB0aGUgcHJlZml4IGRvZXMgbm90IGVuZCBpbiAnLycuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIGJ5dGVbXSBwcmVmaXgpIHsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYnl0ZVtdIHByZWZpeCkgewogCQlwYXJlbnQgPSBudWxsOwogCiAJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoID4gMCkgewpAQCAtMjMyLDcgKzIzMiw3IEBACiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBhcmVudCB0cmVlIGl0ZXJhdG9yLgogCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcGFyZW50ID0gcDsKIAkJcGF0aCA9IHAucGF0aDsKIAkJcGF0aE9mZnNldCA9IHAucGF0aExlbiArIDE7CkBAIC0yNzUsNyArMjc1LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBsaXZlIGJ5dGVzIGluIHRoZSBwYXRoIGJ1ZmZlci4gVGhpcyBtYW55IGJ5dGVzIHdpbGwKIAkgKiAgICAgICAgICAgIGJlIG1vdmVkIGludG8gdGhlIGxhcmdlciBidWZmZXIuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZ3Jvd1BhdGgoZmluYWwgaW50IGxlbikgeworCXByb3RlY3RlZCB2b2lkIGdyb3dQYXRoKGludCBsZW4pIHsKIAkJc2V0UGF0aENhcGFjaXR5KHBhdGgubGVuZ3RoIDw8IDEsIGxlbik7CiAJfQogCkBAIC0yODcsNyArMjg3LDcgQEAKIAkgKiBAcGFyYW0gbGVuCiAJICogICAgICAgICAgICB0aGUgYW1vdW50IG9mIGxpdmUgYnl0ZXMgaW4gcGF0aCBidWZmZXIKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVQYXRoQ2FwYWNpdHkoZmluYWwgaW50IGNhcGFjaXR5LCBmaW5hbCBpbnQgbGVuKSB7CisJcHJvdGVjdGVkIHZvaWQgZW5zdXJlUGF0aENhcGFjaXR5KGludCBjYXBhY2l0eSwgaW50IGxlbikgewogCQlpZiAocGF0aC5sZW5ndGggPj0gY2FwYWNpdHkpCiAJCQlyZXR1cm47CiAJCWZpbmFsIGJ5dGVbXSBvID0gcGF0aDsKQEAgLTMyMiwxMSArMzIyLDExIEBACiAJICogQHJldHVybiAtMSBpZiB0aGlzIGVudHJ5IHNvcnRzIGZpcnN0OyAwIGlmIHRoZSBlbnRyaWVzIGFyZSBlcXVhbDsgMSBpZgogCSAqICAgICAgICAgcCdzIGVudHJ5IHNvcnRzIGZpcnN0LgogCSAqLwotCXB1YmxpYyBpbnQgcGF0aENvbXBhcmUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCXB1YmxpYyBpbnQgcGF0aENvbXBhcmUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgewogCQlyZXR1cm4gcGF0aENvbXBhcmUocCwgcC5tb2RlKTsKIAl9CiAKLQlpbnQgcGF0aENvbXBhcmUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCwgZmluYWwgaW50IHBNb2RlKSB7CisJaW50IHBhdGhDb21wYXJlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHAsIGludCBwTW9kZSkgewogCQkvLyBJdHMgY29tbW9uIHdoZW4gd2UgYXJlIGEgc3VidHJlZSBmb3IgYm90aCBwYXJlbnRzIHRvIG1hdGNoOwogCQkvLyB3aGVuIHRoaXMgaGFwcGVucyBldmVyeXRoaW5nIGluIHBhdGhbMC4uY1Bvc10gaXMga25vd24gdG8KIAkJLy8gYmUgZXF1YWwgYW5kIGRvZXMgbm90IHJlcXVpcmUgZXZhbHVhdGlvbiBhZ2Fpbi4KQEAgLTQyMCw3ICs0MjAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGl0ZXJhdG9yIHRvIHRlc3QgYWdhaW5zdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgYm90aCBpdGVyYXRvcnMgaGF2ZSB0aGUgc2FtZSBvYmplY3QgaWQ7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG90aGVySXRlcmF0b3IpIHsKKwlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKEFic3RyYWN0VHJlZUl0ZXJhdG9yIG90aGVySXRlcmF0b3IpIHsKIAkJcmV0dXJuIE9iamVjdElkLmVxdWFscyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpLAogCQkJCW90aGVySXRlcmF0b3IuaWRCdWZmZXIoKSwgb3RoZXJJdGVyYXRvci5pZE9mZnNldCgpKTsKIAl9CkBAIC00NDcsNyArNDQ3LDcgQEAKIAkgKiBAcGFyYW0gb3V0CiAJICogICAgICAgICAgICBidWZmZXIgdG8gY29weSB0aGUgb2JqZWN0IGlkIGludG8uCiAJICovCi0JcHVibGljIHZvaWQgZ2V0RW50cnlPYmplY3RJZChmaW5hbCBNdXRhYmxlT2JqZWN0SWQgb3V0KSB7CisJcHVibGljIHZvaWQgZ2V0RW50cnlPYmplY3RJZChNdXRhYmxlT2JqZWN0SWQgb3V0KSB7CiAJCW91dC5mcm9tUmF3KGlkQnVmZmVyKCksIGlkT2Zmc2V0KCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXIuamF2YQppbmRleCA3MTExM2E2Li4wMTk5Njg4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXIuamF2YQpAQCAtMTE5LDcgKzExOSw3IEBACiAJCXJlc2V0KHJlYWRlciwgdHJlZUlkKTsKIAl9CiAKLQlwcml2YXRlIENhbm9uaWNhbFRyZWVQYXJzZXIoZmluYWwgQ2Fub25pY2FsVHJlZVBhcnNlciBwKSB7CisJcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyKENhbm9uaWNhbFRyZWVQYXJzZXIgcCkgewogCQlzdXBlcihwKTsKIAl9CiAKQEAgLTE0MCw3ICsxNDAsNyBAQAogCSAqIEBwYXJhbSB0cmVlRGF0YQogCSAqICAgICAgICAgICAgdGhlIHJhdyB0cmVlIGNvbnRlbnQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgYnl0ZVtdIHRyZWVEYXRhKSB7CisJcHVibGljIHZvaWQgcmVzZXQoYnl0ZVtdIHRyZWVEYXRhKSB7CiAJCWF0dHJpYnV0ZXNOb2RlID0gbnVsbDsKIAkJcmF3ID0gdHJlZURhdGE7CiAJCXByZXZQdHIgPSAtMTsKQEAgLTIxOSw3ICsyMTksNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwdWJsaWMgdm9pZCByZXNldChPYmplY3RSZWFkZXIgcmVhZGVyLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJlc2V0KHJlYWRlci5vcGVuKGlkLCBPQkpfVFJFRSkuZ2V0Q2FjaGVkQnl0ZXMoKSk7CiAJfQpAQCAtMjYyLDcgKzI2Miw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBDYW5vbmljYWxUcmVlUGFyc2VyIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBDYW5vbmljYWxUcmVlUGFyc2VyIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihyZWFkZXIsIG5ldyBNdXRhYmxlT2JqZWN0SWQoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhCmluZGV4IDU5NmQzZDAuLmY1ZDQ1YzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0VtcHR5VHJlZUl0ZXJhdG9yLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkJLy8gQ3JlYXRlIGEgcm9vdCBlbXB0eSB0cmVlLgogCX0KIAotCUVtcHR5VHJlZUl0ZXJhdG9yKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlFbXB0eVRyZWVJdGVyYXRvcihBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXN1cGVyKHApOwogCQlwYXRoTGVuID0gcGF0aE9mZnNldDsKIAl9CkBAIC05Miw3ICs5Miw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbmV3IEVtcHR5VHJlZUl0ZXJhdG9yKHRoaXMpOwogCX0KQEAgLTE0MSwxMyArMTQxLDEzIEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5leHQoZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgbmV4dChpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gRG8gbm90aGluZy4KIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGJhY2soZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgYmFjayhpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gRG8gbm90aGluZy4KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggOGRmNzY0ZC4uMjRiOWFjMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEKQEAgLTUyLDYgKzUyLDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CkBAIC02Nyw2ICs2OCw3IEBACiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30uCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlVHJlZUl0ZXJhdG9yIGV4dGVuZHMgV29ya2luZ1RyZWVJdGVyYXRvciB7CisKIAkvKioKIAkgKiB0aGUgc3RhcnRpbmcgZGlyZWN0b3J5IG9mIHRoaXMgSXRlcmF0b3IuIEFsbCBlbnRyaWVzIGFyZSBsb2NhdGVkIGRpcmVjdGx5CiAJICogaW4gdGhpcyBkaXJlY3RvcnkuCkBAIC0xMzAsNyArMTMyLDcgQEAKIAkgKiBAcGFyYW0gb3B0aW9ucwogCSAqICAgICAgICAgICAgd29ya2luZyB0cmVlIG9wdGlvbnMgdG8gYmUgdXNlZAogCSAqLwotCXB1YmxpYyBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIEZpbGUgcm9vdCwgRlMgZnMsIFdvcmtpbmdUcmVlT3B0aW9ucyBvcHRpb25zKSB7CisJcHVibGljIEZpbGVUcmVlSXRlcmF0b3IoRmlsZSByb290LCBGUyBmcywgV29ya2luZ1RyZWVPcHRpb25zIG9wdGlvbnMpIHsKIAkJdGhpcyhyb290LCBmcywgb3B0aW9ucywgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kuSU5TVEFOQ0UpOwogCX0KIApAQCAtMTcxLDI3ICsxNzMsNiBAQAogCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KIAkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KIAkgKiBAc2luY2UgNC4zCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjRmlsZVRyZWVJdGVyYXRvcihGaWxlVHJlZUl0ZXJhdG9yLCBGaWxlLCBGUyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIFdvcmtpbmdUcmVlSXRlcmF0b3IgcCwgZmluYWwgRmlsZSByb290LAotCQkJRlMgZnMpIHsKLQkJdGhpcyhwLCByb290LCBmcywgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kuSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpdGVyYXRvciB0byB0cmF2ZXJzZSBhIHN1YmRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGl0ZXJhdG9yIHdlIHdlcmUgY3JlYXRlZCBmcm9tLgotCSAqIEBwYXJhbSByb290Ci0JICogICAgICAgICAgICB0aGUgc3ViZGlyZWN0b3J5LiBUaGlzIHNob3VsZCBiZSBhIGRpcmVjdG9yeSBjb250YWluZWQgd2l0aGluCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLQkgKiBAcGFyYW0gZnMKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCi0JICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCi0JICogQHNpbmNlIDQuMwogCSAqLwogCXByb3RlY3RlZCBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIEZpbGVUcmVlSXRlcmF0b3IgcCwgZmluYWwgRmlsZSByb290LAogCQkJRlMgZnMpIHsKQEAgLTIyNiwxOSArMjA3LDM5IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGVUcmVlSXRlcmF0b3IodGhpcywgKChGaWxlRW50cnkpIGN1cnJlbnQoKSkuZ2V0RmlsZSgpLCBmcywgZmlsZU1vZGVTdHJhdGVneSk7CisJCWlmICghd2Fsa3NJZ25vcmVkRGlyZWN0b3JpZXMoKSAmJiBpc0VudHJ5SWdub3JlZCgpKSB7CisJCQlEaXJDYWNoZUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RGlyQ2FjaGVJdGVyYXRvcigpOworCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IEVtcHR5VHJlZUl0ZXJhdG9yKHRoaXMpOworCQkJfQorCQkJLy8gT25seSBlbnRlciBpZiB3ZSBoYXZlIGFuIGFzc29jaWF0ZWQgRGlyQ2FjaGVJdGVyYXRvciB0aGF0IGlzCisJCQkvLyBhdCB0aGUgc2FtZSBlbnRyeSAod2hpY2ggaW5kaWNhdGVzIHRoZXJlIGlzIHNvbWUgYWxyZWFkeQorCQkJLy8gdHJhY2tlZCBmaWxlIHVuZGVybmVhdGggdGhpcyBkaXJlY3RvcnkpLiBPdGhlcndpc2UgdGhlCisJCQkvLyBkaXJlY3RvcnkgaXMgaW5kZWVkIGlnbm9yZWQgYW5kIGNhbiBiZSBza2lwcGVkIGVudGlyZWx5LgorCQl9CisJCXJldHVybiBlbnRlclN1YnRyZWUoKTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBpdGVyYXRvciBmb3IgdGhlIGN1cnJlbnQgZW50cnkncyBzdWJ0cmVlLgorCSAqIDxwPgorCSAqIFRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBpdGVyYXRvciBtdXN0IGJlIDxjb2RlPnRoaXM8L2NvZGU+LCBvdGhlcndpc2UKKwkgKiB0aGUgY2FsbGVyIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGV4aXQgb3V0IG9mIHRoZSBzdWJ0cmVlIGl0ZXJhdG9yCisJICogY29ycmVjdGx5IGFuZCByZXR1cm4gdG8gY29udGludWUgd2Fsa2luZyA8Y29kZT50aGlzPC9jb2RlPi4KKwkgKgorCSAqIEByZXR1cm4gYSBuZXcgaXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBjdXJyZW50IHN1YnRyZWUuCisJICogQHNpbmNlIDUuMAorCSAqLworCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvciBlbnRlclN1YnRyZWUoKSB7CisJCXJldHVybiBuZXcgRmlsZVRyZWVJdGVyYXRvcih0aGlzLCAoKEZpbGVFbnRyeSkgY3VycmVudCgpKS5nZXRGaWxlKCksIGZzLAorCQkJCWZpbGVNb2RlU3RyYXRlZ3kpOwogCX0KIAogCXByaXZhdGUgRW50cnlbXSBlbnRyaWVzKCkgewotCQlmaW5hbCBGaWxlW10gYWxsID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlpZiAoYWxsID09IG51bGwpCi0JCQlyZXR1cm4gRU9GOwotCQlmaW5hbCBFbnRyeVtdIHIgPSBuZXcgRW50cnlbYWxsLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykKLQkJCXJbaV0gPSBuZXcgRmlsZUVudHJ5KGFsbFtpXSwgZnMsIGZpbGVNb2RlU3RyYXRlZ3kpOwotCQlyZXR1cm4gcjsKKwkJcmV0dXJuIGZzLmxpc3QoZGlyZWN0b3J5LCBmaWxlTW9kZVN0cmF0ZWd5KTsKIAl9CiAKIAkvKioKQEAgLTI2Nyw3ICsyNjgsNyBAQAogCSAqCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXN0YXRpYyBwdWJsaWMgY2xhc3MgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kgaW1wbGVtZW50cyBGaWxlTW9kZVN0cmF0ZWd5IHsKKwlwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHRGaWxlTW9kZVN0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CiAJCS8qKgogCQkgKiBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBGaWxlTW9kZVN0cmF0ZWd5CiAJCSAqLwpAQCAtMzAwLDcgKzMwMSw3IEBACiAJICoKIAkgKiBAc2luY2UgNC4zCiAJICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBOb0dpdGxpbmtzU3RyYXRlZ3kgaW1wbGVtZW50cyBGaWxlTW9kZVN0cmF0ZWd5IHsKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE5vR2l0bGlua3NTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgewogCiAJCS8qKgogCQkgKiBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBGaWxlTW9kZVN0cmF0ZWd5CkBAIC0zMjUsNyArMzI2LDcgQEAKIAkvKioKIAkgKiBXcmFwcGVyIGZvciBhIHN0YW5kYXJkIEphdmEgSU8gZmlsZQogCSAqLwotCXN0YXRpYyBwdWJsaWMgY2xhc3MgRmlsZUVudHJ5IGV4dGVuZHMgRW50cnkgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZUVudHJ5IGV4dGVuZHMgRW50cnkgewogCQlwcml2YXRlIGZpbmFsIEZpbGVNb2RlIG1vZGU7CiAKIAkJcHJpdmF0ZSBGUy5BdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CkBAIC0zNjQsNiArMzY1LDI5IEBACiAJCQltb2RlID0gZmlsZU1vZGVTdHJhdGVneS5nZXRNb2RlKGYsIGF0dHJpYnV0ZXMpOwogCQl9CiAKKwkJLyoqCisJCSAqIENyZWF0ZSBhIG5ldyBmaWxlIGVudHJ5IGdpdmVuIHRoZSBzcGVjaWZpZWQgRmlsZU1vZGVTdHJhdGVneQorCQkgKgorCQkgKiBAcGFyYW0gZgorCQkgKiAgICAgICAgICAgIGZpbGUKKwkJICogQHBhcmFtIGZzCisJCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0KKwkJICogQHBhcmFtIGF0dHJpYnV0ZXMKKwkJICogICAgICAgICAgICBvZiB0aGUgZmlsZQorCQkgKiBAcGFyYW0gZmlsZU1vZGVTdHJhdGVneQorCQkgKiAgICAgICAgICAgIHRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBkZXRlcm1pbmluZyB0aGUgRmlsZU1vZGUgb2YgYQorCQkgKiAgICAgICAgICAgIGZpbGU7IGNvbnRyb2xzIGdpdGxpbmtzIGV0Yy4KKwkJICoKKwkJICogQHNpbmNlIDUuMAorCQkgKi8KKwkJcHVibGljIEZpbGVFbnRyeShGaWxlIGYsIEZTIGZzLCBGUy5BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsCisJCQkJRmlsZU1vZGVTdHJhdGVneSBmaWxlTW9kZVN0cmF0ZWd5KSB7CisJCQl0aGlzLmZzID0gZnM7CisJCQl0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworCQkJZiA9IGZzLm5vcm1hbGl6ZShmKTsKKwkJCW1vZGUgPSBmaWxlTW9kZVN0cmF0ZWd5LmdldE1vZGUoZiwgYXR0cmlidXRlcyk7CisJCX0KKwogCQlAT3ZlcnJpZGUKIAkJcHVibGljIEZpbGVNb2RlIGdldE1vZGUoKSB7CiAJCQlyZXR1cm4gbW9kZTsKQEAgLTM4NiwxMiArNDEwLDEyIEBACiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJaWYgKGZzLmlzU3ltTGluayhnZXRGaWxlKCkpKQorCQkJaWYgKGF0dHJpYnV0ZXMuaXNTeW1ib2xpY0xpbmsoKSkgewogCQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZnMucmVhZFN5bUxpbmsoZ2V0RmlsZSgpKQotCQkJCQkJLmdldEJ5dGVzKAotCQkJCQkJQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwotCQkJZWxzZQorCQkJCQkJLmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKKwkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZSgpKTsKKwkJCX0KIAkJfQogCiAJCS8qKgpAQCAtNDI2LDcgKzQ1MCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBieXRlW10gaWRTdWJtb2R1bGUoZmluYWwgRW50cnkgZSkgeworCXByb3RlY3RlZCBieXRlW10gaWRTdWJtb2R1bGUoRW50cnkgZSkgewogCQlyZXR1cm4gaWRTdWJtb2R1bGUoZ2V0RGlyZWN0b3J5KCksIGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhCmluZGV4IDU1NjBmNzcuLjYxYjEzMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvTmFtZUNvbmZsaWN0VHJlZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEKQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJfQogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdGhlIHdhbGtlciB3aWxsIG9idGFpbiB0cmVlIGRhdGEgZnJvbS4KIAkgKiBAc2luY2UgNC4zCiAJICovCi0JcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBPYmplY3RSZWFkZXIgb3IpIHsKIAkJc3VwZXIocmVwbywgb3IpOwogCX0KIApAQCAtMTIyLDcgKzEyMiw3IEBACiAJICogQHBhcmFtIG9yCiAJICogICAgICAgICAgICB0aGUgcmVhZGVyIHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gdHJlZSBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhPYmplY3RSZWFkZXIgb3IpIHsKIAkJc3VwZXIob3IpOwogCX0KIApAQCAtMTM1LDcgKzEzNSw3IEBACiAKIAkJCWlmIChpc1RyZWUobWluUmVmKSkgewogCQkJCWlmIChza2lwRW50cnkobWluUmVmKSkgewotCQkJCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgeworCQkJCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgewogCQkJCQkJaWYgKHQubWF0Y2hlcyA9PSBtaW5SZWYpIHsKIAkJCQkJCQl0Lm5leHQoMSk7CiAJCQkJCQkJdC5tYXRjaGVzID0gbnVsbDsKQEAgLTIyMiwxNiArMjIyLDE2IEBACiAJCXJldHVybiBGaWxlTW9kZS5HSVRMSU5LLmVxdWFscyhwLm1vZGUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUcmVlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHJlZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXJldHVybiBGaWxlTW9kZS5UUkVFLmVxdWFscyhwLm1vZGUpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBza2lwRW50cnkoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQorCXByaXZhdGUgYm9vbGVhbiBza2lwRW50cnkoQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBBIHRyZWUgRC9GIG1heSBoYXZlIGJlZW4gaGFuZGxlZCBlYXJsaWVyLiBXZSBuZWVkIHRvCiAJCS8vIG5vdCByZXBvcnQgdGhpcyBwYXRoIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCiAJCS8vCi0JCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZiB8fCB0LmZpcnN0KCkpCiAJCQkJY29udGludWU7CiAKQEAgLTI2MCwxNCArMjYwLDE0IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNvbWJpbmVERihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCisJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBjb21iaW5lREYoQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBMb29rIGZvciBhIHBvc3NpYmxlIEQvRiBjb25mbGljdCBmb3J3YXJkIGluIHRoZSB0cmVlKHMpCiAJCS8vIGFzIHRoZXJlIG1heSBiZSBhICIkcGF0aC8iIHdoaWNoIG1hdGNoZXMgIiRwYXRoIi4gTWFrZQogCQkvLyBzdWNoIGVudHJpZXMgbWF0Y2ggdGhpcyBlbnRyeS4KIAkJLy8KIAkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZU1hdGNoID0gbnVsbDsKLQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmIHx8IHQuZW9mKCkpCiAJCQkJY29udGludWU7CiAKQEAgLTMwNiw3ICszMDYsNyBAQAogCQkJLy8gbWF0Y2hpbmcgaXRlcmF0b3JzIGluc3RlYWQgb2YgdGhlIGZpbGUgaXRlcmF0b3IuCiAJCQkvLyBUaGlzIHdheSBpc1N1YnRyZWUgaXMgdHJ1ZSBhbmQgaXNSZWN1cnNpdmUgd29ya3MuCiAJCQkvLwotCQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpCisJCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykKIAkJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZikKIAkJCQkJdC5tYXRjaGVzID0gdHJlZU1hdGNoOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKaW5kZXggODg3MjY4OS4uZDUwMGFhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQpAQCAtMzMyLDcgKzMzMiw3IEBACiAJICogICAgICAgICAgICBPYmplY3RSZWFkZXIgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSB3YWxrZXIsIGFuZCB3aWxsIGJlIGNsb3NlZAogCSAqICAgICAgICAgICAgd2hlbiB0aGUgd2Fsa2VyIGlzIGNsb3NlZC4KIAkgKi8KLQlwdWJsaWMgVHJlZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFRyZWVXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQl0aGlzKHJlcG8sIHJlcG8ubmV3T2JqZWN0UmVhZGVyKCksIHRydWUpOwogCX0KIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAJICogICAgICAgICAgICBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHdhbGtlciBpcyBjbG9zZWQuCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXB1YmxpYyBUcmVlV2FsayhmaW5hbCBATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKKwlwdWJsaWMgVHJlZVdhbGsoQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXRoaXMocmVwbywgb3IsIGZhbHNlKTsKIAl9CiAKQEAgLTM1OSw3ICszNTksNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJlYWRlciB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIHRyZWUgZGF0YSBmcm9tLiBUaGUgcmVhZGVyCiAJICogICAgICAgICAgICBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHdhbGtlciBpcyBjbG9zZWQuCiAJICovCi0JcHVibGljIFRyZWVXYWxrKGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBUcmVlV2FsayhPYmplY3RSZWFkZXIgb3IpIHsKIAkJdGhpcyhudWxsLCBvciwgZmFsc2UpOwogCX0KIApAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5BbmRUcmVlRmlsdGVyCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5PclRyZWVGaWx0ZXIKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoZmluYWwgVHJlZUZpbHRlciBuZXdGaWx0ZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoVHJlZUZpbHRlciBuZXdGaWx0ZXIpIHsKIAkJZmlsdGVyID0gbmV3RmlsdGVyICE9IG51bGwgPyBuZXdGaWx0ZXIgOiBUcmVlRmlsdGVyLkFMTDsKIAl9CiAKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCSAqIEBwYXJhbSBiCiAJICogICAgICAgICAgICB0cnVlIHRvIHNraXAgc3VidHJlZSBub2RlcyBhbmQgb25seSBvYnRhaW4gZmlsZXMgbm9kZXMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGZpbmFsIGJvb2xlYW4gYikgeworCXB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIGIpIHsKIAkJcmVjdXJzaXZlID0gYjsKIAl9CiAKQEAgLTUwNSw3ICs1MDUsNyBAQAogCSAqICAgICAgICAgICAgdHJ1ZSB0byBnZXQgdHJlZXMgYWZ0ZXIgdGhlaXIgY2hpbGRyZW4uCiAJICogQHNlZSAjaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKQogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RPcmRlclRyYXZlcnNhbChmaW5hbCBib29sZWFuIGIpIHsKKwlwdWJsaWMgdm9pZCBzZXRQb3N0T3JkZXJUcmF2ZXJzYWwoYm9vbGVhbiBiKSB7CiAJCXBvc3RPcmRlclRyYXZlcnNhbCA9IGI7CiAJfQogCkBAIC02MzMsMjIgKzYzMyw2IEBACiAJfQogCiAJLyoqCi0JICogR2V0IHRoZSBFT0wgc3RyZWFtIHR5cGUgb2YgdGhlIGN1cnJlbnQgZW50cnkgdXNpbmcgdGhlIGNvbmZpZyBhbmQKLQkgKiB7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKX0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBFT0wgc3RyZWFtIHR5cGUgb2YgdGhlIGN1cnJlbnQgZW50cnkgdXNpbmcgdGhlIGNvbmZpZyBhbmQKLQkgKiAgICAgICAgIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbAotCSAqICAgICAgICAgaWYgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfSBpcyBub3QgYmFzZWQgb24KLQkgKiAgICAgICAgIGEgd29ya2luZyB0cmVlCi0JICogQHNpbmNlIDQuMwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZSl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQE51bGxhYmxlIEVvbFN0cmVhbVR5cGUgZ2V0RW9sU3RyZWFtVHlwZSgpIHsKLQkJcmV0dXJuIChnZXRFb2xTdHJlYW1UeXBlKG9wZXJhdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKIAkgKiBSZXNldCB0aGlzIHdhbGtlciBzbyBuZXcgdHJlZSBpdGVyYXRvcnMgY2FuIGJlIGFkZGVkIHRvIGl0LgogCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewpAQCAtNjc3LDcgKzY2MSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBsb29zZSBvYmplY3Qgb3IgcGFjayBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICh0cmVlcy5sZW5ndGggPT0gMSkgewogCQkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgbyA9IHRyZWVzWzBdOwpAQCAtNzE4LDcgKzcwMiw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBsb29zZSBvYmplY3Qgb3IgcGFjayBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIEFueU9iamVjdElkLi4uIGlkcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgcmVzZXQoQW55T2JqZWN0SWQuLi4gaWRzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IG9sZExlbiA9IHRyZWVzLmxlbmd0aDsKIAkJZmluYWwgaW50IG5ld0xlbiA9IGlkcy5sZW5ndGg7CkBAIC03NzMsNyArNzU3LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIGludCBhZGRUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgaW50IGFkZFRyZWUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gYWRkVHJlZShwYXJzZXJGb3IoaWQpKTsKIAl9CkBAIC05MzYsNyArOTIwLDcgQEAKIAkgKiBAcmV0dXJuIG1vZGUgYml0cyBmb3IgdGhlIGN1cnJlbnQgZW50cnkgb2YgdGhlIG50aCB0cmVlLgogCSAqIEBzZWUgRmlsZU1vZGUjZnJvbUJpdHMoaW50KQogCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmF3TW9kZShmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIGludCBnZXRSYXdNb2RlKGludCBudGgpIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IHRyZWVzW250aF07CiAJCXJldHVybiB0Lm1hdGNoZXMgPT0gY3VycmVudEhlYWQgPyB0Lm1vZGUgOiAwOwogCX0KQEAgLTk1Miw3ICs5MzYsNyBAQAogCSAqICAgICAgICAgICAgdHJlZSB0byBvYnRhaW4gdGhlIG1vZGUgZnJvbS4KIAkgKiBAcmV0dXJuIG1vZGUgZm9yIHRoZSBjdXJyZW50IGVudHJ5IG9mIHRoZSBudGggdHJlZS4KIAkgKi8KLQlwdWJsaWMgRmlsZU1vZGUgZ2V0RmlsZU1vZGUoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBGaWxlTW9kZSBnZXRGaWxlTW9kZShpbnQgbnRoKSB7CiAJCXJldHVybiBGaWxlTW9kZS5mcm9tQml0cyhnZXRSYXdNb2RlKG50aCkpOwogCX0KIApAQCAtOTg3LDcgKzk3MSw3IEBACiAJICogQHNlZSAjZ2V0T2JqZWN0SWQoTXV0YWJsZU9iamVjdElkLCBpbnQpCiAJICogQHNlZSAjaWRFcXVhbChpbnQsIGludCkKIAkgKi8KLQlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChpbnQgbnRoKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSB0cmVlc1tudGhdOwogCQlyZXR1cm4gdC5tYXRjaGVzID09IGN1cnJlbnRIZWFkID8gdC5nZXRFbnRyeU9iamVjdElkKCkgOiBPYmplY3RJZAogCQkJCS56ZXJvSWQoKTsKQEAgLTEwMDksNyArOTkzLDcgQEAKIAkgKiAgICAgICAgICAgIHRyZWUgdG8gb2J0YWluIHRoZSBvYmplY3QgaWRlbnRpZmllciBmcm9tLgogCSAqIEBzZWUgI2lkRXF1YWwoaW50LCBpbnQpCiAJICovCi0JcHVibGljIHZvaWQgZ2V0T2JqZWN0SWQoZmluYWwgTXV0YWJsZU9iamVjdElkIG91dCwgZmluYWwgaW50IG50aCkgeworCXB1YmxpYyB2b2lkIGdldE9iamVjdElkKE11dGFibGVPYmplY3RJZCBvdXQsIGludCBudGgpIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IHRyZWVzW250aF07CiAJCWlmICh0Lm1hdGNoZXMgPT0gY3VycmVudEhlYWQpCiAJCQl0LmdldEVudHJ5T2JqZWN0SWQob3V0KTsKQEAgLTEwMjgsNyArMTAxMiw3IEBACiAJICogICAgICAgICA8Y29kZT5nZXRPYmplY3RJZChudGhBKS5lcXVhbHMoZ2V0T2JqZWN0SWQobnRoQikpPC9jb2RlPi4KIAkgKiBAc2VlICNnZXRPYmplY3RJZChpbnQpCiAJICovCi0JcHVibGljIGJvb2xlYW4gaWRFcXVhbChmaW5hbCBpbnQgbnRoQSwgZmluYWwgaW50IG50aEIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKGludCBudGhBLCBpbnQgbnRoQikgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBjaCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBhID0gdHJlZXNbbnRoQV07CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGIgPSB0cmVlc1tudGhCXTsKQEAgLTExMjYsNyArMTExMCw3IEBACiAJICogICAgICAgICBhZ2FpbiBvbiB0aGlzIHRyZWUgd2Fsay4KIAkgKiBAc2luY2UgNC43CiAJICovCi0JcHVibGljIGludCBpc1BhdGhNYXRjaChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKKwlwdWJsaWMgaW50IGlzUGF0aE1hdGNoKGJ5dGVbXSBwLCBpbnQgcExlbikgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIGJ5dGVbXSBjID0gdC5wYXRoOwogCQlmaW5hbCBpbnQgY0xlbiA9IHQucGF0aExlbjsKQEAgLTExNzksNyArMTE2Myw3IEBACiAJICogICAgICAgICBwYXRoOyAxIGlmIHRoZSBjdXJyZW50IHBhdGggaXMgcGFzdCBwIGFuZCBwIHdpbGwgbmV2ZXIgbWF0Y2gKIAkgKiAgICAgICAgIGFnYWluIG9uIHRoaXMgdHJlZSB3YWxrLgogCSAqLwotCXB1YmxpYyBpbnQgaXNQYXRoUHJlZml4KGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbikgeworCXB1YmxpYyBpbnQgaXNQYXRoUHJlZml4KGJ5dGVbXSBwLCBpbnQgcExlbikgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIGJ5dGVbXSBjID0gdC5wYXRoOwogCQlmaW5hbCBpbnQgY0xlbiA9IHQucGF0aExlbjsKQEAgLTEyMjksNyArMTIxMyw3IEBACiAJICogQHJldHVybiB0cnVlIGlmIHAgaXMgc3VmZml4IG9mIHRoZSBjdXJyZW50IHBhdGg7CiAJICogICAgICAgICBmYWxzZSBpZiBvdGhlcndpc2UKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhdGhTdWZmaXgoZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CisJcHVibGljIGJvb2xlYW4gaXNQYXRoU3VmZml4KGJ5dGVbXSBwLCBpbnQgcExlbikgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIGJ5dGVbXSBjID0gdC5wYXRoOwogCQlmaW5hbCBpbnQgY0xlbiA9IHQucGF0aExlbjsKQEAgLTEzNzcsNyArMTM2MSw3IEBACiAJCQl0cmVlc1tpXSA9IHRyZWVzW2ldLnBhcmVudDsKIAogCQlBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYgPSBudWxsOwotCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgeworCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgewogCQkJaWYgKHQubWF0Y2hlcyAhPSB0KQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKG1pblJlZiA9PSBudWxsIHx8IHQucGF0aENvbXBhcmUobWluUmVmKSA8IDApCkBAIC0xMzg2LDE4ICsxMzcwLDE4IEBACiAJCWN1cnJlbnRIZWFkID0gbWluUmVmOwogCX0KIAotCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlciBwYXJzZXJGb3IoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyIHBhcnNlckZvcihBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CiAJCXAucmVzZXQocmVhZGVyLCBpZCk7CiAJCXJldHVybiBwOwogCX0KIAotCXN0YXRpYyBTdHJpbmcgcGF0aE9mKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQpIHsKKwlzdGF0aWMgU3RyaW5nIHBhdGhPZihBYnN0cmFjdFRyZWVJdGVyYXRvciB0KSB7CiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgdC5wYXRoLCAwLCB0LnBhdGhMZW4pOwogCX0KIAotCXN0YXRpYyBTdHJpbmcgcGF0aE9mKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwb3MsIGludCBlbmQpIHsKKwlzdGF0aWMgU3RyaW5nIHBhdGhPZihieXRlW10gYnVmLCBpbnQgcG9zLCBpbnQgZW5kKSB7CiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgYnVmLCBwb3MsIGVuZCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCmluZGV4IDY4Y2M3Y2IuLjE3OWZkNDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCkBAIC0yMTEsNyArMjExLDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcGFyZW50IHRyZWUgaXRlcmF0b3IuCiAJICovCi0JcHJvdGVjdGVkIFdvcmtpbmdUcmVlSXRlcmF0b3IoZmluYWwgV29ya2luZ1RyZWVJdGVyYXRvciBwKSB7CisJcHJvdGVjdGVkIFdvcmtpbmdUcmVlSXRlcmF0b3IoV29ya2luZ1RyZWVJdGVyYXRvciBwKSB7CiAJCXN1cGVyKHApOwogCQlzdGF0ZSA9IHAuc3RhdGU7CiAJCXJlcG9zaXRvcnkgPSBwLnJlcG9zaXRvcnk7CkBAIC0yNTYsNiArMjU2LDQ1IEBACiAJCXN0YXRlLmRpckNhY2hlVHJlZSA9IHRyZWVJZDsKIAl9CiAKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBEaXJDYWNoZUl0ZXJhdG9yfSBhdCB0aGUgY3VycmVudCBlbnRyeSBpZgorCSAqIHtAbGluayAjc2V0RGlyQ2FjaGVJdGVyYXRvcihUcmVlV2FsaywgaW50KX0gd2FzIGNhbGxlZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIERpckNhY2hlSXRlcmF0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3Qgc2V0IG9yIG5vdCBhdCB0aGUKKwkgKiAgICAgICAgIGN1cnJlbnQgZW50cnkKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHJvdGVjdGVkIERpckNhY2hlSXRlcmF0b3IgZ2V0RGlyQ2FjaGVJdGVyYXRvcigpIHsKKwkJaWYgKHN0YXRlLmRpckNhY2hlVHJlZSA+PSAwICYmIHN0YXRlLndhbGsgIT0gbnVsbCkgeworCQkJcmV0dXJuIHN0YXRlLndhbGsuZ2V0VHJlZShzdGF0ZS5kaXJDYWNoZVRyZWUsCisJCQkJCURpckNhY2hlSXRlcmF0b3IuY2xhc3MpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIERlZmluZXMgd2hldGhlciB0aGlzIHtAbGluayBXb3JraW5nVHJlZUl0ZXJhdG9yfSB3YWxrcyBpZ25vcmVkCisJICogZGlyZWN0b3JpZXMuCisJICoKKwkgKiBAcGFyYW0gaW5jbHVkZUlnbm9yZWQKKwkgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gdG8gc2tpcCBpZ25vcmVkIGRpcmVjdG9yaWVzLCBpZiBwb3NzaWJsZTsKKwkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBhbHdheXMgaW5jbHVkZSB0aGVtIGluIHRoZSB3YWxrCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXMoYm9vbGVhbiBpbmNsdWRlSWdub3JlZCkgeworCQlzdGF0ZS53YWxrSWdub3JlZCA9IGluY2x1ZGVJZ25vcmVkOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhpcyB7QGxpbmsgV29ya2luZ1RyZWVJdGVyYXRvcn0gd2Fsa3MgaWdub3JlZCBkaXJlY3Rvcmllcy4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGl0IGRvZXMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIHdhbGtzSWdub3JlZERpcmVjdG9yaWVzKCkgeworCQlyZXR1cm4gc3RhdGUud2Fsa0lnbm9yZWQ7CisJfQorCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNJZCgpIHsKQEAgLTM0MCwzMCArMzc5LDIyIEBACiAJICogQHJldHVybiBub24tbnVsbCBzdWJtb2R1bGUgaWQKIAkgKi8KIAlwcm90ZWN0ZWQgYnl0ZVtdIGlkU3VibW9kdWxlKEZpbGUgZGlyZWN0b3J5LCBFbnRyeSBlKSB7Ci0JCWZpbmFsIFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbzsKLQkJdHJ5IHsKLQkJCXN1Ym1vZHVsZVJlcG8gPSBTdWJtb2R1bGVXYWxrLmdldFN1Ym1vZHVsZVJlcG9zaXRvcnkoZGlyZWN0b3J5LAotCQkJCQllLmdldE5hbWUoKSwKLQkJCQkJcmVwb3NpdG9yeSAhPSBudWxsID8gcmVwb3NpdG9yeS5nZXRGUygpIDogRlMuREVURUNURUQpOworCQl0cnkgKFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbyA9IFN1Ym1vZHVsZVdhbGsuZ2V0U3VibW9kdWxlUmVwb3NpdG9yeSgKKwkJCQlkaXJlY3RvcnksIGUuZ2V0TmFtZSgpLAorCQkJCXJlcG9zaXRvcnkgIT0gbnVsbCA/IHJlcG9zaXRvcnkuZ2V0RlMoKSA6IEZTLkRFVEVDVEVEKSkgeworCQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkgeworCQkJCXJldHVybiB6ZXJvaWQ7CisJCQl9CisJCQlPYmplY3RJZCBoZWFkID0gc3VibW9kdWxlUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKKwkJCWlmIChoZWFkID09IG51bGwpIHsKKwkJCQlyZXR1cm4gemVyb2lkOworCQkJfQorCQkJYnl0ZVtdIGlkID0gbmV3IGJ5dGVbQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEhdOworCQkJaGVhZC5jb3B5UmF3VG8oaWQsIDApOworCQkJcmV0dXJuIGlkOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKIAkJCXJldHVybiB6ZXJvaWQ7CiAJCX0KLQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkKLQkJCXJldHVybiB6ZXJvaWQ7Ci0KLQkJZmluYWwgT2JqZWN0SWQgaGVhZDsKLQkJdHJ5IHsKLQkJCWhlYWQgPSBzdWJtb2R1bGVSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXJldHVybiB6ZXJvaWQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJtb2R1bGVSZXBvLmNsb3NlKCk7Ci0JCX0KLQkJaWYgKGhlYWQgPT0gbnVsbCkKLQkJCXJldHVybiB6ZXJvaWQ7Ci0JCWZpbmFsIGJ5dGVbXSBpZCA9IG5ldyBieXRlW0NvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIXTsKLQkJaGVhZC5jb3B5UmF3VG8oaWQsIDApOwotCQlyZXR1cm4gaWQ7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGRpZ2l0cyA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLApAQCAtMzcyLDcgKzQwMyw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGhibG9iID0gQ29uc3RhbnRzCiAJCQkuZW5jb2RlZFR5cGVTdHJpbmcoQ29uc3RhbnRzLk9CSl9CTE9CKTsKIAotCXByaXZhdGUgYnl0ZVtdIGlkQnVmZmVyQmxvYihmaW5hbCBFbnRyeSBlKSB7CisJcHJpdmF0ZSBieXRlW10gaWRCdWZmZXJCbG9iKEVudHJ5IGUpIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIElucHV0U3RyZWFtIGlzID0gZS5vcGVuSW5wdXRTdHJlYW0oKTsKIAkJCWlmIChpcyA9PSBudWxsKQpAQCAtNDMwLDcgKzQ2MSw3IEBACiAJCXJldHVybiBmaWx0ZXJDbGVhbihpcywgb3BUeXBlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNhZmVDbG9zZShmaW5hbCBJbnB1dFN0cmVhbSBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgc2FmZUNsb3NlKElucHV0U3RyZWFtIGluKSB7CiAJCXRyeSB7CiAJCQlpbi5jbG9zZSgpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIyKSB7CkBAIC01NDgsNyArNTc5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbmV4dChmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBuZXh0KGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlwdHIgKz0gZGVsdGE7CiAJCWlmICghZW9mKCkpIHsKIAkJCXBhcnNlRW50cnkoKTsKQEAgLTU1Nyw3ICs1ODgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBiYWNrKGZpbmFsIGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGJhY2soaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCXB0ciAtPSBkZWx0YTsKIAkJcGFyc2VFbnRyeSgpOwogCX0KQEAgLTY2Miw3ICs2OTMsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcmVsZXZhbnQgaWdub3JlIHJ1bGUgZmlsZSBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW50cnlJZ25vcmVkKGZpbmFsIGludCBwTGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBib29sZWFuIGlzRW50cnlJZ25vcmVkKGludCBwTGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaXNFbnRyeUlnbm9yZWQocExlbiwgbW9kZSk7CiAJfQogCkBAIC02NzcsNyArNzA4LDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSByZWxldmFudCBpZ25vcmUgcnVsZSBmaWxlIGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW50cnlJZ25vcmVkKGZpbmFsIGludCBwTGVuLCBpbnQgZmlsZU1vZGUpCisJcHJpdmF0ZSBib29sZWFuIGlzRW50cnlJZ25vcmVkKGludCBwTGVuLCBpbnQgZmlsZU1vZGUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBUaGUgaWdub3JlIGNvZGUgd2FudHMgcGF0aCB0byBzdGFydCB3aXRoIGEgJy8nIGlmIHBvc3NpYmxlLgogCQkvLyBJZiB3ZSBoYXZlIHRoZSAnLycgaW4gb3VyIHBhdGggYnVmZmVyIGJlY2F1c2Ugd2UgYXJlIGluc2lkZQpAQCAtNzU2LDcgKzc4Nyw3IEBACiAJICogICAgICAgICAgICBmaWxlcyBpbiB0aGUgc3VidHJlZSBvZiB0aGUgd29yayB0cmVlIHRoaXMgaXRlcmF0b3Igb3BlcmF0ZXMKIAkgKiAgICAgICAgICAgIG9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChmaW5hbCBFbnRyeVtdIGxpc3QpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KEVudHJ5W10gbGlzdCkgewogCQkvLyBGaWx0ZXIgb3V0IG51bGxzLCAuIGFuZCAuLiBhcyB0aGVzZSBhcmUgbm90IHZhbGlkIHRyZWUgZW50cmllcywKIAkJLy8gYWxzbyBjYWNoZSB0aGUgZW5jb2RlZCBmb3JtcyBvZiB0aGUgcGF0aCBuYW1lcyBmb3IgZWZmaWNpZW50IHVzZQogCQkvLyBsYXRlciBvbiBkdXJpbmcgc29ydGluZyBhbmQgaXRlcmF0aW9uLgpAQCAtODM4LDcgKzg2OSw3IEBACiAJICogICAgICAgICAgICBhbiBpbnQuCiAJICogQHJldHVybiB0cnVlIGlmIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlRGlmZmVyZW50KGZpbmFsIGludCByYXdNb2RlKSB7CisJcHVibGljIGJvb2xlYW4gaXNNb2RlRGlmZmVyZW50KGludCByYXdNb2RlKSB7CiAJCS8vIERldGVybWluZSBkaWZmZXJlbmNlIGluIG1vZGUtYml0cyBvZiBmaWxlIGFuZCBpbmRleC1lbnRyeS4gSW4gdGhlCiAJCS8vIGJpdHdpc2UgcHJlc2VudGF0aW9uIG9mIG1vZGVEaWZmIHdlJ2xsIGhhdmUgYSAnMScgd2hlbiB0aGUgdHdvIG1vZGVzCiAJCS8vIGRpZmZlciBhdCB0aGlzIHBvc2l0aW9uLgpAQCAtOTkyLDcgKzEwMjMsNyBAQAogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIGF0IHRoaXMgaXRlcmF0b3IncyBjdXJyZW50IGVudHJ5CiAJICogQHJldHVybiBpbmRleCBmaWxlIG1vZGUKIAkgKi8KLQlwdWJsaWMgRmlsZU1vZGUgZ2V0SW5kZXhGaWxlTW9kZShmaW5hbCBEaXJDYWNoZUl0ZXJhdG9yIGluZGV4SXRlcikgeworCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleEZpbGVNb2RlKERpckNhY2hlSXRlcmF0b3IgaW5kZXhJdGVyKSB7CiAJCWZpbmFsIEZpbGVNb2RlIHd0TW9kZSA9IGdldEVudHJ5RmlsZU1vZGUoKTsKIAkJaWYgKGluZGV4SXRlciA9PSBudWxsKSB7CiAJCQlyZXR1cm4gd3RNb2RlOwpAQCAtMTE3MywxMyArMTIwNCwxNyBAQAogCQlyZXR1cm4gY29udGVudERpZ2VzdC5kaWdlc3QoKTsKIAl9CiAKLQkvKiogQSBzaW5nbGUgZW50cnkgd2l0aGluIGEgd29ya2luZyBkaXJlY3RvcnkgdHJlZS4gKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVudHJ5IHsKKwkvKioKKwkgKiBBIHNpbmdsZSBlbnRyeSB3aXRoaW4gYSB3b3JraW5nIGRpcmVjdG9yeSB0cmVlLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRW50cnkgewogCQlieXRlW10gZW5jb2RlZE5hbWU7CiAKIAkJaW50IGVuY29kZWROYW1lTGVuOwogCi0JCXZvaWQgZW5jb2RlTmFtZShmaW5hbCBDaGFyc2V0RW5jb2RlciBlbmMpIHsKKwkJdm9pZCBlbmNvZGVOYW1lKENoYXJzZXRFbmNvZGVyIGVuYykgewogCQkJZmluYWwgQnl0ZUJ1ZmZlciBiOwogCQkJdHJ5IHsKIAkJCQliID0gZW5jLmVuY29kZShDaGFyQnVmZmVyLndyYXAoZ2V0TmFtZSgpKSk7CkBAIC0xMjgwLDExICsxMzE1LDggQEAKIAogCQlJZ25vcmVOb2RlIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJSWdub3JlTm9kZSByID0gbmV3IElnbm9yZU5vZGUoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpKSB7CiAJCQkJci5wYXJzZShpbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm4gci5nZXRSdWxlcygpLmlzRW1wdHkoKSA/IG51bGwgOiByOwogCQl9CkBAIC0xMzMyLDExICsxMzY0LDggQEAKIAkJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkUnVsZXNGcm9tRmlsZShJZ25vcmVOb2RlIHIsIEZpbGUgZXhjbHVkZSkKIAkJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoRlMuREVURUNURUQuZXhpc3RzKGV4Y2x1ZGUpKSB7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShleGNsdWRlKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShleGNsdWRlKSkgewogCQkJCQlyLnBhcnNlKGluKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpbi5jbG9zZSgpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTM1MywxMSArMTM4Miw4IEBACiAKIAkJQXR0cmlidXRlc05vZGUgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlBdHRyaWJ1dGVzTm9kZSByID0gbmV3IEF0dHJpYnV0ZXNOb2RlKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBlbnRyeS5vcGVuSW5wdXRTdHJlYW0oKSkgewogCQkJCXIucGFyc2UoaW4pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQkJcmV0dXJuIHIuZ2V0UnVsZXMoKS5pc0VtcHR5KCkgPyBudWxsIDogcjsKIAkJfQpAQCAtMTM3OCw3ICsxNDA0LDEwIEBACiAJCVRyZWVXYWxrIHdhbGs7CiAKIAkJLyoqIFBvc2l0aW9uIG9mIHRoZSBtYXRjaGluZyB7QGxpbmsgRGlyQ2FjaGVJdGVyYXRvcn0uICovCi0JCWludCBkaXJDYWNoZVRyZWU7CisJCWludCBkaXJDYWNoZVRyZWUgPSAtMTsKKworCQkvKiogV2hldGhlciB0aGUgaXRlcmF0b3Igc2hhbGwgd2FsayBpZ25vcmVkIGRpcmVjdG9yaWVzLiAqLworCQlib29sZWFuIHdhbGtJZ25vcmVkID0gZmFsc2U7CiAKIAkJZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gZGlyZWN0b3J5VG9JZ25vcmVkID0gbmV3IEhhc2hNYXA8PigpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZU9wdGlvbnMuamF2YQppbmRleCAyZGZiMjAzLi44NDZmYjZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkaXJOb0dpdExpbmtzOwogCi0JcHJpdmF0ZSBXb3JraW5nVHJlZU9wdGlvbnMoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBXb3JraW5nVHJlZU9wdGlvbnMoQ29uZmlnIHJjKSB7CiAJCWZpbGVNb2RlID0gcmMuZ2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKIAkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9GSUxFTU9ERSwgdHJ1ZSk7CiAJCWF1dG9DUkxGID0gcmMuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YQppbmRleCA2ZDQwYTRlLi5hOTYwYmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQW5kVHJlZUZpbHRlci5qYXZhCkBAIC03MSw3ICs3MSw3IEBACiAJICogICAgICAgICAgICBzZWNvbmQgZmlsdGVyIHRvIHRlc3QuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYm90aCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhLCBmaW5hbCBUcmVlRmlsdGVyIGIpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXIgYSwgVHJlZUZpbHRlciBiKSB7CiAJCWlmIChhID09IEFMTCkKIAkJCXJldHVybiBiOwogCQlpZiAoYiA9PSBBTEwpCkBAIC04Nyw3ICs4Nyw3IEBACiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGFsbCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwNSw3ICsxMDUsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhbGwgaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248VHJlZUZpbHRlcj4gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxUcmVlRmlsdGVyPiBsaXN0KSB7CiAJCWlmIChsaXN0LnNpemUoKSA8IDIpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmF0TGVhc3RUd29GaWx0ZXJzTmVlZGVkKTsKIAkJZmluYWwgVHJlZUZpbHRlcltdIHN1YmZpbHRlcnMgPSBuZXcgVHJlZUZpbHRlcltsaXN0LnNpemUoKV07CkBAIC0xMjAsMTMgKzEyMCwxMyBAQAogCiAJCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlciBiOwogCi0JCUJpbmFyeShmaW5hbCBUcmVlRmlsdGVyIG9uZSwgZmluYWwgVHJlZUZpbHRlciB0d28pIHsKKwkJQmluYXJ5KFRyZWVGaWx0ZXIgb25lLCBUcmVlRmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CkBAIC0xNzAsMTIgKzE3MCwxMiBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIExpc3QgZXh0ZW5kcyBBbmRUcmVlRmlsdGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVyczsKIAotCQlMaXN0KGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJCUxpc3QoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJaW50IG0gPSAwOwotCQkJZm9yIChmaW5hbCBUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKIAkJCQlpbnQgciA9IGYubWF0Y2hGaWx0ZXIod2Fsa2VyKTsKIAkJCQlpZiAociA9PSAxKSB7CiAJCQkJCXJldHVybiAxOwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIHNob3VsZEJlUmVjdXJzaXZlKCkgewotCQkJZm9yIChmaW5hbCBUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKQorCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKQogCQkJCWlmIChmLnNob3VsZEJlUmVjdXJzaXZlKCkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9CeXRlQXJyYXlTZXQuamF2YQppbmRleCA2NTM3ODZiLi45OTU1NjFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9CeXRlQXJyYXlTZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9CeXRlQXJyYXlTZXQuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogCQlpbml0VGFibGUoMSA8PCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQoKGNhcGFjaXR5ICogMikgLSAxKSk7CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gZ2V0KGZpbmFsIGJ5dGVbXSB0b0ZpbmQsIGludCBsZW5ndGgsIGludCBoYXNoKSB7CisJcHJpdmF0ZSBieXRlW10gZ2V0KGJ5dGVbXSB0b0ZpbmQsIGludCBsZW5ndGgsIGludCBoYXNoKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaSA9IGhhc2ggJiBtc2s7CiAJCWZpbmFsIGJ5dGVbXVtdIHRibCA9IHRhYmxlOwpAQCAtMTEyLDcgKzExMiw3IEBACiAJICogICAgICAgICAgICBwcmUtY29tcHV0ZWQgaGFzaCBvZiB0b0ZpbmQKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcHBpbmcgZXhpc3RzIGZvciB0aGlzIGJ5dGUgYXJyYXk7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlib29sZWFuIGNvbnRhaW5zKGZpbmFsIGJ5dGVbXSB0b0ZpbmQsIGludCBsZW5ndGgsIGludCBoYXNoKSB7CisJYm9vbGVhbiBjb250YWlucyhieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgewogCQlyZXR1cm4gZ2V0KHRvRmluZCwgbGVuZ3RoLCBoYXNoKSAhPSBudWxsOwogCX0KIApAQCAtMTgwLDcgKzE4MCw3IEBACiAJCXJldHVybiBzaXplID09IDA7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydChmaW5hbCBieXRlW10gbmV3VmFsdWUsIGludCBoYXNoKSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydChieXRlW10gbmV3VmFsdWUsIGludCBoYXNoKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaiA9IGhhc2ggJiBtc2s7CiAJCWZpbmFsIGJ5dGVbXVtdIHRibCA9IHRhYmxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0ludGVySW5kZXhEaWZmRmlsdGVyLmphdmEKaW5kZXggODFiOGU2ZC4uMzM4ZWUyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJZmluYWwgaW50IG4gPSB3YWxrZXIuZ2V0VHJlZUNvdW50KCk7CiAJCWlmIChuID09IDEpIC8vIEFzc3VtZSB0aGV5IG1lYW50IGRpZmZlcmVuY2UgdG8gZW1wdHkgdHJlZS4KIAkJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhCmluZGV4IDM0MDNjNzguLjYwOTA1MDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RJZ25vcmVkRmlsdGVyLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAcGFyYW0gd29ya2RpclRyZWVJbmRleAogCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHdvcmtkaXIgdHJlZSBpbiB0aGUgdHJlZSB3YWxrCiAJICovCi0JcHVibGljIE5vdElnbm9yZWRGaWx0ZXIoZmluYWwgaW50IHdvcmtkaXJUcmVlSW5kZXgpIHsKKwlwdWJsaWMgTm90SWdub3JlZEZpbHRlcihpbnQgd29ya2RpclRyZWVJbmRleCkgewogCQl0aGlzLmluZGV4ID0gd29ya2RpclRyZWVJbmRleDsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YQppbmRleCAyZTAyM2QwLi5kMzE1NTI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlci5qYXZhCkBAIC02MSwxMyArNjEsMTMgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlciB0byBuZWdhdGUuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IGRvZXMgdGhlIHJldmVyc2Ugb2YgPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyIGEpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXIgYSkgewogCQlyZXR1cm4gbmV3IE5vdFRyZWVGaWx0ZXIoYSk7CiAJfQogCiAJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyIGE7CiAKLQlwcml2YXRlIE5vdFRyZWVGaWx0ZXIoZmluYWwgVHJlZUZpbHRlciBvbmUpIHsKKwlwcml2YXRlIE5vdFRyZWVGaWx0ZXIoVHJlZUZpbHRlciBvbmUpIHsKIAkJYSA9IG9uZTsKIAl9CiAKQEAgLTc5LDcgKzc5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPT0gMDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL09yVHJlZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEKaW5kZXggZGJiMDYyYi4uMzA4ZmYwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiAgICAgICAgICAgIHNlY29uZCBmaWx0ZXIgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhLCBmaW5hbCBUcmVlRmlsdGVyIGIpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXIgYSwgVHJlZUZpbHRlciBiKSB7CiAJCWlmIChhID09IEFMTCB8fCBiID09IEFMTCkKIAkJCXJldHVybiBBTEw7CiAJCXJldHVybiBuZXcgQmluYXJ5KGEsIGIpOwpAQCAtODUsNyArODUsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxUcmVlRmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBUcmVlRmlsdGVyW2xpc3Quc2l6ZSgpXTsKQEAgLTExOCwxMyArMTE4LDEzIEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyIGI7CiAKLQkJQmluYXJ5KGZpbmFsIFRyZWVGaWx0ZXIgb25lLCBmaW5hbCBUcmVlRmlsdGVyIHR3bykgeworCQlCaW5hcnkoVHJlZUZpbHRlciBvbmUsIFRyZWVGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE2OCwxMiArMTY4LDEyIEBACiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIE9yVHJlZUZpbHRlciB7CiAJCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlcltdIHN1YmZpbHRlcnM7CiAKLQkJTGlzdChmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgeworCQlMaXN0KFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCQlzdWJmaWx0ZXJzID0gbGlzdDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE4NCw3ICsxODQsNyBAQAogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCWludCBtID0gMTsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgeworCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaW50IHIgPSBmLm1hdGNoRmlsdGVyKHdhbGtlcik7CiAJCQkJaWYgKHIgPT0gMCkgewogCQkJCQlyZXR1cm4gMDsKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRCZVJlY3Vyc2l2ZSgpIHsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykKKwkJCWZvciAoVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykKIAkJCQlpZiAoZi5zaG91bGRCZVJlY3Vyc2l2ZSgpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXIuamF2YQppbmRleCAyZjdmNWNkLi45MjY3ZmI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhCkBAIC04Niw3ICs4Niw3IEBACiAKIAlmaW5hbCBieXRlW10gcGF0aFJhdzsKIAotCXByaXZhdGUgUGF0aEZpbHRlcihmaW5hbCBTdHJpbmcgcykgeworCXByaXZhdGUgUGF0aEZpbHRlcihTdHJpbmcgcykgewogCQlwYXRoU3RyID0gczsKIAkJcGF0aFJhdyA9IENvbnN0YW50cy5lbmNvZGUocGF0aFN0cik7CiAJfQpAQCAtMTAyLDIwICsxMDIsMjAgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBtYXRjaEZpbHRlcihmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgaW50IG1hdGNoRmlsdGVyKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gd2Fsa2VyLmlzUGF0aE1hdGNoKHBhdGhSYXcsIHBhdGhSYXcubGVuZ3RoKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHNob3VsZEJlUmVjdXJzaXZlKCkgewotCQlmb3IgKGZpbmFsIGJ5dGUgYiA6IHBhdGhSYXcpCisJCWZvciAoYnl0ZSBiIDogcGF0aFJhdykKIAkJCWlmIChiID09ICcvJykKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhdGggbGVuZ3RoIG9mIHRoaXMgZmlsdGVyIG1hdGNoZXMgdGhlIGxlbmd0aAogCSAqICAgICAgICAgb2YgdGhlIGN1cnJlbnQgcGF0aCBvZiB0aGUgc3VwcGxpZWQgVHJlZVdhbGsuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNEb25lKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGlzRG9uZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJcmV0dXJuIHBhdGhSYXcubGVuZ3RoID09IHdhbGtlci5nZXRQYXRoTGVuZ3RoKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YQppbmRleCAwNjUyMjg4Li41Y2Y1NzUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YQpAQCAtODIsMTMgKzgyLDEzIEBACiAJICogICAgICAgICAgICB0aGUgcGF0aHMgdG8gdGVzdCBhZ2FpbnN0LiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGZvciB0aGUgbGlzdCBvZiBwYXRocyBzdXBwbGllZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhdGhzKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiBwYXRocykgewogCQlpZiAocGF0aHMuaXNFbXB0eSgpKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYXRMZWFzdE9uZVBhdGhJc1JlcXVpcmVkKTsKIAkJZmluYWwgUGF0aEZpbHRlcltdIHAgPSBuZXcgUGF0aEZpbHRlcltwYXRocy5zaXplKCldOwogCQlpbnQgaSA9IDA7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiBwYXRocykKKwkJZm9yIChTdHJpbmcgcyA6IHBhdGhzKQogCQkJcFtpKytdID0gUGF0aEZpbHRlci5jcmVhdGUocyk7CiAJCXJldHVybiBjcmVhdGUocCk7CiAJfQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJICogICAgICAgICAgICB0aGUgcGF0aHMgdG8gdGVzdCBhZ2FpbnN0LiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGZvciB0aGUgcGF0aHMgc3VwcGxpZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKGZpbmFsIFN0cmluZy4uLiBwYXRocykgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhTdHJpbmcuLi4gcGF0aHMpIHsKIAkJaWYgKHBhdGhzLmxlbmd0aCA9PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYXRMZWFzdE9uZVBhdGhJc1JlcXVpcmVkKTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHBhdGhzIHRvIHRlc3QgYWdhaW5zdC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbnRyeS4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBmb3IgdGhlIGxpc3Qgb2YgcGF0aHMgc3VwcGxpZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFBhdGhGaWx0ZXI+IHBhdGhzKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShDb2xsZWN0aW9uPFBhdGhGaWx0ZXI+IHBhdGhzKSB7CiAJCWlmIChwYXRocy5pc0VtcHR5KCkpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5hdExlYXN0T25lUGF0aElzUmVxdWlyZWQpOwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybiBjcmVhdGUocCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgUGF0aEZpbHRlcltdIHApIHsKKwlwcml2YXRlIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShQYXRoRmlsdGVyW10gcCkgewogCQlpZiAocC5sZW5ndGggPT0gMSkKIAkJCXJldHVybiBuZXcgU2luZ2xlKHBbMF0pOwogCQlyZXR1cm4gbmV3IEdyb3VwKHApOwpAQCAtMTUxLDEzICsxNTEsMTMgQEAKIAogCQlwcml2YXRlIGZpbmFsIGJ5dGVbXSByYXc7CiAKLQkJcHJpdmF0ZSBTaW5nbGUoZmluYWwgUGF0aEZpbHRlciBwKSB7CisJCXByaXZhdGUgU2luZ2xlKFBhdGhGaWx0ZXIgcCkgewogCQkJcGF0aCA9IHA7CiAJCQlyYXcgPSBwYXRoLnBhdGhSYXc7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJCWZpbmFsIGludCBjbXAgPSB3YWxrZXIuaXNQYXRoUHJlZml4KHJhdywgcmF3Lmxlbmd0aCk7CiAJCQlpZiAoY21wID4gMCkKIAkJCQl0aHJvdyBTdG9wV2Fsa0V4Y2VwdGlvbi5JTlNUQU5DRTsKQEAgLTE4OCw3ICsxODgsNyBAQAogCiAJCXByaXZhdGUgYnl0ZVtdIG1heDsKIAotCQlwcml2YXRlIEdyb3VwKGZpbmFsIFBhdGhGaWx0ZXJbXSBwYXRoRmlsdGVycykgeworCQlwcml2YXRlIEdyb3VwKFBhdGhGaWx0ZXJbXSBwYXRoRmlsdGVycykgewogCQkJZnVsbHBhdGhzID0gbmV3IEJ5dGVBcnJheVNldChwYXRoRmlsdGVycy5sZW5ndGgpOwogCQkJcHJlZml4ZXMgPSBuZXcgQnl0ZUFycmF5U2V0KHBhdGhGaWx0ZXJzLmxlbmd0aCAvIDUpOwogCQkJLy8gNSBpcyBhbiBlbXBpcmljYWxseSBkZXJpdmVkIHJhdGlvIG9mICNwYXRocy8jcHJlZml4ZXMgZnJvbToKQEAgLTIzOSw3ICsyMzksNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAKIAkJCWJ5dGVbXSBycCA9IHdhbGtlci5nZXRSYXdQYXRoKCk7CiAJCQlIYXNoZXIgaGFzaGVyID0gbmV3IEhhc2hlcihycCwgd2Fsa2VyLmdldFBhdGhMZW5ndGgoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEKaW5kZXggNTUzZTZiZC4uM2Q5Zjg3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXIuamF2YQpAQCAtODQsNyArODQsNyBAQAogCWZpbmFsIFN0cmluZyBwYXRoU3RyOwogCWZpbmFsIGJ5dGVbXSBwYXRoUmF3OwogCi0JcHJpdmF0ZSBQYXRoU3VmZml4RmlsdGVyKGZpbmFsIFN0cmluZyBzKSB7CisJcHJpdmF0ZSBQYXRoU3VmZml4RmlsdGVyKFN0cmluZyBzKSB7CiAJCXBhdGhTdHIgPSBzOwogCQlwYXRoUmF3ID0gQ29uc3RhbnRzLmVuY29kZShwYXRoU3RyKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEKaW5kZXggZjBhNzYzMi4uMTFhZDQ2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQWxsRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYXNlVHJlZSA9IDA7CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCQlmaW5hbCBpbnQgbiA9IHdhbGtlci5nZXRUcmVlQ291bnQoKTsKIAkJCWlmIChuID09IDEpIC8vIEFzc3VtZSB0aGV5IG1lYW50IGRpZmZlcmVuY2UgdG8gZW1wdHkgdHJlZS4KIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTIyMSw3ICsyMjEsNyBAQAogCSAqICAgICAgICAgICAgIGFzIHRocm93biBieSB7QGxpbmsgI2luY2x1ZGUoVHJlZVdhbGspfQogCSAqIEBzaW5jZSA0LjcKIAkgKi8KLQlwdWJsaWMgaW50IG1hdGNoRmlsdGVyKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwlwdWJsaWMgaW50IG1hdGNoRmlsdGVyKFRyZWVXYWxrIHdhbGtlcikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24KIAl7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTY0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTY0LmphdmEKaW5kZXggMGMyN2NlZC4uNDQyZjA3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YQpAQCAtNiw5ICs2LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCkBAIC01NSw3ICs1NCw3IEBACiAJCQkJKyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiIC8vIC8vJE5PTi1OTFMtMSQKIAkJCQkrICIwMTIzNDU2Nzg5IiAvLyAvLyROT04tTkxTLTEkCiAJCQkJKyAiKy8iIC8vIC8vJE5PTi1OTFMtMSQKLQkJKS5nZXRCeXRlcyhVVEZfOCk7CisJCSkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAKIAkJREVDID0gbmV3IGJ5dGVbMTI4XTsKIAkJQXJyYXlzLmZpbGwoREVDLCBJTlZBTElEX0RFQyk7CkBAIC0xNzgsNyArMTc3LDcgQEAKIAkJCWUgKz0gNDsKIAkJfQogCi0JCXJldHVybiBuZXcgU3RyaW5nKG91dEJ1ZmYsIDAsIGUsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworCQlyZXR1cm4gbmV3IFN0cmluZyhvdXRCdWZmLCAwLCBlLCBDSEFSU0VUKTsKIAl9CiAKIAkvKioKQEAgLTI5NCw3ICsyOTMsNyBAQAogCSAqIEByZXR1cm4gdGhlIGRlY29kZWQgZGF0YQogCSAqLwogCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShTdHJpbmcgcykgewotCQlieXRlW10gYnl0ZXMgPSBzLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzID0gcy5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJcmV0dXJuIGRlY29kZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NhY2hlZEF1dGhlbnRpY2F0b3IuamF2YQppbmRleCA5OTE1YmRmLi42YjU4NzkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIAkgKiBAcGFyYW0gY2EKIAkgKiAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBzaG91bGQgcmVtZW1iZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZChmaW5hbCBDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoQ2FjaGVkQXV0aGVudGljYXRpb24gY2EpIHsKIAkJY2FjaGVkLmFkZChjYSk7CiAJfQogCkBAIC03MCw3ICs3MCw3IEBACiAJcHJvdGVjdGVkIGZpbmFsIFBhc3N3b3JkQXV0aGVudGljYXRpb24gZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpIHsKIAkJZmluYWwgU3RyaW5nIGhvc3QgPSBnZXRSZXF1ZXN0aW5nSG9zdCgpOwogCQlmaW5hbCBpbnQgcG9ydCA9IGdldFJlcXVlc3RpbmdQb3J0KCk7Ci0JCWZvciAoZmluYWwgQ2FjaGVkQXV0aGVudGljYXRpb24gY2EgOiBjYWNoZWQpIHsKKwkJZm9yIChDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSA6IGNhY2hlZCkgewogCQkJaWYgKGNhLmhvc3QuZXF1YWxzKGhvc3QpICYmIGNhLnBvcnQgPT0gcG9ydCkKIAkJCQlyZXR1cm4gY2EudG9QYXNzd29yZEF1dGhlbnRpY2F0aW9uKCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEKaW5kZXggNTZmN2FjYi4uODk0OGU2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEKQEAgLTc1LDYgKzc1LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yLkZpbGVNb2RlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yLkVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5Qcm9jZXNzUmVzdWx0LlN0YXR1czsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtODYsNiArODksMTQgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRlMuY2xhc3MpOwogCiAJLyoqCisJICogQW4gZW1wdHkgYXJyYXkgb2YgZW50cmllcywgc3VpdGFibGUgYXMgYSByZXR1cm4gdmFsdWUgZm9yCisJICoge0BsaW5rICNsaXN0KEZpbGUsIEZpbGVNb2RlU3RyYXRlZ3kpfS4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudHJ5W10gTk9fRU5UUklFUyA9IHt9OworCisJLyoqCiAJICogVGhpcyBjbGFzcyBjcmVhdGVzIEZTIGluc3RhbmNlcy4gSXQgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGEgSmF2YTcgdmFyaWFudAogCSAqIGlmIHN1Y2ggY2FuIGJlIGRldGVjdGVkIGluIHtAbGluayAjZGV0ZWN0KEJvb2xlYW4pfS4KIAkgKgpAQCAtMzgzLDcgKzM5NCw3IEBACiAJICogQHJldHVybiB0aGUgdHJhbnNsYXRlZCBwYXRoLiA8Y29kZT5uZXcgRmlsZShkaXIsbmFtZSk8L2NvZGU+IGlmIHRoaXMKIAkgKiAgICAgICAgIHBsYXRmb3JtIGRvZXMgbm90IHJlcXVpcmUgcGF0aCBuYW1lIHRyYW5zbGF0aW9uLgogCSAqLwotCXB1YmxpYyBGaWxlIHJlc29sdmUoZmluYWwgRmlsZSBkaXIsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIEZpbGUgcmVzb2x2ZShGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgRmlsZSBhYnNwbiA9IG5ldyBGaWxlKG5hbWUpOwogCQlpZiAoYWJzcG4uaXNBYnNvbHV0ZSgpKQogCQkJcmV0dXJuIGFic3BuOwpAQCAtNDU5LDExICs0NzAsMTEgQEAKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBtYXRjaCBmb3VuZCwgb3IgbnVsbAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgc2VhcmNoUGF0aChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nLi4uIGxvb2tGb3IpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgc2VhcmNoUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nLi4uIGxvb2tGb3IpIHsKIAkJaWYgKHBhdGggPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCi0JCWZvciAoZmluYWwgU3RyaW5nIHAgOiBwYXRoLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcikpIHsKKwkJZm9yIChTdHJpbmcgcCA6IHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKSkgewogCQkJZm9yIChTdHJpbmcgY29tbWFuZCA6IGxvb2tGb3IpIHsKIAkJCQlmaW5hbCBGaWxlIGUgPSBuZXcgRmlsZShwLCBjb21tYW5kKTsKIAkJCQlpZiAoZS5pc0ZpbGUoKSkKQEAgLTk2MSw2ICs5NzIsMjkgQEAKIAl9CiAKIAkvKioKKwkgKiBFbnVtZXJhdGVzIGNoaWxkcmVuIG9mIGEgZGlyZWN0b3J5LgorCSAqCisJICogQHBhcmFtIGRpcmVjdG9yeQorCSAqICAgICAgICAgICAgdG8gZ2V0IHRoZSBjaGlsZHJlbiBvZgorCSAqIEBwYXJhbSBmaWxlTW9kZVN0cmF0ZWd5CisJICogICAgICAgICAgICB0byB1c2UgdG8gY2FsY3VsYXRlIHRoZSBnaXQgbW9kZSBvZiBhIGNoaWxkCisJICogQHJldHVybiBhbiBhcnJheSBvZiBlbnRyaWVzIGZvciB0aGUgY2hpbGRyZW4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgRW50cnlbXSBsaXN0KEZpbGUgZGlyZWN0b3J5LCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKKwkJZmluYWwgRmlsZVtdIGFsbCA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKKwkJaWYgKGFsbCA9PSBudWxsKSB7CisJCQlyZXR1cm4gTk9fRU5UUklFUzsKKwkJfQorCQlmaW5hbCBFbnRyeVtdIHJlc3VsdCA9IG5ldyBFbnRyeVthbGwubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKKwkJCXJlc3VsdFtpXSA9IG5ldyBGaWxlRW50cnkoYWxsW2ldLCB0aGlzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgogCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBob29rIGlzIGRlZmluZWQgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5LCB0aGVuCiAJICogcnVucyBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCiAJICogPHA+CkBAIC0xMDk3LDcgKzExMzEsNyBAQAogCSAqICAgICAgICAgZXhpc3RzIGluIHRoZSBnaXZlbiByZXBvc2l0b3J5LCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCiAJICogQHNpbmNlIDQuMAogCSAqLwotCXB1YmxpYyBGaWxlIGZpbmRIb29rKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGhvb2tOYW1lKSB7CisJcHVibGljIEZpbGUgZmluZEhvb2soUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgaG9va05hbWUpIHsKIAkJRmlsZSBnaXREaXIgPSByZXBvc2l0b3J5LmdldERpcmVjdG9yeSgpOwogCQlpZiAoZ2l0RGlyID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKQEAgLTExODIsMTkgKzEyMTYsMjMgQEAKIAkJCQkJbmV3IFN0cmVhbUdvYmJsZXIocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpLCBlcnJSZWRpcmVjdCkpOwogCQkJZXhlY3V0b3IuZXhlY3V0ZSgKIAkJCQkJbmV3IFN0cmVhbUdvYmJsZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLCBvdXRSZWRpcmVjdCkpOworCQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQ2xvc2VkIGluIHRoZSBmaW5hbGx5IGJsb2NrCiAJCQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gcHJvY2Vzcy5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJCWlmIChpblJlZGlyZWN0ICE9IG51bGwpIHsKLQkJCQluZXcgU3RyZWFtR29iYmxlcihpblJlZGlyZWN0LCBvdXRwdXRTdHJlYW0pLmNvcHkoKTsKLQkJCX0KIAkJCXRyeSB7Ci0JCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gV2hlbiB0aGUgcHJvY2VzcyBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBpbnB1dCwgdGhlIE91dHB1dFN0cmVhbQotCQkJCS8vIGlzIHJlcGxhY2VkIHdpdGggdGhlIG51bGwgb3V0cHV0IHN0cmVhbS4gVGhpcyBudWxsIG91dHB1dCBzdHJlYW0KLQkJCQkvLyB0aHJvd3MgSU9FeGNlcHRpb24gZm9yIGFsbCB3cml0ZSBjYWxscy4gV2hlbiBTdHJlYW1Hb2JibGVyIGZhaWxzIHRvCi0JCQkJLy8gZmx1c2ggdGhlIGJ1ZmZlciBiZWNhdXNlIG9mIHRoaXMsIHRoaXMgY2xvc2UgY2FsbCB0cmllcyB0byBmbHVzaCBpdAotCQkJCS8vIGFnYWluLiBUaGlzIGNhdXNlcyBhbm90aGVyIElPRXhjZXB0aW9uLiBTaW5jZSB3ZSBpZ25vcmUgdGhlCi0JCQkJLy8gSU9FeGNlcHRpb24gaW4gU3RyZWFtR29iYmxlciwgd2UgYWxzbyBpZ25vcmUgdGhlIGV4Y2VwdGlvbiBoZXJlLgorCQkJCWlmIChpblJlZGlyZWN0ICE9IG51bGwpIHsKKwkJCQkJbmV3IFN0cmVhbUdvYmJsZXIoaW5SZWRpcmVjdCwgb3V0cHV0U3RyZWFtKS5jb3B5KCk7CisJCQkJfQorCQkJfSBmaW5hbGx5IHsKKwkJCQl0cnkgeworCQkJCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIFdoZW4gdGhlIHByb2Nlc3MgZXhpdHMgYmVmb3JlIGNvbnN1bWluZyB0aGUgaW5wdXQsIHRoZSBPdXRwdXRTdHJlYW0KKwkJCQkJLy8gaXMgcmVwbGFjZWQgd2l0aCB0aGUgbnVsbCBvdXRwdXQgc3RyZWFtLiBUaGlzIG51bGwgb3V0cHV0IHN0cmVhbQorCQkJCQkvLyB0aHJvd3MgSU9FeGNlcHRpb24gZm9yIGFsbCB3cml0ZSBjYWxscy4gV2hlbiBTdHJlYW1Hb2JibGVyIGZhaWxzIHRvCisJCQkJCS8vIGZsdXNoIHRoZSBidWZmZXIgYmVjYXVzZSBvZiB0aGlzLCB0aGlzIGNsb3NlIGNhbGwgdHJpZXMgdG8gZmx1c2ggaXQKKwkJCQkJLy8gYWdhaW4uIFRoaXMgY2F1c2VzIGFub3RoZXIgSU9FeGNlcHRpb24uIFNpbmNlIHdlIGlnbm9yZSB0aGUKKwkJCQkJLy8gSU9FeGNlcHRpb24gaW4gU3RyZWFtR29iYmxlciwgd2UgYWxzbyBpZ25vcmUgdGhlIGV4Y2VwdGlvbiBoZXJlLgorCQkJCX0KIAkJCX0KIAkJCXJldHVybiBwcm9jZXNzLndhaXRGb3IoKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfUE9TSVguamF2YQppbmRleCA0NTIzN2M0Li44Nzk1MzI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfUE9TSVguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfUE9TSVguamF2YQpAQCAtMzk5LDcgKzM5OSw3IEBACiAJCQlJbnRlZ2VyIG5saW5rID0gKEludGVnZXIpIChGaWxlcy5nZXRBdHRyaWJ1dGUobG9ja1BhdGgsCiAJCQkJCSJ1bml4Om5saW5rIikpOyAvLyROT04tTkxTLTEkCiAJCQlpZiAobmxpbmsgPiAyKSB7Ci0JCQkJTE9HLndhcm4oIm5saW5rIG9mIGxpbmsgdG8gbG9jayBmaWxlIHswfSB3YXMgbm90IDIgYnV0IHsxfSIsIC8vJE5PTi1OTFMtMSQKKwkJCQlMT0cud2Fybigibmxpbmsgb2YgbGluayB0byBsb2NrIGZpbGUge30gd2FzIG5vdCAyIGJ1dCB7fSIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCWxvY2suZ2V0UGF0aCgpLCBubGluayk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfSBlbHNlIGlmIChubGluayA8IDIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKaW5kZXggMjlmZTVkYy4uOWY5OWUyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKQEAgLTQ3LDExICs0NywyMSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdE9wdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdFJlc3VsdDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlTW9kZVN0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuV29ya2luZ1RyZWVJdGVyYXRvci5FbnRyeTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC05NywxMyArMTA3LDEzIEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoZmluYWwgRmlsZSBmKSB7CisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShGaWxlIGYpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2V0RXhlY3V0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIGJvb2xlYW4gY2FuRXhlYykgeworCXB1YmxpYyBib29sZWFuIHNldEV4ZWN1dGUoRmlsZSBmLCBib29sZWFuIGNhbkV4ZWMpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMTIxLDYgKzEzMSw0OSBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50cnlbXSBsaXN0KEZpbGUgZGlyZWN0b3J5LCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKKwkJTGlzdDxFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUZTIGZzID0gdGhpczsKKwkJYm9vbGVhbiBjaGVja0V4ZWN1dGFibGUgPSBmcy5zdXBwb3J0c0V4ZWN1dGUoKTsKKwkJdHJ5IHsKKwkJCUZpbGVzLndhbGtGaWxlVHJlZShkaXJlY3RvcnkudG9QYXRoKCksCisJCQkJCUVudW1TZXQubm9uZU9mKEZpbGVWaXNpdE9wdGlvbi5jbGFzcyksIDEsCisJCQkJCW5ldyBTaW1wbGVGaWxlVmlzaXRvcjxQYXRoPigpIHsKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIEZpbGVWaXNpdFJlc3VsdCB2aXNpdEZpbGUoUGF0aCBmaWxlLAorCQkJCQkJCQlCYXNpY0ZpbGVBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQkJCUZpbGUgZiA9IGZpbGUudG9GaWxlKCk7CisJCQkJCQkJRlMuQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbmV3IEZTLkF0dHJpYnV0ZXMoZnMsIGYsCisJCQkJCQkJCQl0cnVlLCBhdHRycy5pc0RpcmVjdG9yeSgpLAorCQkJCQkJCQkJY2hlY2tFeGVjdXRhYmxlICYmIGYuY2FuRXhlY3V0ZSgpLAorCQkJCQkJCQkJYXR0cnMuaXNTeW1ib2xpY0xpbmsoKSwKKwkJCQkJCQkJCWF0dHJzLmlzUmVndWxhckZpbGUoKSwKKwkJCQkJCQkJCWF0dHJzLmNyZWF0aW9uVGltZSgpLnRvTWlsbGlzKCksCisJCQkJCQkJCQlhdHRycy5sYXN0TW9kaWZpZWRUaW1lKCkudG9NaWxsaXMoKSwKKwkJCQkJCQkJCWF0dHJzLnNpemUoKSk7CisJCQkJCQkJcmVzdWx0LmFkZChuZXcgRmlsZUVudHJ5KGYsIGZzLCBhdHRyaWJ1dGVzLAorCQkJCQkJCQkJZmlsZU1vZGVTdHJhdGVneSkpOworCQkJCQkJCXJldHVybiBGaWxlVmlzaXRSZXN1bHQuQ09OVElOVUU7CisJCQkJCQl9CisKKwkJCQkJCUBPdmVycmlkZQorCQkJCQkJcHVibGljIEZpbGVWaXNpdFJlc3VsdCB2aXNpdEZpbGVGYWlsZWQoUGF0aCBmaWxlLAorCQkJCQkJCQlJT0V4Y2VwdGlvbiBleGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCQkJLy8gSnVzdCBpZ25vcmUgaXQKKwkJCQkJCQlyZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworCQkJCQkJfQorCQkJCQl9KTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KKwkJaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBOT19FTlRSSUVTOworCQl9CisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgRW50cnlbcmVzdWx0LnNpemUoKV0pOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEZpbGUgZGlzY292ZXJHaXRFeGUoKSB7CiAJCVN0cmluZyBwYXRoID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0ZW52KCJQQVRIIik7IC8vJE5PTi1OTFMtMSQKIAkJRmlsZSBnaXRFeGUgPSBzZWFyY2hQYXRoKHBhdGgsICJnaXQuZXhlIiwgImdpdC5jbWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzJfQ3lnd2luLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzJfQ3lnd2luLmphdmEKaW5kZXggNjRjZGNjMy4uMzM5M2ZiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YQpAQCAtNDMsNiArNDMsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CkBAIC0xMTcsMTQgKzExOSwxNCBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgRmlsZSByZXNvbHZlKGZpbmFsIEZpbGUgZGlyLCBmaW5hbCBTdHJpbmcgcG4pIHsKKwlwdWJsaWMgRmlsZSByZXNvbHZlKEZpbGUgZGlyLCBTdHJpbmcgcG4pIHsKIAkJU3RyaW5nIHVzZUN5Z1BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImpnaXQudXNlY3lncGF0aCIpOyAvLyROT04tTkxTLTEkCiAJCWlmICh1c2VDeWdQYXRoICE9IG51bGwgJiYgdXNlQ3lnUGF0aC5lcXVhbHMoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCiAJCQlTdHJpbmcgdzsKIAkJCXRyeSB7CiAJCQkJdyA9IHJlYWRQaXBlKGRpciwgLy8KIAkJCQkJbmV3IFN0cmluZ1tdIHsgY3lncGF0aCwgIi0td2luZG93cyIsICItLWFic29sdXRlIiwgcG4gfSwgLy8gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSJVVEYtOCIpOyAvLyROT04tTkxTLTEkCisJCQkJCUNIQVJTRVQubmFtZSgpKTsKIAkJCX0gY2F0Y2ggKENvbW1hbmRGYWlsZWRFeGNlcHRpb24gZSkgewogCQkJCUxPRy53YXJuKGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQlyZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjIxNzUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiwgUm9iaW4gUm9zZW5iZXJnIDxyb2Jpbi5yb3NlbmJlcmdAZGV3aXJlLmNvbT4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTLkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogRmlsZSB1dGlsaXRpZXMgdXNpbmcgSmF2YSA3IE5JTzIKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBSZWFkIHRhcmdldCBwYXRoIG9mIGEgc3ltbGluay4KLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gdGFyZ2V0IHBhdGggb2YgdGhlIHN5bWxpbmsuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3JlYWRTeW1MaW5rKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRTeW1saW5rKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5yZWFkU3ltTGluayhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW1saW5rCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgc3ltbGluayB0byBiZSBjcmVhdGVkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGFyZ2V0IG9mIHRoZSBzeW1saW5rIHRvIGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNjcmVhdGVTeW1MaW5rKEZpbGUsIFN0cmluZyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVN5bUxpbmsoRmlsZSBwYXRoLCBTdHJpbmcgdGFyZ2V0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLmNyZWF0ZVN5bUxpbmsocGF0aCwgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBwYXNzZWQgZmlsZSBpcyBhIHN5bWxpbmsKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcGFzc2VkIHBhdGggaXMgYSBzeW1saW5rCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNTeW1ib2xpY0xpbmsoamF2YS5uaW8uZmlsZS5QYXRoKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW1saW5rKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzU3ltbGluayhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSBmb3IgZ2l2ZW4gcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiBsYXN0TW9kaWZpZWQgYXR0cmlidXRlIGZvciBnaXZlbiBwYXRoCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjZ2V0TGFzdE1vZGlmaWVkVGltZShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBsb25nIGxhc3RNb2RpZmllZChGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMubGFzdE1vZGlmaWVkKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFNldCBsYXN0TW9kaWZpZWQgYXR0cmlidXRlIGZvciBnaXZlbiBwYXRoCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcGFyYW0gdGltZQotCSAqICAgICAgICAgICAgYSBsb25nLgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI3NldExhc3RNb2RpZmllZFRpbWUoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlVGltZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExhc3RNb2RpZmllZChGaWxlIHBhdGgsIGxvbmcgdGltZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLnNldExhc3RNb2RpZmllZChwYXRoLCB0aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoaXMgZmlsZSBleGlzdHMKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBwYXRoIGV4aXN0cwotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2V4aXN0cyhqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4aXN0cyhGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5leGlzdHMocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIGZpbGUgaXMgaGlkZGVuCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBoaWRkZW4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNIaWRkZW4oamF2YS5uaW8uZmlsZS5QYXRoKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIaWRkZW4oRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzSGlkZGVuKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlzIGZpbGUgaGlkZGVuCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcGFyYW0gaGlkZGVuCi0JICogICAgICAgICAgICBhIGJvb2xlYW4uCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjc2V0SGlkZGVuKEZpbGUsYm9vbGVhbil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhpZGRlbihGaWxlIHBhdGgsIGJvb2xlYW4gaGlkZGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlVXRpbHMuc2V0SGlkZGVuKHBhdGgsIGhpZGRlbik7Ci0JfQotCi0JLyoqCi0JICogR2V0IGZpbGUgbGVuZ3RoCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZmlsZQotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNnZXRMZW5ndGgoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBsb25nIGdldExlbmd0aChGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMuZ2V0TGVuZ3RoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIGdpdmVuIEZpbGUgaXMgYSBkaXJlY3RvcnkKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGRpcmVjdG9yeQotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzRGlyZWN0b3J5KGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uLi4uKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuaXNEaXJlY3RvcnkocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgZ2l2ZW4gRmlsZSBpcyBhIGZpbGUKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGZpbGUKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNpc1JlZ3VsYXJGaWxlKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uLi4uKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzRmlsZShwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBnaXZlbiBmaWxlIGNhbiBiZSBleGVjdXRlZAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBmaWxlIGNhbiBiZSBleGVjdXRlZAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNjYW5FeGVjdXRlKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGVjdXRlKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmNhbkV4ZWN1dGUocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBnaXZlbiBmaWxlCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2RlbGV0ZShGaWxlKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlVXRpbHMuZGVsZXRlKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldCBmaWxlIHN5c3RlbSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqCi0JICogQHBhcmFtIGZzCi0JICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlN9IG9iamVjdC4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiBmaWxlIHN5c3RlbSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2dldEZpbGVBdHRyaWJ1dGVzUG9zaXgoRlMsRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVzIGdldEZpbGVBdHRyaWJ1dGVzUG9zaXgoRlMgZnMsIEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmdldEZpbGVBdHRyaWJ1dGVzUG9zaXgoZnMsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIE5GQyBub3JtYWxpemUgRmlsZSAob24gTWFjKSwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcKLQkgKgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gb24gTWFjOiBORkMgbm9ybWFsaXplZCB7QGxpbmsgamF2YS5pby5GaWxlfSwgb3RoZXJ3aXNlIHRoZSBwYXNzZWQKLQkgKiAgICAgICAgIGZpbGUKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjbm9ybWFsaXplKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRmlsZSBub3JtYWxpemUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMubm9ybWFsaXplKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIE5GQyBub3JtYWxpemUgZmlsZSBuYW1lIChvbiBNYWMpLCBvdGhlcndpc2UgZG8gbm90aGluZwotCSAqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KLQkgKiBAcmV0dXJuIG9uIE1hYzogTkZDIG5vcm1hbGl6ZWQgZm9ybSBvZiBnaXZlbiBuYW1lCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI25vcm1hbGl6ZShTdHJpbmcpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gRmlsZVV0aWxzLm5vcm1hbGl6ZShuYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YQppbmRleCAwOGMyNzhlLi4yZjU0N2MxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5JbnZhbGlkUGF0aEV4Y2VwdGlvbn0pCiAJICogQHNpbmNlIDQuMTAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdGggdG9QYXRoKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIFBhdGggdG9QYXRoKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBmLnRvUGF0aCgpOwogCQl9IGNhdGNoIChJbnZhbGlkUGF0aEV4Y2VwdGlvbiBleCkgewpAQCAtMTQxLDcgKzE0MSw3IEBACiAJICogICAgICAgICAgICAgY2F1c2UgamF2YS5pby5JT0V4Y2VwdGlvbnMgZHVyaW5nIHJhY2UgY29uZGl0aW9ucyB3aGVuCiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gZGVsZXRlIHRoZSBzYW1lIGZpbGUuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShmLCBOT05FKTsKIAl9CiAKQEAgLTE2Miw3ICsxNjIsNyBAQAogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGRlbGV0ZSB0aGUgc2FtZSBmaWxlLgogCSAqICAgICAgICAgICAgIFRoaXMgZXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gd2hlbiBJR05PUkVfRVJST1JTIGlzIHNldC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZiwgaW50IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGYsIGludCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGUyBmcyA9IEZTLkRFVEVDVEVEOwogCQlpZiAoKG9wdGlvbnMgJiBTS0lQX01JU1NJTkcpICE9IDAgJiYgIWZzLmV4aXN0cyhmKSkKIAkJCXJldHVybjsKQEAgLTI0MSw3ICsyNDEsNyBAQAogCSAqICAgICAgICAgICAgIGlmIHRoZSByZW5hbWUgaGFzIGZhaWxlZAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVuYW1lKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVuYW1lKEZpbGUgc3JjLCBGaWxlIGRzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlbmFtZShzcmMsIGRzdCwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOwogCX0KQEAgLTMyMSw3ICszMjEsNyBAQAogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoZmluYWwgRmlsZSBkKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihGaWxlIGQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlta2RpcihkLCBmYWxzZSk7CiAJfQpAQCAtMzQxLDcgKzM0MSw3IEBACiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCiAJICogICAgICAgICAgICAgZGlyZWN0b3J5LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihmaW5hbCBGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFkLm1rZGlyKCkpIHsKIAkJCWlmIChza2lwRXhpc3RpbmcgJiYgZC5pc0RpcmVjdG9yeSgpKQpAQCAtMzY2LDcgKzM2Niw3IEBACiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCiAJICogICAgICAgICAgICAgZGlyZWN0b3J5LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgRmlsZSBkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcnMoRmlsZSBkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlta2RpcnMoZCwgZmFsc2UpOwogCX0KIApAQCAtMzg4LDcgKzM4OCw3IEBACiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCiAJICogICAgICAgICAgICAgZGlyZWN0b3J5LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZCwgYm9vbGVhbiBza2lwRXhpc3RpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWQubWtkaXJzKCkpIHsKIAkJCWlmIChza2lwRXhpc3RpbmcgJiYgZC5pc0RpcmVjdG9yeSgpKQpAQCAtNDk4LDMzICs0OTgsNiBAQAogCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2Fubm90Q3JlYXRlVGVtcERpcik7CiAJfQogCi0KLQkvKioKLQkgKiBSZWxhdGl2aXplIGEgcGF0aAotCSAqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBtb3JlLWNsZWFybHktbmFtZWQKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWxhdGl2aXplTmF0aXZlUGF0aChTdHJpbmcsIFN0cmluZyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZCwgb3IgZGlyZWN0bHkgY2FsbAotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3JlbGF0aXZpemVQYXRoKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfQotCSAqCi0JICogICAgICAgICAgICAgRXhwcmVzc2VzIDxjb2RlPm90aGVyPC9jb2RlPiBhcyBhIHJlbGF0aXZlIGZpbGUgcGF0aCBmcm9tCi0JICogICAgICAgICAgICAgPGNvZGU+YmFzZTwvY29kZT4uIEZpbGUtc2VwYXJhdG9yIGFuZCBjYXNlIHNlbnNpdGl2aXR5IGFyZQotCSAqICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtLgotCSAqCi0JICogICAgICAgICAgICAgU2VlIGFsc28KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWxhdGl2aXplUGF0aChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBib29sZWFuKX0uCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIEJhc2UgcGF0aAotCSAqIEBwYXJhbSBvdGhlcgotCSAqICAgICAgICAgICAgRGVzdGluYXRpb24gcGF0aAotCSAqIEByZXR1cm4gUmVsYXRpdmUgcGF0aCBmcm9tIDxjb2RlPmJhc2U8L2NvZGU+IHRvIDxjb2RlPm90aGVyPC9jb2RlPgotCSAqIEBzaW5jZSAzLjcKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIGJhc2UsIFN0cmluZyBvdGhlcikgewotCQlyZXR1cm4gcmVsYXRpdml6ZU5hdGl2ZVBhdGgoYmFzZSwgb3RoZXIpOwotCX0KLQogCS8qKgogCSAqIEV4cHJlc3NlcyA8Y29kZT5vdGhlcjwvY29kZT4gYXMgYSByZWxhdGl2ZSBmaWxlIHBhdGggZnJvbQogCSAqIDxjb2RlPmJhc2U8L2NvZGU+LiBGaWxlLXNlcGFyYXRvciBhbmQgY2FzZSBzZW5zaXRpdml0eSBhcmUgYmFzZWQgb24gdGhlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhCmluZGV4IGE1YTg1OGYuLjZmOTJiMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhCkBAIC00NCw2ICs0NCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkc7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwpAQCAtMTc1LDExICsxNzcsMTEgQEAKIAkgKiBAcGFyYW0ga2V5CiAJICogICAgICAgICAgICB2YWx1ZSB3aGljaCBtdXN0IGJlIGVuY29kZWQgdG8gcHJvdGVjdGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlKGZpbmFsIFN0cmluZ0J1aWxkZXIgdXJsc3RyLCBmaW5hbCBTdHJpbmcga2V5KSB7CisJcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZShTdHJpbmdCdWlsZGVyIHVybHN0ciwgU3RyaW5nIGtleSkgewogCQlpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCgpID09IDApCiAJCQlyZXR1cm47CiAJCXRyeSB7Ci0JCQl1cmxzdHIuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGtleSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisJCQl1cmxzdHIuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGtleSwgQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY291bGROb3RVUkxFbmNvZGVUb1VURjgsIGUpOwogCQl9CkBAIC0yMDAsNyArMjAyLDcgQEAKIAkgKiAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBlcnJvciBwcmV2ZW50ZWQgb2J0YWluaW5nIHRoZSByZXNwb25zZSBjb2RlLgogCSAqIEBzaW5jZSAzLjMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCByZXNwb25zZShmaW5hbCBIdHRwQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKEh0dHBDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gYy5nZXRSZXNwb25zZUNvZGUoKTsKIAkJfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBjZSkgewpAQCAtMjI4LDcgKzIzMCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgY29tbXVuaWNhdGlvbnMgZXJyb3IgcHJldmVudGVkIG9idGFpbmluZyB0aGUgcmVzcG9uc2UgY29kZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCByZXNwb25zZShmaW5hbCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbiBjKQorCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uIGMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIGMuZ2V0UmVzcG9uc2VDb2RlKCk7CkBAIC0yNzMsNyArMjc1LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgcHJveHkgY291bGQgbm90IGJlIGNvbXB1dGVkIGFzIHRoZSBzdXBwbGllZCBVUkwgY291bGQgbm90CiAJICogICAgICAgICAgICAgYmUgcmVhZC4gVGhpcyBmYWlsdXJlIHNob3VsZCBuZXZlciBvY2N1ci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5IHByb3h5Rm9yKGZpbmFsIFByb3h5U2VsZWN0b3IgcHJveHlTZWxlY3RvciwgZmluYWwgVVJMIHUpCisJcHVibGljIHN0YXRpYyBQcm94eSBwcm94eUZvcihQcm94eVNlbGVjdG9yIHByb3h5U2VsZWN0b3IsIFVSTCB1KQogCQkJdGhyb3dzIENvbm5lY3RFeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIHByb3h5U2VsZWN0b3Iuc2VsZWN0KHUudG9VUkkoKSkuZ2V0KDApOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0lPLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YQppbmRleCBmMzlkMjE3Li5lODhlN2EzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YQpAQCAtNDcsNyArNDcsNiBAQAogCiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTU5LDYgKzU4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlNpbGVudEZpbGVJbnB1dFN0cmVhbTsKIAogLyoqCiAgKiBJbnB1dC9PdXRwdXQgdXRpbGl0aWVzCkBAIC03Niw3ICs3Niw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGZpbGUgZXhpc3RzLCBidXQgaXRzIGNvbnRlbnRzIGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRGdWxseShmaW5hbCBGaWxlIHBhdGgpCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KEZpbGUgcGF0aCkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIElPLnJlYWRGdWxseShwYXRoLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CiAJfQpAQCAtOTYsMTAgKzk2LDkgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMsIGJ1dCBpdHMgY29udGVudHMgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZFNvbWUoZmluYWwgRmlsZSBwYXRoLCBmaW5hbCBpbnQgbGltaXQpCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZFNvbWUoRmlsZSBwYXRoLCBpbnQgbGltaXQpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JCXRyeSB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgewogCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xpbWl0XTsKIAkJCWludCBjbnQgPSAwOwogCQkJZm9yICg7OykgewpAQCAtMTEzLDEyICsxMTIsNiBAQAogCQkJYnl0ZVtdIHJlcyA9IG5ldyBieXRlW2NudF07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgcmVzLCAwLCBjbnQpOwogCQkJcmV0dXJuIHJlczsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9CiAJCX0KIAl9CiAKQEAgLTEzNiwxMCArMTI5LDkgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMsIGJ1dCBpdHMgY29udGVudHMgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KGZpbmFsIEZpbGUgcGF0aCwgZmluYWwgaW50IG1heCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoRmlsZSBwYXRoLCBpbnQgbWF4KQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotCQl0cnkgeworCQl0cnkgKFNpbGVudEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0ocGF0aCkpIHsKIAkJCWxvbmcgc3ogPSBNYXRoLm1heChwYXRoLmxlbmd0aCgpLCAxKTsKIAkJCWlmIChzeiA+IG1heCkKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0xNzMsMTIgKzE2NSw2IEBACiAJCQkJYnVmID0gbmI7CiAJCQl9CiAJCQlyZXR1cm4gYnVmOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotCQkJCS8vIGlnbm9yZSBhbnkgY2xvc2UgZXJyb3JzLCB0aGlzIHdhcyBhIHJlYWQgb25seSBzdHJlYW0KLQkJCX0KIAkJfQogCX0KIApAQCAtMzI1LDcgKzMxMSw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgc3RyZWFtLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBza2lwRnVsbHkoZmluYWwgSW5wdXRTdHJlYW0gZmQsIGxvbmcgdG9Ta2lwKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBza2lwRnVsbHkoSW5wdXRTdHJlYW0gZmQsIGxvbmcgdG9Ta2lwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd2hpbGUgKHRvU2tpcCA+IDApIHsKIAkJCWZpbmFsIGxvbmcgciA9IGZkLnNraXAodG9Ta2lwKTsKQEAgLTM0Myw3ICszMjksNyBAQAogCSAqIEByZXR1cm4gdGhlIHN0cmluZyBkaXZpZGVkIGludG8gbGluZXMKIAkgKiBAc2luY2UgMi4wCiAJICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZExpbmVzKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZExpbmVzKFN0cmluZyBzKSB7CiAJCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JbnRMaXN0LmphdmEKaW5kZXggMjQwMzhmMC4uNzQ0MWQ1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJICogQHBhcmFtIGNhcGFjaXR5CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0aGUgbGlzdCBjYW4gaW5pdGlhbGx5IGhvbGQuCiAJICovCi0JcHVibGljIEludExpc3QoZmluYWwgaW50IGNhcGFjaXR5KSB7CisJcHVibGljIEludExpc3QoaW50IGNhcGFjaXR5KSB7CiAJCWVudHJpZXMgPSBuZXcgaW50W2NhcGFjaXR5XTsKIAl9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZQogCSAqLwotCXB1YmxpYyBpbnQgZ2V0KGZpbmFsIGludCBpKSB7CisJcHVibGljIGludCBnZXQoaW50IGkpIHsKIAkJaWYgKGNvdW50IDw9IGkpCiAJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGkpOwogCQlyZXR1cm4gZW50cmllc1tpXTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGFkZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgaW50IG4pIHsKKwlwdWJsaWMgdm9pZCBhZGQoaW50IG4pIHsKIAkJaWYgKGNvdW50ID09IGVudHJpZXMubGVuZ3RoKQogCQkJZ3JvdygpOwogCQllbnRyaWVzW2NvdW50KytdID0gbjsKQEAgLTEzNSw3ICsxMzUsNyBAQAogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB2YWx1ZSB0byBzdG9yZSBhdCB0aGUgcG9zaXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0KGZpbmFsIGludCBpbmRleCwgZmluYWwgaW50IG4pIHsKKwlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBpbnQgbikgewogCQlpZiAoY291bnQgPCBpbmRleCkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwogCQllbHNlIGlmIChjb3VudCA9PSBpbmRleCkKQEAgLTE1NCw3ICsxNTQsNyBAQAogCSAqIEBwYXJhbSB2YWwKIAkgKiAgICAgICAgICAgIHZhbHVlIHRvIGluc2VydCBpbnRvIHBhZGRlZCBwb3NpdGlvbnMuCiAJICovCi0JcHVibGljIHZvaWQgZmlsbFRvKGludCB0b0luZGV4LCBmaW5hbCBpbnQgdmFsKSB7CisJcHVibGljIHZvaWQgZmlsbFRvKGludCB0b0luZGV4LCBpbnQgdmFsKSB7CiAJCXdoaWxlIChjb3VudCA8IHRvSW5kZXgpCiAJCQlhZGQodmFsKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTGlzdC5qYXZhCmluZGV4IDQwNDU5NGMuLjNiZDZlMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTGlzdC5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAJICogQHBhcmFtIGNhcGFjaXR5CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0aGUgbGlzdCBjYW4gaW5pdGlhbGx5IGhvbGQuCiAJICovCi0JcHVibGljIExvbmdMaXN0KGZpbmFsIGludCBjYXBhY2l0eSkgeworCXB1YmxpYyBMb25nTGlzdChpbnQgY2FwYWNpdHkpIHsKIAkJZW50cmllcyA9IG5ldyBsb25nW2NhcGFjaXR5XTsKIAl9CiAKQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UKIAkgKi8KLQlwdWJsaWMgbG9uZyBnZXQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgbG9uZyBnZXQoaW50IGkpIHsKIAkJaWYgKGNvdW50IDw9IGkpCiAJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGkpOwogCQlyZXR1cm4gZW50cmllc1tpXTsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAJICogQHJldHVybiB0cnVlIG9mIHtAY29kZSB2YWx1ZX0gYXBwZWFycyBpbiB0aGlzIGxpc3QuCiAJICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgbG9uZyB2YWx1ZSkgeworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGxvbmcgdmFsdWUpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogCQkJaWYgKGVudHJpZXNbaV0gPT0gdmFsdWUpCiAJCQkJcmV0dXJuIHRydWU7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBhZGQuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIGxvbmcgbikgeworCXB1YmxpYyB2b2lkIGFkZChsb25nIG4pIHsKIAkJaWYgKGNvdW50ID09IGVudHJpZXMubGVuZ3RoKQogCQkJZ3JvdygpOwogCQllbnRyaWVzW2NvdW50KytdID0gbjsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB2YWx1ZSB0byBzdG9yZSBhdCB0aGUgcG9zaXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0KGZpbmFsIGludCBpbmRleCwgZmluYWwgbG9uZyBuKSB7CisJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgbG9uZyBuKSB7CiAJCWlmIChjb3VudCA8IGluZGV4KQogCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7CiAJCWVsc2UgaWYgKGNvdW50ID09IGluZGV4KQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJICogQHBhcmFtIHZhbAogCSAqICAgICAgICAgICAgdmFsdWUgdG8gaW5zZXJ0IGludG8gcGFkZGVkIHBvc2l0aW9ucy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGZpbmFsIGxvbmcgdmFsKSB7CisJcHVibGljIHZvaWQgZmlsbFRvKGludCB0b0luZGV4LCBsb25nIHZhbCkgewogCQl3aGlsZSAoY291bnQgPCB0b0luZGV4KQogCQkJYWRkKHZhbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdNYXAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEKaW5kZXggMDllZWU0Mi4uOGM3ZjY3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdNYXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydChmaW5hbCBOb2RlPFY+IG4pIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0KE5vZGU8Vj4gbikgewogCQlmaW5hbCBpbnQgaWR4ID0gaW5kZXgobi5rZXkpOwogCQluLm5leHQgPSB0YWJsZVtpZHhdOwogCQl0YWJsZVtpZHhdID0gbjsKQEAgLTE2NiwxNCArMTY2LDE0IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIGZpbmFsIGludCBpbmRleChmaW5hbCBsb25nIGtleSkgeworCXByaXZhdGUgZmluYWwgaW50IGluZGV4KGxvbmcga2V5KSB7CiAJCWludCBoID0gKChpbnQpIGtleSkgPj4+IDE7CiAJCWggXj0gKGggPj4+IDIwKSBeIChoID4+PiAxMik7CiAJCXJldHVybiBoICYgKHRhYmxlLmxlbmd0aCAtIDEpOwogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIDxWPiBOb2RlPFY+W10gY3JlYXRlQXJyYXkoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgPFY+IE5vZGU8Vj5bXSBjcmVhdGVBcnJheShpbnQgc3opIHsKIAkJcmV0dXJuIG5ldyBOb2RlW3N6XTsKIAl9CiAKQEAgLTE4Miw3ICsxODIsNyBAQAogCQlWIHZhbHVlOwogCQlOb2RlPFY+IG5leHQ7CiAKLQkJTm9kZShmaW5hbCBsb25nIGssIGZpbmFsIFYgdikgeworCQlOb2RlKGxvbmcgaywgViB2KSB7CiAJCQlrZXkgPSBrOwogCQkJdmFsdWUgPSB2OwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nLmphdmEKaW5kZXggNzdiYzI0OS4uNGQ1OGQwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YQpAQCAtOTksNyArOTksNyBAQAogCSAqIEByZXR1cm4gdGhlIGNsZWFuZWQgc3RyaW5nLgogCSAqIEBzZWUgI2RlcXVvdGUoYnl0ZVtdLCBpbnQsIGludCkKIAkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoZmluYWwgU3RyaW5nIGluKSB7CisJcHVibGljIFN0cmluZyBkZXF1b3RlKFN0cmluZyBpbikgewogCQlmaW5hbCBieXRlW10gYiA9IENvbnN0YW50cy5lbmNvZGUoaW4pOwogCQlyZXR1cm4gZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJfQpAQCAtMTM3LDcgKzEzNyw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBjbGFzcyBCb3VybmVTdHlsZSBleHRlbmRzIFF1b3RlZFN0cmluZyB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbikgeworCQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBpbikgewogCQkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJCXIuYXBwZW5kKCdcJycpOwogCQkJaW50IHN0YXJ0ID0gMCwgaSA9IDA7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoZmluYWwgYnl0ZVtdIGluLCBpbnQgaXAsIGZpbmFsIGludCBpZSkgeworCQlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoYnl0ZVtdIGluLCBpbnQgaXAsIGludCBpZSkgewogCQkJYm9vbGVhbiBpbnF1b3RlID0gZmFsc2U7CiAJCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2llIC0gaXBdOwogCQkJaW50IHJQdHIgPSAwOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJLyoqIEJvdXJuZSBzdHlsZSwgYnV0IHBlcm1pdHMgPGNvZGU+fnVzZXI8L2NvZGU+IGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLiAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgQm91cm5lVXNlclBhdGhTdHlsZSBleHRlbmRzIEJvdXJuZVN0eWxlIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluKSB7CisJCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIGluKSB7CiAJCQlpZiAoaW4ubWF0Y2hlcygiXn5bQS1aYS16MC05Xy1dKyQiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJLy8gSWYgdGhlIHN0cmluZyBpcyBqdXN0ICJ+dXNlciIgd2UgY2FuIGFzc3VtZSB0aGV5CiAJCQkJLy8gbWVhbiAifnVzZXIvIi4KQEAgLTI1NSw3ICsyNTUsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluc3RyKSB7CisJCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIGluc3RyKSB7CiAJCQlpZiAoaW5zdHIubGVuZ3RoKCkgPT0gMCkKIAkJCQlyZXR1cm4gIlwiXCIiOyAvLyROT04tTkxTLTEkCiAJCQlib29sZWFuIHJldXNlID0gdHJ1ZTsKQEAgLTI5MSwxMyArMjkxLDEzIEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIGJ5dGVbXSBpbiwgZmluYWwgaW50IGluUHRyLCBmaW5hbCBpbnQgaW5FbmQpIHsKKwkJcHVibGljIFN0cmluZyBkZXF1b3RlKGJ5dGVbXSBpbiwgaW50IGluUHRyLCBpbnQgaW5FbmQpIHsKIAkJCWlmICgyIDw9IGluRW5kIC0gaW5QdHIgJiYgaW5baW5QdHJdID09ICciJyAmJiBpbltpbkVuZCAtIDFdID09ICciJykKIAkJCQlyZXR1cm4gZHEoaW4sIGluUHRyICsgMSwgaW5FbmQgLSAxKTsKIAkJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgaW4sIGluUHRyLCBpbkVuZCk7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHEoZmluYWwgYnl0ZVtdIGluLCBpbnQgaW5QdHIsIGZpbmFsIGludCBpbkVuZCkgeworCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHEoYnl0ZVtdIGluLCBpbnQgaW5QdHIsIGludCBpbkVuZCkgewogCQkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtpbkVuZCAtIGluUHRyXTsKIAkJCWludCByUHRyID0gMDsKIAkJCXdoaWxlIChpblB0ciA8IGluRW5kKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEKaW5kZXggMjNlZTlkMC4uNDIwNjBjNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdDaGFyU2VxdWVuY2UuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCSAqIEBwYXJhbSBlbmQKIAkgKiAgICAgICAgICAgIGVuZGluZyBwb3NpdGlvbiBmb3IgdGhlIHNlcXVlbmNlLgogCSAqLwotCXB1YmxpYyBSYXdDaGFyU2VxdWVuY2UoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJcHVibGljIFJhd0NoYXJTZXF1ZW5jZShieXRlW10gYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJYnVmZmVyID0gYnVmOwogCQlzdGFydFB0ciA9IHN0YXJ0OwogCQllbmRQdHIgPSBlbmQ7CkBAIC03Niw3ICs3Niw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBjaGFyIGNoYXJBdChmaW5hbCBpbnQgaW5kZXgpIHsKKwlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7CiAJCXJldHVybiAoY2hhcikgKGJ1ZmZlcltzdGFydFB0ciArIGluZGV4XSAmIDB4ZmYpOwogCX0KIApAQCAtODgsNyArODgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgeworCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCXJldHVybiBuZXcgUmF3Q2hhclNlcXVlbmNlKGJ1ZmZlciwgc3RhcnRQdHIgKyBzdGFydCwgc3RhcnRQdHIgKyBlbmQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzLmphdmEKaW5kZXggMDE0Yzc3Mi4uYzIyYzhkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhCkBAIC02Myw2ICs2Myw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQmluYXJ5QmxvYkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CiAKQEAgLTEyNSw3ICsxMjYsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byB0ZXN0IGZvciBlcXVhbGl0eSB3aXRoIGIuCiAJICogQHJldHVybiBwdHIgKyBzcmMubGVuZ3RoIGlmIGJbcHRyLi5zcmMubGVuZ3RoXSA9PSBzcmM7IGVsc2UgLTEuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF0Y2goZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGJ5dGVbXSBzcmMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXRjaChieXRlW10gYiwgaW50IHB0ciwgYnl0ZVtdIHNyYykgewogCQlpZiAocHRyICsgc3JjLmxlbmd0aCA+IGIubGVuZ3RoKQogCQkJcmV0dXJuIC0xOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKywgcHRyKyspCkBAIC00NjEsNyArNDYyLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiBidWZmZXIgdG8gc3RhcnQgcGFyc2luZyBkaWdpdHMgYXQuCiAJICogQHJldHVybiB0aGUgdGltZXpvbmUgYXQgdGhpcyBsb2NhdGlvbiwgZXhwcmVzc2VkIGluIG1pbnV0ZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyc2VUaW1lWm9uZU9mZnNldChmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcnNlVGltZVpvbmVPZmZzZXQoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJcmV0dXJuIHBhcnNlVGltZVpvbmVPZmZzZXQoYiwgcHRyLCBudWxsKTsKIAl9CiAKQEAgLTUwMCw3ICs1MDEsNyBAQAogCSAqICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGZpbmQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBhZnRlciBjaHJBLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHQoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHQoYnl0ZVtdIGIsIGludCBwdHIsIGNoYXIgY2hyQSkgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6KSB7CiAJCQlpZiAoYltwdHIrK10gPT0gY2hyQSkKQEAgLTUyMCw3ICs1MjEsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciB0byBzdGFydCBsb29raW5nIGZvciBMRiBhdC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGFmdGVyIHRoZSBmaXJzdCBMRiBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJcmV0dXJuIG5leHQoYiwgcHRyLCAnXG4nKTsKIAl9CiAKQEAgLTUzNyw3ICs1MzgsNyBAQAogCSAqICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGZpbmQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgZmlyc3QgY2hyQSBvciBMRiB0byBiZSBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3opIHsKIAkJCWZpbmFsIGJ5dGUgYyA9IGJbcHRyKytdOwpAQCAtNTU4LDcgKzU1OSw3IEBACiAJICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gZmluZC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGJlZm9yZSBjaHJBLCAtMSBmb3Igbm90IGZvdW5kCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldihieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWlmIChwdHIgPT0gYi5sZW5ndGgpCiAJCQktLXB0cjsKIAkJd2hpbGUgKHB0ciA+PSAwKSB7CkBAIC01NzksNyArNTgwLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiBidWZmZXIgdG8gc3RhcnQgbG9va2luZyBmb3IgTEYgYXQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIGZpcnN0IExGIGZvdW5kLCAtMSBmb3Igbm90IGZvdW5kCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldkxGKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldkxGKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCXJldHVybiBwcmV2KGIsIHB0ciwgJ1xuJyk7CiAJfQogCkBAIC01OTcsNyArNTk4LDcgQEAKIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hyQSBvciBMRiB0byBiZSBmb3VuZCwgLTEgZm9yCiAJICogICAgICAgICBub3QgZm91bmQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWlmIChwdHIgPT0gYi5sZW5ndGgpCiAJCQktLXB0cjsKIAkJd2hpbGUgKHB0ciA+PSAwKSB7CkBAIC02MzIsMTEgKzYzMyw0NyBAQAogCSAqICAgICAgICAgICAgbGluZSAxLgogCSAqIEBwYXJhbSBlbmQKIAkgKiAgICAgICAgICAgIDEgcGFzdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IHdpdGhpbiA8Y29kZT5idWY8L2NvZGU+LgotCSAqIEByZXR1cm4gYSBsaW5lIG1hcCBpbmRleGluZyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgZWFjaCBsaW5lLgorCSAqIEByZXR1cm4gYSBsaW5lIG1hcCBpbmRpY2F0aW5nIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBlYWNoIGxpbmUsIG9yIGEKKwkgKiAgICAgICAgIG1hcCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSBidWZmZXIgYXMgYSBzaW5nbGUgbGluZSBpZgorCSAqICAgICAgICAgPGNvZGU+YnVmPC9jb2RlPiBjb250YWlucyBhIE5VTCBieXRlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKLQkJaW50IHN0YXJ0ID0gcHRyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwKGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKKwkJSW50TGlzdCBtYXAgPSBsaW5lTWFwT3JOdWxsKGJ1ZiwgcHRyLCBlbmQpOworCQlpZiAobWFwID09IG51bGwpIHsKKwkJCW1hcCA9IG5ldyBJbnRMaXN0KDMpOworCQkJbWFwLmFkZChJbnRlZ2VyLk1JTl9WQUxVRSk7CisJCQltYXAuYWRkKHB0cik7CisJCQltYXAuYWRkKGVuZCk7CisJCX0KKwkJcmV0dXJuIG1hcDsKKwl9CiAKKwkvKioKKwkgKiBMaWtlIHtAbGluayAjbGluZU1hcChieXRlW10sIGludCwgaW50KX0gYnV0IHRocm93CisJICoge0BsaW5rIEJpbmFyeUJsb2JFeGNlcHRpb259IGlmIGEgTlVMIGJ5dGUgaXMgZW5jb3VudGVyZWQuCisJICoKKwkgKiBAcGFyYW0gYnVmCisJICogICAgICAgICAgICBidWZmZXIgdG8gc2Nhbi4KKwkgKiBAcGFyYW0gcHRyCisJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBieXRlIG9mCisJICogICAgICAgICAgICBsaW5lIDEuCisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgMSBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgd2l0aGluIDxjb2RlPmJ1ZjwvY29kZT4uCisJICogQHJldHVybiBhIGxpbmUgbWFwIGluZGljYXRpbmcgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGVhY2ggbGluZS4KKwkgKiBAdGhyb3dzIEJpbmFyeUJsb2JFeGNlcHRpb24KKwkgKiAgICAgICAgICAgIGlmIGEgTlVMIGJ5dGUgaXMgZm91bmQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwT3JCaW5hcnkoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkKKwkJCXRocm93cyBCaW5hcnlCbG9iRXhjZXB0aW9uIHsKKwkJSW50TGlzdCBtYXAgPSBsaW5lTWFwT3JOdWxsKGJ1ZiwgcHRyLCBlbmQpOworCQlpZiAobWFwID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBCaW5hcnlCbG9iRXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBATnVsbGFibGUgSW50TGlzdCBsaW5lTWFwT3JOdWxsKGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKIAkJLy8gRXhwZXJpbWVudGFsbHkgZGVyaXZlZCBmcm9tIG11bHRpcGxlIHNvdXJjZSByZXBvc2l0b3JpZXMKIAkJLy8gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ5dGVzL2xpbmUgaXMgMzYuIEl0cyBhIHJvdWdoIGd1ZXNzCiAJCS8vIHRvIGluaXRpYWxseSBzaXplIG91ciBtYXAgY2xvc2UgdG8gdGhlIHRhcmdldC4KQEAgLTY0OSwxMSArNjg2LDcgQEAKIAkJCX0KIAogCQkJaWYgKGJ1ZltwdHJdID09ICdcMCcpIHsKLQkJCQkvLyBiaW5hcnkgZGF0YS4KLQkJCQltYXAgPSBuZXcgSW50TGlzdCgzKTsKLQkJCQltYXAuYWRkKEludGVnZXIuTUlOX1ZBTFVFKTsKLQkJCQltYXAuYWRkKHN0YXJ0KTsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAogCQkJZm91bmRMRiA9IChidWZbcHRyXSA9PSAnXG4nKTsKQEAgLTY3NSw3ICs3MDgsNyBAQAogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBhdXRob3IncyBuYW1lLiBJZiBubyBhdXRob3IgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRob3IoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRob3IoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0NjsgLy8gc2tpcCB0aGUgInRyZWUgLi4uIiBsaW5lLgpAQCAtNjk3LDcgKzczMCw3IEBACiAJICogICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGNvbW1pdHRlcidzIG5hbWUuIElmIG5vIGNvbW1pdHRlciBoZWFkZXIgY2FuIGJlCiAJICogICAgICAgICBsb2NhdGVkIC0xIGlzIHJldHVybmVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdHRlcihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdHRlcihieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJaWYgKHB0ciA9PSAwKQogCQkJcHRyICs9IDQ2OyAvLyBza2lwIHRoZSAidHJlZSAuLi4iIGxpbmUuCkBAIC03MjEsNyArNzU0LDcgQEAKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgdGFnZ2VyJ3MgbmFtZS4gSWYgbm8gdGFnZ2VyIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnZ2VyKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnZ2VyKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDg7IC8vIHNraXAgdGhlICJvYmplY3QgLi4uIiBsaW5lLgpAQCAtNzQ5LDcgKzc4Miw3IEBACiAJICogICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGVuY29kaW5nJ3MgbmFtZS4gSWYgbm8gZW5jb2RpbmcgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZCAoYW5kIFVURi04IHNob3VsZCBiZSBhc3N1bWVkKS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZyhmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuY29kaW5nKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3opIHsKIAkJCWlmIChiW3B0cl0gPT0gJ1xuJykKQEAgLTc3Myw3ICs4MDYsNyBAQAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVuY29kaW5nTmFtZShmaW5hbCBieXRlW10gYikgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlRW5jb2RpbmdOYW1lKGJ5dGVbXSBiKSB7CiAJCWludCBlbmMgPSBlbmNvZGluZyhiLCAwKTsKIAkJaWYgKGVuYyA8IDApIHsKIAkJCXJldHVybiBudWxsOwpAQCAtODAxLDcgKzgzNCw3IEBACiAJICogICAgICAgICAgICAgaWYgdGhlIEpSRSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjaGFyYWN0ZXIgc2V0IHJlcXVlc3RlZCBieQogCSAqICAgICAgICAgICAgIHRoZSBlbmNvZGluZyBoZWFkZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBDaGFyc2V0IHBhcnNlRW5jb2RpbmcoZmluYWwgYnl0ZVtdIGIpIHsKKwlwdWJsaWMgc3RhdGljIENoYXJzZXQgcGFyc2VFbmNvZGluZyhieXRlW10gYikgewogCQlTdHJpbmcgZW5jID0gcGFyc2VFbmNvZGluZ05hbWUoYik7CiAJCWlmIChlbmMgPT0gbnVsbCkgewogCQkJcmV0dXJuIFVURl84OwpAQCAtODMxLDcgKzg2NCw3IEBACiAJICogQHJldHVybiB0aGUgcGFyc2VkIGlkZW50aXR5IG9yIG51bGwgaW4gY2FzZSB0aGUgaWRlbnRpdHkgY291bGQgbm90IGJlCiAJICogICAgICAgICBwYXJzZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KGZpbmFsIFN0cmluZyBpbikgeworCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChTdHJpbmcgaW4pIHsKIAkJcmV0dXJuIHBhcnNlUGVyc29uSWRlbnQoQ29uc3RhbnRzLmVuY29kZShpbiksIDApOwogCX0KIApAQCAtODUzLDcgKzg4Niw3IEBACiAJICogQHJldHVybiB0aGUgcGFyc2VkIGlkZW50aXR5IG9yIG51bGwgaW4gY2FzZSB0aGUgaWRlbnRpdHkgY291bGQgbm90IGJlCiAJICogICAgICAgICBwYXJzZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KGZpbmFsIGJ5dGVbXSByYXcsIGZpbmFsIGludCBuYW1lQikgeworCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChieXRlW10gcmF3LCBpbnQgbmFtZUIpIHsKIAkJQ2hhcnNldCBjczsKIAkJdHJ5IHsKIAkJCWNzID0gcGFyc2VFbmNvZGluZyhyYXcpOwpAQCAtOTYxLDcgKzk5NCw3IEBACiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgJzonIHdoaWNoIHRlcm1pbmF0ZXMgdGhlIGZvb3RlciBsaW5lIGtleSBpZiB0aGlzCiAJICogICAgICAgICBpcyBvdGhlcndpc2UgYSB2YWxpZCBmb290ZXIgbGluZSBrZXk7IG90aGVyd2lzZSAtMS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBlbmRPZkZvb3RlckxpbmVLZXkoZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgaW50IGVuZE9mRm9vdGVyTGluZUtleShieXRlW10gcmF3LCBpbnQgcHRyKSB7CiAJCXRyeSB7CiAJCQlmb3IgKDs7KSB7CiAJCQkJZmluYWwgYnl0ZSBjID0gcmF3W3B0cl07CkBAIC05ODgsNyArMTAyMSw3IEBACiAJICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmFuZ2UgPGNvZGU+W3N0YXJ0LGVuZCk8L2NvZGU+LAogCSAqICAgICAgICAgYWZ0ZXIgZGVjb2RpbmcgdGhlIHJlZ2lvbiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNldC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoZmluYWwgYnl0ZVtdIGJ1ZmZlcikgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShieXRlW10gYnVmZmVyKSB7CiAJCXJldHVybiBkZWNvZGUoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKIAl9CiAKQEAgLTEwMjYsNyArMTA1OSw3IEBACiAJICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmFuZ2UgPGNvZGU+W3N0YXJ0LGVuZCk8L2NvZGU+LAogCSAqICAgICAgICAgYWZ0ZXIgZGVjb2RpbmcgdGhlIHJlZ2lvbiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNldC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoZmluYWwgQ2hhcnNldCBjcywgZmluYWwgYnl0ZVtdIGJ1ZmZlcikgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShDaGFyc2V0IGNzLCBieXRlW10gYnVmZmVyKSB7CiAJCXJldHVybiBkZWNvZGUoY3MsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAJfQogCkBAIC0xMTQzLDcgKzExNzYsNyBAQAogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGUoZmluYWwgQnl0ZUJ1ZmZlciBiLCBmaW5hbCBDaGFyc2V0IGNoYXJzZXQpCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZShCeXRlQnVmZmVyIGIsIENoYXJzZXQgY2hhcnNldCkKIAkJCXRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogCQlmaW5hbCBDaGFyc2V0RGVjb2RlciBkID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7CiAJCWQub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwpAQCAtMTE2Miw3ICsxMTk1LDcgQEAKIAkgKiAgICAgICAgICAgIGNvbW1pdCBidWZmZXIuCiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgdXNlcidzIG1lc3NhZ2UgYnVmZmVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdE1lc3NhZ2UoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXRNZXNzYWdlKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDY7IC8vIHNraXAgdGhlICJ0cmVlIC4uLiIgbGluZS4KQEAgLTExODYsNyArMTIxOSw3IEBACiAJICogICAgICAgICAgICBidWZmZXIuCiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgdXNlcidzIG1lc3NhZ2UgYnVmZmVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ01lc3NhZ2UoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdNZXNzYWdlKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDg7IC8vIHNraXAgdGhlICJvYmplY3QgLi4uIiBsaW5lLgpAQCAtMTIxMSw3ICsxMjQ0LDcgQEAKIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGg7CiAJICogICAgICAgICA8Y29kZT5iLmxlbmd0aDwvY29kZT4gaWYgbm8gcGFyYWdyYXBoIGVuZCBjb3VsZCBiZSBsb2NhdGVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuZE9mUGFyYWdyYXBoKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgc3RhcnQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmRPZlBhcmFncmFwaChieXRlW10gYiwgaW50IHN0YXJ0KSB7CiAJCWludCBwdHIgPSBzdGFydDsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCXdoaWxlIChwdHIgPCBzeiAmJiAoYltwdHJdICE9ICdcbicgJiYgYltwdHJdICE9ICdccicpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEKaW5kZXggYThmOWJjNy4uMDQwYjVjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiAJICogICAgICAgICAgICBtZXRhLWNoYXJhY3RlcnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmcuCiAJICovCi0JcHVibGljIFJhd1N1YlN0cmluZ1BhdHRlcm4oZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJcHVibGljIFJhd1N1YlN0cmluZ1BhdHRlcm4oU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCWlmIChwYXR0ZXJuVGV4dC5sZW5ndGgoKSA9PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5jYW5ub3RNYXRjaE9uRW1wdHlTdHJpbmcpOwogCQluZWVkbGVTdHJpbmcgPSBwYXR0ZXJuVGV4dDsKQEAgLTg3LDcgKzg3LDcgQEAKIAkgKiAgICAgICAgIHBhdHRlcm47IC0xIGlmIHRoaXMgcGF0dGVybiBkb2VzIG5vdCBhcHBlYXIgYXQgYW55IHBvc2l0aW9uIG9mCiAJICogICAgICAgICA8Y29kZT5yY3M8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBpbnQgbWF0Y2goZmluYWwgUmF3Q2hhclNlcXVlbmNlIHJjcykgeworCXB1YmxpYyBpbnQgbWF0Y2goUmF3Q2hhclNlcXVlbmNlIHJjcykgewogCQlmaW5hbCBpbnQgbmVlZGxlTGVuID0gbmVlZGxlLmxlbmd0aDsKIAkJZmluYWwgYnl0ZSBmaXJzdCA9IG5lZWRsZVswXTsKIApAQCAtMTE0LDExICsxMTQsMTEgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbmVxKGZpbmFsIGJ5dGUgYSwgZmluYWwgYnl0ZSBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBuZXEoYnl0ZSBhLCBieXRlIGIpIHsKIAkJcmV0dXJuIGEgIT0gYiAmJiBhICE9IGxjKGIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgbGMoZmluYWwgYnl0ZSBxKSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBsYyhieXRlIHEpIHsKIAkJcmV0dXJuIChieXRlKSBTdHJpbmdVdGlscy50b0xvd2VyQ2FzZSgoY2hhcikgKHEgJiAweGZmKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEKaW5kZXggYzFhYWVjZi4uYTNmOTczMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZk1hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YQpAQCAtMTY5LDcgKzE2OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBSZWYgcHV0KGZpbmFsIFN0cmluZyBrZXlOYW1lLCBSZWYgdmFsdWUpIHsKKwlwdWJsaWMgUmVmIHB1dChTdHJpbmcga2V5TmFtZSwgUmVmIHZhbHVlKSB7CiAJCVN0cmluZyBuYW1lID0gdG9SZWZOYW1lKGtleU5hbWUpOwogCiAJCWlmICghbmFtZS5lcXVhbHModmFsdWUuZ2V0TmFtZSgpKSkKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAotCQlwcml2YXRlIFJlZiByZXNvbHZlTG9vc2UoZmluYWwgUmVmIGwpIHsKKwkJcHJpdmF0ZSBSZWYgcmVzb2x2ZUxvb3NlKFJlZiBsKSB7CiAJCQlpZiAocmVzb2x2ZWRJZHggPCByZXNvbHZlZC5zaXplKCkpIHsKIAkJCQlSZWYgciA9IHJlc29sdmVkLmdldChyZXNvbHZlZElkeCk7CiAJCQkJaW50IGNtcCA9IFJlZkNvbXBhcmF0b3IuY29tcGFyZVRvKGwsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1NzaFN1cHBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Tc2hTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzYWE3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Tc2hTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIE1hcmt1cyBEdWZ0IDxtYXJrdXMuZHVmdEBzc2ktc2NoYWVmZXIuY29tPgorICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKKyAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKKyAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbW1hbmRGYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5DcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVNlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoU2Vzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5NZXNzYWdlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TdHJlYW1Db3B5VGhyZWFkOworCisvKioKKyAqIEV4dHJhIHV0aWxpdGllcyB0byBzdXBwb3J0IHVzYWdlIG9mIFNTSC4KKyAqCisgKiBAc2luY2UgNS4wCisgKi8KK3B1YmxpYyBjbGFzcyBTc2hTdXBwb3J0IHsKKworCS8qKgorCSAqIFV0aWxpdHkgdG8gZXhlY3V0ZSBhIHJlbW90ZSBTU0ggY29tbWFuZCBhbmQgcmVhZCB0aGUgZmlyc3QgbGluZSBvZgorCSAqIG91dHB1dC4KKwkgKgorCSAqIEBwYXJhbSBzc2hVcmkKKwkgKiAgICAgICAgICAgIHRoZSBTU0ggcmVtb3RlIFVSSQorCSAqIEBwYXJhbSBwcm92aWRlcgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBDcmVkZW50aWFsc1Byb3ZpZGVyfSBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRlN9IGltcGxlbWVudGF0aW9uIHBhc3NlZCB0bworCSAqICAgICAgICAgICAge0BsaW5rIFNzaFNlc3Npb25GYWN0b3J5fQorCSAqIEBwYXJhbSBjb21tYW5kCisJICogICAgICAgICAgICB0aGUgcmVtb3RlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKwkgKiBAcGFyYW0gdGltZW91dAorCSAqICAgICAgICAgICAgYSB0aW1lb3V0IGluIHNlY29uZHMuIFRoZSB0aW1lb3V0IG1heSBiZSBleGNlZWRlZCBpbiBjb3JuZXIKKwkgKiAgICAgICAgICAgIGNhc2VzLgorCSAqIEByZXR1cm4gVGhlIGVudGlyZSBvdXRwdXQgcmVhZCBmcm9tIHN0ZG91dC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogQHRocm93cyBDb21tYW5kRmFpbGVkRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHNzaCBjb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQsIGVycm9yIG1lc3NhZ2UgY29udGFpbnMKKwkgKiAgICAgICAgICAgICB0aGUgY29udGVudCBvZiBzdGRlcnIuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuU3NoQ29tbWFuZChVUklpc2ggc3NoVXJpLAorCQkJQE51bGxhYmxlIENyZWRlbnRpYWxzUHJvdmlkZXIgcHJvdmlkZXIsIEZTIGZzLCBTdHJpbmcgY29tbWFuZCwKKwkJCWludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbW1hbmRGYWlsZWRFeGNlcHRpb24geworCQlSZW1vdGVTZXNzaW9uIHNlc3Npb24gPSBudWxsOworCQlQcm9jZXNzIHByb2Nlc3MgPSBudWxsOworCQlTdHJlYW1Db3B5VGhyZWFkIGVycm9yVGhyZWFkID0gbnVsbDsKKwkJU3RyZWFtQ29weVRocmVhZCBvdXRUaHJlYWQgPSBudWxsOworCQlDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGZhaWx1cmUgPSBudWxsOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorCQlNZXNzYWdlV3JpdGVyIHN0ZGVyciA9IG5ldyBNZXNzYWdlV3JpdGVyKCk7CisJCXRyeSAoTWVzc2FnZVdyaXRlciBzdGRvdXQgPSBuZXcgTWVzc2FnZVdyaXRlcigpKSB7CisJCQlzZXNzaW9uID0gU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXNzaW9uKHNzaFVyaSwKKwkJCQkJcHJvdmlkZXIsIGZzLCAxMDAwICogdGltZW91dCk7CisJCQlwcm9jZXNzID0gc2Vzc2lvbi5leGVjKGNvbW1hbmQsIDApOworCQkJZXJyb3JUaHJlYWQgPSBuZXcgU3RyZWFtQ29weVRocmVhZChwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksCisJCQkJCXN0ZGVyci5nZXRSYXdTdHJlYW0oKSk7CisJCQllcnJvclRocmVhZC5zdGFydCgpOworCQkJb3V0VGhyZWFkID0gbmV3IFN0cmVhbUNvcHlUaHJlYWQocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLAorCQkJCQlzdGRvdXQuZ2V0UmF3U3RyZWFtKCkpOworCQkJb3V0VGhyZWFkLnN0YXJ0KCk7CisJCQl0cnkgeworCQkJCS8vIHdhaXRGb3Igd2l0aCB0aW1lb3V0IGhhcyBhIGJ1ZyAtIEpTY2gnIGV4aXRWYWx1ZSgpIHRocm93cyB0aGUKKwkJCQkvLyB3cm9uZyBleGNlcHRpb24gdHlwZSA6KAorCQkJCWlmIChwcm9jZXNzLndhaXRGb3IoKSA9PSAwKSB7CisJCQkJCXJldHVybiBzdGRvdXQudG9TdHJpbmcoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbnVsbDsgLy8gc3RpbGwgcnVubmluZyBhZnRlciB0aW1lb3V0CisJCQkJfQorCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGVycm9yVGhyZWFkICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQllcnJvclRocmVhZC5oYWx0KCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkvLyBTdG9wIHdhaXRpbmcgYW5kIHJldHVybiBhbnl3YXkuCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJZXJyb3JUaHJlYWQgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJCWlmIChvdXRUaHJlYWQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCW91dFRocmVhZC5oYWx0KCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkvLyBTdG9wIHdhaXRpbmcgYW5kIHJldHVybiBhbnl3YXkuCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJb3V0VGhyZWFkID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7CisJCQkJaWYgKHByb2Nlc3MuZXhpdFZhbHVlKCkgIT0gMCkgeworCQkJCQlmYWlsdXJlID0gbmV3IENvbW1hbmRGYWlsZWRFeGNlcHRpb24ocHJvY2Vzcy5leGl0VmFsdWUoKSwKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5zc2hDb21tYW5kRmFpbGVkLCBjb21tYW5kLAorCQkJCQkJCXN0ZGVyci50b1N0cmluZygpKSk7CisJCQkJfQorCQkJCXByb2Nlc3MuZGVzdHJveSgpOworCQkJfQorCQkJc3RkZXJyLmNsb3NlKCk7CisJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisJCQkJU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlU2Vzc2lvbihzZXNzaW9uKTsKKwkJCX0KKwkJCWlmIChmYWlsdXJlICE9IG51bGwpIHsKKwkJCQl0aHJvdyBmYWlsdXJlOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCmluZGV4IGI0NzM2ZDMuLjM4NjhlNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCkBAIC03NCw3ICs3NCw3IEBACiAJICogICAgICAgICAgICB0aGUgaW5wdXQgY2hhcmFjdGVyLgogCSAqIEByZXR1cm4gbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhlIGlucHV0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZShmaW5hbCBjaGFyIGMpIHsKKwlwdWJsaWMgc3RhdGljIGNoYXIgdG9Mb3dlckNhc2UoY2hhciBjKSB7CiAJCXJldHVybiBjIDw9ICdaJyA/IExDW2NdIDogYzsKIAl9CiAKQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nLCBhZnRlciBjb252ZXJ0aW5nIGNoYXJhY3RlcnMgaW4gdGhlCiAJICogICAgICAgICByYW5nZSAnQScuLidaJyB0byAnYScuLid6Jy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyQ2FzZShmaW5hbCBTdHJpbmcgaW4pIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyQ2FzZShTdHJpbmcgaW4pIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoaW4ubGVuZ3RoKCkpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGluLmxlbmd0aCgpOyBpKyspCiAJCQlyLmFwcGVuZCh0b0xvd2VyQ2FzZShpbi5jaGFyQXQoaSkpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCSAqICAgICAgICAgICAgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIGVxdWFscyBiCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IGIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKGEubGVuZ3RoKCkgIT0gYi5sZW5ndGgoKSkKQEAgLTIwNSw3ICsyMDUsNyBAQAogCSAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWx1ZX0gaXMgbm90IHJlY29nbml6ZWQgYXMgb25lIG9mIHRoZSBzdGFuZGFyZAogCSAqICAgICAgICAgICAgIGJvb2xlYW4gbmFtZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9Cb29sZWFuKFN0cmluZyBzdHJpbmdWYWx1ZSkgewogCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5leHBlY3RlZEJvb2xlYW5TdHJpbmdWYWx1ZSk7CiAKQEAgLTIzMiw3ICsyMzIsNyBAQAogCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gaW50ZXJwcmV0YXRpb24gb2Yge0Bjb2RlIHZhbHVlfSBvciBudWxsIGluIGNhc2UgdGhlCiAJICogICAgICAgICBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEgYm9vbGVhbiB2YWx1ZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB0b0Jvb2xlYW5Pck51bGwoZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJcHVibGljIHN0YXRpYyBCb29sZWFuIHRvQm9vbGVhbk9yTnVsbChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKIAkJaWYgKHN0cmluZ1ZhbHVlID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhCmluZGV4IDk2YTc5NmMuLjk1M2M5NzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEKQEAgLTIzNyw3ICsyMzcsNyBAQAogCXB1YmxpYyBhYnN0cmFjdCBGaWxlQmFzZWRDb25maWcgb3BlblVzZXJDb25maWcoQ29uZmlnIHBhcmVudCwgRlMgZnMpOwogCiAJLyoqCi0JICogT3BlbiB0aGUgZ2l0b25maWcgY29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgc3lzdGVtLXdpZGUgImV0YyIgZGlyZWN0b3J5CisJICogT3BlbiB0aGUgZ2l0Y29uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiIGRpcmVjdG9yeQogCSAqCiAJICogQHBhcmFtIHBhcmVudAogCSAqICAgICAgICAgICAgYSBjb25maWcgd2l0aCB2YWx1ZXMgbm90IGZvdW5kIGRpcmVjdGx5IGluIHRoZSByZXR1cm5lZApAQCAtMjQ1LDcgKzI0NSw3IEBACiAJICogQHBhcmFtIGZzCiAJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQogCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4gdGhlIGdpdG9uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiCisJICogQHJldHVybiB0aGUgZ2l0Y29uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiCiAJICogICAgICAgICBkaXJlY3RvcnkKIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgRmlsZUJhc2VkQ29uZmlnIG9wZW5TeXN0ZW1Db25maWcoQ29uZmlnIHBhcmVudCwgRlMgZnMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCmluZGV4IGRkOTMzYTAuLjNlZDdhZWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKIAkgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIG1lbW9yeSBiZWZvcmUgZW50ZXJpbmcgdGhlCiAJICogICAgICAgICAgICBvdmVyZmxvdyBvdXRwdXQgcGF0aDsgYWxzbyB1c2VkIGFzIHRoZSBlc3RpbWF0ZWQgc2l6ZS4KIAkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGZpbmFsIGludCBsaW1pdCkgeworCXByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoaW50IGxpbWl0KSB7CiAJCXRoaXMobGltaXQsIGxpbWl0KTsKIAl9CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogCSAqICAgICAgICAgICAgb3ZlcmZsb3cgb3V0cHV0IHBhdGguCiAJICogQHNpbmNlIDQuMAogCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoZmluYWwgaW50IGVzdGltYXRlZFNpemUsIGZpbmFsIGludCBsaW1pdCkgeworCXByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoaW50IGVzdGltYXRlZFNpemUsIGludCBsaW1pdCkgewogCQlpZiAoZXN0aW1hdGVkU2l6ZSA+IGxpbWl0KQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCQl0aGlzLmluQ29yZUxpbWl0ID0gbGltaXQ7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChvdmVyZmxvdyAhPSBudWxsKSB7CiAJCQlvdmVyZmxvdy53cml0ZShiKTsKIAkJCXJldHVybjsKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG92ZXJmbG93ID09IG51bGwpIHsKIAkJCXdoaWxlIChsZW4gPiAwKSB7CiAJCQkJQmxvY2sgcyA9IGxhc3QoKTsKQEAgLTE4Myw3ICsxODMsNyBAQAogCSAqICAgICAgICAgICAgIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciB3aGlsZQogCSAqICAgICAgICAgICAgIHdyaXRpbmcgdG8gYSBsb2NhbCB0ZW1wb3JhcnkgZmlsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChibG9ja3MgIT0gbnVsbCkgewogCQkJZm9yICg7OykgewogCQkJCUJsb2NrIHMgPSBsYXN0KCk7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJCXRocm93IG5ldyBPdXRPZk1lbW9yeUVycm9yKEpHaXRUZXh0LmdldCgpLmxlbmd0aEV4Y2VlZHNNYXhpbXVtQXJyYXlTaXplKTsKIAkJZmluYWwgYnl0ZVtdIG91dCA9IG5ldyBieXRlWyhpbnQpIGxlbl07CiAJCWludCBvdXRQdHIgPSAwOwotCQlmb3IgKGZpbmFsIEJsb2NrIGIgOiBibG9ja3MpIHsKKwkJZm9yIChCbG9jayBiIDogYmxvY2tzKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGIuYnVmZmVyLCAwLCBvdXQsIG91dFB0ciwgYi5jb3VudCk7CiAJCQlvdXRQdHIgKz0gYi5jb3VudDsKIAkJfQpAQCAtMjY1LDcgKzI2NSw3IEBACiAJCQkJCUpHaXRUZXh0LmdldCgpLmxlbmd0aEV4Y2VlZHNNYXhpbXVtQXJyYXlTaXplKTsKIAkJZmluYWwgYnl0ZVtdIG91dCA9IG5ldyBieXRlWyhpbnQpIGxlbl07CiAJCWludCBvdXRQdHIgPSAwOwotCQlmb3IgKGZpbmFsIEJsb2NrIGIgOiBibG9ja3MpIHsKKwkJZm9yIChCbG9jayBiIDogYmxvY2tzKSB7CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGIuYnVmZmVyLCAwLCBvdXQsIG91dFB0ciwgYi5jb3VudCk7CiAJCQlvdXRQdHIgKz0gYi5jb3VudDsKIAkJfQpAQCAtMjg4LDExICsyODgsMTEgQEAKIAkgKiAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIGZyb20gYSB0ZW1wb3JhcnkgZmlsZSBvbiB0aGUgbG9jYWwKIAkgKiAgICAgICAgICAgICBzeXN0ZW0sIG9yIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBzdHJlYW0uCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3MsIFByb2dyZXNzTW9uaXRvciBwbSkKKwlwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHBtID09IG51bGwpCiAJCQlwbSA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7Ci0JCWZvciAoZmluYWwgQmxvY2sgYiA6IGJsb2NrcykgeworCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpIHsKIAkJCW9zLndyaXRlKGIuYnVmZmVyLCAwLCBiLmNvdW50KTsKIAkJCXBtLnVwZGF0ZShiLmNvdW50IC8gMTAyNCk7CiAJCX0KQEAgLTM3Myw3ICszNzMsNyBAQAogCQlvdmVyZmxvdyA9IG92ZXJmbG93KCk7CiAKIAkJZmluYWwgQmxvY2sgbGFzdCA9IGJsb2Nrcy5yZW1vdmUoYmxvY2tzLnNpemUoKSAtIDEpOwotCQlmb3IgKGZpbmFsIEJsb2NrIGIgOiBibG9ja3MpCisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykKIAkJCW92ZXJmbG93LndyaXRlKGIuYnVmZmVyLCAwLCBiLmNvdW50KTsKIAkJYmxvY2tzID0gbnVsbDsKIApAQCAtNDQyLDcgKzQ0Miw3IEBACiAJCSAqICAgICAgICAgICAgc3lzdGVtIGRlZmF1bHQgdGVtcG9yYXJ5IGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUgL3RtcCkgd2lsbAogCQkgKiAgICAgICAgICAgIGJlIHVzZWQgaW5zdGVhZC4KIAkJICovCi0JCXB1YmxpYyBMb2NhbEZpbGUoZmluYWwgRmlsZSBkaXJlY3RvcnkpIHsKKwkJcHVibGljIExvY2FsRmlsZShGaWxlIGRpcmVjdG9yeSkgewogCQkJdGhpcyhkaXJlY3RvcnksIERFRkFVTFRfSU5fQ09SRV9MSU1JVCk7CiAJCX0KIApAQCAtNDU4LDcgKzQ1OCw3IEBACiAJCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gbWVtb3J5LiBTdG9yYWdlIGJleW9uZAogCQkgKiAgICAgICAgICAgIHRoaXMgbGltaXQgd2lsbCB1c2UgdGhlIGxvY2FsIGZpbGUuCiAJCSAqLwotCQlwdWJsaWMgTG9jYWxGaWxlKGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBmaW5hbCBpbnQgaW5Db3JlTGltaXQpIHsKKwkJcHVibGljIExvY2FsRmlsZShGaWxlIGRpcmVjdG9yeSwgaW50IGluQ29yZUxpbWl0KSB7CiAJCQlzdXBlcihpbkNvcmVMaW1pdCk7CiAJCQl0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKIAkJfQpAQCAtNDg3LDE3ICs0ODcsMTQgQEAKIAkJCWlmIChJbnRlZ2VyLk1BWF9WQUxVRSA8IGxlbikKIAkJCQl0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihKR2l0VGV4dC5nZXQoKS5sZW5ndGhFeGNlZWRzTWF4aW11bUFycmF5U2l6ZSk7CiAJCQlmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGludCkgbGVuXTsKLQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpKSB7CiAJCQkJSU8ucmVhZEZ1bGx5KGluLCBvdXQsIDAsIChpbnQpIGxlbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm4gb3V0OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCisJCXB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWlmIChvbkRpc2tGaWxlID09IG51bGwpIHsKIAkJCQlzdXBlci53cml0ZVRvKG9zLCBwbSk7CkBAIC01MDUsMTYgKzUwMiwxMyBAQAogCQkJfQogCQkJaWYgKHBtID09IG51bGwpCiAJCQkJcG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwotCQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShvbkRpc2tGaWxlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSkpIHsKIAkJCQlpbnQgY250OwogCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCbG9jay5TWl07CiAJCQkJd2hpbGUgKChjbnQgPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKIAkJCQkJb3Mud3JpdGUoYnVmLCAwLCBjbnQpOwogCQkJCQlwbS51cGRhdGUoY250IC8gMTAyNCk7CiAJCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTU2OSw3ICs1NjMsNyBAQAogCQkgKiAgICAgICAgICAgIGFsc28gdXNlZCBhcyB0aGUgZXN0aW1hdGVkIHNpemUuIFN0b3JpbmcgYmV5b25kIHRoaXMgbWFueQogCQkgKiAgICAgICAgICAgIHdpbGwgY2F1c2UgYW4gSU9FeGNlcHRpb24gdG8gYmUgdGhyb3duIGR1cmluZyB3cml0ZS4KIAkJICovCi0JCXB1YmxpYyBIZWFwKGZpbmFsIGludCBsaW1pdCkgeworCQlwdWJsaWMgSGVhcChpbnQgbGltaXQpIHsKIAkJCXN1cGVyKGxpbWl0KTsKIAkJfQogCkBAIC01ODUsNyArNTc5LDcgQEAKIAkJICogICAgICAgICAgICB0aHJvd24gZHVyaW5nIHdyaXRlLgogCQkgKiBAc2luY2UgNC4wCiAJCSAqLwotCQlwdWJsaWMgSGVhcChmaW5hbCBpbnQgZXN0aW1hdGVkU2l6ZSwgZmluYWwgaW50IGxpbWl0KSB7CisJCXB1YmxpYyBIZWFwKGludCBlc3RpbWF0ZWRTaXplLCBpbnQgbGltaXQpIHsKIAkJCXN1cGVyKGVzdGltYXRlZFNpemUsIGxpbWl0KTsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YQppbmRleCA0NTY2ODI1Li4wODM3N2U2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJzLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnMsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChsZW4gPT0gMCkKIAkJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGU3NjQzODkuLmQ4Y2ZlZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbS5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGZpbmFsIGludCBzdGFydE9mZiwgZmluYWwgaW50IHN0YXJ0TGVuKQorCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgc3RhcnRPZmYsIGludCBzdGFydExlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBvdmVyZmxvdyA9IGJ1ZmZlcihiLCBzdGFydE9mZiwgc3RhcnRMZW4pOwogCQlpZiAob3ZlcmZsb3cgPCAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YQppbmRleCAwNmY4M2YzLi5mZjI4MTYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YQpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnMsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pCisJcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgaW50IG9mZiwgaW50IGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChsZW4gPT0gMCkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDMyMjI2YzQuLjkwOGQwYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgZmluYWwgaW50IHN0YXJ0T2ZmLCBmaW5hbCBpbnQgc3RhcnRMZW4pCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBzdGFydE9mZiwgaW50IHN0YXJ0TGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IG92ZXJmbG93ID0gYnVmZmVyKGIsIHN0YXJ0T2ZmLCBzdGFydExlbik7CiAJCWlmIChvdmVyZmxvdyA8IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Fb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDlhOTUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Fb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMyBNYXJjIFN0cmFwZXR6IDxtYXJjLnN0cmFwZXR6QHN5bnRldm8uY29tPgotICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEFuIGlucHV0IHN0cmVhbSB3aGljaCBjYW5vbmljYWxpemVzIEVPTHMgYnl0ZXMgb24gdGhlIGZseSB0byAnXG4nLgotICoKLSAqIE9wdGlvbmFsbHksIGEgYmluYXJ5IGNoZWNrIG9uIHRoZSBmaXJzdCA4MDAwIGJ5dGVzIGlzIHBlcmZvcm1lZCBhbmQgaW4gY2FzZQotICogb2YgYmluYXJ5IGZpbGVzLCBjYW5vbmljYWxpemF0aW9uIGlzIHR1cm5lZCBvZmYgKGZvciB0aGUgY29tcGxldGUgZmlsZSkuCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uQXV0b0xGSW5wdXRTdHJlYW19IGluc3RlYWQKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBFb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtIGV4dGVuZHMgQXV0b0xGSW5wdXRTdHJlYW0gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBJbnB1dFN0cmVhbSwgd3JhcHBpbmcgdGhlIHNwZWNpZmllZCBzdHJlYW0KLQkgKgotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgcmF3IGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSBkZXRlY3RCaW5hcnkKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgYmluYXJpZXMgc2hvdWxkIGJlIGRldGVjdGVkCi0JICovCi0JcHVibGljIEVvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gZGV0ZWN0QmluYXJ5KSB7Ci0JCXN1cGVyKGluLCBkZXRlY3RCaW5hcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSW5wdXRTdHJlYW0sIHdyYXBwaW5nIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICoKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHJhdyBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gZGV0ZWN0QmluYXJ5Ci0JICogICAgICAgICAgICB3aGV0aGVyIGJpbmFyaWVzIHNob3VsZCBiZSBkZXRlY3RlZAotCSAqIEBwYXJhbSBhYm9ydElmQmluYXJ5Ci0JICogICAgICAgICAgICB0aHJvdyBhbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpcyBiaW5hcnkKLQkgKi8KLQlwdWJsaWMgRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBkZXRlY3RCaW5hcnksCi0JCQlib29sZWFuIGFib3J0SWZCaW5hcnkpIHsKLQkJc3VwZXIoaW4sIGRldGVjdEJpbmFyeSwgYWJvcnRJZkJpbmFyeSk7Ci0JfQotCi0JLyoqCi0JICogQSBzcGVjaWFsIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiB7QGxpbmsgQXV0b0xGSW5wdXRTdHJlYW19IGlzIHRvbGQgdG8KLQkgKiB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYSBiaW5hcnkgZmlsZS4gVGhlIGV4Y2VwdGlvbgotCSAqIG1heSBiZSB0aHJvd24gYXQgYW55IHN0YWdlIGR1cmluZyByZWFkaW5nLgotCSAqCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSXNCaW5hcnlFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUlzQmluYXJ5RXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YQppbmRleCBmNDAwZTUwLi5iN2ZlZGRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBACiAJICogQHBhcmFtIHRocmVhZE5hbWUKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRpbWVyIHRocmVhZC4KIAkgKi8KLQlwdWJsaWMgSW50ZXJydXB0VGltZXIoZmluYWwgU3RyaW5nIHRocmVhZE5hbWUpIHsKKwlwdWJsaWMgSW50ZXJydXB0VGltZXIoU3RyaW5nIHRocmVhZE5hbWUpIHsKIAkJc3RhdGUgPSBuZXcgQWxhcm1TdGF0ZSgpOwogCQlhdXRvS2lsbGVyID0gbmV3IEF1dG9LaWxsZXIoc3RhdGUpOwogCQl0aHJlYWQgPSBuZXcgQWxhcm1UaHJlYWQodGhyZWFkTmFtZSwgc3RhdGUpOwpAQCAtMTE3LDcgKzExNyw3IEBACiAJICogICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgaW50ZXJydXB0IHNob3VsZCB0cmlnZ2VyLgogCSAqICAgICAgICAgICAgTXVzdCBiZSAmZ3Q7IDAuCiAJICovCi0JcHVibGljIHZvaWQgYmVnaW4oZmluYWwgaW50IHRpbWVvdXQpIHsKKwlwdWJsaWMgdm9pZCBiZWdpbihpbnQgdGltZW91dCkgewogCQlpZiAodGltZW91dCA8PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVvdXQsIEludGVnZXIudmFsdWVPZih0aW1lb3V0KSkpOwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJfQogCiAJc3RhdGljIGZpbmFsIGNsYXNzIEFsYXJtVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJQWxhcm1UaHJlYWQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEFsYXJtU3RhdGUgcSkgeworCQlBbGFybVRocmVhZChTdHJpbmcgbmFtZSwgQWxhcm1TdGF0ZSBxKSB7CiAJCQlzdXBlcihxKTsKIAkJCXNldE5hbWUobmFtZSk7CiAJCQlzZXREYWVtb24odHJ1ZSk7CkBAIC0xNjEsNyArMTYxLDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBdXRvS2lsbGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBBbGFybVN0YXRlIHN0YXRlOwogCi0JCUF1dG9LaWxsZXIoZmluYWwgQWxhcm1TdGF0ZSBzKSB7CisJCUF1dG9LaWxsZXIoQWxhcm1TdGF0ZSBzKSB7CiAJCQlzdGF0ZSA9IHM7CiAJCX0KIApAQCAtMjAzLDcgKzIwMyw3IEBACiAJCQl9CiAJCX0KIAotCQlzeW5jaHJvbml6ZWQgdm9pZCBiZWdpbihmaW5hbCBpbnQgdGltZW91dCkgeworCQlzeW5jaHJvbml6ZWQgdm9pZCBiZWdpbihpbnQgdGltZW91dCkgewogCQkJaWYgKHRlcm1pbmF0ZWQpCiAJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50aW1lckFscmVhZHlUZXJtaW5hdGVkKTsKIAkJCWNhbGxpbmdUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0lzb2xhdGVkT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YQppbmRleCA1ZTUwOTk1Li42NTQ3MGQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YQpAQCAtOTksNyArOTksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgcG9zLCBmaW5hbCBpbnQgY250KQorCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBwb3MsIGludCBjbnQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljaGVja0Nsb3NlZCgpOwogCQlleGVjdXRlKG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TaWxlbnRGaWxlSW5wdXRTdHJlYW0uamF2YQpzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TaWxlbnRGaWxlSW5wdXRTdHJlYW0uamF2YQppbmRleCA2OGI0MTdlLi5lNTg4MDNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NpbGVudEZpbGVJbnB1dFN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgUm9iaW4gUm9zZW5iZXJnCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIERhdmlkIFB1cnNlaG91c2UgPGRhdmlkLnB1cnNlaG91c2VAZ21haWwuY29tPgogICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQpAQCAtNDAsMzkgKzQwLDM2IEBACiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgogICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIDxwPlNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbSBjbGFzcy48L3A+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBGaWxlSW5wdXRTdHJlYW0gdGhhdCBpZ25vcmVzIGFueSBleGNlcHRpb25zIG9uIGNsb3NlKCkuCiAgKgotICogQGRlcHJlY2F0ZWQgdXNlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGluIEphdmEgOCBhbmQgbGF0ZXIuCisgKiBAc2luY2UgNS4wCiAgKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRPdXRwdXRTdHJlYW0geworcHVibGljIGNsYXNzIFNpbGVudEZpbGVJbnB1dFN0cmVhbSBleHRlbmRzIEZpbGVJbnB1dFN0cmVhbSB7CiAJLyoqCi0JICogPHA+Q29uc3RydWN0b3IgZm9yIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS48L3A+Ci0JICoKLQkgKiBAc2VlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtI0J1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSkKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KKwkgKiBAcGFyYW0gZmlsZQorCSAqICAgICAgICAgICAgdGhlIGZpbGUKKwkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSBmaWxlIHdhcyBub3QgZm91bmQKIAkgKi8KLQlwdWJsaWMgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJc3VwZXIob3V0KTsKKwlwdWJsaWMgU2lsZW50RmlsZUlucHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCXN1cGVyKGZpbGUpOwogCX0KIAotCS8qKgotCSAqIDxwPkNvbnN0cnVjdG9yIGZvciBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uPC9wPgotCSAqCi0JICogQHNlZSBCdWZmZXJlZE91dHB1dFN0cmVhbSNCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0sIGludCkKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgYnVmZmVyIHNpemUKLQkgKi8KLQlwdWJsaWMgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIGludCBzaXplKSB7Ci0JCXN1cGVyKG91dCwgc2l6ZSk7CisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCXRyeSB7CisJCQlzdXBlci5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TdHJlYW1Db3B5VGhyZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU3RyZWFtQ29weVRocmVhZC5qYXZhCmluZGV4IDVjMWFmOWVmLi5hOTk4OWExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU3RyZWFtQ29weVRocmVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TdHJlYW1Db3B5VGhyZWFkLmphdmEKQEAgLTczLDcgKzczLDcgQEAKIAkgKiAgICAgICAgICAgIHN0cmVhbSB0byBjb3B5IGludG8uIFRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gaXMgYXV0b21hdGljYWxseQogCSAqICAgICAgICAgICAgY2xvc2VkIHdoZW4gdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgogCSAqLwotCXB1YmxpYyBTdHJlYW1Db3B5VGhyZWFkKGZpbmFsIElucHV0U3RyZWFtIGksIGZpbmFsIE91dHB1dFN0cmVhbSBvKSB7CisJcHVibGljIFN0cmVhbUNvcHlUaHJlYWQoSW5wdXRTdHJlYW0gaSwgT3V0cHV0U3RyZWFtIG8pIHsKIAkJc2V0TmFtZShUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICItU3RyZWFtQ29weSIpOyAvLyROT04tTkxTLTEkCiAJCXNyYyA9IGk7CiAJCWRzdCA9IG87CkBAIC04MSwyMCArODEsNiBAQAogCX0KIAogCS8qKgotCSAqIFJlcXVlc3QgdGhlIHRocmVhZCB0byBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QgdG8gdGhlIHRocmVhZC4gVGhlIGFjdHVhbCBmbHVzaCB3aWxsCi0JICogaGFwcGVuIGF0IHNvbWUgZnV0dXJlIHBvaW50IGluIHRpbWUsIHdoZW4gdGhlIHRocmVhZCB3YWtlcyB1cCB0byBwcm9jZXNzCi0JICogdGhlIHJlcXVlc3QuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJc3luY2hyb25pemVkICh3cml0ZUxvY2spIHsKLQkJCWludGVycnVwdCgpOwotCQl9Ci0JfQotCi0JLyoqCiAJICogUmVxdWVzdCB0aGF0IHRoZSB0aHJlYWQgdGVybWluYXRlLCBhbmQgd2FpdCBmb3IgaXQuCiAJICogPHA+CiAJICogVGhpcyBtZXRob2Qgc2lnbmFscyB0byB0aGUgY29weSB0aHJlYWQgdGhhdCBpdCBzaG91bGQgc3RvcCBhcyBzb29uIGFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGRlZTRmZTkuLmU0MGE1YTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhCkBAIC04OSw3ICs4OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWxvbmcgc2tpcHBlZCA9IDA7CiAJCWxvbmcgY250ID0gY291bnQ7CiAJCWZpbmFsIGJ5dGVbXSBiID0gc2tpcEJ1ZmZlcigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDAxYjI1MTkuLjIzOTJiOGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dElucHV0U3RyZWFtLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiBAcGFyYW0gbWlsbGlzCiAJICogICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBhYm9ydGluZyBhIHJlYWQuIE11c3QgYmUgJmd0OyAwLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IG1pbGxpcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IG1pbGxpcykgewogCQlpZiAobWlsbGlzIDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lb3V0LCBJbnRlZ2VyLnZhbHVlT2YobWlsbGlzKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZWE0MDEzMy4uMjdmMTg3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAJICogICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBhYm9ydGluZyBhIHdyaXRlLiBNdXN0IGJlICZndDsKIAkgKiAgICAgICAgICAgIDAuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgbWlsbGlzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgbWlsbGlzKSB7CiAJCWlmIChtaWxsaXMgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVvdXQsIEludGVnZXIudmFsdWVPZihtaWxsaXMpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YQppbmRleCA1MWQzMTA2Li5lMTRlYjJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQAogCSAqIEBwYXJhbSBpbgogCSAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0byBhZGQ7IG11c3Qgbm90IGJlIG51bGwuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIElucHV0U3RyZWFtIGluKSB7CisJcHVibGljIHZvaWQgYWRkKElucHV0U3RyZWFtIGluKSB7CiAJCXN0cmVhbXMuYWRkKGluKTsKIAl9CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBza2lwKGZpbmFsIGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb25nIHNraXBwZWQgPSAwOwogCQlsb25nIGNudCA9IGNvdW50OwogCQl3aGlsZSAoMCA8IGNudCkgewpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggY2M5NGYzOS4uMjVjOTIzZCAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC01MSw3ICs1MSw3IEBACiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj40LjExLjMtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCiAgIDxuYW1lPkpHaXQgLSBQYXJlbnQ8L25hbWU+CiAgIDx1cmw+JHtqZ2l0LXVybH08L3VybD4KQEAgLTIxMyw3ICsyMTMsNyBAQAogICAgIDxodHRwY29yZS12ZXJzaW9uPjQuNC42PC9odHRwY29yZS12ZXJzaW9uPgogICAgIDxzbGY0ai12ZXJzaW9uPjEuNy4yPC9zbGY0ai12ZXJzaW9uPgogICAgIDxsb2c0ai12ZXJzaW9uPjEuMi4xNTwvbG9nNGotdmVyc2lvbj4KLSAgICA8bWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbj4zLjAuMDwvbWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbj4KKyAgICA8bWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbj4zLjAuMTwvbWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbj4KICAgICA8dHljaG8tZXh0cmFzLXZlcnNpb24+MS4xLjA8L3R5Y2hvLWV4dHJhcy12ZXJzaW9uPgogICAgIDxnc29uLXZlcnNpb24+Mi44LjI8L2dzb24tdmVyc2lvbj4KICAgICA8c3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luLXZlcnNpb24+My4xLjI8L3Nwb3RidWdzLW1hdmVuLXBsdWdpbi12ZXJzaW9uPgpAQCAtMjY3LDYzICsyNjcsNiBAQAogICAgICAgICA8L3BsdWdpbj4KIAogICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4zLjcuMDwvdmVyc2lvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+Ci0gICAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgotICAgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1jb21waWxlPC9pZD4KLSAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KLSAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8aWQ+Y29tcGlsZS13aXRoLWVycm9ycHJvbmU8L2lkPgotICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8Y29tcGlsZXJJZD5qYXZhYy13aXRoLWVycm9ycHJvbmU8L2NvbXBpbGVySWQ+Ci0gICAgICAgICAgICAgICAgPGZvcmNlSmF2YWNDb21waWxlclVzZT50cnVlPC9mb3JjZUphdmFjQ29tcGlsZXJVc2U+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLWphdmFjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItamF2YWMtZXJyb3Jwcm9uZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8IS0tIG92ZXJyaWRlIHBsZXh1cy1jb21waWxlci1qYXZhYy1lcnJvcnByb25lJ3MgZGVwZW5kZW5jeSBvbgotICAgICAgICAgICAgICAgICBFcnJvciBQcm9uZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiAtLT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmVycm9ycHJvbmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVycm9yX3Byb25lX2NvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNsZWFuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICA8dmVyc2lvbj4zLjAuMDwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CkBAIC0zNDMsNyArMjg2LDcgQEAKICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+My4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgPHZlcnNpb24+My4xLjE8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgogCiAgICAgICAgIDxwbHVnaW4+CkBAIC01NDEsNyArNDg0LDYgQEAKICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+CiAgICAgICAgICAgICA8Z29hbHM+CiAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KICAgICAgICAgICAgIDwvZ29hbHM+CkBAIC01OTYsNiArNTM4LDIzIEBACiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4tamF2YWRvYy1wbHVnaW4tdmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxyZXBvcnRTZXRzPgorICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgPHJlcG9ydD5qYXZhZG9jPC9yZXBvcnQ+CisgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgPC9yZXBvcnRTZXQ+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxpZD5hZ2dyZWdhdGU8L2lkPgorICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgIDxyZXBvcnQ+YWdncmVnYXRlPC9yZXBvcnQ+CisgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgPC9yZXBvcnRTZXQ+CisgICAgICAgIDwvcmVwb3J0U2V0cz4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFkZGl0aW9uYWxwYXJhbT4tWGRvY2xpbnQ6bm9uZTwvYWRkaXRpb25hbHBhcmFtPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KQEAgLTYxOSw2ICs1NzgsMjQgQEAKICAgICAgICAgICA8L3JlcG9ydHNEaXJlY3Rvcmllcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi45PC92ZXJzaW9uPgorICAgICAgICA8cmVwb3J0U2V0cz4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgIDxyZXBvcnQ+ZGVwZW5kZW5jaWVzPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+cHJvamVjdC10ZWFtPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+bWFpbGluZy1saXN0PC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+Y2ltPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+aXNzdWUtdHJhY2tpbmc8L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5saWNlbnNlPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+c2NtPC9yZXBvcnQ+CisgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgPC9yZXBvcnRTZXQ+CisgICAgICAgIDwvcmVwb3J0U2V0cz4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9yZXBvcnRpbmc+CiAKQEAgLTc2Miw2ICs3MzksMTA3IEBACiAKICAgPHByb2ZpbGVzPgogICAgIDxwcm9maWxlPgorICAgICAgPGlkPmphdmFjPC9pZD4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+CisgICAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1jb21waWxlPC9pZD4KKyAgICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+Y29tcGlsZS13aXRoLWVycm9ycHJvbmU8L2lkPgorICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJJZD5qYXZhYy13aXRoLWVycm9ycHJvbmU8L2NvbXBpbGVySWQ+CisgICAgICAgICAgICAgICAgICA8Zm9yY2VKYXZhY0NvbXBpbGVyVXNlPnRydWU8L2ZvcmNlSmF2YWNDb21waWxlclVzZT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYy1lcnJvcnByb25lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC40PC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgIDwhLS0gb3ZlcnJpZGUgcGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmUncyBkZXBlbmRlbmN5IG9uCisgICAgICAgICAgICAgICAgICBFcnJvciBQcm9uZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiAtLT4KKyAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5lcnJvcnByb25lPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVycm9yX3Byb25lX2NvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5lY2o8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My43LjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGNvbXBpbGVySWQ+ZWNsaXBzZTwvY29tcGlsZXJJZD4KKyAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgICAgICAgPCEtLSBQYXNzaW5nIGFyZ3VtZW50cyBpcyBhIHRyYWlud3JlY2ssIHNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01DT01QSUxFUi0xMjMgLS0+CisgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4ke3Byb2plY3QuYmFzZWRpcn0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPnRydWU8L3Nob3dXYXJuaW5ncz4KKyAgICAgICAgICAgICAgPHNob3dEZXByZWNhdGlvbj50cnVlPC9zaG93RGVwcmVjYXRpb24+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1lY2xpcHNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC40PC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpkdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lY2o8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4xMy4xMDI8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgICA8cHJvZmlsZT4KICAgICAgIDxpZD5zdGF0aWMtY2hlY2tzPC9pZD4KICAgICAgIDxidWlsZD4KICAgICAgICAgPHBsdWdpbnM+Cg==