ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGM2NDQwMWEuLjI2OGJhZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxMyArNCwxMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDY0YjhmODEuLjRiZmJjOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDA0MDBiYy4uNmRmMzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTEgKzMsMTEgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYW50Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgorICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50LnRhc2tzO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNS4wLjQiOwogIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcyxvcmcuYXBhY2hlLnRvb2xzLmFudCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IDdkODY3MTguLmEyODgzNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDVkMTZhYi4uMzI4NWVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOApAQCAtMTMsMTUgKzEzLDE1IEBACiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmJ6aXAyO3ZlcnNpb249IlsxLjQsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmd6aXA7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMueHo7dmVyc2lvbj0iWzEuNCwyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5Gb3JtYXRBY3RpdmF0b3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNC4xMS44IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCA1MDBjOWM5Li5mODU1NTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKaW5kZXggNGI4YjdlZC4uNGJmYTE3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGFyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQppbmRleCA3NTU5YWRhLi45ZWQ2MGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTgyLDIyICs4NCwxNCBAQAogCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRhckFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFRhckFyY2hpdmVPdXRwdXRTdHJlYW0ocywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJVGFyQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgVGFyQXJjaGl2ZU91dHB1dFN0cmVhbShzLAorCQkJCUNIQVJBQ1RFUl9FTkNPRElORyk7CiAJCW91dC5zZXRMb25nRmlsZU1vZGUoVGFyQXJjaGl2ZU91dHB1dFN0cmVhbS5MT05HRklMRV9QT1NJWCk7CiAJCW91dC5zZXRCaWdOdW1iZXJNb2RlKFRhckFyY2hpdmVPdXRwdXRTdHJlYW0uQklHTlVNQkVSX1BPU0lYKTsKIAkJcmV0dXJuIGFwcGx5Rm9ybWF0T3B0aW9ucyhvdXQsIG8pOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpAQCAtMTA2LDcgKzEwMCw3IEBACiAJCQlmaW5hbCBUYXJBcmNoaXZlRW50cnkgZW50cnkgPSBuZXcgVGFyQXJjaGl2ZUVudHJ5KAogCQkJCQlwYXRoLCBUYXJDb25zdGFudHMuTEZfU1lNTElOSyk7CiAJCQllbnRyeS5zZXRMaW5rTmFtZShuZXcgU3RyaW5nKAotCQkJCQlsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoMTAwKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisJCQkJCWxvYWRlci5nZXRDYWNoZWRCeXRlcygxMDApLCBDSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCW91dC5wdXRBcmNoaXZlRW50cnkoZW50cnkpOwogCQkJb3V0LmNsb3NlQXJjaGl2ZUVudHJ5KCk7CiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEKaW5kZXggMmY5NWY2ZC4uZmE2YTdiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RiejJGb3JtYXQuamF2YQpAQCAtODMsMTUgKzgzLDYgQEAKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKaW5kZXggYjIyYTYyZC4uMzY4YjRmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGd6Rm9ybWF0LmphdmEKQEAgLTgzLDE1ICs4Myw2IEBACiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCmluZGV4IGQyM2QyYjYuLjM2NjE2ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1R4ekZvcm1hdC5qYXZhCkBAIC04MywxNSArODMsNiBAQAogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQppbmRleCBkYzhmYjQ0Li44NDgzODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9aaXBGb3JtYXQuamF2YQpAQCAtODQsMTUgKzg0LDYgQEAKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDY3NWEyNzIuLjY5ZmI0N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZQotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVQcm92aWRlci1OYW1lCkBAIC0yMywxMCArMjMsMTAgQEAKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQ7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubjt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5hcGFjaGUuaHR0cC5jbGllbnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLAogICAgb3JnLmFwYWNoZS5odHRwLmVudGl0eSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbAppbmRleCAyNzY3NjI3Li5iYzcxZmFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCkBAIC00OCw3ICs0OCw3IEBACiAJPHBhcmVudD4KIAkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KIAkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAJPC9wYXJlbnQ+CiAKIAk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEKaW5kZXggMjgxOTMwMC4uN2YxZmVjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9odHRwL2FwYWNoZS9IdHRwQ2xpZW50Q29ubmVjdGlvbi5qYXZhCkBAIC00MjEsNyArNDIxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SG9zdG5hbWVWZXJpZmllcihmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1ldmVyaWZpZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKEhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWV2ZXJpZmllcikgewogCQl0aGlzLmhvc3RuYW1ldmVyaWZpZXIgPSBob3N0bmFtZXZlcmlmaWVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNjg4ODE4My4uYzk3YjkyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEzICszLDEzIEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI0LjExLjgiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LApAQCAtMTgsMTIgKzE4LDEyIEBACiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCiAgamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249IlsyLjUuMCwzLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCmluZGV4IDNhMjI1N2QuLjZmNzAwODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKQEAgLTUyLDcgKzUyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YQppbmRleCA3ZjgyNmQ0Li45ZTlmMjVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0FzSXNGaWxlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiBjbGFzcyBBc0lzRmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CiAJcHJpdmF0ZSBmaW5hbCBBc0lzRmlsZVNlcnZpY2UgYXNJczsKIAotCUFzSXNGaWxlRmlsdGVyKGZpbmFsIEFzSXNGaWxlU2VydmljZSBnZXRBbnlGaWxlKSB7CisJQXNJc0ZpbGVGaWx0ZXIoQXNJc0ZpbGVTZXJ2aWNlIGdldEFueUZpbGUpIHsKIAkJdGhpcy5hc0lzID0gZ2V0QW55RmlsZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvRmlsZVNlbmRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKaW5kZXggMGQ5MzVmYy4uMDU1MTBhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogCXByaXZhdGUgbG9uZyBlbmQ7CiAKLQlGaWxlU2VuZGVyKGZpbmFsIEZpbGUgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJRmlsZVNlbmRlcihGaWxlIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQl0aGlzLnNvdXJjZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGgsICJyIik7CiAKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJcmV0dXJuIHJlcS5nZXRIZWFkZXJzKEhEUl9SQU5HRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQppbmRleCBlZTIzNjc3Li5kMGVhN2I2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CiAJCWdpdEZpbHRlci5pbml0KG5ldyBGaWx0ZXJDb25maWcoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1BhY2tzU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKaW5kZXggODMwZTA2MS4uNTJhYWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEKQEAgLTY3LDcgKzY3LDcgQEAKIAkJc2VuZFBsYWluVGV4dChwYWNrTGlzdChyZXEpLCByZXEsIHJzcCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhY2tMaXN0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFja0xpc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZpbmFsIE9iamVjdERhdGFiYXNlIGRiID0gZ2V0UmVwb3NpdG9yeShyZXEpLmdldE9iamVjdERhdGFiYXNlKCk7CiAJCWlmIChkYiBpbnN0YW5jZW9mIE9iamVjdERpcmVjdG9yeSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1JlZnNTZXJ2bGV0LmphdmEKaW5kZXggNGY3MGNmNy4uMGY0NjMzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhCkBAIC00NCwxOCArNDQsMTUgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLlNlcnZsZXRVdGlscy5nZXRSZXBvc2l0b3J5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZBZHZlcnRpc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKQEAgLTc5LDcgKzc2LDcgQEAKIAkJCQlDb25zdGFudHMuQ0hBUlNFVCkpIHsKIAkJCWZpbmFsIFJlZkFkdmVydGlzZXIgYWR2ID0gbmV3IFJlZkFkdmVydGlzZXIoKSB7CiAJCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoZmluYWwgQ2hhclNlcXVlbmNlIGxpbmUpCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoQ2hhclNlcXVlbmNlIGxpbmUpCiAJCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkvLyBXaG9ldmVyIGRlY2lkZWQgdGhhdCBpbmZvL3JlZnMgc2hvdWxkIHVzZSBhIGRpZmZlcmVudAogCQkJCQkvLyBkZWxpbWl0ZXIgdGhhbiB0aGUgbmF0aXZlIGdpdDovLyBwcm90b2NvbCBzaG91bGRuJ3QKQEAgLTk0LDEwICs5MSw3IEBACiAJCQl9OwogCQkJYWR2LmluaXQoZGIpOwogCQkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKLQotCQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlyZWZzLnJlbW92ZShDb25zdGFudHMuSEVBRCk7Ci0JCQlhZHYuc2VuZChyZWZzKTsKKwkJCWFkdi5zZW5kKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1JFRlMpKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKaW5kZXggYjBiODMxZi4uYjM3OTk4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Jc0xvY2FsRmlsdGVyLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCSgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldE9iamVjdERhdGFiYXNlKCkgaW5zdGFuY2VvZiBPYmplY3REaXJlY3Rvcnk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhCmluZGV4IDUwZGM2OGYuLjYyZjA3NWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvT2JqZWN0RmlsZVNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL09iamVjdEZpbGVTZXJ2bGV0LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlTdHJpbmcgZXRhZyhmaW5hbCBGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGV0YWcoRmlsZVNlbmRlciBzZW5kZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gTG9uZy50b0hleFN0cmluZyhzZW5kZXIuZ2V0TGFzdE1vZGlmaWVkKCkpOwogCQl9CiAJfQpAQCAtODgsNyArODgsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBzZW5kZXIuZ2V0VGFpbENoZWNrc3VtKCk7CiAJCX0KIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlOwogCi0JT2JqZWN0RmlsZVNlcnZsZXQoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJT2JqZWN0RmlsZVNlcnZsZXQoU3RyaW5nIGNvbnRlbnRUeXBlKSB7CiAJCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKIAl9CiAKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBvYmplY3RzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBGaWxlIG9iamVjdHMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBSZXBvc2l0b3J5IGRiID0gZ2V0UmVwb3NpdG9yeShyZXEpOwogCQlyZXR1cm4gKChPYmplY3REaXJlY3RvcnkpIGRiLmdldE9iamVjdERhdGFiYXNlKCkpLmdldERpcmVjdG9yeSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvUmVwb3NpdG9yeUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKaW5kZXggYzg5YTVkNy4uMDIwYmU0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gaW5zdGFuY2UgZm9yIHRoZQogCSAqICAgICAgICAgICAgY3VycmVudCB3ZWIgcmVxdWVzdC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeUZpbHRlcihmaW5hbCBSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikgeworCXB1YmxpYyBSZXBvc2l0b3J5RmlsdGVyKFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlc29sdmVyKSB7CiAJCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoZmluYWwgRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewogCQljb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CiAJfQogCkBAIC0xNDAsOSArMTQwLDkgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCWZpbmFsIFJlcG9zaXRvcnkgZGI7Ci0JCXRyeSB7Ci0JCQlkYiA9IHJlc29sdmVyLm9wZW4ocmVxLCBuYW1lKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGRiID0gcmVzb2x2ZXIub3BlbihyZXEsIG5hbWUpKSB7CisJCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUkVQT1NJVE9SWSwgZGIpOworCQkJY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogCQl9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgewogCQkJc2VuZEVycm9yKHJlcSwgcmVzLCBTQ19OT1RfRk9VTkQpOwogCQkJcmV0dXJuOwpAQCAtMTU1LDEzICsxNTUsOCBAQAogCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZSkgewogCQkJc2VuZEVycm9yKHJlcSwgcmVzLCBlLmdldFN0YXR1c0NvZGUoKSwgZS5nZXRNZXNzYWdlKCkpOwogCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSSUJVVEVfUkVQT1NJVE9SWSwgZGIpOwotCQkJY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogCQl9IGZpbmFsbHkgewogCQkJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlkpOwotCQkJZGIuY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhCmluZGV4IGYxZmY1NDcuLjk2MDFjOGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TZXJ2bGV0VXRpbHMuamF2YQpAQCAtOTAsNyArOTAsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSBmaWx0ZXIgcnVucyBiZWZvcmUgdGhlIHNlcnZsZXQuCiAJICogQHNlZSAjQVRUUklCVVRFX1JFUE9TSVRPUlkKIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJUmVwb3NpdG9yeSBkYiA9IChSZXBvc2l0b3J5KSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9SRVBPU0lUT1JZKTsKIAkJaWYgKGRiID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEh0dHBTZXJ2ZXJUZXh0LmdldCgpLmV4cGVjdGVkUmVwb3NpdG9yeUF0dHJpYnV0ZSk7CkBAIC0xMTAsNyArMTEwLDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCisJcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShIdHRwU2VydmxldFJlcXVlc3QgcmVxKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gaW4gPSByZXEuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJZmluYWwgU3RyaW5nIGVuYyA9IHJlcS5nZXRIZWFkZXIoSERSX0NPTlRFTlRfRU5DT0RJTkcpOwpAQCAtMjIwLDEyICsyMjAsOSBAQAogCXB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kKGJ5dGVbXSBjb250ZW50LCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQkJZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbnRlbnQgPSBzZW5kSW5pdChjb250ZW50LCByZXEsIHJzcCk7Ci0JCWZpbmFsIE91dHB1dFN0cmVhbSBvdXQgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKSkgewogCQkJb3V0LndyaXRlKGNvbnRlbnQpOwogCQkJb3V0LmZsdXNoKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvdXQuY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMjQxLDcgKzIzOCw3IEBACiAJCXJldHVybiBjb250ZW50OwogCX0KIAotCXN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlyZXR1cm4gYWNjZXB0c0d6aXBFbmNvZGluZyhyZXEuZ2V0SGVhZGVyKEhEUl9BQ0NFUFRfRU5DT0RJTkcpKTsKIAl9CiAKQEAgLTI2MSw3ICsyNTgsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGZpbmFsIGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbXByZXNzKGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBtYXhMZW4gPSByYXcubGVuZ3RoICsgMzI7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heExlbik7CiAJCWZpbmFsIEdaSVBPdXRwdXRTdHJlYW0gZ3ogPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXQpOwpAQCAtMjcxLDcgKzI2OCw3IEBACiAJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXRhZyhmaW5hbCBieXRlW10gY29udGVudCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBldGFnKGJ5dGVbXSBjb250ZW50KSB7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwogCQltZC51cGRhdGUoY29udGVudCk7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KG1kLmRpZ2VzdCgpKS5nZXROYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNGViOTRhMy4uYWQ1ZThkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEwLDExICsxMTAsOCBAQAogCQkJaWYgKDI1NiA8IG91dC5sZW5ndGgoKSAmJiBhY2NlcHRzR3ppcEVuY29kaW5nKHJlcSkpIHsKIAkJCQlUZW1wb3JhcnlCdWZmZXIgZ3pidWYgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoTElNSVQpOwogCQkJCXRyeSB7Ci0JCQkJCUdaSVBPdXRwdXRTdHJlYW0gZ3ppcCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGd6YnVmKTsKLQkJCQkJdHJ5IHsKKwkJCQkJdHJ5IChHWklQT3V0cHV0U3RyZWFtIGd6aXAgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShnemJ1ZikpIHsKIAkJCQkJCW91dC53cml0ZVRvKGd6aXAsIG51bGwpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJZ3ppcC5jbG9zZSgpOwogCQkJCQl9CiAJCQkJCWlmIChnemJ1Zi5sZW5ndGgoKSA8IG91dC5sZW5ndGgoKSkgewogCQkJCQkJb3V0ID0gZ3pidWY7CkBAIC0xMzEsMTIgKzEyOCw5IEBACiAJCQkvLyBoYXJkY29kZWQgTElNSVQgY29uc3RhbnQgYWJvdmUgYXNzdXJlcyB1cyB3ZSB3b3VsZG4ndCBzdG9yZQogCQkJLy8gbW9yZSB0aGFuIDIgR2lCIG9mIGNvbnRlbnQgaW4gbWVtb3J5LgogCQkJcnNwLnNldENvbnRlbnRMZW5ndGgoKGludCkgb3V0Lmxlbmd0aCgpKTsKLQkJCWZpbmFsIE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKSkgewogCQkJCW91dC53cml0ZVRvKG9zLCBudWxsKTsKIAkJCQlvcy5mbHVzaCgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhCmluZGV4IDY0MTc4NzcuLjE5NWRmZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0U2VydmljZUluZm9SZWZzLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAogCXByaXZhdGUgZmluYWwgRmlsdGVyW10gZmlsdGVyczsKIAotCVNtYXJ0U2VydmljZUluZm9SZWZzKGZpbmFsIFN0cmluZyBzZXJ2aWNlLCBmaW5hbCBMaXN0PEZpbHRlcj4gZmlsdGVycykgeworCVNtYXJ0U2VydmljZUluZm9SZWZzKFN0cmluZyBzZXJ2aWNlLCBMaXN0PEZpbHRlcj4gZmlsdGVycykgewogCQl0aGlzLnN2YyA9IHNlcnZpY2U7CiAJCXRoaXMuZmlsdGVycyA9IGZpbHRlcnMudG9BcnJheShuZXcgRmlsdGVyW2ZpbHRlcnMuc2l6ZSgpXSk7CiAJfQpAQCAtMTMzLDkgKzEzMyw3IEBACiAJCQlyZXMuc2V0Q29udGVudFR5cGUoaW5mb1JlZnNSZXN1bHRUeXBlKHN2YykpOwogCiAJCQlmaW5hbCBQYWNrZXRMaW5lT3V0IG91dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7Ci0JCQlvdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgIlxuIik7Ci0JCQlvdXQuZW5kKCk7Ci0JCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIob3V0KSk7CisJCQlyZXNwb25kKHJlcSwgb3V0LCBzdmMpOwogCQkJYnVmLmNsb3NlKCk7CiAJCX0gY2F0Y2ggKFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIGUpIHsKIAkJCXJlcy5zZW5kRXJyb3IoU0NfVU5BVVRIT1JJWkVELCBlLmdldE1lc3NhZ2UoKSk7CkBAIC0xNzgsNiArMTc2LDM3IEBACiAJCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBwY2spIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIAorCS8qKgorCSAqIFdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgdG8gYW4gaW5mby9yZWZzIHJlcXVlc3QgcmVjZWl2ZWQgYnkKKwkgKiBhIHNtYXJ0IHNlcnZpY2UuIEluIHByb3RvY29sIHYwLCB0aGlzIHN0YXJ0cyB3aXRoICIjCisJICogc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYSBmbHVzaCBwYWNrZXQsIGJ1dCB0aGlzIGlzIG5vdAorCSAqIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIGluIG90aGVyIHByb3RvY29sIHZlcnNpb25zLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdyaXRlcyAiIyBzZXJ2aWNlPXNlcnZpY2VOYW1lIiBhbmQgYQorCSAqIGZsdXNoIHBhY2tldCwgdGhlbiBjYWxscyB7QGxpbmsgI2FkdmVydGlzZX0uIFN1YmNsYXNzZXMgc2hvdWxkCisJICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBzdXBwb3J0IHByb3RvY29sIHZlcnNpb25zIG90aGVyIHRoYW4KKwkgKiBwcm90b2NvbCB2MC4KKwkgKgorCSAqIEBwYXJhbSByZXEKKwkgKiAgICAgICAgICAgIHJlcXVlc3QKKwkgKiBAcGFyYW0gcGNrT3V0CisJICogICAgICAgICAgICBkZXN0aW5hdGlvbiBvZiByZXNwb25zZQorCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorCSAqICAgICAgICAgICAgc2VydmljZSBuYW1lIHRvIGJlIHdyaXR0ZW4gb3V0IGluIHByb3RvY29sIHYwOyBtYXkgb3IgbWF5CisJICogICAgICAgICAgICBub3QgYmUgdXNlZCBpbiBvdGhlciB2ZXJzaW9ucworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uCisJICogQHRocm93cyBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc3BvbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKwkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQlwY2tPdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJcGNrT3V0LmVuZCgpOworCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSk7CisJfQorCiAJcHJpdmF0ZSBjbGFzcyBDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9UZXh0RmlsZVNlcnZsZXQuamF2YQppbmRleCAwMDg1MWNmLi5iMjQ2NmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVGV4dEZpbGVTZXJ2bGV0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKIAogCXByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwogCi0JVGV4dEZpbGVTZXJ2bGV0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJVGV4dEZpbGVTZXJ2bGV0KFN0cmluZyBuYW1lKSB7CiAJCXRoaXMuZmlsZU5hbWUgPSBuYW1lOwogCX0KIApAQCAtODAsNyArODAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gcmVhZChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYnl0ZVtdIHJlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBnaXRkaXIgPSBnZXRSZXBvc2l0b3J5KHJlcSkuZ2V0RGlyZWN0b3J5KCk7CiAJCWlmIChnaXRkaXIgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZmlsZU5hbWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCmluZGV4IDNlOWMxZmUuLmNhNmI3NDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKQEAgLTc2LDYgKzc2LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSW50ZXJuYWxIdHRwU2VydmVyR2x1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrZXRMaW5lT3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXIuUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2s7CkBAIC0xMTcsNiArMTE4LDI1IEBACiAJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOwogCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhwY2spOwogCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCisJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcmVzcG9uZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorCQkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJVXBsb2FkUGFjayB1cCA9IChVcGxvYWRQYWNrKSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9IQU5ETEVSKTsKKwkJCXRyeSB7CisJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOworCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSwgc2VydmljZU5hbWUpOworCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCiAJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YQppbmRleCA1N2ZkZGRhLi42ZjI3YjI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvRXJyb3JTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL0Vycm9yU2VydmxldC5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogQHBhcmFtIHN0YXR1cwogCSAqICAgICAgICAgICAgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYWx3YXlzIHNlbmQuCiAJICovCi0JcHVibGljIEVycm9yU2VydmxldChmaW5hbCBpbnQgc3RhdHVzKSB7CisJcHVibGljIEVycm9yU2VydmxldChpbnQgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleEdyb3VwRmlsdGVyLmphdmEKaW5kZXggYTNkYzZjMy4uZjI2ZWJjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhHcm91cEZpbHRlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBACiAJICogQHBhcmFtIGdyb3VwSWR4CiAJICogICAgICAgICAgICBjYXB0dXJlIGdyb3VwIG51bWJlciwgMSB0aHJvdWdoIHRoZSBudW1iZXIgb2YgZ3JvdXBzLgogCSAqLwotCXB1YmxpYyBSZWdleEdyb3VwRmlsdGVyKGZpbmFsIGludCBncm91cElkeCkgeworCXB1YmxpYyBSZWdleEdyb3VwRmlsdGVyKGludCBncm91cElkeCkgewogCQlpZiAoZ3JvdXBJZHggPCAxKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSHR0cFNlcnZlclRleHQuZ2V0KCkuaW52YWxpZEluZGV4LCB2YWx1ZU9mKGdyb3VwSWR4KSkpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQkJCXZhbHVlT2YoZ3JvdXBJZHggKyAxKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFdyYXBwZWRSZXF1ZXN0W10gZ3JvdXBzRm9yKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHIpIHsKKwlwcml2YXRlIHN0YXRpYyBXcmFwcGVkUmVxdWVzdFtdIGdyb3Vwc0ZvcihTZXJ2bGV0UmVxdWVzdCByKSB7CiAJCXJldHVybiAoV3JhcHBlZFJlcXVlc3RbXSkgci5nZXRBdHRyaWJ1dGUoTWV0YUZpbHRlci5SRUdFWF9HUk9VUFMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhQaXBlbGluZS5qYXZhCmluZGV4IGJmMmQ2ZGIuLjAxMDgxMDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YQpAQCAtODcsMTEgKzg3LDExIEBACiAJc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIFNlcnZsZXRCaW5kZXJJbXBsIHsKIAkJcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIHBhdHRlcm47CiAKLQkJQmluZGVyKGZpbmFsIFN0cmluZyBwKSB7CisJCUJpbmRlcihTdHJpbmcgcCkgewogCQkJcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShwKTsKIAkJfQogCi0JCUJpbmRlcihmaW5hbCBQYXR0ZXJuIHApIHsKKwkJQmluZGVyKFBhdHRlcm4gcCkgewogCQkJcGF0dGVybiA9IHA7CiAJCX0KIApAQCAtMTEwLDcgKzExMCw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJYm9vbGVhbiBtYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwogCQlyZXR1cm4gcGF0aEluZm8gIT0gbnVsbCAmJiBwYXR0ZXJuLm1hdGNoZXIocGF0aEluZm8pLm1hdGNoZXMoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCmluZGV4IDY3NDJjOWYuLjRmZDk5YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9TdWZmaXhQaXBlbGluZS5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIFNlcnZsZXRCaW5kZXJJbXBsIHsKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3VmZml4OwogCi0JCUJpbmRlcihmaW5hbCBTdHJpbmcgc3VmZml4KSB7CisJCUJpbmRlcihTdHJpbmcgc3VmZml4KSB7CiAJCQl0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKIAkJfQogCkBAIC04OSw3ICs4OSw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJYm9vbGVhbiBtYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwogCQlyZXR1cm4gcGF0aEluZm8gIT0gbnVsbCAmJiBwYXRoSW5mby5lbmRzV2l0aChzdWZmaXgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKaW5kZXggNTZlNGUyMi4uYzAyMzk5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1VybFBpcGVsaW5lLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAkvKiogSW5zdGFuY2UgdGhhdCBtdXN0IGdlbmVyYXRlIHRoZSByZXNwb25zZTsgbmV2ZXIgbnVsbC4gKi8KIAlwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7CiAKLQlVcmxQaXBlbGluZShmaW5hbCBGaWx0ZXJbXSBmaWx0ZXJzLCBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0KSB7CisJVXJsUGlwZWxpbmUoRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQl0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzOwogCQl0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OwogCX0KQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGZpbHRlciBvciBzZXJ2bGV0IGlzIHVuYWJsZSB0byBpbml0aWFsaXplLgogCSAqLwotCXZvaWQgaW5pdChmaW5hbCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBTZXQ8T2JqZWN0PiBpbml0ZWQpCisJdm9pZCBpbml0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFNldDxPYmplY3Q+IGluaXRlZCkKIAkJCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJZm9yIChGaWx0ZXIgcmVmIDogZmlsdGVycykKIAkJCWluaXRGaWx0ZXIocmVmLCBjb250ZXh0LCBpbml0ZWQpOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJICogICAgICAgICAgICBkZXN0cm95ZWQgYSBzZWNvbmQgdGltZS4gRmlsdGVycyBhbmQgc2VydmxldHMgdGhhdCBhcmUgZmlyc3QKIAkgKiAgICAgICAgICAgIGRlc3Ryb3llZCBieSB0aGlzIHBpcGVsaW5lIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBzZXQuCiAJICovCi0Jdm9pZCBkZXN0cm95KGZpbmFsIFNldDxPYmplY3Q+IGRlc3Ryb3llZCkgeworCXZvaWQgZGVzdHJveShTZXQ8T2JqZWN0PiBkZXN0cm95ZWQpIHsKIAkJZm9yIChGaWx0ZXIgcmVmIDogZmlsdGVycykKIAkJCWRlc3Ryb3lGaWx0ZXIocmVmLCBkZXN0cm95ZWQpOwogCQlkZXN0cm95U2VydmxldChzZXJ2bGV0LCBkZXN0cm95ZWQpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCi0JCUNoYWluKGZpbmFsIEZpbHRlcltdIGZpbHRlcnMsIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKKwkJQ2hhaW4oRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQkJdGhpcy5maWx0ZXJzID0gZmlsdGVyczsKIAkJCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0FzSXNGaWxlU2VydmljZS5qYXZhCmluZGV4IDExYWQ1ZTAuLjlhOTI4YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9Bc0lzRmlsZVNlcnZpY2UuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VDb25maWcgewogCQlmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAKLQkJU2VydmljZUNvbmZpZyhmaW5hbCBDb25maWcgY2ZnKSB7CisJCVNlcnZpY2VDb25maWcoQ29uZmlnIGNmZykgewogCQkJZW5hYmxlZCA9IGNmZy5nZXRCb29sZWFuKCJodHRwIiwgImdldGFueWZpbGUiLCB0cnVlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKaW5kZXggOTVlYjhkNS4uMDZhOGY1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5LmphdmEKQEAgLTc0LDcgKzc0LDcgQEAKIAogCQlmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAKLQkJU2VydmljZUNvbmZpZyhmaW5hbCBDb25maWcgY2ZnKSB7CisJCVNlcnZpY2VDb25maWcoQ29uZmlnIGNmZykgewogCQkJc2V0ID0gY2ZnLmdldFN0cmluZygiaHR0cCIsIG51bGwsICJyZWNlaXZlcGFjayIpICE9IG51bGw7CiAJCQllbmFibGVkID0gY2ZnLmdldEJvb2xlYW4oImh0dHAiLCAicmVjZWl2ZXBhY2siLCBmYWxzZSk7CiAJCX0KQEAgLTgyLDcgKzgyLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTZXJ2aWNlQ29uZmlnIGNmZyA9IGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpOwogCQlTdHJpbmcgdXNlciA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnkuamF2YQppbmRleCBmNWFmYTFlLi5hNjlmYWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5LmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CkBAIC02NCwxOCArNjYsMjUgQEAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAkJZmluYWwgYm9vbGVhbiBlbmFibGVkOwogCi0JCVNlcnZpY2VDb25maWcoZmluYWwgQ29uZmlnIGNmZykgeworCQlTZXJ2aWNlQ29uZmlnKENvbmZpZyBjZmcpIHsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJ1cGxvYWRwYWNrIiwgdHJ1ZSk7CiAJCX0KIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7Ci0JCWlmIChkYi5nZXRDb25maWcoKS5nZXQoU2VydmljZUNvbmZpZzo6bmV3KS5lbmFibGVkKQotCQkJcmV0dXJuIG5ldyBVcGxvYWRQYWNrKGRiKTsKLQkJZWxzZQorCQlpZiAoZGIuZ2V0Q29uZmlnKCkuZ2V0KFNlcnZpY2VDb25maWc6Om5ldykuZW5hYmxlZCkgeworCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCVN0cmluZyBoZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJHaXQtUHJvdG9jb2wiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7CisJCQkJU3RyaW5nW10gcGFyYW1zID0gaGVhZGVyLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoQXJyYXlzLmFzTGlzdChwYXJhbXMpKTsKKwkJCX0KKwkJCXJldHVybiB1cDsKKwkJfSBlbHNlIHsKIAkJCXRocm93IG5ldyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbigpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmMzM4NjA3Li5mZWQ2MzJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKQEAgLTI1LDI1ICsyNSwyNiBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNlY3VyaXR5O3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnRocmVhZDt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmhhbWNyZXN0O3ZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO3ZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydWxlczt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKaW5kZXggNDIyMzk4Yy4uODdlMmY0YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCkBAIC01MSw3ICs1MSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGU5NGE3OTIuLjI5OGJmMjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvQXNJc1NlcnZpY2VUZXN0LmphdmEKQEAgLTEzMyw3ICsxMzMsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggYjI0ZTJkZi4uYWRlMWUxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5VGVzdC5qYXZhCmluZGV4IGNlMjRkNjQuLjI2OGMyODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YQpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKIAotCQlSKGZpbmFsIFN0cmluZyB1c2VyLCBmaW5hbCBTdHJpbmcgaG9zdCkgeworCQlSKFN0cmluZyB1c2VyLCBTdHJpbmcgaG9zdCkgewogCQkJc3VwZXIobmV3IFJlcXVlc3QobnVsbCwgbnVsbCkgLyogY2FuJ3QgcGFzcyBudWxsLCBzaWdoICovKTsKIAkJCXRoaXMudXNlciA9IHVzZXI7CiAJCQl0aGlzLmhvc3QgPSBob3N0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCmluZGV4IDZkYmUwZTMuLmVmMDU5YmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKQEAgLTQzLDE1ICs0MywyMCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnRoZUluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CkBAIC03NSw5ICs4MCwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkZldGNoQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrZXRMaW5lSW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUGFja2V0TGluZU91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5UcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5KREtIdHRwQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuUmVwb3NpdG9yeVJlc29sdmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xMTgsNyArMTI3LDcgQEAKIAkJc21hcnRBdXRoQmFzaWNVUkkgPSB0b1VSSWlzaChzQmFzaWMsIHNyY05hbWUpOwogCX0KIAotCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIGR1bWIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBkdW1iKFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIEZpbGUgc3JjR2l0ID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCk7CiAJCWZpbmFsIFVSSSBiYXNlID0gc3JjR2l0LmdldFBhcmVudEZpbGUoKS50b1VSSSgpOwogCkBAIC0xMzAsNyArMTM5LDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTEsNyArMTYwLDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKQEAgLTM0NSw0ICszNTQsODIgQEAKIAkJCWFzc2VydE5vdE51bGwoaGVhZCk7CiAJCX0KIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RIdHRwQ2xpZW50V2FudHNWMkJ1dFNlcnZlck5vdENvbmZpZ3VyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiR2l0LVByb3RvY29sIiwgInZlcnNpb249MiIpOworCQljLmNvbm5lY3QoKTsKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisKKwkJLy8gQ2hlY2sgdGhhdCB3ZSBnZXQgYSB2MCByZXNwb25zZS4KKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCIjIHNlcnZpY2U9Z2l0LXVwbG9hZC1wYWNrIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKS5tYXRjaGVzKCJbMC05YS1mXXs0MH0gSEVBRC4qIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYySHR0cEZpcnN0UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuc2V0SW50KAorCQkJCSJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIiwgMik7CisKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiR2l0LVByb3RvY29sIiwgInZlcnNpb249MiIpOworCQljLmNvbm5lY3QoKTsKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygidmVyc2lvbiAyIikpOworCisJCS8vIFdoYXQgcmVtYWlucyBhcmUgY2FwYWJpbGl0aWVzIC0gZW5zdXJlIHRoYXQgYWxsIG9mIHRoZW0gYXJlCisJCS8vIG5vbi1lbXB0eSBzdHJpbmdzLCBhbmQgdGhhdCB3ZSBzZWUgRU5EIGF0IHRoZSBlbmQuCisJCVN0cmluZyBzOworCQl3aGlsZSAoKHMgPSBwY2tJbi5yZWFkU3RyaW5nKCkpICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCWFzc2VydFRydWUoIXMuaXNFbXB0eSgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYySHR0cFN1YnNlcXVlbnRSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworCQlyZW1vdGVSZXBvc2l0b3J5LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKS5zZXRJbnQoCisJCQkJInByb3RvY29sIiwgbnVsbCwgInZlcnNpb24iLCAyKTsKKworCQlKREtIdHRwQ29ubmVjdGlvbkZhY3RvcnkgZiA9IG5ldyBKREtIdHRwQ29ubmVjdGlvbkZhY3RvcnkoKTsKKwkJU3RyaW5nIHVybCA9IHNtYXJ0QXV0aE5vbmVVUkkudG9TdHJpbmcoKSArICIvZ2l0LXVwbG9hZC1wYWNrIjsKKwkJSHR0cENvbm5lY3Rpb24gYyA9IGYuY3JlYXRlKG5ldyBVUkwodXJsKSk7CisJCWMuc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtZ2l0LXVwbG9hZC1wYWNrLXJlcXVlc3QiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5zZXREb091dHB1dCh0cnVlKTsKKwkJYy5jb25uZWN0KCk7CisKKwkJLy8gVGVzdCBscy1yZWZzIHRvIHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgY29ubmVjdGVkCisJCS8vIHByb3Blcmx5LiBUZXN0cyBmb3Igb3RoZXIgY29tbWFuZHMgZ28gaW4KKwkJLy8gVXBsb2FkUGFja1Rlc3QuamF2YS4KKworCQlPdXRwdXRTdHJlYW0gb3MgPSBjLmdldE91dHB1dFN0cmVhbSgpOworCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KG9zKTsKKwkJcGNrT3V0LndyaXRlU3RyaW5nKCJjb21tYW5kPWxzLXJlZnMiKTsKKwkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJcGNrT3V0LmVuZCgpOworCQlvcy5jbG9zZSgpOworCisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4oYy5nZXRJbnB1dFN0cmVhbSgpKTsKKworCQkvLyBKdXN0IGNoZWNrIHRoYXQgd2UgZ2V0IHdoYXQgbG9va3MgbGlrZSBhIHJlZiBhZHZlcnRpc2VtZW50LgorCQlTdHJpbmcgczsKKwkJd2hpbGUgKChzID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlhc3NlcnRUcnVlKHMubWF0Y2hlcygiWzAtOWEtZl17NDB9IFtBLVphLXovXSoiKSk7CisJCX0KKworCQlhc3NlcnRUaGF0KGMuZ2V0UmVzcG9uc2VDb2RlKCksIGlzKDIwMCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKaW5kZXggODdkMGJhZC4uYTFiYWFlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1Byb3RvY29sRXJyb3JUZXN0LmphdmEKQEAgLTE0OSwxOSArMTQ5LDE1IEBACiAJCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwKIAkJCQkJR2l0U21hcnRIdHRwVG9vbHMuUkVDRUlWRV9QQUNLX1JFUVVFU1RfVFlQRSk7CiAJCQljLnNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShyZXFiaW4ubGVuZ3RoKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBjLmdldE91dHB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGMuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGUocmVxYmluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3V0LmNsb3NlKCk7CiAJCQl9CiAKIAkJCWFzc2VydEVxdWFscygyMDAsIGMuZ2V0UmVzcG9uc2VDb2RlKCkpOwogCQkJYXNzZXJ0RXF1YWxzKEdpdFNtYXJ0SHR0cFRvb2xzLlJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwKIAkJCQkJYy5nZXRDb250ZW50VHlwZSgpKTsKIAotCQkJSW5wdXRTdHJlYW0gcmF3aW4gPSBjLmdldElucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSByYXdpbiA9IGMuZ2V0SW5wdXRTdHJlYW0oKSkgewogCQkJCVBhY2tldExpbmVJbiBwY2tpbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3aW4pOwogCQkJCWFzc2VydEVxdWFscygidW5wYWNrIGVycm9yICIKIAkJCQkJCSsgSkdpdFRleHQuZ2V0KCkucGFja2ZpbGVJc1RydW5jYXRlZE5vUGFyYW0sCkBAIC0xNjksOCArMTY1LDYgQEAKIAkJCQlhc3NlcnRFcXVhbHMoIm5nIHJlZnMvb2JqZWN0cy9BIG4vYSAodW5wYWNrZXIgZXJyb3IpIiwKIAkJCQkJCXBja2luLnJlYWRTdHJpbmcoKSk7CiAJCQkJYXNzZXJ0U2FtZShQYWNrZXRMaW5lSW4uRU5ELCBwY2tpbi5yZWFkU3RyaW5nKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyYXdpbi5jbG9zZSgpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJYy5kaXNjb25uZWN0KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEKaW5kZXggZWY4ZGFlYy4uZmJjNTRmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NldEFkZGl0aW9uYWxIZWFkZXJzVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YQpAQCAtMTA3LDggKzEwNyw3IEBACiAKIAkJYXNzZXJ0RXF1YWxzKCJodHRwIiwgcmVtb3RlVVJJLmdldFNjaGVtZSgpKTsKIAotCQlUcmFuc3BvcnQgdCA9IFRyYW5zcG9ydC5vcGVuKGRzdCwgcmVtb3RlVVJJKTsKLQkJdHJ5IHsKKwkJdHJ5IChUcmFuc3BvcnQgdCA9IFRyYW5zcG9ydC5vcGVuKGRzdCwgcmVtb3RlVVJJKSkgewogCQkJYXNzZXJ0VHJ1ZSgiaXNhIFRyYW5zcG9ydEh0dHAiLCB0IGluc3RhbmNlb2YgVHJhbnNwb3J0SHR0cCk7CiAJCQlhc3NlcnRUcnVlKCJpc2EgSHR0cFRyYW5zcG9ydCIsIHQgaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0KTsKIApAQCAtMTE3LDggKzExNiw2IEBACiAJCQloZWFkZXJzLnB1dCgiQW5vdGhlcktleSIsICJzb21lVmFsdWUiKTsKIAkJCSgoVHJhbnNwb3J0SHR0cCkgdCkuc2V0QWRkaXRpb25hbEhlYWRlcnMoaGVhZGVycyk7CiAJCQl0Lm9wZW5GZXRjaCgpOwotCQl9IGZpbmFsbHkgewotCQkJdC5jbG9zZSgpOwogCQl9CiAKIAkJTGlzdDxBY2Nlc3NFdmVudD4gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQppbmRleCAzMTgzMmU3Li42NTIxMGQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQ09OVEVOVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CkBAIC0yOTgsMTAgKzI5OCwxMCBAQAogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewogCQkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgciA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKIAkJCQlyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0JCQkJci5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLQkJCQlQcmludFdyaXRlciB3ID0gci5nZXRXcml0ZXIoKTsKLQkJCQl3LnByaW50KCJPSyIpOwotCQkJCXcuY2xvc2UoKTsKKwkJCQlyLnNldENoYXJhY3RlckVuY29kaW5nKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpOworCQkJCXRyeSAoUHJpbnRXcml0ZXIgdyA9IHIuZ2V0V3JpdGVyKCkpIHsKKwkJCQkJdy5wcmludCgiT0siKTsKKwkJCQl9CiAJCQl9CiAKIAkJCUBPdmVycmlkZQpAQCAtNDI5LDExICs0MjksOCBAQAogCQkJYXNzZXJ0VHJ1ZSgiaXNhIFRyYW5zcG9ydEh0dHAiLCB0IGluc3RhbmNlb2YgVHJhbnNwb3J0SHR0cCk7CiAJCQlhc3NlcnRUcnVlKCJpc2EgSHR0cFRyYW5zcG9ydCIsIHQgaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0KTsKIAotCQkJRmV0Y2hDb25uZWN0aW9uIGMgPSB0Lm9wZW5GZXRjaCgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmV0Y2hDb25uZWN0aW9uIGMgPSB0Lm9wZW5GZXRjaCgpKSB7CiAJCQkJbWFwID0gYy5nZXRSZWZzTWFwKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWMuY2xvc2UoKTsKIAkJCX0KIAkJfQogCkBAIC0xMTY2LDcgKzExNjMsNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkV2FudCgpIHRocm93cyBFeGNlcHRpb24gewogCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQlPYmplY3RJZCBpZCA9IG5ldyBPYmplY3RJbnNlcnRlci5Gb3JtYXR0ZXIoKS5pZEZvcihDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJInRlc3RJbnZhbGlkV2FudCIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkidGVzdEludmFsaWRXYW50Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmVwb3NpdG9yeSBkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQl0cnkgKFRyYW5zcG9ydCB0ID0gVHJhbnNwb3J0Lm9wZW4oZHN0LCByZW1vdGVVUkkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGQ3OTIwZmEuLmE2OGQxNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKQEAgLTIyLDE2ICsyMiwxNiBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNlY3VyaXR5O3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNzbDt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI0LjExLjgiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBqYXZheC5zZXJ2bGV0Lmh0dHAsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCmluZGV4IDVkOTJhMWEuLmViN2QwMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9BY2Nlc3NFdmVudC5qYXZhCmluZGV4IDAxYzQzNjAuLjgyNDc2ZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCiAJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3BvbnNlSGVhZGVyczsKIAotCUFjY2Vzc0V2ZW50KGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBSZXNwb25zZSByc3ApIHsKKwlBY2Nlc3NFdmVudChSZXF1ZXN0IHJlcSwgUmVzcG9uc2UgcnNwKSB7CiAJCW1ldGhvZCA9IHJlcS5nZXRNZXRob2QoKTsKIAkJdXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKIAkJcmVxdWVzdEhlYWRlcnMgPSBjbG9uZUhlYWRlcnMocmVxKTsKQEAgLTc3LDcgKzc3LDcgQEAKIAkJcmVzcG9uc2VIZWFkZXJzID0gY2xvbmVIZWFkZXJzKHJzcCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoZmluYWwgUmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsb25lSGVhZGVycyhSZXF1ZXN0IHJlcSkgewogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgVHJlZU1hcDw+KCk7CiAJCUVudW1lcmF0aW9uIGhuID0gcmVxLmdldEhlYWRlck5hbWVzKCk7CiAJCXdoaWxlIChobi5oYXNNb3JlRWxlbWVudHMoKSkgewpAQCAtODksNyArODksNyBAQAogCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKGZpbmFsIFJlc3BvbnNlIHJzcCkgeworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKFJlc3BvbnNlIHJzcCkgewogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHIgPSBuZXcgVHJlZU1hcDw+KCk7CiAJCUVudW1lcmF0aW9uPFN0cmluZz4gaG4gPSByc3AuZ2V0SHR0cEZpZWxkcygpLmdldEZpZWxkTmFtZXMoKTsKIAkJd2hpbGUgKGhuLmhhc01vcmVFbGVtZW50cygpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9SZWNvcmRpbmdMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCmluZGV4IGZlZDA2M2EuLmE3MTRlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKgogCSAqIEBwYXJhbSBuYW1lCiAJICovCi0JcHVibGljIFJlY29yZGluZ0xvZ2dlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZWNvcmRpbmdMb2dnZXIoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5uYW1lID0gbmFtZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQppbmRleCBjNTU3NmY5Li4yNDViNTEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9TaW1wbGVIdHRwU2VydmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhCkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJcmV0dXJuIHNlY3VyZVVyaTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iRG9uJ3QgY2FyZSBhYm91dCBub24tQVBJIGluIHRlc3RzLiIgaWQ9IjY0Mzg0MjA2NCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkZpbGVSZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjcmVhdGVCYXJlUmVwb3NpdG9yeSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjQzODQyMDY0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZVJlcG9zaXRvcnkoYm9vbGVhbiwgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkRvbid0IGNhcmUgYWJvdXQgbm9uLUFQSSBpbiB0ZXN0cy4iIGlkPSI2NDM4NDIwNjQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJGaWxlUmVwb3NpdG9yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlV29ya1JlcG9zaXRvcnkoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjI3MDYwNzUxIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImRiIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmOWUxMmQ1Li43NDlmOGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzEgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0zNiw0ICszNiw0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNC4xMS44IgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI1LjAuNCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbAppbmRleCBkMjUxYjk3Li4zMGNlMGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9KR2l0VGVzdFV0aWwuamF2YQppbmRleCBjZWY4MWEwLi5hMTAyZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvSkdpdFRlc3RVdGlsLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNDIsNyArMTQyLDcgQEAKIAkgKiBAcGFyYW0gZmlsZU5hbWUKIAkgKiBAcmV0dXJuIHRoZSB0ZXN0IHJlc291cmNlIGZpbGUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKIAkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUubGVuZ3RoKCkgPD0gMCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KQEAgLTI0MiwxMSArMjQyLDExIEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZVV0aWxzLm1rZGlycyhmLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSk7CiAJCXRyeSAoV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQl3LndyaXRlKGJvZHkpOwogCQl9CiAJfQpAQCAtMjYxLDkgKzI2MSw5IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGJvZHkgPSBJTy5yZWFkRnVsbHkoZmlsZSk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJvZHksIDAsIGJvZHkubGVuZ3RoLCBVVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKGJvZHksIDAsIGJvZHkubGVuZ3RoLCBDSEFSU0VUKTsKIAl9CiAKIAkvKioKQEAgLTI3NCw3ICsyNzQsNyBAQAogCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgbmFtZSkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CiAJCXJldHVybiByZWFkKGZpbGUpOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmaWxlCiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGZpbGUgZXhpc3RzCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBuYW1lKSB7CiAJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIG5hbWUpOwogCQlyZXR1cm4gZmlsZS5leGlzdHMoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCA1NjhiYzNiLi42Y2RkMGViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMjI1LDcgKzIyNSw3IEBACiAJICogQHBhcmFtIGRpcgogCSAqICAgICAgICAgICAgdGhlIHJlY3Vyc2l2ZWx5IGRpcmVjdG9yeSB0byBkZWxldGUsIGlmIHByZXNlbnQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRGVsZXRlKGZpbmFsIEZpbGUgZGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRGVsZXRlKEZpbGUgZGlyKSB7CiAJCXJlY3Vyc2l2ZURlbGV0ZShkaXIsIGZhbHNlLCB0cnVlKTsKIAl9CiAKQEAgLTM1Miw3ICszNTIsNyBAQAogCQkJaWYgKDAgIT0gKGluY2x1ZGVkT3B0aW9ucyAmIENPTlRFTlQpKSB7CiAJCQkJc2IuYXBwZW5kKCIsIGNvbnRlbnQ6IgogCQkJCQkJKyBuZXcgU3RyaW5nKHJlcG8ub3BlbihlbnRyeS5nZXRPYmplY3RJZCgpLAotCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBVVEZfOCkpOworCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCQlpZiAoMCAhPSAoaW5jbHVkZWRPcHRpb25zICYgQVNTVU1FX1VOQ0hBTkdFRCkpCiAJCQkJc2IuYXBwZW5kKCIsIGFzc3VtZS11bmNoYW5nZWQ6IgpAQCAtNTQwLDcgKzU0MCw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlKGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBGaWxlIHdyaXRlKFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwgInR4dCIsIHRtcCk7CiAJCXRyeSB7CiAJCQl3cml0ZShmLCBib2R5KTsKQEAgLTU3MSw3ICs1NzEsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHdyaXRlKEZpbGUgZiwgU3RyaW5nIGJvZHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShmLCBib2R5KTsKIAl9CiAKQEAgLTU4MywxMSArNTgzLDExIEBACiAJICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZmlsZQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwucmVhZChmKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b0VudkFycmF5KGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52KSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdG9FbnZBcnJheShNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikgewogCQlmaW5hbCBTdHJpbmdbXSBlbnZwID0gbmV3IFN0cmluZ1tlbnYuc2l6ZSgpXTsKIAkJaW50IGkgPSAwOwogCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGVudi5lbnRyeVNldCgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQppbmRleCAwNWQxNTIyLi5kM2Q3ZDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L01vY2tTeXN0ZW1SZWFkZXIuamF2YQpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCXNldEN1cnJlbnRQbGF0Zm9ybSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbml0KGZpbmFsIFN0cmluZyBuKSB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG4pIHsKIAkJc2V0UHJvcGVydHkobiwgbik7CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCB0aWNrKGZpbmFsIGludCBzZWNEZWx0YSkgeworCXB1YmxpYyB2b2lkIHRpY2soaW50IHNlY0RlbHRhKSB7CiAJCW5vdyArPSBzZWNEZWx0YSAqIDEwMDBMOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggYWZjMmM0NC4uZTk4M2U1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTkyLDIyICs5MiwxNSBAQAogCSAqIEBwYXJhbSBkc3QKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY29weUZpbGUoRmlsZSBzcmMsIEZpbGUgZHN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJdHJ5IHsKLQkJCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotCQkJCWludCByOwotCQkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID4gMCkgewotCQkJCQlmb3Mud3JpdGUoYnVmLCAwLCByKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOworCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7CisJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpKSB7CisJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisJCQlpbnQgcjsKKwkJCXdoaWxlICgociA9IGZpcy5yZWFkKGJ1ZikpID4gMCkgeworCQkJCWZvcy53cml0ZShidWYsIDAsIHIpOwogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTExOSw3ICsxMTIsNyBAQAogCSAqIEByZXR1cm4gdGhlIHRyYXNoIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwud3JpdGVUcmFzaEZpbGUoZGIsIG5hbWUsIGRhdGEpOwogCX0KQEAgLTEzNSw3ICsxMjgsNyBAQAogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBQYXRoIHdyaXRlTGluayhmaW5hbCBTdHJpbmcgbGluaywgZmluYWwgU3RyaW5nIHRhcmdldCkKKwlwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQpAQCAtMTYyLDcgKzE1NSw3IEBACiAJICogQHJldHVybiB0aGUgZmlsZSdzIGNvbnRlbnQKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgcmVhZChTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC5yZWFkKGRiLCBuYW1lKTsKIAl9CiAKQEAgLTE3Myw3ICsxNjYsNyBAQAogCSAqICAgICAgICAgICAgZmlsZSBuYW1lCiAJICogQHJldHVybiBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuY2hlY2soZGIsIG5hbWUpOwogCX0KIApAQCAtMTg0LDcgKzE3Nyw3IEBACiAJICogICAgICAgICAgICBmaWxlIG5hbWUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCkBAIC0xOTYsMTAgKzE4OSwxMCBAQAogCSAqICAgICAgICAgICAgZXhwZWN0ZWQgY29udGVudAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tGaWxlKEZpbGUgZiwgZmluYWwgU3RyaW5nIGNoZWNrRGF0YSkKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tGaWxlKEZpbGUgZiwgU3RyaW5nIGNoZWNrRGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmKSwKLQkJCQlVVEZfOCkpIHsKKwkJCQlDSEFSU0VUKSkgewogCQkJaWYgKGNoZWNrRGF0YS5sZW5ndGgoKSA+IDApIHsKIAkJCQljaGFyW10gZGF0YSA9IG5ldyBjaGFyW2NoZWNrRGF0YS5sZW5ndGgoKV07CiAJCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCByLnJlYWQoZGF0YSkpOwpAQCAtMjkzLDEwICsyODYsMTEgQEAKIAkJCQlkY2Uuc2V0RmlsZU1vZGUodHJlZUl0ci5nZXRFbnRyeUZpbGVNb2RlKCkpOwogCQkJCWRjZS5zZXRMYXN0TW9kaWZpZWQodHJlZUl0ci5nZXRFbnRyeUxhc3RNb2RpZmllZCgpKTsKIAkJCQlkY2Uuc2V0TGVuZ3RoKChpbnQpIGxlbik7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCXRyZWVJdHIuZ2V0RW50cnlGaWxlKCkpOwotCQkJCWRjZS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBsZW4sIGluKSk7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCisJCQkJCQl0cmVlSXRyLmdldEVudHJ5RmlsZSgpKSkgeworCQkJCQlkY2Uuc2V0T2JqZWN0SWQoCisJCQkJCQkJaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgbGVuLCBpbikpOworCQkJCX0KIAkJCQlidWlsZGVyLmFkZChkY2UpOwogCQkJCXRyZWVJdHIubmV4dCgxKTsKIAkJCX0KQEAgLTM4MCw4ICszNzQsOSBAQAogCQkJd2hpbGUgKGFjdFRpbWUgPD0gc3RhcnRUaW1lKSB7CiAJCQkJVGhyZWFkLnNsZWVwKHNsZWVwVGltZSk7CiAJCQkJc2xlZXBUaW1lICo9IDI7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApOwotCQkJCWZvcy5jbG9zZSgpOworCQkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApKSB7CisJCQkJCS8vIERvIG5vdGhpbmcKKwkJCQl9CiAJCQkJYWN0VGltZSA9IGZzLmxhc3RNb2RpZmllZCh0bXApOwogCQkJfQogCQkJcmV0dXJuIGFjdFRpbWU7CkBAIC01MDUsNyArNTAwLDcgQEAKIAkgKiBAcGFyYW0gbW9kZQogCSAqIEByZXR1cm4gdGhlIERpckNhY2hlRW50cnkKIAkgKi8KLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBjcmVhdGVFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgRmlsZU1vZGUgbW9kZSkgeworCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGNyZWF0ZUVudHJ5KFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlKSB7CiAJCXJldHVybiBjcmVhdGVFbnRyeShwYXRoLCBtb2RlLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzAsIHBhdGgpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhCmluZGV4IDQxNjM0ZTcuLmQyM2MwZDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogCSAqIEBwYXJhbSBzZWNEZWx0YQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIHNlY29uZHMgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRpbWUuCiAJICovCi0JcHVibGljIHZvaWQgdGljayhmaW5hbCBpbnQgc2VjRGVsdGEpIHsKKwlwdWJsaWMgdm9pZCB0aWNrKGludCBzZWNEZWx0YSkgewogCQltb2NrU3lzdGVtUmVhZGVyLnRpY2soc2VjRGVsdGEpOwogCX0KIApAQCAtMjY3LDggKzI2Nyw4IEBACiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2IuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJsb2IoY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCXB1YmxpYyBSZXZCbG9iIGJsb2IoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYmxvYihjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAkvKioKQEAgLTI3OSw3ICsyNzksNyBAQAogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBibG9iLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkJsb2IgYmxvYihmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkJsb2IgYmxvYihieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdElkIGlkOwogCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IGluc2VydGVyKSB7CiAJCQlpZCA9IGlucy5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBjb250ZW50KTsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCSAqIEByZXR1cm4gdGhlIGVudHJ5LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBibG9iKQorCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGZpbGUoU3RyaW5nIHBhdGgsIFJldkJsb2IgYmxvYikKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGUgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoKTsKIAkJZS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOwpAQCAtMzE1LDEwICszMTUsMTAgQEAKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgdHJlZSBzcGVjaWZpZWQgYnkgdGhlIGVudHJ5IGxpc3QuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2VHJlZSB0cmVlKGZpbmFsIERpckNhY2hlRW50cnkuLi4gZW50cmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldlRyZWUgdHJlZShEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlmaW5hbCBEaXJDYWNoZUJ1aWxkZXIgYiA9IGRjLmJ1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBEaXJDYWNoZUVudHJ5IGUgOiBlbnRyaWVzKQorCQlmb3IgKERpckNhY2hlRW50cnkgZSA6IGVudHJpZXMpCiAJCQliLmFkZChlKTsKIAkJYi5maW5pc2goKTsKIAkJT2JqZWN0SWQgcm9vdDsKQEAgLTMzOSw3ICszMzksNyBAQAogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBvYmplY3QgZW50cnkgYXQgdGhpcyBwYXRoLCBuZXZlciBudWxsLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldk9iamVjdCBnZXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlwdWJsaWMgUmV2T2JqZWN0IGdldChSZXZUcmVlIHRyZWUsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocG9vbC5nZXRPYmplY3RSZWFkZXIoKSkpIHsKIAkJCXR3LnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMKQEAgLTM3MCw3ICszNzAsNyBAQAogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkNvbW1pdCBjb21taXQoUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KDEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQogCkBAIC0zODYsNyArMzg2LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBuZXcgY29tbWl0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChSZXZUcmVlIHRyZWUsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjb21taXQoMSwgdHJlZSwgcGFyZW50cyk7CiAJfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAJICogQHJldHVybiB0aGUgbmV3IGNvbW1pdC4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZDb21taXQgY29tbWl0KGZpbmFsIGludCBzZWNEZWx0YSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHVibGljIFJldkNvbW1pdCBjb21taXQoaW50IHNlY0RlbHRhLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KHNlY0RlbHRhLCB0cmVlKCksIHBhcmVudHMpOwogCX0KQEAgLTQ3MCw3ICs0NzAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGFubm90YXRlZCB0YWcgb2JqZWN0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldlRhZyB0YWcoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldk9iamVjdCBkc3QpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZUYWcgdGFnKFN0cmluZyBuYW1lLCBSZXZPYmplY3QgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgVGFnQnVpbGRlciB0ID0gbmV3IFRhZ0J1aWxkZXIoKTsKIAkJdC5zZXRPYmplY3RJZChkc3QpOwogCQl0LnNldFRhZyhuYW1lKTsKQEAgLTc1OSw3ICs3NTksNyBAQAogCQkJZmluYWwgRmlsZVJlcG9zaXRvcnkgZnIgPSAoRmlsZVJlcG9zaXRvcnkpIGRiOwogCQkJUmVmV3JpdGVyIHJ3ID0gbmV3IFJlZldyaXRlcihmci5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJ5dGVbXSBiaW4pCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKFN0cmluZyBuYW1lLCBieXRlW10gYmluKQogCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZnIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCQlUZXN0UmVwb3NpdG9yeS50aGlzLndyaXRlRmlsZShwYXRoLCBiaW4pOwpAQCAtNzkxLDcgKzc5MSw3IEBACiAJICogQHJldHVybiB7QGNvZGUgb2JqZWN0fQogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShmaW5hbCBUIG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShUIG9iamVjdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXBvb2wucGFyc2VCb2R5KG9iamVjdCk7CiAJCXJldHVybiBvYmplY3Q7CiAJfQpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJCXJldHVybiBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgbmFtZS5uYW1lKCkgKyB0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVGaWxlKGZpbmFsIEZpbGUgcCwgZmluYWwgYnl0ZVtdIGJpbikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRmlsZSBwLCBieXRlW10gYmluKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlPYmplY3RXcml0aW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgTG9ja0ZpbGUgbGNrID0gbmV3IExvY2tGaWxlKHApOwogCQlpZiAoIWxjay5sb2NrKCkpCkBAIC05NjIsNyArOTYyLDcgQEAKIAlwdWJsaWMgY2xhc3MgQnJhbmNoQnVpbGRlciB7CiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlZjsKIAotCQlCcmFuY2hCdWlsZGVyKGZpbmFsIFN0cmluZyByZWYpIHsKKwkJQnJhbmNoQnVpbGRlcihTdHJpbmcgcmVmKSB7CiAJCQl0aGlzLnJlZiA9IHJlZjsKIAkJfQogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQAogCQkJcmV0dXJuIGFkZChwYXRoLCBibG9iKGNvbnRlbnQpKTsKIAkJfQogCi0JCXB1YmxpYyBDb21taXRCdWlsZGVyIGFkZChTdHJpbmcgcGF0aCwgZmluYWwgUmV2QmxvYiBpZCkKKwkJcHVibGljIENvbW1pdEJ1aWxkZXIgYWRkKFN0cmluZyBwYXRoLCBSZXZCbG9iIGlkKQogCQkJCXRocm93cyBFeGNlcHRpb24gewogCQkJcmV0dXJuIGVkaXQobmV3IFBhdGhFZGl0KHBhdGgpIHsKIAkJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKaW5kZXggNTRjODFmMi4uZjdhZjM2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0Um5nLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkgKiBAcGFyYW0gc2VlZAogCSAqICAgICAgICAgICAgc2VlZCB0byBib290c3RyYXAsIHVzdWFsbHkgdGhpcyBpcyB0aGUgdGVzdCBtZXRob2QgbmFtZS4KIAkgKi8KLQlwdWJsaWMgVGVzdFJuZyhmaW5hbCBTdHJpbmcgc2VlZCkgeworCXB1YmxpYyBUZXN0Um5nKFN0cmluZyBzZWVkKSB7CiAJCW5leHQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoKCk7IGkrKykKIAkJCW5leHQgPSBuZXh0ICogMTEgKyBzZWVkLmNoYXJBdChpKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gcHJvZHVjZS4KIAkgKiBAcmV0dXJuIGFycmF5IG9mIHtAY29kZSBjbnR9IHJhbmRvbWx5IGdlbmVyYXRlZCBieXRlcy4KIAkgKi8KLQlwdWJsaWMgYnl0ZVtdIG5leHRCeXRlcyhmaW5hbCBpbnQgY250KSB7CisJcHVibGljIGJ5dGVbXSBuZXh0Qnl0ZXMoaW50IGNudCkgewogCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2NudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspCiAJCQlyW2ldID0gKGJ5dGUpIG5leHRJbnQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNDU0YmQxZC4uYzgwNWY3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yOCwyNCArMjgsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IGMwOGJmNmIuLmRlZTMxOTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvTGZzU2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKaW5kZXggOTBmZTExNi4uNTBhMDZmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC0xMzEsMTIgKzEzMSw2IEBACiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIExhcmdlRmlsZVJlcG9zaXRvcnkgZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeSgKLQkJCQkJTGZzUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGF0aCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoCiAJCQkJCUxmc1JlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHBhdGgsIFN0cmluZyBhdXRoKQogCQkJCQl0aHJvd3MgTGZzRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKQEAgLTIxNywxMSArMjExLDExIEBACiAJCQkJaWYgKGJ1Zi5oYXNBcnJheSgpKSB7CiAJCQkJCWVycm9yID0gbmV3IFN0cmluZyhidWYuYXJyYXkoKSwKIAkJCQkJCQlidWYuYXJyYXlPZmZzZXQoKSArIGJ1Zi5wb3NpdGlvbigpLCBidWYucmVtYWluaW5nKCksCi0JCQkJCQkJVVRGXzgpOworCQkJCQkJCUNIQVJTRVQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCWZpbmFsIGJ5dGVbXSBiID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKIAkJCQkJYnVmLmR1cGxpY2F0ZSgpLmdldChiKTsKLQkJCQkJZXJyb3IgPSBuZXcgU3RyaW5nKGIsIFVURl84KTsKKwkJCQkJZXJyb3IgPSBuZXcgU3RyaW5nKGIsIENIQVJTRVQpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQllcnJvciA9IHN0YXR1c0xpbmUuZ2V0UmVhc29uUGhyYXNlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCmluZGV4IDhhOGY0OWMuLjA5ZjhkMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvVXBsb2FkVGVzdC5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAKIAogCQlFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woY291bnQpOwogCQl0cnkgewotCQkJZm9yIChmaW5hbCBQYXRoIHAgOiBwYXRocykgeworCQkJZm9yIChQYXRoIHAgOiBwYXRocykgewogCQkJCWUuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2ODU1NWI4Li4xNGQzYWI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjgiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKQEAgLTI1LDE0ICsyNSwxNSBAQAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHA7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmNsaWVudDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCBlNzNhZDJmLi43YzgxYzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9MZnNQcm90b2NvbFNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCmluZGV4IDY5NjhkNzUuLmQyMmQ0NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXMuU0NfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKQEAgLTExMiw0OCArMTEyLDYgQEAKIAkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgbGFyZ2UgZmlsZSByZXBvc2l0b3J5IHN0b3JpbmcgbGFyZ2UgZmlsZXMuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCB0aHJvdyBtb3JlIHNwZWNpZmljIGV4Y2VwdGlvbnMgdG8KLQkgKiAgICAgICAgICAgICBzaWduYWwgd2hpY2ggdHlwZSBvZiBlcnJvciBvY2N1cnJlZDoKLQkgKiAgICAgICAgICAgICA8ZGw+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzVmFsaWRhdGlvbkVycm9yfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlCi0JICogICAgICAgICAgICAgb2JqZWN0cyBpbiB0aGUgcmVxdWVzdDwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmVwb3NpdG9yeU5vdEZvdW5kfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSB1c2VyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNSZXBvc2l0b3J5UmVhZE9ubHl9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgcmVhZCwgYnV0IG5vdCB3cml0ZSBhY2Nlc3MuIE9ubHkKLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgcmVxdWVzdCBpcyAidXBsb2FkIjwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmF0ZUxpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgaGl0IGEgcmF0ZSBsaW1pdCB3aXRoIHRoZSBzZXJ2ZXI8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0JhbmR3aWR0aExpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgYmFuZHdpZHRoIGxpbWl0IGZvciB0aGUgdXNlciBvciByZXBvc2l0b3J5IGhhcwotCSAqICAgICAgICAgICAgIGJlZW4gZXhjZWVkZWQ8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0luc3VmZmljaWVudFN0b3JhZ2V9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBvbiB0aGUgc2VydmVyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNVbmF2YWlsYWJsZX08L2R0PgotCSAqICAgICAgICAgICAgIDxkZD53aGVuIExGUyBpcyBub3QgYXZhaWxhYmxlPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNFeGNlcHRpb259PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiBhbiB1bmV4cGVjdGVkIGludGVybmFsIHNlcnZlciBlcnJvciBvY2N1cnJlZDwvZGQ+Ci0JICogICAgICAgICAgICAgPC9kbD4KLQkgKiBAc2luY2UgNC41Ci0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rICNnZXRMYXJnZUZpbGVSZXBvc2l0b3J5KExmc1JlcXVlc3QsIFN0cmluZywgU3RyaW5nKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoTGZzUmVxdWVzdCByZXF1ZXN0LAotCQkJU3RyaW5nIHBhdGgpIHRocm93cyBMZnNFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeShyZXF1ZXN0LCBwYXRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhcmdlIGZpbGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKIAkgKiBAcGFyYW0gYXV0aAogCSAqICAgICAgICAgICAgdGhlIEF1dGhvcml6YXRpb24gSFRUUCBoZWFkZXIKIAkgKiBAcmV0dXJuIHRoZSBsYXJnZSBmaWxlIHJlcG9zaXRvcnkgc3RvcmluZyBsYXJnZSBmaWxlcy4KQEAgLTI0NCwxMCArMjAyLDEwIEBACiAJcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQogCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJV3JpdGVyIHcgPSBuZXcgQnVmZmVyZWRXcml0ZXIoCi0JCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIENIQVJTRVQpKTsKIAogCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVxLmdldElucHV0U3RyZWFtKCksIFVURl84KSk7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlcS5nZXRJbnB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAJCUxmc1JlcXVlc3QgcmVxdWVzdCA9IExmc0dzb24uZnJvbUpzb24ociwgTGZzUmVxdWVzdC5jbGFzcyk7CiAJCVN0cmluZyBwYXRoID0gcmVxLmdldFBhdGhJbmZvKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhCmluZGV4IDY4OGFlZjIuLjU1ZDkwOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvRmlsZUxmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGNoYXIgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoY2hhcltdIGRzdCwgaW50IHAsIGludCBiKSB7CiAJCWludCBvID0gcCArIDE7CiAJCXdoaWxlIChvID49IHAgJiYgYiAhPSAwKSB7CiAJCQlkc3Rbby0tXSA9IGhleGNoYXJbYiAmIDB4Zl07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvczMvU2lnbmVyVjQuamF2YQppbmRleCBiMjFjOTRlLi4zNzRhNTYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9BVVRIT1JJWkFUSU9OOwogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtMzU5LDEzICszNTksMTMgQEAKIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBoYXNoKFN0cmluZyBzKSB7CiAJCU1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwotCQltZC51cGRhdGUocy5nZXRCeXRlcyhVVEZfOCkpOworCQltZC51cGRhdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBtZC5kaWdlc3QoKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBieXRlW10gc2lnbihTdHJpbmcgc3RyaW5nRGF0YSwgYnl0ZVtdIGtleSkgewogCQl0cnkgewotCQkJYnl0ZVtdIGRhdGEgPSBzdHJpbmdEYXRhLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBkYXRhID0gc3RyaW5nRGF0YS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJCU1hYyBtYWMgPSBNYWMuZ2V0SW5zdGFuY2UoSE1BQ1NIQTI1Nik7CiAJCQltYWMuaW5pdChuZXcgU2VjcmV0S2V5U3BlYyhrZXksIEhNQUNTSEEyNTYpKTsKIAkJCXJldHVybiBtYWMuZG9GaW5hbChkYXRhKTsKQEAgLTM5NSw3ICszOTUsNyBAQAogCXByaXZhdGUgc3RhdGljIFN0cmluZyB1cmxFbmNvZGUoU3RyaW5nIHVybCwgYm9vbGVhbiBrZWVwUGF0aFNsYXNoKSB7CiAJCVN0cmluZyBlbmNvZGVkOwogCQl0cnkgewotCQkJZW5jb2RlZCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCwgVVRGXzgubmFtZSgpKTsKKwkJCWVuY29kZWQgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwsIENIQVJTRVQubmFtZSgpKTsKIAkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihMZnNTZXJ2ZXJUZXh0LmdldCgpLnVuc3VwcG9ydGVkVXRmOCwgZSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGQ2NGUyZTIuLmQ4Mzc2Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywyMyArMywyMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7dmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249IjQuMTEuOCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QiCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbAppbmRleCAwYjczMDBlLi5hNTVjZWNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YQppbmRleCBjM2MzODU5Li5lM2M2ZWY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3Rlc3QvTG9uZ09iamVjdElkVGVzdFV0aWxzLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC02Niw3ICs2Niw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBMb25nT2JqZWN0SWQgaGFzaChTdHJpbmcgcykgewogCQlNZXNzYWdlRGlnZXN0IG1kID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKLQkJbWQudXBkYXRlKHMuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbWQudXBkYXRlKHMuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gTG9uZ09iamVjdElkLmZyb21SYXcobWQuZGlnZXN0KCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xGU1BvaW50ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YQppbmRleCAxNDZhMjVlLi5hMTI4M2RkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC02Niw3ICs2Niw3IEBACiAJCQlhc3NlcnRFcXVhbHMoCiAJCQkJCSJ2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjFcbm9pZCBzaGEyNTY6IgogCQkJCQkJCSsgcyArICJcbnNpemUgNFxuIiwKLQkJCQkJYmFvcy50b1N0cmluZyhVVEZfOC5uYW1lKCkpKTsKKwkJCQkJYmFvcy50b1N0cmluZyhDSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNDRhYzg1Ni4uM2UxZTIyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzMgKzMsMzQgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mcyxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSI0LjExLjgiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjUuMC40IgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlLmdzb247dmVyc2lvbj0iWzIuOC4yLDMuMC4wKSIsCiAgY29tLmdvb2dsZS5nc29uLnN0cmVhbTt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQ7dmVyc2lvbj0iWzQuMi42LDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubjt2ZXJzaW9uPSJbNC4yLjYsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCmluZGV4IGJlYzA5ZWUuLmMyMzE2OTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmxmczwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YQppbmRleCA0MGQ4MzQyLi40YzQ2YmJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhCkBAIC02NSwxOSArNjUsNiBAQAogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCiAJICoKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIExGUyBtZWRpYSBkaXJlY3RvcnkuIFdpbGwgYmUKLQkgKiAgICAgICAgICAgIHtAY29kZSAiPHJlcG8+Ly5naXQvbGZzIn0KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNMZnMoUmVwb3NpdG9yeSl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgTGZzKFBhdGggcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCi0JICoKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIHJlcG8KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQb2ludGVyLmphdmEKaW5kZXggMGUzODMwYy4uNGY5NTk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUG9pbnRlci5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEzNCw3ICsxMzQsNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIGVuY29kZShPdXRwdXRTdHJlYW0gb3V0KSB7CiAJCXRyeSAoUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3V0LCBmYWxzZSwKLQkJCQlVVEZfOC5uYW1lKCkpKSB7CisJCQkJQ0hBUlNFVC5uYW1lKCkpKSB7CiAJCQlwcy5wcmludCgidmVyc2lvbiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJcHMucHJpbnQoVkVSU0lPTiArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQlwcy5wcmludCgib2lkICIgKyBIQVNIX0ZVTkNUSU9OX05BTUUgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQkJcHMucHJpbnQoc2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4sIHdlIGFyZSB1c2luZyBhIHN0YW5kYXJkIGNoYXJzZXQKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oVVRGXzgubmFtZSgpKTsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oQ0hBUlNFVC5uYW1lKCkpOwogCQl9CiAJfQogCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJbG9uZyBzeiA9IC0xOwogCiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBDSEFSU0VUKSkpIHsKIAkJCWZvciAoU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOyBzICE9IG51bGw7IHMgPSBici5yZWFkTGluZSgpKSB7CiAJCQkJaWYgKHMuc3RhcnRzV2l0aCgiIyIpIHx8IHMubGVuZ3RoKCkgPT0gMCkgeyAvLyROT04tTkxTLTEkCiAJCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQppbmRleCA2MTE1ZTM5Li5kZTQ0NDlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sLk9QRVJBVElPTl9VUExPQUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsLkxmc0Nvbm5lY3Rpb25GYWN0b3J5LnRvUmVxdWVzdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbi5IVFRQX09LOwpAQCAtMTc0LDggKzE3NCw4IEBACiAKIAlwcml2YXRlIHZvaWQgZXhjbHVkZVJlbW90ZVJlZnMoT2JqZWN0V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZEYXRhYmFzZSByZWZEYXRhYmFzZSA9IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpOwotCQlNYXA8U3RyaW5nLCBSZWY+IHJlbW90ZVJlZnMgPSByZWZEYXRhYmFzZS5nZXRSZWZzKHJlbW90ZSgpKTsKLQkJZm9yIChSZWYgciA6IHJlbW90ZVJlZnMudmFsdWVzKCkpIHsKKwkJTGlzdDxSZWY+IHJlbW90ZVJlZnMgPSByZWZEYXRhYmFzZS5nZXRSZWZzQnlQcmVmaXgocmVtb3RlKCkpOworCQlmb3IgKFJlZiByIDogcmVtb3RlUmVmcykgewogCQkJT2JqZWN0SWQgb2lkID0gci5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJaWYgKG9pZCA9PSBudWxsKSB7CiAJCQkJb2lkID0gci5nZXRPYmplY3RJZCgpOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCX0KIAkJR3NvbiBnc29uID0gUHJvdG9jb2wuZ3NvbigpOwogCQlhcGkuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoCi0JCQkJZ3Nvbi50b0pzb24odG9SZXF1ZXN0KE9QRVJBVElPTl9VUExPQUQsIHJlcykpLmdldEJ5dGVzKFVURl84KSk7CisJCQkJZ3Nvbi50b0pzb24odG9SZXF1ZXN0KE9QRVJBVElPTl9VUExPQUQsIHJlcykpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJaW50IHJlc3BvbnNlQ29kZSA9IGFwaS5nZXRSZXNwb25zZUNvZGUoKTsKIAkJaWYgKHJlc3BvbnNlQ29kZSAhPSBIVFRQX09LKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKaW5kZXggZTJhYjMwOS4uNmJmZjEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQpAQCAtNDIsMTEgKzQyLDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC0xNjksNyArMTcwLDcgQEAKIAkJCQkud3JpdGUoZ3NvbgogCQkJCQkJLnRvSnNvbihMZnNDb25uZWN0aW9uRmFjdG9yeQogCQkJCQkJCQkudG9SZXF1ZXN0KFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCwgcmVzKSkKLQkJCQkJCS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlpbnQgcmVzcG9uc2VDb2RlID0gbGZzU2VydmVyQ29ubi5nZXRSZXNwb25zZUNvZGUoKTsKIAkJaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwQ29ubmVjdGlvbi5IVFRQX09LKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDUzMjBhZjAuLmY5MGEwMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC02Myw0ICs2MywxNyBAQAogCQlzdXBlcihtc2cpOwogCX0KIAorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAgdGhlIGVycm9yIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7CisJCXN1cGVyKG1zZywgZSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IDVkODI2OGIuLjk1NWVjYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC00NywxMCArNDcsOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FDQ0VQVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CkBAIC01OCw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5MZnNQb2ludGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOwpAQCAtNjYsMjAgKzY2LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSHR0cFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaFNlc3Npb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk1lc3NhZ2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlN0cmVhbUNvcHlUaHJlYWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlNzaFN1cHBvcnQ7CiAKIC8qKgogICogUHJvdmlkZXMgbWVhbnMgdG8gZ2V0IGEgdmFsaWQgTEZTIGNvbm5lY3Rpb24gZm9yIGEgZ2l2ZW4gcmVwb3NpdG9yeS4KICAqLwogcHVibGljIGNsYXNzIExmc0Nvbm5lY3Rpb25GYWN0b3J5IHsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTU0hfQVVUSF9USU1FT1VUX1NFQ09ORFMgPSAzMDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0hUVFBTID0gImh0dHBzIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfU1NIID0gInNzaCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBBdXRoQ2FjaGU+IHNzaEF1dGhDYWNoZSA9IG5ldyBUcmVlTWFwPD4oKTsKQEAgLTEzMyw2ICsxMzAsNyBAQAogCQlTdHJpbmcgbGZzVXJsID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAogCQkJCW51bGwsCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKTsKKwkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CiAJCQlTdHJpbmcgcmVtb3RlVXJsID0gbnVsbDsKIAkJCWZvciAoU3RyaW5nIHJlbW90ZSA6IGRiLmdldFJlbW90ZU5hbWVzKCkpIHsKQEAgLTE1MSwzOCArMTQ5LDQ0IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAobGZzVXJsID09IG51bGwgJiYgcmVtb3RlVXJsICE9IG51bGwpIHsKLQkJCQlsZnNVcmwgPSBkaXNjb3Zlckxmc1VybChkYiwgcHVycG9zZSwgYWRkaXRpb25hbEhlYWRlcnMsCi0JCQkJCQlyZW1vdGVVcmwpOworCQkJCXRyeSB7CisJCQkJCWxmc1VybCA9IGRpc2NvdmVyTGZzVXJsKGRiLCBwdXJwb3NlLCBhZGRpdGlvbmFsSGVhZGVycywKKwkJCQkJCQlyZW1vdGVVcmwpOworCQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uCisJCQkJCQl8IENvbW1hbmRGYWlsZWRFeGNlcHRpb24gZSkgeworCQkJCQlleCA9IGU7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlsZnNVcmwgPSBsZnNVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAkJCX0KIAkJfQogCQlpZiAobGZzVXJsID09IG51bGwpIHsKKwkJCWlmIChleCAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCQlMZnNUZXh0LmdldCgpLmxmc05vRG93bmxvYWRVcmwsIGV4KTsKKwkJCX0KIAkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKExmc1RleHQuZ2V0KCkubGZzTm9Eb3dubG9hZFVybCk7CiAJCX0KIAkJcmV0dXJuIGxmc1VybDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlzY292ZXJMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzLCBTdHJpbmcgcmVtb3RlVXJsKSB7Ci0JCXRyeSB7Ci0JCQlVUklpc2ggdSA9IG5ldyBVUklpc2gocmVtb3RlVXJsKTsKLQkJCWlmIChTQ0hFTUVfU1NILmVxdWFscyh1LmdldFNjaGVtZSgpKSkgewotCQkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKAotCQkJCQkJZGIsIHB1cnBvc2UsIHJlbW90ZVVybCwgdSk7Ci0JCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOwotCQkJCXJldHVybiBhY3Rpb24uaHJlZjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7IC8vIGNvdWxkIG5vdCBkaXNjb3ZlcgorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycywgU3RyaW5nIHJlbW90ZVVybCkKKwkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKKwkJVVJJaXNoIHUgPSBuZXcgVVJJaXNoKHJlbW90ZVVybCk7CisJCWlmICh1LmdldFNjaGVtZSgpID09IG51bGwgfHwgU0NIRU1FX1NTSC5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKKwkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKGRiLCBwdXJwb3NlLAorCQkJCQlyZW1vdGVVcmwsIHUpOworCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOworCQkJcmV0dXJuIGFjdGlvbi5ocmVmOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gZ2V0U3NoQXV0aGVudGljYXRpb24oCiAJCQlSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwgU3RyaW5nIHJlbW90ZVVybCwgVVJJaXNoIHUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKIAkJQXV0aENhY2hlIGNhY2hlZCA9IHNzaEF1dGhDYWNoZS5nZXQocmVtb3RlVXJsKTsKIAkJUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gYWN0aW9uID0gbnVsbDsKIAkJaWYgKGNhY2hlZCAhPSBudWxsICYmIGNhY2hlZC52YWxpZFVudGlsID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKQEAgLTE5MywxMCArMTk3LDExIEBACiAJCQkvLyBkaXNjb3ZlciBhbmQgYXV0aGVudGljYXRlOyBnaXQtbGZzIGRvZXMgInNzaAogCQkJLy8gLXAgPHBvcnQ+IC0tIDxob3N0PiBnaXQtbGZzLWF1dGhlbnRpY2F0ZQogCQkJLy8gPHByb2plY3Q+IDx1cGxvYWQvZG93bmxvYWQ+IgotCQkJU3RyaW5nIGpzb24gPSBydW5Tc2hDb21tYW5kKHUuc2V0UGF0aCgiIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZGIuZ2V0RlMoKSwKKwkJCVN0cmluZyBqc29uID0gU3NoU3VwcG9ydC5ydW5Tc2hDb21tYW5kKHUuc2V0UGF0aCgiIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJbnVsbCwgZGIuZ2V0RlMoKSwKIAkJCQkJImdpdC1sZnMtYXV0aGVudGljYXRlICIgKyBleHRyYWN0UHJvamVjdE5hbWUodSkgKyAiICIgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIHB1cnBvc2UpOworCQkJCQkJCSsgcHVycG9zZSwKKwkJCQkJU1NIX0FVVEhfVElNRU9VVF9TRUNPTkRTKTsKIAogCQkJYWN0aW9uID0gUHJvdG9jb2wuZ3NvbigpLmZyb21Kc29uKGpzb24sCiAJCQkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uLmNsYXNzKTsKQEAgLTIzMCw4ICsyMzUsMTAgQEAKIAkJCQkuY3JlYXRlKGNvbnRlbnRVcmwsIEh0dHBTdXBwb3J0CiAJCQkJCQkucHJveHlGb3IoUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCksIGNvbnRlbnRVcmwpKTsKIAkJY29udGVudFNlcnZlckNvbm4uc2V0UmVxdWVzdE1ldGhvZChtZXRob2QpOwotCQlhY3Rpb24uaGVhZGVyCi0JCQkJLmZvckVhY2goKGssIHYpIC0+IGNvbnRlbnRTZXJ2ZXJDb25uLnNldFJlcXVlc3RQcm9wZXJ0eShrLCB2KSk7CisJCWlmIChhY3Rpb24uaGVhZGVyICE9IG51bGwpIHsKKwkJCWFjdGlvbi5oZWFkZXIuZm9yRWFjaCgKKwkJCQkJKGssIHYpIC0+IGNvbnRlbnRTZXJ2ZXJDb25uLnNldFJlcXVlc3RQcm9wZXJ0eShrLCB2KSk7CisJCX0KIAkJaWYgKGNvbnRlbnRVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoU0NIRU1FX0hUVFBTKQogCQkJCSYmICFyZXBvLmdldENvbmZpZygpLmdldEJvb2xlYW4oSHR0cENvbmZpZy5IVFRQLAogCQkJCQkJSHR0cENvbmZpZy5TU0xfVkVSSUZZX0tFWSwgdHJ1ZSkpIHsKQEAgLTI0NSw3ICsyNTIsMTMgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKFVSSWlzaCB1KSB7Ci0JCVN0cmluZyBwYXRoID0gdS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpOworCQlTdHJpbmcgcGF0aCA9IHUuZ2V0UGF0aCgpOworCisJCS8vIGJlZ2lucyB3aXRoIGEgc2xhc2ggaWYgdGhlIHVybCBjb250YWlucyBhIHBvcnQgKGdlcnJpdCB2cy4gZ2l0aHViKS4KKwkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKwkJfQorCiAJCWlmIChwYXRoLmVuZHNXaXRoKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ET1RfR0lUKSkgewogCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKIAkJfSBlbHNlIHsKQEAgLTI1Myw0MiArMjY2LDYgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBydW5Tc2hDb21tYW5kKFVSSWlzaCBzc2hVcmksIEZTIGZzLCBTdHJpbmcgY29tbWFuZCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlbW90ZVNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IG51bGw7Ci0JCVN0cmVhbUNvcHlUaHJlYWQgZXJyb3JUaHJlYWQgPSBudWxsOwotCQl0cnkgKE1lc3NhZ2VXcml0ZXIgc3RkZXJyID0gbmV3IE1lc3NhZ2VXcml0ZXIoKSkgewotCQkJc2Vzc2lvbiA9IFNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U2Vzc2lvbihzc2hVcmksIG51bGwsCi0JCQkJCWZzLCA1XzAwMCk7Ci0JCQlwcm9jZXNzID0gc2Vzc2lvbi5leGVjKGNvbW1hbmQsIDApOwotCQkJZXJyb3JUaHJlYWQgPSBuZXcgU3RyZWFtQ29weVRocmVhZChwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksCi0JCQkJCXN0ZGVyci5nZXRSYXdTdHJlYW0oKSk7Ci0JCQllcnJvclRocmVhZC5zdGFydCgpOwotCQkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCksCi0JCQkJCQkJb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQpKSkgewotCQkJCXJldHVybiByZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKLQkJCX0KLQkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU3RvcCB3YWl0aW5nIGFuZCByZXR1cm4gYW55d2F5LgotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWVycm9yVGhyZWFkID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlU2Vzc2lvbihzZXNzaW9uKTsKLQkJCX0KLQkJfQotCX0KLQogCS8qKgogCSAqIEBwYXJhbSBvcGVyYXRpb24KIAkgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSwgZS5nLiBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQKQEAgLTMxMyw3ICsyOTAsNyBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEF1dGhDYWNoZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQVVUSF9DQUNIRV9FQUdFUl9USU1FT1VUID0gMTAwOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVCA9IDUwMDsKIAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IElTT19GT1JNQVQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgKIAkJCQkieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1giKTsgLy8kTk9OLU5MUy0xJApAQCAtMzMwLDggKzMwNyw5IEBACiAJCQl0aGlzLmNhY2hlZEFjdGlvbiA9IGFjdGlvbjsKIAkJCXRyeSB7CiAJCQkJaWYgKGFjdGlvbi5leHBpcmVzSW4gIT0gbnVsbCAmJiAhYWN0aW9uLmV4cGlyZXNJbi5pc0VtcHR5KCkpIHsKLQkJCQkJdGhpcy52YWxpZFVudGlsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKLQkJCQkJCQkrIExvbmcucGFyc2VMb25nKGFjdGlvbi5leHBpcmVzSW4pOworCQkJCQl0aGlzLnZhbGlkVW50aWwgPSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKwkJCQkJCQkrIExvbmcucGFyc2VMb25nKGFjdGlvbi5leHBpcmVzSW4pKQorCQkJCQkJCS0gQVVUSF9DQUNIRV9FQUdFUl9USU1FT1VUOwogCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmV4cGlyZXNBdCAhPSBudWxsCiAJCQkJCQkmJiAhYWN0aW9uLmV4cGlyZXNBdC5pc0VtcHR5KCkpIHsKIAkJCQkJdGhpcy52YWxpZFVudGlsID0gSVNPX0ZPUk1BVC5wYXJzZShhY3Rpb24uZXhwaXJlc0F0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhCmluZGV4IDQ1MjlhMjUuLmJkZDFiMzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FiYnJldmlhdGVkTG9uZ09iamVjdElkLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gQWJicmV2aWF0ZWRPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChTdHJpbmcgaWQpIHsKIAkJaWYgKGlkLmxlbmd0aCgpIDwgMgogCQkJCXx8IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIIDwgaWQubGVuZ3RoKCkpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlICZsdDs9IDY0IGNoYXJhY3RlcnMuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgPiBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkuaW52YWxpZExvbmdJZCwgc3RyKSk7CkBAIC0xNzMsNyArMTczLDcgQEAKIAkJcmV0dXJuIHIgPDwgKDE2IC0gbikgKiA0OwogCX0KIAotCXN0YXRpYyBsb25nIG1hc2soZmluYWwgaW50IG5pYmJsZXMsIGZpbmFsIGxvbmcgd29yZCwgZmluYWwgbG9uZyB2KSB7CisJc3RhdGljIGxvbmcgbWFzayhpbnQgbmliYmxlcywgbG9uZyB3b3JkLCBsb25nIHYpIHsKIAkJZmluYWwgbG9uZyBiID0gKHdvcmQgLSAxKSAqIDE2OwogCQlpZiAoYiArIDE2IDw9IG5pYmJsZXMpIHsKIAkJCS8vIFdlIGhhdmUgYWxsIG9mIHRoZSBiaXRzIHJlcXVpcmVkIGZvciB0aGlzIHdvcmQuCkBAIC0yNDksNyArMjQ5LDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIEFueUxvbmdPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIG90aGVyLncxKSk7CkBAIC0yODEsNyArMjgxLDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIG1hc2soMSwgTkIuZGVjb2RlSW50NjQoYnMsIHApKSk7CkBAIC0zMTMsNyArMzEzLDcgQEAKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIGxvbmdbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUobG9uZ1tdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIG1hc2soMSwgYnNbcF0pKTsKQEAgLTM0MCw3ICszNDAsNyBAQAogCQlyZXR1cm4gKGludCkgKHcxID4+PiA1Nik7CiAJfQogCi0JcHJpdmF0ZSBsb25nIG1hc2soZmluYWwgbG9uZyB3b3JkLCBmaW5hbCBsb25nIHYpIHsKKwlwcml2YXRlIGxvbmcgbWFzayhsb25nIHdvcmQsIGxvbmcgdikgewogCQlyZXR1cm4gbWFzayhuaWJibGVzLCB3b3JkLCB2KTsKIAl9CiAKQEAgLTM1Miw3ICszNTIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJaWYgKG8gaW5zdGFuY2VvZiBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCkgewogCQkJZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYiA9IChBYmJyZXZpYXRlZExvbmdPYmplY3RJZCkgbzsKIAkJCXJldHVybiBuaWJibGVzID09IGIubmliYmxlcyAmJiB3MSA9PSBiLncxICYmIHcyID09IGIudzIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FueUxvbmdPYmplY3RJZC5qYXZhCmluZGV4IDk2ZDY5MzguLjA3ODg5MjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBACiAJICogQ29tcGFyZSB0aGlzIExvbmdPYmplY3RJZCB0byBhbm90aGVyIGFuZCBvYnRhaW4gYSBzb3J0IG9yZGVyaW5nLgogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIEFueUxvbmdPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCQlpZiAodGhpcyA9PSBvdGhlcikKIAkJCXJldHVybiAwOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzCiAJICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBOQi5kZWNvZGVJbnQ2NChicywgcCkpOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGlzIG9iamVjdCBpcwogCSAqICAgICAgICAgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIGxvbmdbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhsb25nW10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQ2NCh3MSwgYnNbcF0pOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgTG9uZ09iamVjdElkIGJlZ2lucyB3aXRoIHRoZSBhYmJyZXZpYXRpb247IGVsc2UKIAkgKiAgICAgICAgIGZhbHNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgeworCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgewogCQlyZXR1cm4gYWJici5wcmVmaXhDb21wYXJlKHRoaXMpID09IDA7CiAJfQogCkBAIC0yNzQsMTMgKzI3NCwxMyBAQAogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGlkIHRvIGNvbXBhcmUgdG8uIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGJvdGggTG9uZ09iamVjdElkcyBoYXZlIGlkZW50aWNhbCBiaXRzLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJCXJldHVybiBvdGhlciAhPSBudWxsID8gZXF1YWxzKHRoaXMsIG90aGVyKSA6IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQW55TG9uZ09iamVjdElkKQogCQkJcmV0dXJuIGVxdWFscygoQW55TG9uZ09iamVjdElkKSBvKTsKIAkJZWxzZQpAQCAtMjkzLDcgKzI5Myw3IEBACiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gY29weSB0by4gTXVzdCBiZSBpbiBiaWcgZW5kaWFuIG9yZGVyLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBCeXRlQnVmZmVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oQnl0ZUJ1ZmZlciB3KSB7CiAJCXcucHV0TG9uZyh3MSk7CiAJCXcucHV0TG9uZyh3Mik7CiAJCXcucHV0TG9uZyh3Myk7CkBAIC0zMDgsNyArMzA4LDcgQEAKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGJ5dGVbXSBiLCBpbnQgbykgewogCQlOQi5lbmNvZGVJbnQ2NChiLCBvLCB3MSk7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyA4LCB3Mik7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyAxNiwgdzMpOwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGxvbmdbXSBiLCBmaW5hbCBpbnQgbykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhsb25nW10gYiwgaW50IG8pIHsKIAkJYltvXSA9IHcxOwogCQliW28gKyAxXSA9IHcyOwogCQliW28gKyAyXSA9IHczOwpAQCAtMzM4LDE0ICszMzgsMTQgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUmF3TG9uZyh3LCB3MSk7CiAJCXdyaXRlUmF3TG9uZyh3LCB3Mik7CiAJCXdyaXRlUmF3TG9uZyh3LCB3Myk7CiAJCXdyaXRlUmF3TG9uZyh3LCB3NCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoZmluYWwgT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUmF3TG9uZyhPdXRwdXRTdHJlYW0gdywgbG9uZyB2KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdy53cml0ZSgoaW50KSAodiA+Pj4gNTYpKTsKIAkJdy53cml0ZSgoaW50KSAodiA+Pj4gNDgpKTsKQEAgLTM2NSw3ICszNjUsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdy53cml0ZSh0b0hleEJ5dGVBcnJheSgpKTsKIAl9CiAKQEAgLTQwNiw3ICs0MDYsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoZXhieXRlID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCiAJCQknNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IHAsIGxvbmcgdykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShieXRlW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhieXRlWyhpbnQpICh3ICYgMHhmKV07CkBAIC00MjQsNyArNDI0LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhDaGFyQXJyYXkoKSk7CiAJfQogCkBAIC00NDAsNyArNDQwLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcud3JpdGUodG1wLCAwLCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYXBwZW5kIG9udG8uCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFN0cmluZ0J1aWxkZXIgdykgeworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBTdHJpbmdCdWlsZGVyIHcpIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy5hcHBlbmQodG1wLCAwLCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKKwlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoY2hhcltdIGRzdCkgewogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMCwgdzEpOwogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMTYsIHcyKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDMyLCB3Myk7CkBAIC00NzYsNyArNDc2LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0Jc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgbG9uZyB3KSB7CisJc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhjaGFyWyhpbnQpICh3ICYgMHhmKV07CkBAIC01MjQsNyArNTI0LDcgQEAKIAkgKiAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgYWJicmV2aWF0ZWQgc3RyaW5nLgogCSAqIEByZXR1cm4gU0hBLTI1NiBhYmJyZXZpYXRpb24uCiAJICovCi0JcHVibGljIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGFiYnJldmlhdGUoZmluYWwgaW50IGxlbikgeworCXB1YmxpYyBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBhYmJyZXZpYXRlKGludCBsZW4pIHsKIAkJZmluYWwgbG9uZyBhID0gQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQubWFzayhsZW4sIDEsIHcxKTsKIAkJZmluYWwgbG9uZyBiID0gQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQubWFzayhsZW4sIDIsIHcyKTsKIAkJZmluYWwgbG9uZyBjID0gQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQubWFzayhsZW4sIDMsIHczKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xvbmdPYmplY3RJZC5qYXZhCmluZGV4IGVjMWUxNzkuLjgxNTk1NzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YQpAQCAtOTAsNyArOTAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBjb252ZXJ0ZWQgaW50byBhbiBMb25nT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSAhPSBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXJldHVybiBmYWxzZTsKIAkJdHJ5IHsKQEAgLTExMCw3ICsxMTAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGlkIHRvIGNvbnZlcnQuIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdGhlIGhleCBzdHJpbmcgY29udmVyc2lvbiBvZiB0aGlzIGlkJ3MgY29udGVudC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhmaW5hbCBMb25nT2JqZWN0SWQgaSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKExvbmdPYmplY3RJZCBpKSB7CiAJCXJldHVybiBpICE9IG51bGwgPyBpLm5hbWUoKSA6IFpFUk9JRF9TVFI7CiAJfQogCkBAIC0xNzMsNyArMTczLDcgQEAKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBieXRlIGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlyZXR1cm4gZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xODcsNyArMTg3LDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGxvbmcgYSA9IE5CLmRlY29kZUludDY0KGJzLCBwKTsKIAkJZmluYWwgbG9uZyBiID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyA4KTsKIAkJZmluYWwgbG9uZyBjID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyAxNik7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBsb25nIGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGxvbmdbXSBpcykgewogCQlyZXR1cm4gZnJvbVJhdyhpcywgMCk7CiAJfQogCkBAIC0yMTcsNyArMjE3LDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGxvbmcgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhsb25nW10gaXMsIGludCBwKSB7CiAJCXJldHVybiBuZXcgTG9uZ09iamVjdElkKGlzW3BdLCBpc1twICsgMV0sIGlzW3AgKyAyXSwgaXNbcCArIDNdKTsKIAl9CiAKQEAgLTIzMSw3ICsyMzEsNyBAQAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tU3RyaW5nKGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjQyLDE0ICsyNDIsMTQgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZy4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IEludmFsaWRMb25nT2JqZWN0SWRFeGNlcHRpb24oc3RyKTsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksCiAJCQkJMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGxvbmcgYSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCk7CiAJCQlmaW5hbCBsb25nIGIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHAgKyAxNik7CkBAIC0yODAsNyArMjgwLDcgQEAKIAkgKiBAcGFyYW0gc3JjCiAJICogICAgICAgICAgICBhbm90aGVyIGFscmVhZHkgcGFyc2VkIExvbmdPYmplY3RJZCB0byBjb3B5IHRoZSB2YWx1ZSBvdXQgb2YuCiAJICovCi0JcHJvdGVjdGVkIExvbmdPYmplY3RJZChmaW5hbCBBbnlMb25nT2JqZWN0SWQgc3JjKSB7CisJcHJvdGVjdGVkIExvbmdPYmplY3RJZChBbnlMb25nT2JqZWN0SWQgc3JjKSB7CiAJCXcxID0gc3JjLncxOwogCQl3MiA9IHNyYy53MjsKIAkJdzMgPSBzcmMudzM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL011dGFibGVMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhCmluZGV4IDdiMGM0OTQuLjNkNjI0OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSByYXcgYnl0ZSBidWZmZXIgdG8gcmVhZCBmcm9tLiBBdCBsZWFzdCAzMiBieXRlcyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgYnl0ZSBhcnJheS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCWZyb21SYXcoYnMsIDApOwogCX0KIApAQCAtMTgwLDcgKzE4MCw3IEBACiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl3MSA9IE5CLmRlY29kZUludDY0KGJzLCBwKTsKIAkJdzIgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDgpOwogCQl3MyA9IE5CLmRlY29kZUludDY0KGJzLCBwICsgMTYpOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJICogICAgICAgICAgICB0aGUgcmF3IGxvbmcgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNCBsb25ncyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgbG9uZ3MgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBsb25nW10gbG9uZ3MpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncykgewogCQlmcm9tUmF3KGxvbmdzLCAwKTsKIAl9CiAKQEAgLTIwNyw3ICsyMDcsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBsb25ncywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncywgaW50IHApIHsKIAkJdzEgPSBsb25nc1twXTsKIAkJdzIgPSBsb25nc1twICsgMV07CiAJCXczID0gbG9uZ3NbcCArIDJdOwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCWZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjMzLDE0ICsyMzMsMTQgQEAKIAkgKiBAcGFyYW0gc3RyCiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA2NCBjaGFyYWN0ZXJzIGxvbmcuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChMZnNUZXh0LmdldCgpLmludmFsaWRMb25nSWQsIHN0cikpOwogCQlmcm9tSGV4U3RyaW5nKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpLCAwKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZnJvbUhleFN0cmluZyhmaW5hbCBieXRlW10gYnMsIGludCBwKSB7CisJcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl0cnkgewogCQkJdzEgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHApOwogCQkJdzIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHAgKyAxNik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCAzNjllMzA3Li4xNjllZjdlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGM1ZTMxNDEuLmQwOTg1MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKaW5kZXggMWNjNmNlYi4uYTlhNThhZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggYjliNWNjZS4uNDgwZTljMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCAwZWRhZTFlLi40ODVmZDZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCmluZGV4IDg4Y2MwZGQuLmQxNDhhYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDQ0NTBiYmIuLjI5MWIyOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzYsMTI1ICszNiwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggYzhlMWE0Mi4uNjU1MTMzMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/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+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbAppbmRleCA3NTg2NTcwLi5mNjUzMjZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IGM1YmZmYTguLjgzODc1ODUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCiAjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDc4YTJlODkuLjcyZTE1ZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5sZnMiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+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+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKaW5kZXggNWM5YmNjNi4uMzVhNGZkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDg5OTJhZDMuLmVmOTAzMWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNSwxMjUgKzM1LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGYyNzgwYTQuLjE4YTdkMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5wZ20iCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTMxLDggKzMxLDggQEAKICAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+CiAKICAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNC4xMS44IiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIgdmVyc2lvbj0iNC4xMS44IiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI1LjAuNCIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjUuMC40IiBtYXRjaD0iZXF1aXZhbGVudCIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbAppbmRleCA0NDc5M2Y4Li43M2E3ZDNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCAwMTJjMjE3Li43MzcwMWIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw3IEBACiAjIGRlc2NyaXB0aW9uIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgRGVzY3JpcHRpb24iCiBkZXNjcmlwdGlvbj1cCiBEbyBub3QgaW5zdGFsbCBpbiB5b3VyIElERTogdGhpcyBmZWF0dXJlIGlzIG1lYW50IHRvIHByb3Zpc2lvbiBUYXJnZXQgUGxhdGZvcm1zLlxuXAotU291cmNlIGNvZGUgZm9yIHRoZSBzdXBwb3J0IGZvciBQREUncyBKVW5pdCBydW5uZXIgZm9yIGEgVGFyZ2V0IFBsYXRmb3JtXG5cCitTb3VyY2UgY29kZSBmb3IgdGhlIHN1cHBvcnQgZm9yIFBERSdzIEpVbml0IHJ1bm5lciBmb3IgYSBUYXJnZXQgUGxhdGZvcm1cbgogIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgZGVzY3JpcHRpb24gcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKQEAgLTM2LDEyNSArMzYsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCA5N2E2YTE3Li44MTBkMDE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCmluZGV4IGJjODllZWIuLjg4YjhjZTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCmluZGV4IGNhNzQxNmYuLmM4YzNiNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggOTg0M2UyMy4uYzA0ZGM2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM2LDEyNSArMzYsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjNjN2U5My4uMTJkNmZlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbAppbmRleCA4YWM4OTc0Li43YzgzMjQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDc0NjkyMC4uZmM3ZGZhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNCArMiw0IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogSkdpdCBUYXJnZXQgUGxhdGZvcm0gQnVuZGxlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRhcmdldAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldAppbmRleCAwYzFkNWJiLi5kZmI1YThmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNS50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjUiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzQ3Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjUiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjU0Ij4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQKaW5kZXggZTA1YzQxMC4uZGJmZDY5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjYudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vbWJhcmJlcm8vZnIub2Jlby5yZWxlbmcudGFyZ2V0cGxhdGZvcm0gLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC42IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3NjMzNSI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC42IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3OTI0MSI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuY2xpZW50IiB2ZXJzaW9uPSI5LjQuOC52MjAxNzExMjEiLz4KQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMS4xLjAudjIwMDkwNTAxMDcxMDAwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0CmluZGV4IDIwYjBhMjkuLmJlNzcxOWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC43LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuNyIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzMTQiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuNyIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyMjEiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldAppbmRleCBiODRmYzIwLi4zZGUxNzJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuOC50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjgiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzAxIj4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjgiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjA1Ij4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAxODA2MDYxNDUxMjQtUGhvdG9uLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkCmluZGV4IGY0ZWM1MGQuLmVjZWM0MWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkCkBAIC0xOCw2ICsxOCw3IEBACiAJb3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UgWzEuMi4xNS52MjAxMDEyMDcwODE1LDEuMi4xNS52MjAxMDEyMDcwODE1XQogCW9yZy5rb2hzdWtlLmFyZ3M0aiBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KIAlvcmcua29oc3VrZS5hcmdzNGouc291cmNlIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5oYW1jcmVzdCBbMS4xLjAudjIwMDkwNTAxMDcxMDAwLDEuMS4wLnYyMDA5MDUwMTA3MTAwMF0KIAlvcmcuaGFtY3Jlc3QuY29yZSBbMS4zLjAudjIwMTgwNDIwLTE1MTksMS4zLjAudjIwMTgwNDIwLTE1MTldCiAJb3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KIAlvcmcuaGFtY3Jlc3QubGlicmFyeSBbMS4zLjAudjIwMTgwNTI0LTIyNDYsMS4zLjAudjIwMTgwNTI0LTIyNDZdCkBAIC00NCw0ICs0NSw0IEBACiAJb3JnLnNsZjRqLmltcGwubG9nNGoxMi5zb3VyY2UgWzEuNy4yLnYyMDEzMTEwNS0yMjAwLDEuNy4yLnYyMDEzMTEwNS0yMjAwXQogCWNvbS5qY3JhZnQuanpsaWIgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KIAljb20uamNyYWZ0Lmp6bGliLnNvdXJjZSBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCmluZGV4IDI0YzQ4ZWQuLjNjNjBhODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbApAQCAtNDksNyArNDksNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCmluZGV4IGQzZDg1YzMuLjNjYjIxYzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbApAQCAtNTMsNyArNTMsNyBAQAogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgogCiAgIDxuYW1lPkpHaXQgVHljaG8gUGFyZW50PC9uYW1lPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMjgzMDY1MS4uMzk5MTBjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDI4ICszLDI4IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKaW5kZXggZTliNzc3Zi4uMzBjMzJlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ0xJUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCAwZWVhYmFiLi4wZDE4OTRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YQpAQCAtMTIyLDE3ICsxMjIsMTcgQEAKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQogCi0JcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwud3JpdGVUcmFzaEZpbGUoZGIsIG5hbWUsIGRhdGEpOwogCX0KIAogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgcmVhZChmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFN0cmluZyByZWFkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC5yZWFkKGZpbGUpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBkZWxldGVUcmFzaEZpbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUpHaXRUZXN0VXRpbC5kZWxldGVUcmFzaEZpbGUoZGIsIG5hbWUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhCmluZGV4IDY5ZWIxOTguLjQ0YWQ3OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NMSUdpdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgaW5pdChmaW5hbCBUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBpbml0KFRleHRCdWlsdGluIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY21kLm91dHMgPSByZXN1bHQub3V0OwogCQljbWQuZXJycyA9IHJlc3VsdC5lcnI7CiAJCXN1cGVyLmluaXQoY21kKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BcmNoaXZlVGVzdC5qYXZhCmluZGV4IGU1Yzg1ZWIuLmFmZWI1ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vQXJjaGl2ZVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC02MTIsNyArNjEyLDcgQEAKIAogCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgcmVhZEZyb21Qcm9jZXNzKFByb2Nlc3MgcHJvYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgVVRGXzgpKTsKKwkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIGdyZXBGb3JFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGUsIFN0cmluZy4uLiBjbWRsaW5lKQpAQCAtNzAwLDcgKzcwMCw3IEBACiAJCXJldHVybiBsLnRvQXJyYXkobmV3IFN0cmluZ1tsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZ1dHVyZTxPYmplY3Q+IHdyaXRlQXN5bmMoZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSwgZmluYWwgYnl0ZVtdIGRhdGEpIHsKKwlwcml2YXRlIHN0YXRpYyBGdXR1cmU8T2JqZWN0PiB3cml0ZUFzeW5jKE91dHB1dFN0cmVhbSBzdHJlYW0sIGJ5dGVbXSBkYXRhKSB7CiAJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwogCiAJCXJldHVybiBleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CkBAIC03NTAsNyArNzUwLDcgQEAKIAkJCS8vIGZvdW5kIQogCQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpOworCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIENIQVJTRVQpKTsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCiAJCQkJbC5hZGQobGluZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCmluZGV4IDk2ODVkNDUuLmRkZTFhMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCkBAIC05Miw2ICs5MiwxOSBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoRm9yY2VVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gcmVzdWx0ID0gZXhlY3V0ZSgKKwkJCQkiZ2l0IGZldGNoIHRlc3QgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIgKiBbbmV3IGJyYW5jaF0gICAgICBtYXN0ZXIgICAgIC0+IG9yaWdpbi9tYXN0ZXIiLAorCQkJCXJlc3VsdFsxXSk7CisJCWFzc2VydEVxdWFscygiICogW25ldyB0YWddICAgICAgICAgdGFnICAgICAgICAtPiB0YWciLCByZXN1bHRbMl0pOworCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0QW1lbmQodHJ1ZSkuc2V0TWVzc2FnZSgiYW1lbmRlZCIpLmNhbGwoKTsKKwkJcmVzdWx0ID0gZXhlY3V0ZSgKKwkJCQkiZ2l0IGZldGNoIC1mIHRlc3QgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCByZXN1bHRbMF0pOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZldGNoTm9UYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZ1tdIHJlc3VsdCA9IGV4ZWN1dGUoImdpdCBmZXRjaCAtLW5vLXRhZ3MgdGVzdCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoIiAqIFtuZXcgYnJhbmNoXSAgICAgIG1hc3RlciAgICAgLT4gb3JpZ2luL21hc3RlciIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Qcm94eUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhCmluZGV4IDA2ZTdhMWQuLjQwYTIyM2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0yMDMsNyArMjA0LDcgQEAKIAkJCXdoaWxlICgobGVuZ3RoID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSAhPSAtMSkgewogCQkJCXJlc3VsdC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CiAJCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCJVVEYtOCIpOworCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YQppbmRleCAwMzM5MWEwLi5kMzhhNDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UYWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGFnVGVzdC5qYXZhCkBAIC00MywxMCArNDMsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNzUsMTMgKzc2LDkgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RUYWdEZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LnRhZygpLnNldE5hbWUoInRlc3QiKS5jYWxsKCk7Ci0KLQkJUmVmIHJlZiA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0VGFncygpLmdldCgidGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoInJlZnMvdGFncy90ZXN0IiwgcmVmLmdldE5hbWUoKSk7Ci0KKwkJYXNzZXJ0Tm90TnVsbChnaXQuZ2V0UmVwb3NpdG9yeSgpLmV4YWN0UmVmKCJyZWZzL3RhZ3MvdGVzdCIpKTsKIAkJYXNzZXJ0RXF1YWxzKCIiLCBleGVjdXRlVW5jaGVja2VkKCJnaXQgdGFnIC1kIHRlc3QiKVswXSk7Ci0JCVJlZiBkZWxldGVkUmVmID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRUYWdzKCkuZ2V0KCJ0ZXN0Iik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWxldGVkUmVmKTsKKwkJYXNzZXJ0TnVsbChnaXQuZ2V0UmVwb3NpdG9yeSgpLmV4YWN0UmVmKCJyZWZzL3RhZ3MvdGVzdCIpKTsKIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9CVUlMRAppbmRleCAwNzkyMjY4Li5kZGM4NGJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9CVUlMRApAQCAtMjUsNiArMjUsMTIgQEAKICAgICBdLAogKQogCitqYXZhX2JpbmFyeSgKKyAgICBuYW1lID0gImpnaXQiLAorICAgIG1haW5fY2xhc3MgPSAib3JnLmVjbGlwc2UuamdpdC5wZ20uTWFpbiIsCisgICAgcnVudGltZV9kZXBzID0gWyI6cGdtIl0sCispCisKIGphdmFfaW1wb3J0KAogICAgIG5hbWUgPSAic2VydmljZXMiLAogICAgIGphcnMgPSBbIjpzZXJ2aWNlc19qYXIiXSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNWUyZGVmMS4uZjhhYTA5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCkBAIC0yOCw0OSArMjgsNDkgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmtldGNoO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ajt2ZXJzaW9uPSJbMi4zMy4wLDMuMC4wKSIsCiAgb3JnLmtvaHN1a2UuYXJnczRqLnNwaTt2ZXJzaW9uPSJbMi4zMy4wLDMuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmNvbnNvbGU7dmVyc2lvbj0iNC4xMS44IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmNvbnNvbGU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQsCkBAIC04MSwxMSArODEsMTEgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBqYXZheC5zd2luZywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbywKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggZWRjOTQ1Yy4uMWQ0NTc1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjUuMC40LnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAppbmRleCA3ZDIxODRmLi5kYjY3NDVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5wZ208L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcwppbmRleCBjYjBlYTFiLi5lOTM3MDkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKQEAgLTM0Myw2ICszNDMsNyBAQAogdXNhZ2VfZm9yY2VDaGVja291dD13aGVuIHN3aXRjaGluZyBicmFuY2hlcywgcHJvY2VlZCBldmVuIGlmIHRoZSBpbmRleCBvciB0aGUgd29ya2luZyB0cmVlIGRpZmZlcnMgZnJvbSBIRUFECiB1c2FnZV9mb3JjZUNsZWFuPXJlcXVpcmVkIHRvIGRlbGV0ZSBmaWxlcyBvciBkaXJlY3RvcmllcwogdXNhZ2VfZm9yY2VDcmVhdGVCcmFuY2hFdmVuRXhpc3RzPWZvcmNlIGNyZWF0ZSBicmFuY2ggZXZlbiBleGlzdHMKK3VzYWdlX2ZvcmNlZEZldGNoPWZvcmNlIHJlZiB1cGRhdGUgZmV0Y2ggb3B0aW9uCiB1c2FnZV9mb3JjZVJlcGxhY2luZ0FuRXhpc3RpbmdUYWc9Zm9yY2UgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHRhZwogdXNhZ2VfZ2V0QW5kU2V0T3B0aW9ucz1HZXQgYW5kIHNldCByZXBvc2l0b3J5IG9yIGdsb2JhbCBvcHRpb25zCiB1c2FnZV9ncm91cHM9UmVzdHJpY3QgbWFuaWZlc3QgcHJvamVjdHMgdG8gb25lcyB3aXRoIHNwZWNpZmllZCBncm91cChzKSwgdXNlICItIiBmb3IgZXhjbHVkaW5nIFtkZWZhdWx0fGFsbHxHMSxHMixHM3xHNCwtRzUsLUc2XQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQWJzdHJhY3RGZXRjaENvbW1hbmQuamF2YQppbmRleCBmMDc1NGIxLi45MjIzZTBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQWJzdHJhY3RGZXRjaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQWJzdHJhY3RGZXRjaENvbW1hbmQuamF2YQpAQCAtNzQsMTAgKzc0LDEwIEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW55LgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGZXRjaFJlc3VsdChmaW5hbCBGZXRjaFJlc3VsdCByKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNob3dGZXRjaFJlc3VsdChGZXRjaFJlc3VsdCByKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkYi5uZXdPYmplY3RSZWFkZXIoKSkgewogCQkJYm9vbGVhbiBzaG93blVSSSA9IGZhbHNlOwotCQkJZm9yIChmaW5hbCBUcmFja2luZ1JlZlVwZGF0ZSB1IDogci5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKSkgeworCQkJZm9yIChUcmFja2luZ1JlZlVwZGF0ZSB1IDogci5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKSkgewogCQkJCWlmICghdmVyYm9zZSAmJiB1LmdldFJlc3VsdCgpID09IFJlZlVwZGF0ZS5SZXN1bHQuTk9fQ0hBTkdFKQogCQkJCQljb250aW51ZTsKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBjaGFyIHNob3J0VHlwZU9mKGZpbmFsIFJlZlVwZGF0ZS5SZXN1bHQgcikgeworCXByaXZhdGUgc3RhdGljIGNoYXIgc2hvcnRUeXBlT2YoUmVmVXBkYXRlLlJlc3VsdCByKSB7CiAJCWlmIChyID09IFJlZlVwZGF0ZS5SZXN1bHQuTE9DS19GQUlMVVJFKQogCQkJcmV0dXJuICchJzsKIAkJaWYgKHIgPT0gUmVmVXBkYXRlLlJlc3VsdC5JT19GQUlMVVJFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQppbmRleCBjY2U4ODliLi5mNGY4ZDhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCQl9CiAKIAkJfSBlbHNlIGlmICgibHMiLmVxdWFscyhvcCkgfHwgImxpc3QiLmVxdWFscyhvcCkpIHsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWZvciAoZmluYWwgU3RyaW5nIGsgOiBzMy5saXN0KGJ1Y2tldCwga2V5KSkKKwkJCWZvciAoU3RyaW5nIGsgOiBzMy5saXN0KGJ1Y2tldCwga2V5KSkKIAkJCQlvdXR3LnByaW50bG4oayk7CiAKIAkJfSBlbHNlIGlmICgicm0iLmVxdWFscyhvcCkgfHwgImRlbGV0ZSIuZXF1YWxzKG9wKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YQppbmRleCBlNjY4NWMyLi5hODgzNTRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JyYW5jaC5qYXZhCkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJCQlhZGRSZWZzKHJlZnMsIENvbnN0YW50cy5SX1JFTU9URVMpOwogCiAJCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJZm9yIChmaW5hbCBFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IHByaW50UmVmcy5lbnRyeVNldCgpKSB7CisJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBSZWY+IGUgOiBwcmludFJlZnMuZW50cnlTZXQoKSkgewogCQkJCQkJZmluYWwgUmVmIHJlZiA9IGUuZ2V0VmFsdWUoKTsKIAkJCQkJCXByaW50SGVhZChyZWFkZXIsIGUuZ2V0S2V5KCksCiAJCQkJCQkJCWN1cnJlbnQuZXF1YWxzKHJlZi5nZXROYW1lKCkpLCByZWYpOwpAQCAtMzAyLDE1ICszMDIsMTUgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRSZWZzKGZpbmFsIENvbGxlY3Rpb248UmVmPiByZWZzLCBmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCWZvciAoZmluYWwgUmVmIHJlZiA6IFJlZkNvbXBhcmF0b3Iuc29ydChyZWZzKSkgeworCXByaXZhdGUgdm9pZCBhZGRSZWZzKENvbGxlY3Rpb248UmVmPiByZWZzLCBTdHJpbmcgcHJlZml4KSB7CisJCWZvciAoUmVmIHJlZiA6IFJlZkNvbXBhcmF0b3Iuc29ydChyZWZzKSkgewogCQkJZmluYWwgU3RyaW5nIG5hbWUgPSByZWYuZ2V0TmFtZSgpOwogCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKQogCQkJCWFkZFJlZihuYW1lLnN1YnN0cmluZyhuYW1lLmluZGV4T2YoJy8nLCA1KSArIDEpLCByZWYpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUmVmIHJlZikgeworCXByaXZhdGUgdm9pZCBhZGRSZWYoU3RyaW5nIG5hbWUsIFJlZiByZWYpIHsKIAkJcHJpbnRSZWZzLnB1dChuYW1lLCByZWYpOwogCQltYXhOYW1lTGVuZ3RoID0gTWF0aC5tYXgobWF4TmFtZUxlbmd0aCwgbmFtZS5sZW5ndGgoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRDYXRhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YQppbmRleCA4MWFlZWY4Li41NzU0ZDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YQpAQCAtNDMsMTEgKzQzLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC04OCw3ICs4Nyw3IEBACiAJICogICAgICAgICAgICB3YXMgZGVyaXZlZCBmcm9tIHRoZSBEYXNoTG93ZXJDYXNlRm9ybSBjbGFzcyBuYW1lLgogCSAqIEByZXR1cm4gdGhlIGNvbW1hbmQgaW5zdGFuY2U7IG51bGwgaWYgbm8gY29tbWFuZCBleGlzdHMgYnkgdGhhdCBuYW1lLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZiBnZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIENvbW1hbmRSZWYgZ2V0KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBJTlNUQU5DRS5jb21tYW5kcy5nZXQobmFtZSk7CiAJfQogCkBAIC0xMDgsMTcgKzEwNywxNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZltdIGNvbW1vbigpIHsKIAkJZmluYWwgQXJyYXlMaXN0PENvbW1hbmRSZWY+IGNvbW1vbiA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IElOU1RBTkNFLmNvbW1hbmRzLnZhbHVlcygpKQorCQlmb3IgKENvbW1hbmRSZWYgYyA6IElOU1RBTkNFLmNvbW1hbmRzLnZhbHVlcygpKQogCQkJaWYgKGMuaXNDb21tb24oKSkKIAkJCQljb21tb24uYWRkKGMpOwogCQlyZXR1cm4gdG9Tb3J0ZWRBcnJheShjb21tb24pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIENvbW1hbmRSZWZbXSB0b1NvcnRlZEFycmF5KGZpbmFsIENvbGxlY3Rpb248Q29tbWFuZFJlZj4gYykgeworCXByaXZhdGUgc3RhdGljIENvbW1hbmRSZWZbXSB0b1NvcnRlZEFycmF5KENvbGxlY3Rpb248Q29tbWFuZFJlZj4gYykgewogCQlmaW5hbCBDb21tYW5kUmVmW10gciA9IGMudG9BcnJheShuZXcgQ29tbWFuZFJlZltjLnNpemUoKV0pOwogCQlBcnJheXMuc29ydChyLCBuZXcgQ29tcGFyYXRvcjxDb21tYW5kUmVmPigpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIENvbW1hbmRSZWYgbzEsIGZpbmFsIENvbW1hbmRSZWYgbzIpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShDb21tYW5kUmVmIG8xLCBDb21tYW5kUmVmIG8yKSB7CiAJCQkJcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKIAkJCX0KIAkJfSk7CkBAIC0xNDcsMzYgKzE0NiwyMCBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNjYW4oZmluYWwgVVJMIGNVcmwpIHsKLQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgY0luOwotCQl0cnkgewotCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBjVXJsLm9wZW5TdHJlYW0oKTsKLQkJCWNJbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIFVURl84KSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgY2Fubm90IHJlYWQgZnJvbSB0aGUgc2VydmljZSBsaXN0LCBnbyB0byB0aGUgbmV4dC4KLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgeworCXByaXZhdGUgdm9pZCBzY2FuKFVSTCBjVXJsKSB7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgY0luID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjVXJsLm9wZW5TdHJlYW0oKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGNJbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAogCQkJCQlsb2FkKGxpbmUpOwogCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCS8vIElmIHdlIGZhaWxlZCBkdXJpbmcgYSByZWFkLCBpZ25vcmUgdGhlIGVycm9yLgotCQkJLy8KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJY0luLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoZSBjbG9zZSBlcnJvcjsgd2UgYXJlIG9ubHkgcmVhZGluZy4KLQkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlIGVycm9ycwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGxvYWQoZmluYWwgU3RyaW5nIGNuKSB7CisJcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nIGNuKSB7CiAJCWZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xheno7CiAJCXRyeSB7CiAJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoY24sIGZhbHNlLCBsZHIpLmFzU3ViY2xhc3MoVGV4dEJ1aWx0aW4uY2xhc3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kUmVmLmphdmEKaW5kZXggMmM5YmMwZC4uMTc3M2RlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZFJlZi5qYXZhCkBAIC02NiwyOSArNjYsMjkgQEAKIAogCWJvb2xlYW4gY29tbW9uOwogCi0JQ29tbWFuZFJlZihmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6KSB7CisJQ29tbWFuZFJlZihDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6KSB7CiAJCXRoaXMoY2xhenosIGd1ZXNzTmFtZShjbGF6eikpOwogCX0KIAotCUNvbW1hbmRSZWYoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgZmluYWwgQ29tbWFuZCBjbWQpIHsKKwlDb21tYW5kUmVmKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIENvbW1hbmQgY21kKSB7CiAJCXRoaXMoY2xhenosIGNtZC5uYW1lKCkubGVuZ3RoKCkgPiAwID8gY21kLm5hbWUoKSA6IGd1ZXNzTmFtZShjbGF6eikpOwogCQl1c2FnZSA9IGNtZC51c2FnZSgpOwogCQljb21tb24gPSBjbWQuY29tbW9uKCk7CiAJfQogCi0JcHJpdmF0ZSBDb21tYW5kUmVmKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIGZpbmFsIFN0cmluZyBjbikgeworCXByaXZhdGUgQ29tbWFuZFJlZihDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6LCBTdHJpbmcgY24pIHsKIAkJaW1wbCA9IGNsYXp6OwogCQluYW1lID0gY247CiAJCXVzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NOYW1lKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NOYW1lKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJaWYgKGNsYXp6LmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zy4iKSkgLy8kTk9OLU5MUy0xJAogCQkJcy5hcHBlbmQoImRlYnVnLSIpOyAvLyROT04tTkxTLTEkCiAKIAkJYm9vbGVhbiBsYXN0V2FzRGFzaCA9IHRydWU7Ci0JCWZvciAoZmluYWwgY2hhciBjIDogY2xhenouZ2V0U2ltcGxlTmFtZSgpLnRvQ2hhckFycmF5KCkpIHsKKwkJZm9yIChjaGFyIGMgOiBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9DaGFyQXJyYXkoKSkgewogCQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjKSkgewogCQkJCWlmICghbGFzdFdhc0Rhc2gpCiAJCQkJCXMuYXBwZW5kKCctJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEKaW5kZXggZDBhZGE2Ny4uMzE5YjVlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RhZW1vbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YQpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCQlwYWNrQ29uZmlnLnNldEV4ZWN1dG9yKEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wodGhyZWFkcykpOwogCiAJCWZpbmFsIEZpbGVSZXNvbHZlcjxEYWVtb25DbGllbnQ+IHJlc29sdmVyID0gbmV3IEZpbGVSZXNvbHZlcjw+KCk7Ci0JCWZvciAoZmluYWwgRmlsZSBmIDogZGlyZWN0b3J5KSB7CisJCWZvciAoRmlsZSBmIDogZGlyZWN0b3J5KSB7CiAJCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5leHBvcnRpbmcsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKIAkJCXJlc29sdmVyLmV4cG9ydERpcmVjdG9yeShmKTsKIAkJfQpAQCAtMTU3LDE0ICsxNTcsMTQgQEAKIAkJaWYgKDAgPD0gdGltZW91dCkKIAkJCWQuc2V0VGltZW91dCh0aW1lb3V0KTsKIAotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogZW5hYmxlKQorCQlmb3IgKFN0cmluZyBuIDogZW5hYmxlKQogCQkJc2VydmljZShkLCBuKS5zZXRFbmFibGVkKHRydWUpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogZGlzYWJsZSkKKwkJZm9yIChTdHJpbmcgbiA6IGRpc2FibGUpCiAJCQlzZXJ2aWNlKGQsIG4pLnNldEVuYWJsZWQoZmFsc2UpOwogCi0JCWZvciAoZmluYWwgU3RyaW5nIG4gOiBjYW5PdmVycmlkZSkKKwkJZm9yIChTdHJpbmcgbiA6IGNhbk92ZXJyaWRlKQogCQkJc2VydmljZShkLCBuKS5zZXRPdmVycmlkYWJsZSh0cnVlKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGZvcmJpZE92ZXJyaWRlKQorCQlmb3IgKFN0cmluZyBuIDogZm9yYmlkT3ZlcnJpZGUpCiAJCQlzZXJ2aWNlKGQsIG4pLnNldE92ZXJyaWRhYmxlKGZhbHNlKTsKIAkJaWYgKGtldGNoU2VydmVyVHlwZSA9PSBLZXRjaFNlcnZlclR5cGUuTEVBREVSKSB7CiAJCQlzdGFydEtldGNoTGVhZGVyKGQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhCmluZGV4IDU5ZGU4MGMuLjRlYzVmMDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGllLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IHRvIHRoZSBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgRGllKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHdoeSB0aGUgY29tbWFuZCBoYXMgZmFpbGVkLgogCSAqLwotCXB1YmxpYyBEaWUoZmluYWwgU3RyaW5nIHdoeSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIERpZShTdHJpbmcgd2h5LCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIod2h5LCBjYXVzZSk7CiAJfQogCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkgKiAgICAgICAgICAgIGNhbiBiZSBudWxsCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXB1YmxpYyBEaWUoYm9vbGVhbiBhYm9ydGVkLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgRGllKGJvb2xlYW4gYWJvcnRlZCwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKGNhdXNlICE9IG51bGwgPyBjYXVzZS5nZXRNZXNzYWdlKCkgOiBudWxsLCBjYXVzZSk7CiAJCXRoaXMuYWJvcnRlZCA9IGFib3J0ZWQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEKaW5kZXggZWQ2ZjdiNC4uOTdlM2RmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZi5qYXZhCkBAIC0xNzAsNyArMTcwLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGZpbmFsIFN0cmluZyBnaXREaXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGdpdERpcikgewogCQlzdXBlci5pbml0KHJlcG9zaXRvcnksIGdpdERpcik7CiAJCWRpZmZGbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cykpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKaW5kZXggNTEwNDA2My4uNDJhYWJjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKQEAgLTc1LDkgKzc1LDkgQEAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXdhbGsuc2V0UmVjdXJzaXZlKHJlY3Vyc2l2ZSk7Ci0JCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkgOiB0cmVlcykKKwkJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSA6IHRyZWVzKQogCQkJCXdhbGsuYWRkVHJlZShpKTsKIAkJCXdhbGsuc2V0RmlsdGVyKEFuZFRyZWVGaWx0ZXIuY3JlYXRlKFRyZWVGaWx0ZXIuQU5ZX0RJRkYsIHBhdGhGaWx0ZXIpKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YQppbmRleCBiYzc2MzcyLi42MWZkNTIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YQpAQCAtMTAwLDYgKzEwMCw5IEBACiAJCXRhZ3MgPSBCb29sZWFuLkZBTFNFOwogCX0KIAorCUBPcHRpb24obmFtZSA9ICItLWZvcmNlIiwgdXNhZ2UgPSAidXNhZ2VfZm9yY2VkRmV0Y2giLCBhbGlhc2VzID0geyAiLWYiIH0pCisJcHJpdmF0ZSBCb29sZWFuIGZvcmNlOworCiAJcHJpdmF0ZSBGZXRjaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSByZWN1cnNlU3VibW9kdWxlczsKIAogCUBPcHRpb24obmFtZSA9ICItLXJlY3Vyc2Utc3VibW9kdWxlcyIsIHVzYWdlID0gInVzYWdlX3JlY3Vyc2VTdWJtb2R1bGVzIikKQEAgLTE1NSw2ICsxNTgsOSBAQAogCQkJaWYgKHF1aWV0ID09IG51bGwgfHwgIXF1aWV0LmJvb2xlYW5WYWx1ZSgpKQogCQkJCWZldGNoLnNldFByb2dyZXNzTW9uaXRvcihuZXcgVGV4dFByb2dyZXNzTW9uaXRvcihlcnJ3KSk7CiAJCQlmZXRjaC5zZXRSZWN1cnNlU3VibW9kdWxlcyhyZWN1cnNlU3VibW9kdWxlcykuc2V0Q2FsbGJhY2sodGhpcyk7CisJCQlpZiAoZm9yY2UgIT0gbnVsbCkgeworCQkJCWZldGNoLnNldEZvcmNlVXBkYXRlKGZvcmNlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCX0KIAogCQkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gZmV0Y2guY2FsbCgpOwogCQkJaWYgKHJlc3VsdC5nZXRUcmFja2luZ1JlZlVwZGF0ZXMoKS5pc0VtcHR5KCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhCmluZGV4IGEwODFiNzguLjJiNWFmNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0dsb2cuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogCQlmcmFtZSA9IG5ldyBKRnJhbWUoKTsKIAkJZnJhbWUuYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoZmluYWwgV2luZG93RXZlbnQgZSkgeworCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7CiAJCQkJZnJhbWUuZGlzcG9zZSgpOwogCQkJfQogCQl9KTsKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEKaW5kZXggNzU1NDJkNC4uYWQ5MmE3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mb2cuamF2YQpAQCAtMTg2LDcgKzE4Niw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CkBAIC0yNDEsNyArMjQxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvdyhSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoQ0xJVGV4dC5nZXQoKS5jb21taXRMYWJlbCk7CiAJCW91dHcucHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAogCQljLmdldElkKCkuY29weVRvKG91dGJ1ZmZlciwgb3V0dyk7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSBjLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCmluZGV4IDkwMTNmZjYuLjI3MTFjMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCkBAIC04Myw3ICs4Myw3IEBACiAJCQl9CiAJCX0pOwogCQlyZWZzLmFkZEFsbChjb21tYW5kLmNhbGwoKSk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlzaG93KHIuZ2V0T2JqZWN0SWQoKSwgci5nZXROYW1lKCkpOwogCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCXNob3coci5nZXRQZWVsZWRPYmplY3RJZCgpLCByLmdldE5hbWUoKSArICJee30iKTsgLy8kTk9OLU5MUy0xJApAQCAtOTYsNyArOTYsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyBuYW1lKQorCXByaXZhdGUgdm9pZCBzaG93KEFueU9iamVjdElkIGlkLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoaWQubmFtZSgpKTsKIAkJb3V0dy5wcmludCgnXHQnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YQppbmRleCBjNTdmOWYyLi4wMWZhN2VlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xzVHJlZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl3YWxrLnJlc2V0KCk7IC8vIGRyb3AgdGhlIGZpcnN0IGVtcHR5IHRyZWUsIHdoaWNoIHdlIGRvIG5vdCBuZWVkIGhlcmUKIAkJCWlmIChwYXRocy5zaXplKCkgPiAwKQogCQkJCXdhbGsuc2V0RmlsdGVyKFBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhwYXRocykpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NYWluLmphdmEKaW5kZXggYTM3NmJjMC4uYWM1M2RlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtNzEsNiArNzEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlN1YmNvbW1hbmRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGUuSHR0cENsaWVudENvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5DYWNoZWRBdXRoZW50aWNhdG9yOwpAQCAtMTA1LDEwICsxMDYsMTkgQEAKIAogCXByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGdjRXhlY3V0b3I7CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKKwogCS8qKgogCSAqIDxwPkNvbnN0cnVjdG9yIGZvciBNYWluLjwvcD4KIAkgKi8KIAlwdWJsaWMgTWFpbigpIHsKKwkJZmluYWwgV2luZG93Q2FjaGVDb25maWcgYyA9IG5ldyBXaW5kb3dDYWNoZUNvbmZpZygpOworCQljLnNldFBhY2tlZEdpdE1NQVAodHJ1ZSk7CisJCWMuc2V0UGFja2VkR2l0V2luZG93U2l6ZSg4ICogMTAyNCk7CisJCWMuc2V0UGFja2VkR2l0TGltaXQoMTAgKiBNQik7CisJCWMuc2V0RGVsdGFCYXNlQ2FjaGVMaW1pdCgxMCAqIE1CKTsKKwkJYy5zZXRTdHJlYW1GaWxlVGhyZXNob2xkKDUwICogTUIpOworCQljLmluc3RhbGwoKTsKIAkJSHR0cFRyYW5zcG9ydC5zZXRDb25uZWN0aW9uRmFjdG9yeShuZXcgSHR0cENsaWVudENvbm5lY3Rpb25GYWN0b3J5KCkpOwogCQlCdWlsdGluTEZTLnJlZ2lzdGVyKCk7CiAJCWdjRXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnkoKSB7CkBAIC0xMzEsNyArMTQxLDcgQEAKIAkgKiAgICAgICAgICAgIGFyZ3VtZW50cy4KIAkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gbWFrZSBzdXJlIGJ1aWx0LWluIGZpbHRlcnMgYXJlIHJlZ2lzdGVyZWQKIAkJQnVpbHRpbkxGUy5yZWdpc3RlcigpOwogCkBAIC0xNTUsNyArMTY1LDcgQEAKIAkgKiAgICAgICAgICAgIGFyZ3VtZW50cy4KIAkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW4oZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFeGNlcHRpb24gewogCQl3cml0ZXIgPSBjcmVhdGVFcnJvcldyaXRlcigpOwogCQl0cnkgewogCQkJaWYgKCFpbnN0YWxsQ29uc29sZSgpKSB7CkBAIC0yMTcsMTAgKzIyNywxMCBAQAogCX0KIAogCVByaW50V3JpdGVyIGNyZWF0ZUVycm9yV3JpdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLmVyciwgVVRGXzgpKTsKKwkJcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5lcnIsIENIQVJTRVQpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZXhlY3V0ZShmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgU3ViY29tbWFuZExpbmVQYXJzZXIodGhpcyk7CiAKIAkJdHJ5IHsKQEAgLTI0NiwxMiArMjU2LDEyIEBACiAJCQkJd3JpdGVyLnByaW50bG4oQ0xJVGV4dC5nZXQoKS5tb3N0Q29tbW9ubHlVc2VkQ29tbWFuZHNBcmUpOwogCQkJCWZpbmFsIENvbW1hbmRSZWZbXSBjb21tb24gPSBDb21tYW5kQ2F0YWxvZy5jb21tb24oKTsKIAkJCQlpbnQgd2lkdGggPSAwOwotCQkJCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogY29tbW9uKSB7CisJCQkJZm9yIChDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKIAkJCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYy5nZXROYW1lKCkubGVuZ3RoKCkpOwogCQkJCX0KIAkJCQl3aWR0aCArPSAyOwogCi0JCQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKKwkJCQlmb3IgKENvbW1hbmRSZWYgYyA6IGNvbW1vbikgewogCQkJCQl3cml0ZXIucHJpbnQoJyAnKTsKIAkJCQkJd3JpdGVyLnByaW50KGMuZ2V0TmFtZSgpKTsKIAkJCQkJZm9yIChpbnQgaSA9IGMuZ2V0TmFtZSgpLmxlbmd0aCgpOyBpIDwgd2lkdGg7IGkrKykgewpAQCAtMjg2LDcgKzI5Niw3IEBACiAJCX0KIAl9CiAKLQl2b2lkIGluaXQoZmluYWwgVGV4dEJ1aWx0aW4gY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgaW5pdChUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjbWQucmVxdWlyZXNSZXBvc2l0b3J5KCkpIHsKIAkJCWNtZC5pbml0KG9wZW5HaXREaXIoZ2l0ZGlyKSwgbnVsbCk7CiAJCX0gZWxzZSB7CkBAIC0zNTAsNyArMzYwLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5zdGFsbChmaW5hbCBTdHJpbmcgbmFtZSkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGwoU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKIAkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEKaW5kZXggNjJhODhhZS4uNjg0MmQ4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlQmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZUJhc2UuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IGMgOiBjb21taXRzKQorCQlmb3IgKFJldkNvbW1pdCBjIDogY29tbWl0cykKIAkJCWFyZ1dhbGsubWFya1N0YXJ0KGMpOwogCQlhcmdXYWxrLnNldFJldkZpbHRlcihSZXZGaWx0ZXIuTUVSR0VfQkFTRSk7CiAJCWludCBtYXggPSBhbGwgPyBJbnRlZ2VyLk1BWF9WQUxVRSA6IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1B1c2guamF2YQppbmRleCAzMDlkY2EyLi5iZThhZDM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEKQEAgLTE0OSw3ICsxNDksNyBAQAogCQlib29sZWFuIGV2ZXJ5dGhpbmdVcFRvRGF0ZSA9IHRydWU7CiAKIAkJLy8gYXQgZmlyc3QsIHByaW50IHVwLXRvLWRhdGUgb25lcy4uLgotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLlVQX1RPX0RBVEUpIHsKIAkJCQlpZiAodmVyYm9zZSkKIAkJCQkJcHJpbnRSZWZVcGRhdGVSZXN1bHQocmVhZGVyLCB1cmksIHJlc3VsdCwgcnJ1KTsKQEAgLTE1NywxMyArMTU3LDEzIEBACiAJCQkJZXZlcnl0aGluZ1VwVG9EYXRlID0gZmFsc2U7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKIAkJCS8vIC4uLnRoZW4gc3VjY2Vzc2Z1bCB1cGRhdGVzLi4uCiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5PSykKIAkJCQlwcmludFJlZlVwZGF0ZVJlc3VsdChyZWFkZXIsIHVyaSwgcmVzdWx0LCBycnUpOwogCQl9CiAKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQkvLyAuLi5maW5hbGx5LCBvdGhlcnMgKHByb2JsZW1hdGljKQogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuT0sKIAkJCQkJJiYgcnJ1LmdldFN0YXR1cygpICE9IFN0YXR1cy5VUF9UT19EQVRFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhCmluZGV4IDk0OGNiYzUuLjMzMDhlMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZW1vdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVtb3RlLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFVzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkKKwlwdWJsaWMgdm9pZCBwcmludFVzYWdlKFN0cmluZyBtZXNzYWdlLCBDbWRMaW5lUGFyc2VyIGNscCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWVycncucHJpbnRsbihtZXNzYWdlKTsKIAkJZXJydy5wcmludGxuKCJqZ2l0IHJlbW90ZSBbLS12ZXJib3NlICgtdildIFstLWhlbHAgKC1oKV0iKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEKaW5kZXggOGM4OGE1Yy4uMTAxZmJiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2TGlzdC5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiBjbGFzcyBSZXZMaXN0IGV4dGVuZHMgUmV2V2Fsa1RleHRCdWlsdGluIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNob3coZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNob3coUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24gewogCQlpZiAoYy5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCW91dHcucHJpbnQoJy0nKTsKIAkJYy5nZXRJZCgpLmNvcHlUbyhvdXRidWZmZXIsIG91dHcpOwpAQCAtNjcsNyArNjcsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIE9iamVjdFdhbGsgb3csIGZpbmFsIFJldk9iamVjdCBvYmopCisJcHJvdGVjdGVkIHZvaWQgc2hvdyhPYmplY3RXYWxrIG93LCBSZXZPYmplY3Qgb2JqKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWlmIChvYmouaGFzKFJldkZsYWcuVU5JTlRFUkVTVElORykpCiAJCQlvdXR3LnByaW50KCctJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2UGFyc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhCmluZGV4IDIxYWRmNzMuLmFjMDhjZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhCkBAIC00NSwxMSArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKQEAgLTc0LDggKzcxLDcgQEAKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGFsbCkgewotCQkJTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWxsUmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgciA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByLmdldE9iamVjdElkKCk7CiAJCQkJLy8gZ2V0UmVmcyBza2lwcyBkYW5nbGluZyBzeW1yZWZzLCBzbyBvYmplY3RJZCBzaG91bGQgbmV2ZXIgYmUKIAkJCQkvLyBudWxsLgpAQCAtOTEsNyArODcsNyBAQAogCQkJCQkJQ0xJVGV4dC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5uZWVkU2luZ2xlUmV2aXNpb24pKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBPYmplY3RJZCBvIDogY29tbWl0cykgeworCQkJZm9yIChPYmplY3RJZCBvIDogY29tbWl0cykgewogCQkJCW91dHcucHJpbnRsbihvLm5hbWUoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YQppbmRleCAzZmM5MTAxLi4xNWFiZWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldldhbGtUZXh0QnVpbHRpbi5qYXZhCkBAIC00NywxNCArNDcsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWwuQ0xJVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuUGF0aFRyZWVGaWx0ZXJIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb2xsb3dGaWx0ZXI7CkBAIC05Myw3ICs5MSw3IEBACiAKIAlwcml2YXRlIGZpbmFsIEVudW1TZXQ8UmV2U29ydD4gc29ydGluZyA9IEVudW1TZXQubm9uZU9mKFJldlNvcnQuY2xhc3MpOwogCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoZmluYWwgUmV2U29ydCB0eXBlLCBmaW5hbCBib29sZWFuIG9uKSB7CisJcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoUmV2U29ydCB0eXBlLCBib29sZWFuIG9uKSB7CiAJCWlmIChvbikKIAkJCXNvcnRpbmcuYWRkKHR5cGUpOwogCQllbHNlCkBAIC0xMDEsMjIgKzk5LDIyIEBACiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tZGF0ZS1vcmRlciIpCi0Jdm9pZCBlbmFibGVEYXRlT3JkZXIoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlRGF0ZU9yZGVyKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LkNPTU1JVF9USU1FX0RFU0MsIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS10b3BvLW9yZGVyIikKLQl2b2lkIGVuYWJsZVRvcG9PcmRlcihmaW5hbCBib29sZWFuIG9uKSB7CisJdm9pZCBlbmFibGVUb3BvT3JkZXIoYm9vbGVhbiBvbikgewogCQllbmFibGVSZXZTb3J0KFJldlNvcnQuVE9QTywgb24pOwogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLXJldmVyc2UiKQotCXZvaWQgZW5hYmxlUmV2ZXJzZShmaW5hbCBib29sZWFuIG9uKSB7CisJdm9pZCBlbmFibGVSZXZlcnNlKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LlJFVkVSU0UsIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1ib3VuZGFyeSIpCi0Jdm9pZCBlbmFibGVCb3VuZGFyeShmaW5hbCBib29sZWFuIG9uKSB7CisJdm9pZCBlbmFibGVCb3VuZGFyeShib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5CT1VOREFSWSwgb24pOwogCX0KIApAQCAtMTMyLDE3ICsxMzAsMTcgQEAKIAlwcml2YXRlIGZpbmFsIExpc3Q8UmV2RmlsdGVyPiByZXZMaW1pdGVyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1hdXRob3IiKQotCXZvaWQgYWRkQXV0aG9yUmV2RmlsdGVyKGZpbmFsIFN0cmluZyB3aG8pIHsKKwl2b2lkIGFkZEF1dGhvclJldkZpbHRlcihTdHJpbmcgd2hvKSB7CiAJCXJldkxpbWl0ZXIuYWRkKEF1dGhvclJldkZpbHRlci5jcmVhdGUod2hvKSk7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tY29tbWl0dGVyIikKLQl2b2lkIGFkZENvbW1pdHRlclJldkZpbHRlcihmaW5hbCBTdHJpbmcgd2hvKSB7CisJdm9pZCBhZGRDb21taXR0ZXJSZXZGaWx0ZXIoU3RyaW5nIHdobykgewogCQlyZXZMaW1pdGVyLmFkZChDb21taXR0ZXJSZXZGaWx0ZXIuY3JlYXRlKHdobykpOwogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWdyZXAiKQotCXZvaWQgYWRkQ01lc3NhZ2VSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIG1zZykgeworCXZvaWQgYWRkQ01lc3NhZ2VSZXZGaWx0ZXIoU3RyaW5nIG1zZykgewogCQlyZXZMaW1pdGVyLmFkZChNZXNzYWdlUmV2RmlsdGVyLmNyZWF0ZShtc2cpKTsKIAl9CiAKQEAgLTE1Myw3ICsxNTEsNyBAQAogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCQl3YWxrID0gY3JlYXRlV2FsaygpOwotCQlmb3IgKGZpbmFsIFJldlNvcnQgcyA6IHNvcnRpbmcpCisJCWZvciAoUmV2U29ydCBzIDogc29ydGluZykKIAkJCXdhbGsuc29ydChzLCB0cnVlKTsKIAogCQlpZiAocGF0aEZpbHRlciA9PSBUcmVlRmlsdGVyLkFMTCkgewpAQCAtMTcxLDkgKzE2OSw3IEBACiAJCQl3YWxrLnNldFJldkZpbHRlcihBbmRSZXZGaWx0ZXIuY3JlYXRlKHJldkxpbWl0ZXIpKTsKIAogCQlpZiAoYWxsKSB7Ci0JCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPQotCQkJCWRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpOwotCQkJZm9yIChSZWYgYSA6IHJlZnMudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIGEgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJCU9iamVjdElkIG9pZCA9IGEuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCQlpZiAob2lkID09IG51bGwpCiAJCQkJCW9pZCA9IGEuZ2V0T2JqZWN0SWQoKTsKQEAgLTE5MSw3ICsxODcsNyBAQAogCQkJCXRocm93IGRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmNhbm5vdFJlc29sdmUsIENvbnN0YW50cy5IRUFEKSk7CiAJCQljb21taXRzLmFkZCh3YWxrLnBhcnNlQ29tbWl0KGhlYWQpKTsKIAkJfQotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogY29tbWl0cykgeworCQlmb3IgKFJldkNvbW1pdCBjIDogY29tbWl0cykgewogCQkJZmluYWwgUmV2Q29tbWl0IHJlYWwgPSBhcmdXYWxrID09IHdhbGsgPyBjIDogd2Fsay5wYXJzZUNvbW1pdChjKTsKIAkJCWlmIChjLmhhcyhSZXZGbGFnLlVOSU5URVJFU1RJTkcpKQogCQkJCXdhbGsubWFya1VuaW50ZXJlc3RpbmcocmVhbCk7CkBAIC0yMzcsNyArMjMzLDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IHdhbGtMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWludCBuID0gMDsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHdhbGspIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IHdhbGspIHsKIAkJCWlmICgrK24gPiBtYXhDb3VudCAmJiBtYXhDb3VudCA+PSAwKQogCQkJCWJyZWFrOwogCQkJc2hvdyhjKTsKQEAgLTI2NCw3ICsyNjAsNyBAQAogCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXR9CiAJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbjsKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uOwogCiAJLyoqCiAJICogIlNob3ciIHRoZSBjdXJyZW50IFJldkNvbW1pdCB3aGVuIGNhbGxlZCBmcm9tIHRoZSBtYWluIHByb2Nlc3NpbmcgbG9vcC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvdy5qYXZhCmluZGV4IGRlMDQwNDUuLjg5YTE1ZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSB0YWcuZ2V0RnVsbE1lc3NhZ2UoKS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogbGluZXMpIHsKKwkJZm9yIChTdHJpbmcgcyA6IGxpbmVzKSB7CiAJCQlvdXR3LnByaW50KCIgICAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCW91dHcucHJpbnQocyk7CiAJCQlvdXR3LnByaW50bG4oKTsKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHNob3coUmV2VHJlZSBvYmopIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXdhbGsucmVzZXQoKTsKIAkJCXdhbGsuYWRkVHJlZShvYmopOwogCkBAIC0yNzMsNyArMjczLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KFJldldhbGsgcncsIGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhSZXZXYWxrIHJ3LCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNoYXJbXSBvdXRidWZmZXIgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSCAqIDJdOwogCiAJCW91dHcucHJpbnQoQ0xJVGV4dC5nZXQoKS5jb21taXRMYWJlbCk7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSBjLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3dSZWYuamF2YQppbmRleCA3YjU5ZDQzLi42MzE4YTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEKQEAgLTQ1LDIzICs0NSwxOSBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJlZk1hcDsKIAogQENvbW1hbmQodXNhZ2UgPSAidXNhZ2VfU2hvd1JlZiIpCiBjbGFzcyBTaG93UmVmIGV4dGVuZHMgVGV4dEJ1aWx0aW4gewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiBnZXRTb3J0ZWRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGdldFNvcnRlZFJlZnMoKSkgewogCQkJc2hvdyhyLmdldE9iamVjdElkKCksIHIuZ2V0TmFtZSgpKTsKIAkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQlzaG93KHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSwgci5nZXROYW1lKCkgKyAiXnt9Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTY5LDE0ICs2NSwxMyBAQAogCX0KIAogCXByaXZhdGUgSXRlcmFibGU8UmVmPiBnZXRTb3J0ZWRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWlmIChhbGwgaW5zdGFuY2VvZiBSZWZNYXAKLQkJCQl8fCAoYWxsIGluc3RhbmNlb2YgU29ydGVkTWFwICYmICgoU29ydGVkTWFwKSBhbGwpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSkKLQkJCXJldHVybiBhbGwudmFsdWVzKCk7Ci0JCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsLnZhbHVlcygpKTsKKwkJTGlzdDxSZWY+IGFsbCA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQkvLyBUT0RPKGpybikgY2hlY2sgaWYgd2UgY2FuIHJlaW50cm9kdWNlIGZhc3QtcGF0aCBieSBlLmcuIGltcGxlbWVudGluZworCQkvLyBTb3J0ZWRMaXN0CisJCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIG5hbWUpCisJcHJpdmF0ZSB2b2lkIHNob3coQW55T2JqZWN0SWQgaWQsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludChpZC5uYW1lKCkpOwogCQlvdXR3LnByaW50KCdcdCcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQppbmRleCBiYzM3NTVkLi43ZTViNTQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJLyoqIFJldldhbGsgdXNlZCBkdXJpbmcgY29tbWFuZCBsaW5lIHBhcnNpbmcsIGlmIGl0IHdhcyByZXF1aXJlZC4gKi8KIAlwcm90ZWN0ZWQgUmV2V2FsayBhcmdXYWxrOwogCi0JZmluYWwgdm9pZCBzZXRDb21tYW5kTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCWZpbmFsIHZvaWQgc2V0Q29tbWFuZE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJY29tbWFuZE5hbWUgPSBuYW1lOwogCX0KIApAQCAtMTc2LDcgKzE3Niw3IEBACiAJICogICAgICAgICAgICB2YWx1ZSBvZiB0aGUge0Bjb2RlIC0tZ2l0LWRpcn0gY29tbWFuZCBsaW5lIG9wdGlvbiwgaWYKIAkgKiAgICAgICAgICAgIHtAY29kZSByZXBvc2l0b3J5fSBpcyBudWxsLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFN0cmluZyBvdXRwdXRFbmNvZGluZyA9IHJlcG9zaXRvcnkgIT0gbnVsbCA/IHJlcG9zaXRvcnkKIAkJCQkJLmdldENvbmZpZygpLmdldFN0cmluZygiaTE4biIsIG51bGwsICJsb2dPdXRwdXRFbmNvZGluZyIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0yMzksNyArMjM5LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgaWYgYW55LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlQXJndW1lbnRzKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgQ21kTGluZVBhcnNlcih0aGlzKTsKIAkJaGVscCA9IGNvbnRhaW5zSGVscChhcmdzKTsKIAkJdHJ5IHsKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXJ9IG9iamVjdC4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcHJpbnRVc2FnZUFuZEV4aXQoIiIsIGNscCk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTI4MCw3ICsyODAsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXJ9IG9iamVjdC4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoU3RyaW5nIG1lc3NhZ2UsIENtZExpbmVQYXJzZXIgY2xwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlwcmludFVzYWdlKG1lc3NhZ2UsIGNscCk7CiAJCXRocm93IGRpZSh0cnVlKTsKIAl9CkBAIC0yOTUsNyArMjk1LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiBAc2luY2UgNC4yCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRVc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApCisJcHJvdGVjdGVkIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQllcnJ3LnByaW50bG4obWVzc2FnZSk7CiAJCWVycncucHJpbnQoImpnaXQgIik7IC8vJE5PTi1OTFMtMSQKQEAgLTM2MSw3ICszNjEsNyBAQAogCQlyZXR1cm4gZGI7CiAJfQogCi0JT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlPYmplY3RJZCByZXNvbHZlKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCByID0gZGIucmVzb2x2ZShzKTsKIAkJaWYgKHIgPT0gbnVsbCkKIAkJCXRocm93IGRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLm5vdEFSZXZpc2lvbiwgcykpOwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJICogICAgICAgICAgICB0ZXh0dWFsIGV4cGxhbmF0aW9uCiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoZmluYWwgU3RyaW5nIHdoeSkgeworCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShTdHJpbmcgd2h5KSB7CiAJCXJldHVybiBuZXcgRGllKHdoeSk7CiAJfQogCkBAIC0zODgsNyArMzg4LDcgQEAKIAkgKiAgICAgICAgICAgIHdoeSB0aGUgY29tbWFuZCBoYXMgZmFpbGVkLgogCSAqIEByZXR1cm4gYSBydW50aW1lIGV4Y2VwdGlvbiB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHRocm93CiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGZpbmFsIFN0cmluZyB3aHksIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShTdHJpbmcgd2h5LCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJcmV0dXJuIG5ldyBEaWUod2h5LCBjYXVzZSk7CiAJfQogCkBAIC00MTYsNyArNDE2LDcgQEAKIAkgKiBAcmV0dXJuIGEgcnVudGltZSBleGNlcHRpb24gdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB0aHJvdwogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoYm9vbGVhbiBhYm9ydGVkLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoYm9vbGVhbiBhYm9ydGVkLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJcmV0dXJuIG5ldyBEaWUoYWJvcnRlZCwgY2F1c2UpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEKaW5kZXggNWVmYzAzYi4uNThhY2M1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVmVyc2lvbi5qYXZhCkBAIC05NiwxNCArOTYsOSBAQAogCX0KIAogCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVWZXJzaW9uKFVSTCB1cmwpIHsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaXMpOwotCQkJCXJldHVybiBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKCJCdW5kbGUtVmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpKSB7CisJCQlNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpcyk7CisJCQlyZXR1cm4gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZSgiQnVuZGxlLVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkvLyBkbyBub3RoaW5nIC0gd2lsbCByZXR1cm4gbnVsbAogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9CZW5jaG1hcmtSZWZ0YWJsZS5qYXZhCmluZGV4IDI0OGVhYWMuLjU3NWExMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9CZW5jaG1hcmtSZWZ0YWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9CZW5jaG1hcmtSZWZ0YWJsZS5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5NQVNURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX0hFQURTOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCVJlZkxpc3QuQnVpbGRlcjxSZWY+IGxpc3QgPSBuZXcgUmVmTGlzdC5CdWlsZGVyPD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShsc1JlbW90ZVBhdGgpLCBVVEZfOCkpKSB7CisJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShsc1JlbW90ZVBhdGgpLCBDSEFSU0VUKSkpIHsKIAkJCVJlZiBsYXN0ID0gbnVsbDsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEKaW5kZXggMTI3ZTU0MS4uMmExMzI2ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvTWFrZUNhY2hlVHJlZS5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJCXNob3codHJlZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgRGlyQ2FjaGVUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHNob3coRGlyQ2FjaGVUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmNhY2hlVHJlZVBhdGhJbmZvLAogCQkJCXRyZWUuZ2V0UGF0aFN0cmluZygpLCB2YWx1ZU9mKHRyZWUuZ2V0RW50cnlTcGFuKCkpLAogCQkJCXZhbHVlT2YodHJlZS5nZXRDaGlsZENvdW50KCkpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEKaW5kZXggMmU0MWVlYy4uMmQxNmZlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRDb21taXRHcmFwaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YQpAQCAtNDMsOCArNDMsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwpAQCAtMTE3LDcgKzExNSw3IEBACiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCFyZWFsbHkgJiYgIWRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpLmlzRW1wdHkoKSkgeworCQlpZiAoIXJlYWxseSAmJiBkYi5nZXRSZWZEYXRhYmFzZSgpLmhhc1JlZnMoKSkgewogCQkJRmlsZSBkaXJlY3RvcnkgPSBkYi5nZXREaXJlY3RvcnkoKTsKIAkJCVN0cmluZyBhYnNvbHV0ZVBhdGggPSBkaXJlY3RvcnkgPT0gbnVsbCA/ICJudWxsIiAvLyROT04tTkxTLTEkCiAJCQkJCTogZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpOwpAQCAtMjI0LDcgKzIyMiw3IEBACiAKIAkJT2JqZWN0SWQgbmV3SWQ7CiAKLQkJVG9SZXdyaXRlKGZpbmFsIE9iamVjdElkIG8sIGZpbmFsIGxvbmcgdCwgZmluYWwgT2JqZWN0SWRbXSBwKSB7CisJCVRvUmV3cml0ZShPYmplY3RJZCBvLCBsb25nIHQsIE9iamVjdElkW10gcCkgewogCQkJb2xkSWQgPSBvOwogCQkJY29tbWl0VGltZSA9IHQ7CiAJCQlvbGRQYXJlbnRzID0gcDsKQEAgLTI0Nyw4ICsyNDUsNyBAQAogCiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGRiKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhyLmdldE5hbWUoKSkpCiAJCQkJY29udGludWU7CiAJCQlmaW5hbCBSZWZVcGRhdGUgdSA9IGRiLnVwZGF0ZVJlZihyLmdldE5hbWUoKSk7CkBAIC0yNjEsNyArMjU4LDcgQEAKIAkJZmluYWwgTWFwPFN0cmluZywgUmVmPiByZWZzID0gY29tcHV0ZU5ld1JlZnMoKTsKIAkJbmV3IFJlZldyaXRlcihyZWZzLnZhbHVlcygpKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYnl0ZVtdIGNvbnRlbnQpCisJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIG5hbWUsIGJ5dGVbXSBjb250ZW50KQogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBuYW1lKTsKIAkJCQlmaW5hbCBMb2NrRmlsZSBsY2sgPSBuZXcgTG9ja0ZpbGUoZmlsZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZFJlZlRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhCmluZGV4IDMxNzI0ODMuLjA2MzYwMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhCkBAIC0xNTQsMTQgKzE1NCwxNCBAQAogCQkJCQloZWFkKSk7CiAJCX0KIAotCQlmb3IgKFJlZiByIDogcmVmZGIuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiByZWZkYi5nZXRSZWZzKCkpIHsKIAkJCWlmIChyLmdldE5hbWUoKS5lcXVhbHModHhuQ29tbWl0dGVkKSB8fCByLmdldE5hbWUoKS5lcXVhbHMoSEVBRCkKIAkJCQkJfHwgci5nZXROYW1lKCkuc3RhcnRzV2l0aCh0eG5OYW1lc3BhY2UpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQljbWRzLmFkZChuZXcgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWUuQ29tbWFuZCgKIAkJCQkJbnVsbCwKLQkJCQkJZGIucGVlbChyKSkpOworCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikpKTsKIAkJfQogCQl0cmVlLmFwcGx5KGNtZHMpOwogCQlyZXR1cm4gdHJlZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NhY2hlVHJlZS5qYXZhCmluZGV4IDIwZmE0YTMuLjZiOTdlMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDYWNoZVRyZWUuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCQlzaG93KHRyZWUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KGZpbmFsIERpckNhY2hlVHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBzaG93KERpckNhY2hlVHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5jYWNoZVRyZWVQYXRoSW5mbywKIAkJCQl0cmVlLmdldFBhdGhTdHJpbmcoKSwgdmFsdWVPZih0cmVlLmdldEVudHJ5U3BhbigpKSwKIAkJCQl2YWx1ZU9mKHRyZWUuZ2V0Q2hpbGRDb3VudCgpKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhCmluZGV4IGE5NjBlYzYuLmFmNTZkNjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NvbW1hbmRzLmphdmEKQEAgLTY1LDExICs2NSwxMSBAQAogCQlmaW5hbCBDb21tYW5kUmVmW10gbGlzdCA9IENvbW1hbmRDYXRhbG9nLmFsbCgpOwogCiAJCWludCB3aWR0aCA9IDA7Ci0JCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogbGlzdCkKKwkJZm9yIChDb21tYW5kUmVmIGMgOiBsaXN0KQogCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYy5nZXROYW1lKCkubGVuZ3RoKCkpOwogCQl3aWR0aCArPSAyOwogCi0JCWZvciAoZmluYWwgQ29tbWFuZFJlZiBjIDogbGlzdCkgeworCQlmb3IgKENvbW1hbmRSZWYgYyA6IGxpc3QpIHsKIAkJCWVycncucHJpbnQoYy5pc0NvbW1vbigpID8gJyonIDogJyAnKTsKIAkJCWVycncucHJpbnQoJyAnKTsKIApAQCAtODcsNyArODcsNyBAQAogCQkvKiogKi8KIAkJVVNBR0UgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJU3RyaW5nIHVzYWdlID0gYy5nZXRVc2FnZSgpOwogCQkJCWlmICh1c2FnZSAhPSBudWxsICYmIHVzYWdlLmxlbmd0aCgpID4gMCkKIAkJCQkJZXJyLnByaW50KENMSVRleHQuZ2V0KCkucmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcodXNhZ2UpKTsKQEAgLTk3LDcgKzk3LDcgQEAKIAkJLyoqICovCiAJCUNMQVNTRVMgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZXJyLnByaW50KGMuZ2V0SW1wbGVtZW50YXRpb25DbGFzc05hbWUoKSk7CiAJCQl9CiAJCX0sCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJLyoqICovCiAJCVVSTFMgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZmluYWwgQ2xhc3NMb2FkZXIgbGRyID0gYy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTG9hZGVyKCk7CiAKIAkJCQlTdHJpbmcgY24gPSBjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dQYWNrRGVsdGEuamF2YQppbmRleCBiYmMxYjBmLi5mMzllY2JlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93UGFja0RlbHRhLmphdmEKQEAgLTEyNSwxMiArMTI1LDEzIEBACiAJCQlwdHIrKzsKIAkJcHRyKys7CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIHJhdyA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChidWZBcnJheS5sZW5ndGgpOwotCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZBcnJheSwgcHRyLCBidWZBcnJheS5sZW5ndGgpKTsKLQkJcmF3LmNvcHkoaW5mKTsKLQkJaW5mLmNsb3NlKCk7Ci0JCXJldHVybiByYXcudG9CeXRlQXJyYXkoKTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCByYXcgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoCisJCQkJYnVmQXJyYXkubGVuZ3RoKTsKKwkJCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAorCQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZkFycmF5LCBwdHIsCisJCQkJCQkJCWJ1ZkFycmF5Lmxlbmd0aCkpKSB7CisJCQlyYXcuY29weShpbmYpOworCQkJcmV0dXJuIHJhdy50b0J5dGVBcnJheSgpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQppbmRleCA4M2I3YmNlLi5iYjUxYjUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQpAQCAtMjg4LDExICsyODgsOCBAQAogCQkJZWxzZQogCQkJCXJiLmZpbmRHaXREaXIoZGlyKTsKIAotCQkJUmVwb3NpdG9yeSByZXBvID0gcmIuYnVpbGQoKTsKLQkJCXRyeSB7CisJCQl0cnkgKFJlcG9zaXRvcnkgcmVwbyA9IHJiLmJ1aWxkKCkpIHsKIAkJCQlydW4ocmVwbyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXJlcG8uY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KQEAgLTUwMiw3ICs0OTksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVCaXRzKGludCBzeikgewogCQlpbnQgYml0cyA9IDMxIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhzeik7CiAJCWlmIChiaXRzID09IDApCiAJCQliaXRzID0gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhCmluZGV4IDZjYmMxYjAuLmM1ZWEwMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1dyaXRlUmVmdGFibGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuTUFTVEVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXN0YXRpYyBMaXN0PFJlZj4gcmVhZFJlZnMoU3RyaW5nIGlucHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTGlzdDxSZWY+IHJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlPYmplY3RJZCBpZCA9IE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoMCwgNDApKTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAJCUxpc3Q8TG9nRW50cnk+IGxvZyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1BhdGgpLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0obG9nUGF0aCksIENIQVJTRVQpKSkgewogCQkJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihbXixdKykiIC8vIDE6IHJlZgogCQkJCQkrICIsKFswLTldKyg/OlsuXVswLTldKyk/KSIgLy8gMjogdGltZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEKaW5kZXggNmZlNzkyNy4uYTE0ZjY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0Fic3RyYWN0VHJlZUl0ZXJhdG9ySGFuZGxlci5qYXZhCkBAIC05OCw3ICs5OCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAogCQlpZiAobmV3IEZpbGUobmFtZSkuaXNEaXJlY3RvcnkoKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0NtZExpbmVQYXJzZXIuamF2YQppbmRleCBlMDcxYmRmLi41Y2M5OGNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0NtZExpbmVQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0NtZExpbmVQYXJzZXIuamF2YQpAQCAtMTExLDcgKzExMSw3IEBACiAJICogICAgICAgICAgICAgaWYgdGhlIG9wdGlvbiBiZWFuIGNsYXNzIGlzIHVzaW5nIGFyZ3M0aiBhbm5vdGF0aW9ucwogCSAqICAgICAgICAgICAgIGluY29ycmVjdGx5LgogCSAqLwotCXB1YmxpYyBDbWRMaW5lUGFyc2VyKGZpbmFsIE9iamVjdCBiZWFuKSB7CisJcHVibGljIENtZExpbmVQYXJzZXIoT2JqZWN0IGJlYW4pIHsKIAkJdGhpcyhiZWFuLCBudWxsKTsKIAl9CiAKQEAgLTEzMCw3ICsxMzAsNyBAQAogCSAqICAgICAgICAgICAgIGlmIHRoZSBvcHRpb24gYmVhbiBjbGFzcyBpcyB1c2luZyBhcmdzNGogYW5ub3RhdGlvbnMKIAkgKiAgICAgICAgICAgICBpbmNvcnJlY3RseS4KIAkgKi8KLQlwdWJsaWMgQ21kTGluZVBhcnNlcihmaW5hbCBPYmplY3QgYmVhbiwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIENtZExpbmVQYXJzZXIoT2JqZWN0IGJlYW4sIFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihiZWFuKTsKIAkJaWYgKGJlYW4gaW5zdGFuY2VvZiBUZXh0QnVpbHRpbikgewogCQkJY21kID0gKFRleHRCdWlsdGluKSBiZWFuOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBhcnNlQXJndW1lbnQoZmluYWwgU3RyaW5nLi4uIGFyZ3MpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHRtcCA9IG5ldyBBcnJheUxpc3Q8PihhcmdzLmxlbmd0aCk7CiAJCWZvciAoaW50IGFyZ2kgPSAwOyBhcmdpIDwgYXJncy5sZW5ndGg7IGFyZ2krKykgewogCQkJZmluYWwgU3RyaW5nIHN0ciA9IGFyZ3NbYXJnaV07CkBAIC0yMzIsNyArMjMyLDcgQEAKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFycmF5IGNvbnRhaW5zIGhlbHAgb3B0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSGVscChmaW5hbCBTdHJpbmcuLi4gYXJncykgeworCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zSGVscChTdHJpbmcuLi4gYXJncykgewogCQlyZXR1cm4gVGV4dEJ1aWx0aW4uY29udGFpbnNIZWxwKGFyZ3MpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEKaW5kZXggMGU1YjBmNS4uNWY3ZTgxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L09iamVjdElkSGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAkJZmluYWwgT2JqZWN0SWQgaWQ7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YQppbmRleCAzM2Q2NjljLi5kOTlmODhlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUGF0aFRyZWVGaWx0ZXJIYW5kbGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24geworCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKIAkJZmluYWwgTGlzdDxQYXRoRmlsdGVyPiBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZvciAoaW50IGlkeCA9IDA7OyBpZHgrKykgewogCQkJZmluYWwgU3RyaW5nIHBhdGg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEKaW5kZXggZGQ4NTIwYS4uMjk1NzdlZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmVmU3BlY0hhbmRsZXIuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlzZXR0ZXIuYWRkVmFsdWUobmV3IFJlZlNwZWMocGFyYW1zLmdldFBhcmFtZXRlcigwKSkpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCmluZGV4IGQyZmE3NjQuLmI5MjVlMzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCkBAIC04OCw3ICs4OCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCVN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAogCQlib29sZWFuIGludGVyZXN0aW5nID0gdHJ1ZTsKQEAgLTExNSw3ICsxMTUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT25lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBib29sZWFuIGludGVyZXN0aW5nKQorCXByaXZhdGUgdm9pZCBhZGRPbmUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaW50ZXJlc3RpbmcpCiAJCQl0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhCmluZGV4IDk0NDQzNjMuLjg1OTIyYTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2VHJlZUhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldlRyZWVIYW5kbGVyLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24geworCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIG5hbWUgPSBwYXJhbXMuZ2V0UGFyYW1ldGVyKDApOwogCQlmaW5hbCBPYmplY3RJZCBpZDsKIAkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YQppbmRleCBkNjAwNzFmLi45MmVlYmY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1N1YmNvbW1hbmRIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAkJZmluYWwgQ29tbWFuZFJlZiBjciA9IENvbW1hbmRDYXRhbG9nLmdldChuYW1lKTsKIAkJaWYgKGNyID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggODU1Y2RhNS4uNGI4M2ZiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw1OCArMyw1OCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGVjb2RlLmphdmFld2FoO3ZlcnNpb249IlsxLjEuNiwyLjAuMCkiLAogIGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSJbMC4xLjU0LDAuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhCmluZGV4IDQzOGQyZDYuLjRkOWU4NjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0VnNKR2l0UmFuZG9tSWdub3JlUGF0dGVyblRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkJdGhpcy5naXREaXIgPSBnaXREaXI7CiAJCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwogCQkJRmlsZXMud3JpdGUoRmlsZVV0aWxzLnRvUGF0aChuZXcgRmlsZShnaXREaXIsICIuZ2l0aWdub3JlIikpLAotCQkJCQkocGF0dGVybiArICJcbiIpLmdldEJ5dGVzKFVURl84KSwgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwKKwkJCQkJKHBhdHRlcm4gKyAiXG4iKS5nZXRCeXRlcyhDSEFSU0VUKSwgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwKIAkJCQkJU3RhbmRhcmRPcGVuT3B0aW9uLlRSVU5DQVRFX0VYSVNUSU5HLAogCQkJCQlTdGFuZGFyZE9wZW5PcHRpb24uV1JJVEUpOwogCQl9CkBAIC0xODgsNyArMTg4LDcgQEAKIAkJCVByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCwgbmV3IFN0cmluZ1swXSwKIAkJCQkJZ2l0RGlyKTsKIAkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHByb2MuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKLQkJCQlvdXQud3JpdGUoKHBhdGggKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCW91dC53cml0ZSgocGF0aCArICJcbiIpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCQlvdXQuZmx1c2goKTsKIAkJCX0KIAkJCXJldHVybiBwcm9jOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQppbmRleCAzZjllZjEyLi43OWQ4ZDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQpAQCAtODUsNyArODUsNyBAQAogCiAJCWludCBlcnJvcnM7CiAKLQkJUGF0Y2hSZWFkZXIoZmluYWwgSGFzaE1hcDxTdHJpbmcsIEhhc2hNYXA8U3RyaW5nLCBTdGF0SW5mbz4+IHMpCisJCVBhdGNoUmVhZGVyKEhhc2hNYXA8U3RyaW5nLCBIYXNoTWFwPFN0cmluZywgU3RhdEluZm8+PiBzKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzdXBlcihuZXcgU3RyaW5nW10geyAiLXAiIH0pOwogCQkJc3RhdHMgPSBzOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCQlwLnBhcnNlKGJ1ZiwgMCwgYnVmLmxlbmd0aCAtIDEpOwogCQkJYXNzZXJ0RXF1YWxzKCJGaWxlIGNvdW50ICIgKyBjaWQsIGZpbGVzLnNpemUoKSwgcC5nZXRGaWxlcygpLnNpemUoKSk7CiAJCQlpZiAoIXAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChmaW5hbCBGb3JtYXRFcnJvciBlIDogcC5nZXRFcnJvcnMoKSkgeworCQkJCWZvciAoRm9ybWF0RXJyb3IgZSA6IHAuZ2V0RXJyb3JzKCkpIHsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciAiICsgZS5nZXRNZXNzYWdlKCkpOwogCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgYXQgIiArIGUuZ2V0TGluZVRleHQoKSk7CiAJCQkJfQpAQCAtMTExLDcgKzExMSw3IEBACiAJCQkJZmFpbCgiVW5leHBlY3RlZCBlcnJvciBpbiAiICsgY2lkKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBGaWxlSGVhZGVyIGZoIDogcC5nZXRGaWxlcygpKSB7CisJCQlmb3IgKEZpbGVIZWFkZXIgZmggOiBwLmdldEZpbGVzKCkpIHsKIAkJCQlmaW5hbCBTdHJpbmcgZmlsZU5hbWU7CiAJCQkJaWYgKGZoLmdldENoYW5nZVR5cGUoKSAhPSBGaWxlSGVhZGVyLkNoYW5nZVR5cGUuREVMRVRFKQogCQkJCQlmaWxlTmFtZSA9IGZoLmdldE5ld1BhdGgoKTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJCWZpbmFsIFN0cmluZyBuaWQgPSBmaWxlTmFtZSArICIgaW4gIiArIGNpZDsKIAkJCQlhc3NlcnROb3ROdWxsKCJObyAiICsgbmlkLCBzKTsKIAkJCQlpbnQgYWRkZWQgPSAwLCBkZWxldGVkID0gMDsKLQkJCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKKwkJCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKIAkJCQkJYWRkZWQgKz0gaC5nZXRPbGRJbWFnZSgpLmdldExpbmVzQWRkZWQoKTsKIAkJCQkJZGVsZXRlZCArPSBoLmdldE9sZEltYWdlKCkuZ2V0TGluZXNEZWxldGVkKCk7CiAJCQkJfQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQlhc3NlcnRUcnVlKCJNaXNzZWQgZmlsZXMgaW4gIiArIGNpZCwgZmlsZXMuaXNFbXB0eSgpKTsKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChmaW5hbCBieXRlW10gYnVmKSB7CisJCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcChieXRlW10gYnVmKSB7CiAJCQlTdHJpbmcgc3RyOwogCQkJdHJ5IHsKIAkJCQlzdHIgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgYnVmLmxlbmd0aCAtIDEsICJJU08tODg1OS0xIik7CkBAIC0xODgsNyArMTg4LDcgQEAKIAlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29tbWl0UmVhZGVyIHsKIAkJcHJpdmF0ZSBQcm9jZXNzIHByb2M7CiAKLQkJQ29tbWl0UmVhZGVyKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbW1pdFJlYWRlcihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgU3RyaW5nW10gcmVhbEFyZ3MgPSBuZXcgU3RyaW5nWzMgKyBhcmdzLmxlbmd0aCArIDFdOwogCQkJcmVhbEFyZ3NbMF0gPSAiZ2l0IjsKIAkJCXJlYWxBcmdzWzFdID0gImxvZyI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvclBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM4Mzg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4KKyAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCisgKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCisgKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFNpbXBsZSBwZXJmb3JtYW5jZSB0ZXN0IGZvciBnaXQgYWRkIC8gRmlsZVRyZWVJdGVyYXRvci4KKyAqLworcHVibGljIGNsYXNzIEZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgaW50IE5fT0ZfRklMRVMgPSA1MDE7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtYW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJbG9uZyB0aW1lc1tdID0gbmV3IGxvbmdbTl9PRl9GSUxFU107CisJCQlsb25nIHN1bSA9IDA7CisJCQlTdHJpbmcgbGFzdE5hbWUgPSBudWxsOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOX09GX0ZJTEVTOyBpKyspIHsKKwkJCQlsYXN0TmFtZSA9ICJhIiArIChpICsgMTAwMDAwKSArICIudHh0IjsKKwkJCQl3cml0ZVRyYXNoRmlsZShsYXN0TmFtZSwgIiIpOworCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obGFzdE5hbWUpLmNhbGwoKTsKKwkJCQlsb25nIGVsYXBzZWQgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0OworCQkJCXRpbWVzW2ldID0gZWxhcHNlZDsKKwkJCQlzdW0gKz0gZWxhcHNlZDsKKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgKMK1cykgIiArIHN1bSAvIDEwMDAuMCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRpbWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3lzdGVtLm91dAorCQkJCQkJLnByaW50bG4oIlRpbWUgIiArIGkgKyAiICjCtXMpID0gIiArIHRpbWVzW2ldIC8gMTAwMC4wKTsKKwkJCX0KKwkJCUZpbGVUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJCQl3YWxrLnNldEZpbHRlcihQYXRoRmlsdGVyLmNyZWF0ZShsYXN0TmFtZSkpOworCQkJCXdhbGsuYWRkVHJlZShpdGVyKTsKKwkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJaWYgKHdhbGsubmV4dCgpKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FsayB0aW1lICjCtXMpID0gIgorCQkJCQkJCSsgKFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQpIC8gMTAwMC4wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmYWlsKCJGaWxlIG5vdCBmb3VuZCIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKaW5kZXggNDNmNDAzNy4uZTZjNzEyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKQEAgLTUyLDcgKzUyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC50ZXN0PC9hcnRpZmFjdElkPgpAQCAtNjIsNiArNjIsMTAgQEAKICAgICBKVW5pdCB0ZXN0cyBmb3IgdGhlIGNvcmUgbGlicmFyeS4KICAgPC9kZXNjcmlwdGlvbj4KIAorICA8cHJvcGVydGllcz4KKyAgICA8bWF2ZW4uamF2YWRvYy5za2lwPnRydWU8L21hdmVuLmphdmFkb2Muc2tpcD4KKyAgPC9wcm9wZXJ0aWVzPgorCiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCmluZGV4IGM3NWFiNzYuLmYzNjgwMDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bApAQCAtMTksNiArMTksMTAgQEAKICAgICAgICAgaWYgImxpYiIgbm90IGluIGxhYmVsczoKICAgICAgICAgICAgIGxhYmVscy5hcHBlbmQoImxpYiIpCiAKKyAgICAgICAgIyBUT0RPKGh0dHA6Ly9lY2xpcC5zZS81MzQyODUpOiBNYWtlIHRoaXMgdGVzdCBwYXNzIHJlbGlhYmx5CisgICAgICAgICMgYW5kIHJlbW92ZSB0aGUgZmxha3kgYXR0cmlidXRlLgorICAgICAgICBmbGFreSA9IHNyYy5lbmRzd2l0aCgiQ3Jpc3NDcm9zc01lcmdlVGVzdC5qYXZhIikKKwogICAgICAgICBhZGRpdGlvbmFsX2RlcHMgPSBbXQogICAgICAgICBpZiBzcmMuZW5kc3dpdGgoIlJvb3RMb2NhbGVUZXN0LmphdmEiKToKICAgICAgICAgICAgIGFkZGl0aW9uYWxfZGVwcyA9IFsKQEAgLTUyLDUgKzU2LDYgQEAKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Omp1bml0IiwKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmxmczpqZ2l0LWxmcyIsCiAgICAgICAgICAgICBdLAorICAgICAgICAgICAgZmxha3kgPSBmbGFreSwKICAgICAgICAgICAgIGp2bV9mbGFncyA9IFsiLVhteDI1Nm0iLCAiLURmaWxlLmVuY29kaW5nPVVURi04Il0sCiAgICAgICAgICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEKaW5kZXggMTcyODA3Yy4uMWRkMzI5YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKIAogCXByaXZhdGUgUmF3VGV4dCBiOwogCi0JcHJpdmF0ZSBBcHBseVJlc3VsdCBpbml0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIEFwcGx5UmVzdWx0IGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gaW5pdChuYW1lLCB0cnVlLCB0cnVlKTsKIAl9CiAKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQlhc3NlcnRGYWxzZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiTm9uQVNDSUlEZWwiKS5leGlzdHMoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRGaWxlKGZpbmFsIFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0VGVzdFJlc291cmNlKHBhdGNoRmlsZSk7CiAJCWlmIChpbiA9PSBudWxsKSB7CiAJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRUZXN0UmVzb3VyY2UoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgeworCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFRlc3RSZXNvdXJjZShTdHJpbmcgcGF0Y2hGaWxlKSB7CiAJCXJldHVybiBBcHBseUNvbW1hbmRUZXN0LmNsYXNzLmdldENsYXNzTG9hZGVyKCkKIAkJCQkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2VjbGlwc2UvamdpdC9kaWZmLyIgKyBwYXRjaEZpbGUpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kVGVzdC5qYXZhCmluZGV4IGVkYWI5NmIuLjEzMDBmOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YQpAQCAtMjI5LDExICsyMjksNiBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHB1dEVudHJ5KE1vY2tPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikgewotCQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLCBsb2FkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHB1dEVudHJ5KE1vY2tPdXRwdXRTdHJlYW0gb3V0LCBPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikgewogCQkJU3RyaW5nIGNvbnRlbnQgPSBtb2RlICE9IEZpbGVNb2RlLlRSRUUgPyBuZXcgU3RyaW5nKGxvYWRlci5nZXRCeXRlcygpKSA6IG51bGw7CiAJCQllbnRyaWVzLnB1dChwYXRoLCBjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQmxhbWVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggZjM3YWExMy4uN2ExZDIyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQl0ZXN0UmVuYW1lKCJzdWJkaXIvZmlsZTEudHh0IiwgIm90aGVyZGlyL2ZpbGUxLnR4dCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB0ZXN0UmVuYW1lKGZpbmFsIFN0cmluZyBzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZGVzdFBhdGgpCisJcHJpdmF0ZSB2b2lkIHRlc3RSZW5hbWUoU3RyaW5nIHNvdXJjZVBhdGgsIFN0cmluZyBkZXN0UGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJU3RyaW5nW10gY29udGVudDEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiIH07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKaW5kZXggMmZlNDBiOS4uMDhmMWZkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTkxLDYgKzE5MSwxOCBAQAogCQkJCS0gYWxsQmVmb3JlKTsKIAl9CiAKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoSEVBRCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiSEVBRCIpLmNhbGwoKTsKKwkJZmFpbCgiQ3JlYXRlIGJyYW5jaCB3aXRoIGludmFsaWQgcmVmIG5hbWUgc2hvdWxkIGZhaWwiKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoRGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiLXgiKS5jYWxsKCk7CisJCWZhaWwoIkNyZWF0ZSBicmFuY2ggd2l0aCBpbnZhbGlkIHJlZiBuYW1lIHNob3VsZCBmYWlsIik7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdEFsbEJyYW5jaGVzU2hvdWxkTm90RGllKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNldFVwUmVwb1dpdGhSZW1vdGUoKS5icmFuY2hMaXN0KCkuc2V0TGlzdE1vZGUoTGlzdE1vZGUuQUxMKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQppbmRleCAzNTRiOWM2Li5mYmMyY2Y2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKQEAgLTMzOCw3ICszMzgsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcHJlcGFyZUNoZXJyeVBpY2soZmluYWwgR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZDb21taXQgcHJlcGFyZUNoZXJyeVBpY2soR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSwgYWRkIGFuZCBjb21taXQgZmlsZSBhCiAJCXdyaXRlVHJhc2hGaWxlKCJhIiwgImEiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCmluZGV4IDBkZDM3NDkuLjNhMTNhYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuRW10cHlDb21taXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtcHR5Q29tbWl0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Xcm9uZ1JlcG9zaXRvcnlTdGF0ZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGU7CkBAIC01NTMsOCArNTUzLDggQEAKIAkJCQlnaXQuY29tbWl0KCkuc2V0QXV0aG9yKCJOZXcgQXV0aG9yIiwgIm5ld2F1dGhvckBleGFtcGxlLm9yZyIpCiAJCQkJCQkuc2V0TWVzc2FnZSgiYWdhaW4gbm8gY2hhbmdlIikuc2V0QWxsb3dFbXB0eShmYWxzZSkKIAkJCQkJCS5jYWxsKCk7Ci0JCQkJZmFpbCgiRGlkbid0IGdldCB0aGUgZXhwZWN0ZWQgRW10cHlDb21taXRFeGNlcHRpb24iKTsKLQkJCX0gY2F0Y2ggKEVtdHB5Q29tbWl0RXhjZXB0aW9uIGUpIHsKKwkJCQlmYWlsKCJEaWRuJ3QgZ2V0IHRoZSBleHBlY3RlZCBFbXB0eUNvbW1pdEV4Y2VwdGlvbiIpOworCQkJfSBjYXRjaCAoRW1wdHlDb21taXRFeGNlcHRpb24gZSkgewogCQkJCS8vIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbgogCQkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEKaW5kZXggY2MyMWI0Ny4uYmJkNmVjMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRPbmx5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YQpAQCAtMTI4OSw3ICsxMjg5LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldEhlYWQoZmluYWwgR2l0IGdpdCwgZmluYWwgU3RyaW5nIHBhdGgpCisJc3RhdGljIHByaXZhdGUgU3RyaW5nIGdldEhlYWQoR2l0IGdpdCwgU3RyaW5nIHBhdGgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFJlcG9zaXRvcnkgcmVwbyA9IGdpdC5nZXRSZXBvc2l0b3J5KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCmluZGV4IGJlNjc4OTMuLmYyMDkzZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCkBAIC01NSw3ICs1NSw2IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5SZWZOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbnZhbGlkUGF0dGVybkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTY5LDEzICs2OCwxOCBAQAogCiAJcHJpdmF0ZSBHaXQgZ2l0OwogCi0JQFBhcmFtZXRlcgorCUBQYXJhbWV0ZXIoMCkKIAlwdWJsaWMgYm9vbGVhbiB1c2VBbm5vdGF0ZWRUYWdzOwogCi0JQFBhcmFtZXRlcnMKKwlAUGFyYW1ldGVyKDEpCisJcHVibGljIGJvb2xlYW4gZGVzY3JpYmVVc2VBbGxUYWdzOworCisJQFBhcmFtZXRlcnMobmFtZSA9ICJnaXQgdGFnIC1hIHswfT8tYTogd2l0aCBnaXQgZGVzY3JpYmUgezF9Py0tdGFnczoiKQogCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxCb29sZWFuW10+IGdldFVzZUFubm90YXRlZFRhZ3NWYWx1ZXMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBCb29sZWFuW11bXSB7IHsgQm9vbGVhbi5UUlVFIH0sCi0JCQkJeyBCb29sZWFuLkZBTFNFIH0gfSk7CisJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBCb29sZWFuW11bXSB7IHsgQm9vbGVhbi5UUlVFLCBCb29sZWFuLkZBTFNFIH0sCisJCQkJeyBCb29sZWFuLkZBTFNFLCBCb29sZWFuLkZBTFNFIH0sCisJCQkJeyBCb29sZWFuLlRSVUUsIEJvb2xlYW4uVFJVRSB9LAorCQkJCXsgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5UUlVFIH0gfSk7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC0xMDAsMzUgKzEwNCw1MiBAQAogCQl0YWcoImJvYi10MiIpOwogCiAJCU9iamVjdElkIGM0ID0gbW9kaWZ5KCJkZGQiKTsKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIzZTU2M2M1Iik7CiAKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMSkpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMxLCB0cnVlKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzEsICJhKiIsICJiKiIsICJjKiIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYWxpY2UqIikpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMyLCAiYm9iKiIpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMiwgIj9vYioiKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMiwgImEqIiwgImIqIiwgImMqIikpOwogCi0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMC1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYWxpY2UqIikpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTEtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgImE/P2M/LXQqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiYm9iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgIj9vYioiKSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJhKiIsICJiKiIsICJjKiIpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgfHwgZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMiwgImFsaWNlKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMiwgImEqIiwgImIqIiwgImMqIikpOwogCi0JCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiM2U1NjNjNSIpOwotCQkvLyB0aGUgdmFsdWUgdmVyaWZpZWQgd2l0aCBnaXQtZGVzY3JpYmUoMSkKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0KSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTItZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImFsaWNlKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYm9iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0wLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsIHRydWUpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhPz9jPy10KiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJib2IqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgIj9vYioiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiYSoiLCAiYioiLCAiYyoiKSk7CisKKwkJCS8vIHRoZSB2YWx1ZSB2ZXJpZmllZCB3aXRoIGdpdC1kZXNjcmliZSgxKQorCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0KSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsIHRydWUpKTsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMi1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYm9iKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImEqIiwgImIqIiwgImMqIikpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMyKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzMpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAKIAkJLy8gdGVzdCBkZWZhdWx0IHRhcmdldAotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZ2l0LmRlc2NyaWJlKCkuY2FsbCgpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBnaXQuZGVzY3JpYmUoKS5jYWxsKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsCisJCQkJCWdpdC5kZXNjcmliZSgpLnNldFRhZ3MoZmFsc2UpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwKKwkJCQkJZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyh0cnVlKS5jYWxsKCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5kZXNjcmliZSgpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyhmYWxzZSkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLAorCQkJCQlnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKHRydWUpLmNhbGwoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTQzLDEyICsxNjQsMTcgQEAKIAkJdGFnKCJ2MS4xLjEiKTsKIAkJT2JqZWN0SWQgYzIgPSBtb2RpZnkoImJiYiIpOwogCisJCWlmICghdXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzEpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMikpOworCQkJcmV0dXJuOworCQl9CisKIAkJLy8gRW5zdXJlIHRoYXQgaWYgd2UncmUgaW50ZXJlc3RlZCBpbiBhbnkgdGFncywgd2UgZ2V0IHRoZSBtb3N0IHJlY2VudCB0YWcKIAkJLy8gYXMgcGVyIEdpdCBiZWhhdmlvdXIgc2luY2UgMS43LjEuMQogCQlpZiAodXNlQW5ub3RhdGVkVGFncykgewogCQkJYXNzZXJ0RXF1YWxzKCJ2MS4xLjEiLCBkZXNjcmliZShjMSkpOwogCQkJYXNzZXJ0RXF1YWxzKCJ2MS4xLjEtMS1nYjg5ZGVhZCIsIGRlc2NyaWJlKGMyKSk7Ci0KIAkJCS8vIEVuc3VyZSB0aGF0IGlmIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBvbmUgb2YgbXVsdGlwbGUgdGFncywgd2UgZ2V0IHRoZSByaWdodCBtYXRjaAogCQkJYXNzZXJ0RXF1YWxzKCJ2MS4wLjEiLCBkZXNjcmliZShjMSwgInYxLjAqIikpOwogCQkJYXNzZXJ0RXF1YWxzKCJ2MS4xLjEiLCBkZXNjcmliZShjMSwgInYxLjEqIikpOwpAQCAtMjA0LDcgKzIzMCwxMSBAQAogCQlPYmplY3RJZCBjNCA9IG1lcmdlKGMyKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjExOTg5MmIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0LTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLyAyIGNvbW1pdHM6IGM0IGFuZCBjMworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiMiBjb21taXRzOiBjNCBhbmQgYzMiLCAidC0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzMpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMywgdHJ1ZSkpOwogCX0KQEAgLTIzNiwxNCArMjY2LDc2IEBACiAJCWJyYW5jaCgiYiIsIGMxKTsKIAogCQlPYmplY3RJZCBjMyA9IG1vZGlmeSgiY2NjIik7CisJCWFzc2VydE5hbWVTdGFydHNXaXRoKGMzLCAiMDI0NGU3ZiIpOwogCiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOwotCQlhc3NlcnRFcXVhbHMoInQyLTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLyAyIGNvbW1pdHM6IGM0IGFuZCBjMworCisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0Mi0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8gMiBjb21taXRzOiBjNCBhbmQgYzMKKwkJCWFzc2VydEVxdWFscygidDEtMS1nMDI0NGU3ZiIsIGRlc2NyaWJlKGMzKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzQpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOworCQl9CisJfQorCisJLyoqCisJICogV2hlbiB0MSBhbm5vdGF0ZWQgZG9taW5hdGVzIHQyIGxpZ2h0d2VpZ2h0IHRhZworCSAqCisJICogPHByZT4KKwkgKiB0MSAtKy0+IHQyICAtCisJICogICAgIHwgICAgICAgfAorCSAqICAgICArLT4gYzMgLSstPiBjNAorCSAqIDwvcHJlPgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHQxQW5ub3RhdGVkRG9taW5hdGVzVDJsaWdodHdlaWdodCgpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3RJZCBjMSA9IG1vZGlmeSgiYWFhIik7CisJCXRhZygidDEiLCB1c2VBbm5vdGF0ZWRUYWdzKTsKKworCQlPYmplY3RJZCBjMiA9IG1vZGlmeSgiYmJiIik7CisJCXRhZygidDIiLCBmYWxzZSk7CisKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzIsICIzNzQ3ZGIzIik7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzICYmICFkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIm9ubHkgYW5ub3RhdGVkIHRhZyB0MSBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBkZXNjcmliZSIsCisJCQkJCSJ0MS0xLWczNzQ3ZGIzIiwgZGVzY3JpYmUoYzIpKTsgLy8gMSBjb21taXRzOiB0MiBvdmVycmlkZGVuCisJCQkJCQkJCQkJCQkJLy8gYnkgdDEKKwkJfSBlbHNlIGlmICghdXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoIm5vIGNvbW1pdHMgdG8gZGVzY3JpYmUgZXhwZWN0ZWQiLCBudWxsLCBkZXNjcmliZShjMikpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKCJsaWdodHdlaWdodCB0YWcgdDIgZXhwZWN0ZWQgaW4gZGVzY3JpYmUiLCAidDIiLAorCQkJCQlkZXNjcmliZShjMikpOworCQl9CisKKwkJYnJhbmNoKCJiIiwgYzEpOworCisJCU9iamVjdElkIGMzID0gbW9kaWZ5KCJjY2MiKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjMywgIjAyNDRlN2YiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0MS0xLWcwMjQ0ZTdmIiwgZGVzY3JpYmUoYzMpKTsKKwkJaWYgKHVzZUFubm90YXRlZFRhZ3MgfHwgZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoInQxLTEtZzAyNDRlN2YiLCBkZXNjcmliZShjMykpOworCQl9CisKKwkJT2JqZWN0SWQgYzQgPSBtZXJnZShjMik7CisKKwkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIxMTk4OTJiIik7CisJCWlmIChkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIjIgY29tbWl0cyBmb3IgZGVzY3JpYmUgY29tbWl0IGluY3JlbWVudCBleHBlY3RlZCBzaW5jZSBsaWdodHdlaWdodCB0YWc6IGM0IGFuZCBjMyIsCisJCQkJCSJ0Mi0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8gMiBjb21taXRzOiBjNCBhbmQgYzMKKwkJfSBlbHNlIGlmICghdXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoIm5vIG1hdGNoaW5nIGNvbW1pdHMgZXhwZWN0ZWQiLCBudWxsLCBkZXNjcmliZShjNCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiMyBjb21taXRzIGZvciBkZXNjcmliZSBjb21taXQgaW5jcmVtZW50IGV4cGVjdGVkIHNpbmNlIGFubm90YXRlZCB0YWc6IGM0IGFuZCBjMyBhbmQgYzIiLAorCQkJCQkidDEtMy1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vCisJCX0KIAl9CiAKIAkvKioKQEAgLTI3MSw3ICszNjMsMTEgQEAKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZSh0MSk7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDEtMy1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0zLWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJLyoqCkBAIC0zMDAsNyArMzk2LDExIEBACiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiYmIzODlhNCIpOwotCQlhc3NlcnRFcXVhbHMoInQyLTQtZ2JiMzg5YTQiLCBkZXNjcmliZShjNCkpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygidDItNC1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzQpKTsKKwkJfQogCX0KIAogCXByaXZhdGUgT2JqZWN0SWQgbWVyZ2UoT2JqZWN0SWQgYzIpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewpAQCAtMzE0LDEwICs0MTQsMTUgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgdGFnKFN0cmluZyB0YWcpIHRocm93cyBHaXRBUElFeGNlcHRpb24geworCQl0YWcodGFnLCB0aGlzLnVzZUFubm90YXRlZFRhZ3MpOworCX0KKworCXByaXZhdGUgdm9pZCB0YWcoU3RyaW5nIHRhZywgYm9vbGVhbiBhbm5vdGF0ZWRUYWcpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQlUYWdDb21tYW5kIHRhZ0NvbW1hbmQgPSBnaXQudGFnKCkuc2V0TmFtZSh0YWcpCi0JCQkJLnNldEFubm90YXRlZCh1c2VBbm5vdGF0ZWRUYWdzKTsKLQkJaWYgKHVzZUFubm90YXRlZFRhZ3MpCisJCQkJLnNldEFubm90YXRlZChhbm5vdGF0ZWRUYWcpOworCQlpZiAoYW5ub3RhdGVkVGFnKSB7CiAJCQl0YWdDb21tYW5kLnNldE1lc3NhZ2UodGFnKTsKKwkJfQogCQl0YWdDb21tYW5kLmNhbGwoKTsKIAl9CiAKQEAgLTMyOSwxNSArNDM0LDE3IEBACiAKIAlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgYm9vbGVhbiBsb25nRGVzYykKIAkJCXRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0TG9uZyhsb25nRGVzYykuY2FsbCgpOworCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRUYWdzKGRlc2NyaWJlVXNlQWxsVGFncykKKwkJCQkuc2V0TG9uZyhsb25nRGVzYykuY2FsbCgpOwogCX0KIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBkZXNjcmliZShjMSwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBTdHJpbmcuLi4gcGF0dGVybnMpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBJbnZhbGlkUGF0dGVybkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldE1hdGNoKHBhdHRlcm5zKS5jYWxsKCk7CisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIFN0cmluZy4uLiBwYXR0ZXJucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQorCQkJCS5zZXRNYXRjaChwYXR0ZXJucykuY2FsbCgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoT2JqZWN0SWQgYzQsIFN0cmluZyBwcmVmaXgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFN0cmVhbVR5cGVVdGlsVGVzdC5qYXZhCmluZGV4IDFlM2EzOWEuLmJiMzAzY2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5BVVRPX0NSTEY7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5BVVRPX0xGOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnLkVvbFN0cmVhbVR5cGUuRElSRUNUOwpAQCAtMTUwLDggKzE1MCw4IEBACiAJCQlFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVXaXRoQmluYXJ5Q2hlY2ssIFN0cmluZyBvdXRwdXQsCiAJCQlTdHJpbmcgZXhwZWN0ZWRDb252ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGI7Ci0JCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IG91dHB1dC5nZXRCeXRlcyhVVEZfOCk7Ci0JCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IG91dHB1dC5nZXRCeXRlcyhDSEFSU0VUKTsKKwkJYnl0ZVtdIGV4cGVjdGVkQ29udmVyc2lvbkJ5dGVzID0gZXhwZWN0ZWRDb252ZXJzaW9uLmdldEJ5dGVzKENIQVJTRVQpOwogCiAJCS8vIHRlc3QgdXNpbmcgb3V0cHV0IHRleHQgYW5kIGFzc3VtaW5nIGl0IHdhcyBkZWNsYXJlZCBURVhUCiAJCWIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CkBAIC0yNzcsOCArMjc3LDggQEAKIAlwcml2YXRlIHZvaWQgdGVzdENoZWNraW4oRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlVGV4dCwKIAkJCUVvbFN0cmVhbVR5cGUgc3RyZWFtVHlwZVdpdGhCaW5hcnlDaGVjaywgU3RyaW5nIGlucHV0LAogCQkJU3RyaW5nIGV4cGVjdGVkQ29udmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBpbnB1dEJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoVVRGXzgpOwotCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gaW5wdXRCeXRlcyA9IGlucHV0LmdldEJ5dGVzKENIQVJTRVQpOworCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAKIAkJLy8gdGVzdCB1c2luZyBpbnB1dCB0ZXh0IGFuZCBhc3N1bWluZyBpdCB3YXMgZGVjbGFyZWQgVEVYVAogCQl0cnkgKElucHV0U3RyZWFtIGluID0gRW9sU3RyZWFtVHlwZVV0aWwud3JhcElucHV0U3RyZWFtKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YQppbmRleCA1MzBmYjFiLi5hZGM0ZDk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YQpAQCAtNDMsMTIgKzQzLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5KR2l0VGVzdFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwpAQCAtMTA1LDYgKzExMCwyNSBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcmNlZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQiKS5jYWxsKCk7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQyIikuY2FsbCgpOworCQlnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9tYXN0ZXIiKS5jYWxsKCk7CisKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldEFtZW5kKHRydWUpLnNldE1lc3NhZ2UoImFtZW5kZWQiKS5jYWxsKCk7CisJCUZldGNoUmVzdWx0IHJlcyA9IGdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RXF1YWxzKFJlZlVwZGF0ZS5SZXN1bHQuUkVKRUNURUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwkJcmVzID0gZ2l0LmZldGNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkuc2V0UmVmU3BlY3MoInJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyIikKKwkJCQkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkuY2FsbCgpOworCQlhc3NlcnRFcXVhbHMoUmVmVXBkYXRlLlJlc3VsdC5GT1JDRUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkc0JyYW5jaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2gxID0gImIxIjsKIAkJZmluYWwgU3RyaW5nIGJyYW5jaDIgPSAiYjIiOwpAQCAtMjc1LDYgKzI5OSw0NSBAQAogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aFBydW5lU2hvdWxkS2VlcE9yaWdpbkhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGEgY29tbWl0IGluIHRoZSB0ZXN0IHJlcG8uCisJCWNvbW1pdEZpbGUoImZvbyIsICJmb28iLCAibWFzdGVyIik7CisJCS8vIFByb2R1Y2UgYSByZWFsIGNsb25lIG9mIHRoZSBnaXQgcmVwbworCQlHaXQgY2xvbmVkID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q2xvbmVSZXBvc2l0b3J5IikpCisJCQkJLnNldFVSSSgiZmlsZTovLyIKKwkJCQkJCSsgZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpKQorCQkJCS5jYWxsKCk7CisJCWFzc2VydE5vdE51bGwoY2xvbmVkKTsKKwkJUmVwb3NpdG9yeSBjbG9uZWRSZXBvID0gY2xvbmVkLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoY2xvbmVkUmVwbyk7CisJCU9iamVjdElkIG9yaWdpbk1hc3RlcklkID0gY2xvbmVkUmVwbworCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSBvcmlnaW4vbWFzdGVyIiwgb3JpZ2luTWFzdGVySWQpOworCQlhc3NlcnROb3RFcXVhbHMoIm9yaWdpbi9tYXN0ZXIgc2hvdWxkIG5vdCBiZSB6ZXJvIElEIiwKKwkJCQlPYmplY3RJZC56ZXJvSWQoKSwgb3JpZ2luTWFzdGVySWQpOworCQkvLyBDYW5vbmljYWwgZ2l0IGNyZWF0ZXMgb3JpZ2luL0hFQUQ7IEpHaXQgKGZvciBub3cpIGRvZXNuJ3QuIExldCdzCisJCS8vIHByZXRlbmQgd2UgZGlkIHRoZSBjbG9uZSB2aWEgY29tbWFuZC1saW5lIGdpdC4KKwkJT2JqZWN0SWQgb3JpZ2luSGVhZElkID0gY2xvbmVkUmVwby5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQiKTsKKwkJaWYgKG9yaWdpbkhlYWRJZCA9PSBudWxsKSB7CisJCQlKR2l0VGVzdFV0aWwud3JpdGUoCisJCQkJCW5ldyBGaWxlKGNsb25lZFJlcG8uZ2V0RGlyZWN0b3J5KCksCisJCQkJCQkJInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpLAorCQkJCQkicmVmOiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlclxuIik7CisJCQlvcmlnaW5IZWFkSWQgPSBjbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpOworCQl9CisJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgb3JpZ2luL0hFQUQiLCBvcmlnaW5NYXN0ZXJJZCwgb3JpZ2luSGVhZElkKTsKKwkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gY2xvbmVkLmZldGNoKCkuc2V0UmVtb3RlKCJvcmlnaW4iKQorCQkJCS5zZXRSZW1vdmVEZWxldGVkUmVmcyh0cnVlKS5jYWxsKCk7CisJCWFzc2VydFRydWUoIkZldGNoIGFmdGVyIGNsb25lIHNob3VsZCBiZSB1cC10by1kYXRlIiwKKwkJCQlyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJvcmlnaW4vbWFzdGVyIHNob3VsZCBzdGlsbCBleGlzdCIsIG9yaWdpbk1hc3RlcklkLAorCQkJCWNsb25lZFJlcG8ucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKSk7CisJCWFzc2VydEVxdWFscygib3JpZ2luL0hFQUQgc2hvdWxkIGJlIHVuY2hhbmdlZCIsIG9yaWdpbkhlYWRJZCwKKwkJCQljbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkUmVmc1dpdGhEdXBsaWNhdGVSZWZzcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2hOYW1lID0gImJyYW5jaCI7CiAJCWZpbmFsIFN0cmluZyByZW1vdGVCcmFuY2hOYW1lID0gInRlc3QvIiArIGJyYW5jaE5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEKaW5kZXggYmQwZWZhZC4uNGVmNTExZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZFRlc3QuamF2YQpAQCAtMTE2LDcgKzExNiw3IEBACiAJCUl0ZXJhdG9yPFJldkNvbW1pdD4gbG9nID0gZ2l0LmxvZygpLmFsbCgpLmNhbGwoKS5pdGVyYXRvcigpOwogCQlhc3NlcnRUcnVlKGxvZy5oYXNOZXh0KCkpOwogCQlSZXZDb21taXQgY29tbWl0ID0gbG9nLm5leHQoKTsKLQkJdGFnID0gZGIucGVlbCh0YWcpOworCQl0YWcgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnKTsKIAogCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldE5hbWUoKSwgdGFnLmdldFBlZWxlZE9iamVjdElkKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZShjb21taXRzLmNvbnRhaW5zKGNvbW1pdCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCA0YjIzMzQ5Li45YWYwMDNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLk1lcmdlQ29tbWFuZC5GYXN0Rm9yd2FyZE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VSZXN1bHQuTWVyZ2VTdGF0dXM7CkBAIC0xNTg0LDI3ICsxNTg1LDMxIEBACiAJCWFzc2VydEVxdWFscyhNZXJnZVN0YXR1cy5DT05GTElDVElORywgcmVzdWx0LmdldE1lcmdlU3RhdHVzKCkpOwogCX0KIAorCXByaXZhdGUgUmVmIHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7CisJCVJldkNvbW1pdCBpbml0aWFsQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwiKS5jYWxsKCk7CisKKwkJY3JlYXRlQnJhbmNoKGluaXRpYWxDb21taXQsICJyZWZzL2hlYWRzL3NpZGUiKTsKKwkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvc2lkZSIpOworCisJCXdyaXRlVHJhc2hGaWxlKCJiIiwgIjFcbmJcbjNcbiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImIiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJzaWRlIikuY2FsbCgpOworCisJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL21hc3RlciIpOworCisJCXdyaXRlVHJhc2hGaWxlKCJjIiwgIjFcbmNcbjNcbiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImMiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJtYWluIikuY2FsbCgpOworCisJCXJldHVybiBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9zaWRlIik7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoTWVzc2FnZU9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewotCQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYVxuM1xuIik7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7Ci0JCQlSZXZDb21taXQgaW5pdGlhbENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIikuY2FsbCgpOwotCi0JCQljcmVhdGVCcmFuY2goaW5pdGlhbENvbW1pdCwgInJlZnMvaGVhZHMvc2lkZSIpOwotCQkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvc2lkZSIpOwotCi0JCQl3cml0ZVRyYXNoRmlsZSgiYiIsICIxXG5iXG4zXG4iKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYiIpLmNhbGwoKTsKLQkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJzaWRlIikuY2FsbCgpOwotCi0JCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKTsKLQotCQkJd3JpdGVUcmFzaEZpbGUoImMiLCAiMVxuY1xuM1xuIik7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImMiKS5jYWxsKCk7Ci0JCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWFpbiIpLmNhbGwoKTsKLQotCQkJUmVmIHNpZGVCcmFuY2ggPSBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9zaWRlIik7CisJCQlSZWYgc2lkZUJyYW5jaCA9IHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoZ2l0KTsKIAogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCiAJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CkBAIC0xNjE4LDYgKzE2MjMsNDMgQEAKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhDaGFuZ2VJZCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJUmVmIHNpZGVCcmFuY2ggPSBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKGdpdCk7CisKKwkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKQorCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQodHJ1ZSkuY2FsbCgpOworCisJCQlhc3NlcnROdWxsKGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKworCQkJSXRlcmF0b3I8UmV2Q29tbWl0PiBpdCA9IGdpdC5sb2coKS5jYWxsKCkuaXRlcmF0b3IoKTsKKwkJCVJldkNvbW1pdCBuZXdIZWFkID0gaXQubmV4dCgpOworCQkJU3RyaW5nIGNvbW1pdE1lc3NhZ2UgPSBuZXdIZWFkLmdldEZ1bGxNZXNzYWdlKCk7CisJCQlhc3NlcnRUcnVlKFBhdHRlcm4uY29tcGlsZSgiXG5DaGFuZ2UtSWQ6IElbMC05YS1mQS1GXXs0MH1cbiIpCisJCQkJCS5tYXRjaGVyKGNvbW1pdE1lc3NhZ2UpLmZpbmQoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhNZXNzYWdlQW5kQ2hhbmdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCVJlZiBzaWRlQnJhbmNoID0gcHJlcGFyZVN1Y2Nlc3NmdWxNZXJnZShnaXQpOworCisJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKKwkJCQkJLnNldE1lc3NhZ2UoInVzZXIgbWVzc2FnZSIpLnNldEluc2VydENoYW5nZUlkKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0TnVsbChkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisKKwkJCUl0ZXJhdG9yPFJldkNvbW1pdD4gaXQgPSBnaXQubG9nKCkuY2FsbCgpLml0ZXJhdG9yKCk7CisJCQlSZXZDb21taXQgbmV3SGVhZCA9IGl0Lm5leHQoKTsKKwkJCVN0cmluZyBjb21taXRNZXNzYWdlID0gbmV3SGVhZC5nZXRGdWxsTWVzc2FnZSgpOworCQkJYXNzZXJ0VHJ1ZShjb21taXRNZXNzYWdlLnN0YXJ0c1dpdGgoInVzZXIgbWVzc2FnZVxuXG4iKSk7CisJCQlhc3NlcnRUcnVlKFBhdHRlcm4uY29tcGlsZSgiXG5DaGFuZ2UtSWQ6IElbMC05YS1mQS1GXXs0MH1cbiIpCisJCQkJCS5tYXRjaGVyKGNvbW1pdE1lc3NhZ2UpLmZpbmQoKSk7CisJCX0KKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNZXJnZUNvbmZsaWN0V2l0aE1lc3NhZ2VPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKIAkJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOwpAQCAtMTY1Nyw3ICsxNjk5LDcgQEAKIAkJCQkuZ2V0V29ya1RyZWUoKSwgcGF0aCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFJldkNvbW1pdCBhZGRBbGxBbmRDb21taXQoZmluYWwgR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgUmV2Q29tbWl0IGFkZEFsbEFuZENvbW1pdChHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOwogCQlyZXR1cm4gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm1lc3NhZ2UiKS5jYWxsKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Ob3Rlc0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YQppbmRleCA2ZTA2ZTk1Li5lMjM0YWEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC04OCw3ICs4OCw3IEBACiAJCWdpdC5ub3Rlc0FkZCgpLnNldE9iamVjdElkKGNvbW1pdDIpLnNldE1lc3NhZ2UoImRhdGEiKS5jYWxsKCk7CiAJCU5vdGUgbm90ZSA9IGdpdC5ub3Rlc1Nob3coKS5zZXRPYmplY3RJZChjb21taXQyKS5jYWxsKCk7CiAJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhkYi5vcGVuKG5vdGUuZ2V0RGF0YSgpKS5nZXRDYWNoZWRCeXRlcygpLAotCQkJCVVURl84KTsKKwkJCQlDSEFSU0VUKTsKIAkJYXNzZXJ0RXF1YWxzKGNvbnRlbnQsICJkYXRhIik7CiAKIAkJZ2l0Lm5vdGVzUmVtb3ZlKCkuc2V0T2JqZWN0SWQoY29tbWl0MikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKaW5kZXggOTQ2MWM0Mi4uMGIwZTNiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTU5Miw3ICs1OTIsNyBAQAogCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoRmlsZSBhY3RGaWxlLCBTdHJpbmcgc3RyaW5nKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFjdEZpbGUpKSB7Ci0JCQlmb3Mud3JpdGUoc3RyaW5nLmdldEJ5dGVzKFVURl84KSk7CisJCQlmb3Mud3JpdGUoc3RyaW5nLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJfQogCX0KIApAQCAtNjA2LDcgKzYwNiw3IEBACiAJCQkJYm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7CiAJCQkJcmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcik7CiAJCQl9Ci0JCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIFVURl84KTsKKwkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCk7CiAJCQlhc3NlcnRFcXVhbHMoc3RyaW5nLCBjb250ZW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKaW5kZXggOTEzYjRhYy4uYjM0OWM2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJCQlib3Mud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKIAkJCQlyZWFkID0gZmlzLnJlYWQoYnVmZmVyKTsKIAkJCX0KLQkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgVVRGXzgpOworCQkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpLCBDSEFSU0VUKTsKIAkJCWFzc2VydEVxdWFscyhzdHJpbmcsIGNvbnRlbnQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKaW5kZXggZTBjMTQ5OS4uMWFmMzdlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcml2YXRlIEZpbGUgd3JpdGVIb29rRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpICsgIi8uZ2l0L2hvb2tzLyIsIG5hbWUpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUocGF0aCwgZGF0YSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggMmJmOTFhZS4uOTZlNzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CkBAIC0xNDY0LDcgKzE0NjQsNyBAQAogCQlhc3NlcnRFcXVhbHMoIkdJVF9BVVRIT1JfREFURT0nQDEyMzQ1Njc4OSAtMDEwMCciLCBsaW5lc1syXSk7CiAKIAkJUGVyc29uSWRlbnQgcGFyc2VkSWRlbnQgPSBnaXQucmViYXNlKCkucGFyc2VBdXRob3IoCi0JCQkJY29udmVydGVkQXV0aG9yLmdldEJ5dGVzKFVURl84KSk7CisJCQkJY29udmVydGVkQXV0aG9yLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0RXF1YWxzKGlkZW50LmdldE5hbWUoKSwgcGFyc2VkSWRlbnQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKGlkZW50LmdldEVtYWlsQWRkcmVzcygpLCBwYXJzZWRJZGVudC5nZXRFbWFpbEFkZHJlc3MoKSk7CiAJCS8vIHRoaXMgaXMgcm91bmRlZCB0byB0aGUgbGFzdCBzZWNvbmQKQEAgLTE0ODEsNyArMTQ4MSw3IEBACiAJCWFzc2VydEVxdWFscygiR0lUX0FVVEhPUl9EQVRFPSdAMTIzNDU2Nzg5ICswOTMwJyIsIGxpbmVzWzJdKTsKIAogCQlwYXJzZWRJZGVudCA9IGdpdC5yZWJhc2UoKS5wYXJzZUF1dGhvcigKLQkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0TmFtZSgpLCBwYXJzZWRJZGVudC5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0RW1haWxBZGRyZXNzKCksIHBhcnNlZElkZW50LmdldEVtYWlsQWRkcmVzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKDEyMzQ1Njc4OTAwMEwsIHBhcnNlZElkZW50LmdldFdoZW4oKS5nZXRUaW1lKCkpOwpAQCAtMjEwNCw3ICsyMTA0LDcgQEAKIAkJaW50IGNvdW50ID0gMDsKIAkJRmlsZSB0b2RvRmlsZSA9IGdldFRvZG9GaWxlKCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0odG9kb0ZpbGUpLCBVVEZfOCkpKSB7CisJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbSh0b2RvRmlsZSksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmUgPSBici5yZWFkTGluZSgpOwogCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewogCQkJCWludCBmaXJzdEJsYW5rID0gbGluZS5pbmRleE9mKCcgJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhCmluZGV4IGJhNTE4ODEuLjhmNTZhOTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kVGVzdC5qYXZhCkBAIC0xMDAsMzkgKzEwMCwzOSBAQAogCQlGaWxlIG5lc3RlZEZpbGUgPSBuZXcgRmlsZShkaXIsICJiLnR4dCIpOwogCQlGaWxlVXRpbHMuY3JlYXRlTmV3RmlsZShuZXN0ZWRGaWxlKTsKIAotCQlQcmludFdyaXRlciBuZXN0ZXJGaWxlV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5lc3RlZEZpbGUpOwotCQluZXN0ZXJGaWxlV3JpdGVyLnByaW50KCJjb250ZW50Iik7Ci0JCW5lc3RlckZpbGVXcml0ZXIuZmx1c2goKTsKKwkJdHJ5IChQcmludFdyaXRlciBuZXN0ZWRGaWxlV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5lc3RlZEZpbGUpKSB7CisJCQluZXN0ZWRGaWxlV3JpdGVyLnByaW50KCJjb250ZW50Iik7CisJCQluZXN0ZWRGaWxlV3JpdGVyLmZsdXNoKCk7CiAKLQkJLy8gY3JlYXRlIGZpbGUKLQkJaW5kZXhGaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImEudHh0Iik7Ci0JCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKGluZGV4RmlsZSk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihpbmRleEZpbGUpOwotCQl3cml0ZXIucHJpbnQoImNvbnRlbnQiKTsKLQkJd3JpdGVyLmZsdXNoKCk7CisJCQkvLyBjcmVhdGUgZmlsZQorCQkJaW5kZXhGaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImEudHh0Iik7CisJCQlGaWxlVXRpbHMuY3JlYXRlTmV3RmlsZShpbmRleEZpbGUpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoaW5kZXhGaWxlKSkgeworCQkJCXdyaXRlci5wcmludCgiY29udGVudCIpOworCQkJCXdyaXRlci5mbHVzaCgpOwogCi0JCS8vIGFkZCBmaWxlIGFuZCBjb21taXQgaXQKLQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJkaXIiKS5hZGRGaWxlcGF0dGVybigiYS50eHQiKS5jYWxsKCk7Ci0JCXNlY29uZENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgYS50eHQgYW5kIGRpci9iLnR4dCIpCi0JCQkJLmNhbGwoKTsKKwkJCQkvLyBhZGQgZmlsZSBhbmQgY29tbWl0IGl0CisJCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJkaXIiKS5hZGRGaWxlcGF0dGVybigiYS50eHQiKS5jYWxsKCk7CisJCQkJc2Vjb25kQ29tbWl0ID0gZ2l0LmNvbW1pdCgpCisJCQkJCQkuc2V0TWVzc2FnZSgiYWRkaW5nIGEudHh0IGFuZCBkaXIvYi50eHQiKS5jYWxsKCk7CiAKLQkJcHJlc3RhZ2UgPSBEaXJDYWNoZS5yZWFkKGRiLmdldEluZGV4RmlsZSgpLCBkYi5nZXRGUygpKS5nZXRFbnRyeSgKLQkJCQlpbmRleEZpbGUuZ2V0TmFtZSgpKTsKKwkJCQlwcmVzdGFnZSA9IERpckNhY2hlLnJlYWQoZGIuZ2V0SW5kZXhGaWxlKCksIGRiLmdldEZTKCkpCisJCQkJCQkuZ2V0RW50cnkoaW5kZXhGaWxlLmdldE5hbWUoKSk7CiAKLQkJLy8gbW9kaWZ5IGZpbGUgYW5kIGFkZCB0byBpbmRleAotCQl3cml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQluZXN0ZXJGaWxlV3JpdGVyLnByaW50KCJuZXcgY29udGVudCIpOwotCQluZXN0ZXJGaWxlV3JpdGVyLmNsb3NlKCk7CisJCQkJLy8gbW9kaWZ5IGZpbGUgYW5kIGFkZCB0byBpbmRleAorCQkJCXdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKKwkJCX0KKwkJCW5lc3RlZEZpbGVXcml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7CisJCX0KIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmFkZEZpbGVwYXR0ZXJuKCJkaXIiKS5jYWxsKCk7CiAKIAkJLy8gY3JlYXRlIGEgZmlsZSBub3QgYWRkZWQgdG8gdGhlIGluZGV4CiAJCXVudHJhY2tlZEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLAogCQkJCSJub3RBZGRlZFRvSW5kZXgudHh0Iik7CiAJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKHVudHJhY2tlZEZpbGUpOwotCQlQcmludFdyaXRlciB3cml0ZXIyID0gbmV3IFByaW50V3JpdGVyKHVudHJhY2tlZEZpbGUpOwotCQl3cml0ZXIyLnByaW50KCJjb250ZW50Iik7Ci0JCXdyaXRlcjIuY2xvc2UoKTsKKwkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIyID0gbmV3IFByaW50V3JpdGVyKHVudHJhY2tlZEZpbGUpKSB7CisJCQl3cml0ZXIyLnByaW50KCJjb250ZW50Iik7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCmluZGV4IGVhNjMxMDQuLmQ3N2M0ZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKQEAgLTM3OSw3ICszNzksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcHJlcGFyZVJldmVydChmaW5hbCBHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJldkNvbW1pdCBwcmVwYXJlUmV2ZXJ0KEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUsIGFkZCBhbmQgY29tbWl0IGZpbGUgYQogCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJhIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggYjlmOWY1Yi4uM2I1ODJkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEKQEAgLTk0LDcgKzk0LDcgQEAKIAkJdW50cmFja2VkRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJ1bnRyYWNrZWQudHh0IiwgImNvbnRlbnQiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTdGFzaGVkQ29tbWl0KGZpbmFsIFJldkNvbW1pdCBjb21taXQpCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU3Rhc2hlZENvbW1pdChSZXZDb21taXQgY29tbWl0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdmFsaWRhdGVTdGFzaGVkQ29tbWl0KGNvbW1pdCwgMik7CiAJfQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybiB3YWxrOwogCX0KIAotCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+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+KEFycmF5cy5hc0xpc3QoInNyIiwgInRhcmdldCIpKSwKKwkJCQkJZGlmZi5nZXRJZ25vcmVkTm90SW5JbmRleCgpKTsKIAogCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJzcmMiKS5jYWxsKCk7CiAJCQl3cml0ZVRyYXNoRmlsZSgic3IvY29tL1gxLmphdmEiLCAiIik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEKaW5kZXggZjY4NzliOS4uMWFiMzZmMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlci52YWx1ZU9mOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbC5jb25jYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JBRDsKQEAgLTE1NjAsNyArMTU2MCw3IEBACiAJCVN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWVudHJ5KGIsICIxMDA2NDQgQSIpOwogCQllbnRyeShiLCAiMTAwNjQ0IGEiKTsKLQkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJY2hlY2tlci5zZXRTYWZlRm9yV2luZG93cyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTU3NCw3ICsxNTc0LDcgQEAKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWVudHJ5KGIsICIxMDA2NDQgYSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTU4OCw3ICsxNTg4LDcgQEAKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBcdTAwNjVcdTAzMDEiKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBcdTAwZTkiKTsKLQkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJY2hlY2tlci5zZXRTYWZlRm9yTWFjT1ModHJ1ZSk7CiAJCWFzc2VydENvcnJ1cHQoImR1cGxpY2F0ZSBlbnRyeSBuYW1lcyIsIE9CSl9UUkVFLCBkYXRhKTsKIAkJYXNzZXJ0U2tpcExpc3RBY2NlcHRzKE9CSl9UUkVFLCBkYXRhKTsKQEAgLTE2MDIsNyArMTYwMiw3IEBACiAJCVN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWVudHJ5KGIsICIxMDA2NDQgQSIpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKLQkJY2hlY2tlci5jaGVja1RyZWUoYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWNoZWNrZXIuY2hlY2tUcmVlKGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogCiAJQFRlc3QKQEAgLTE3NjIsNyArMTc2Miw3IEBACiAJCWNoZWNrZXIuc2V0U2tpcExpc3QobnVsbCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWRTZXQgc2V0KGZpbmFsIE9iamVjdElkLi4uIGlkcykgeworCXByaXZhdGUgc3RhdGljIE9iamVjdElkU2V0IHNldChPYmplY3RJZC4uLiBpZHMpIHsKIAkJcmV0dXJuIG5ldyBPYmplY3RJZFNldCgpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmFjeUdpdFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JhY3lHaXRUZXN0cy5qYXZhCmluZGV4IDkyMzZiNGUuLjhkOWNjYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmFjeUdpdFRlc3RzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YQpAQCAtMTc2LDEyICsxNzYsOSBAQAogCiAJcHJpdmF0ZSBGaWxlIGFkZFRvV29ya0RpcihTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgZiA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIHBhdGgpOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQl0cnkgeworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpIHsKIAkJCWZvcy53cml0ZShjb250ZW50LmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCXJldHVybiBmOwotCQl9IGZpbmFsbHkgewotCQkJZm9zLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVGVzdC5qYXZhCmluZGV4IDdmYjMzMDkuLjI0ODFlNjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVGVzdC5qYXZhCkBAIC01Nyw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiAKQEAgLTI1MywxMSArMjU0LDExIEBACiAJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAJCVJlZiByZWYgPSBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKTsKIAkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2UuUEFDS0VELCByZWYuZ2V0U3RvcmFnZSgpKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLAotCQkJCSJyZWZzL2hlYWRzL21hc3RlciIpKTsKLQkJb3Mud3JpdGUocmVmLmdldE9iamVjdElkKCkubmFtZSgpLmdldEJ5dGVzKCkpOwotCQlvcy53cml0ZSgnXG4nKTsKLQkJb3MuY2xvc2UoKTsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisJCQkJbmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksICJyZWZzL2hlYWRzL21hc3RlciIpKSkgeworCQkJb3Mud3JpdGUocmVmLmdldE9iamVjdElkKCkubmFtZSgpLmdldEJ5dGVzKCkpOworCQkJb3Mud3JpdGUoJ1xuJyk7CisJCX0KIAogCQlyZWYgPSBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKTsKIAkJYXNzZXJ0RXF1YWxzKFN0b3JhZ2UuTE9PU0UsIHJlZi5nZXRTdG9yYWdlKCkpOwpAQCAtMzA1LDQgKzMwNiwyNiBAQAogCQlhc3NlcnRTYW1lKGRzdC5nZXRQZWVsZWRPYmplY3RJZCgpLCByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CiAJCWFzc2VydEVxdWFscyhkc3QuaXNQZWVsZWQoKSwgcmVmLmlzUGVlbGVkKCkpOwogCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb250YWluc1JlZihMaXN0PFJlZj4gaGF5c3RhY2ssIFJlZiBuZWVkbGUpIHsKKwkJZm9yIChSZWYgcmVmIDogaGF5c3RhY2spIHsKKwkJCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscyhuZWVkbGUuZ2V0TmFtZSgpKSAmJgorCQkJCQlyZWYuZ2V0T2JqZWN0SWQoKS5lcXVhbHMobmVlZGxlLmdldE9iamVjdElkKCkpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWZhaWwoImxpc3QgIiArIGhheXN0YWNrICsgIiBkb2VzIG5vdCBjb250YWluIHJlZiAiICsgbmVlZGxlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZzQnlQcmVmaXgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlMaXN0PFJlZj4gcmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KCJyZWZzL2hlYWRzL2ciKTsKKwkJYXNzZXJ0RXF1YWxzKDIsIHJlZnMuc2l6ZSgpKTsKKwkJY2hlY2tDb250YWluc1JlZihyZWZzLCBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9nIikpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL2dpdGxpbmsiKSk7CisKKwkJcmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KCJyZWZzL2hlYWRzL3ByZWZpeC8iKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIHJlZnMuc2l6ZSgpKTsKKwkJY2hlY2tDb250YWluc1JlZihyZWZzLCBkYi5leGFjdFJlZigicmVmcy9oZWFkcy9wcmVmaXgvYSIpKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlVGVzdC5qYXZhCmluZGV4IDExMDdjMmMuLjU4YjAwNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlVGVzdC5qYXZhCkBAIC05NCwyNCArOTQsMjUgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZpbGVLZXlPcGVuRXhpc3RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IHI7CisJCXRyeSAoUmVwb3NpdG9yeSByID0gbmV3IEZpbGVLZXkoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpCisJCQkJLm9wZW4odHJ1ZSkpIHsKKwkJCWFzc2VydE5vdE51bGwocik7CisJCQlhc3NlcnRFcXVhbHNGaWxlKGRiLmdldERpcmVjdG9yeSgpLCByLmdldERpcmVjdG9yeSgpKTsKKwkJfQogCi0JCXIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkub3Blbih0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbChyKTsKLQkJYXNzZXJ0RXF1YWxzRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgci5nZXREaXJlY3RvcnkoKSk7Ci0JCXIuY2xvc2UoKTsKLQotCQlyID0gbmV3IEZpbGVLZXkoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpLm9wZW4oZmFsc2UpOwotCQlhc3NlcnROb3ROdWxsKHIpOwotCQlhc3NlcnRFcXVhbHNGaWxlKGRiLmdldERpcmVjdG9yeSgpLCByLmdldERpcmVjdG9yeSgpKTsKLQkJci5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgciA9IG5ldyBGaWxlS2V5KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKQorCQkJCS5vcGVuKGZhbHNlKSkgeworCQkJYXNzZXJ0Tm90TnVsbChyKTsKKwkJCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOworCQl9CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RmlsZUtleU9wZW5OZXcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBSZXBvc2l0b3J5IG4gPSBjcmVhdGVSZXBvc2l0b3J5KHRydWUsIGZhbHNlKTsKLQkJZmluYWwgRmlsZSBnaXRkaXIgPSBuLmdldERpcmVjdG9yeSgpOwotCQluLmNsb3NlKCk7CisJCUZpbGUgZ2l0ZGlyOworCQl0cnkgKFJlcG9zaXRvcnkgbiA9IGNyZWF0ZVJlcG9zaXRvcnkodHJ1ZSwgZmFsc2UpKSB7CisJCQlnaXRkaXIgPSBuLmdldERpcmVjdG9yeSgpOworCQl9CiAJCXJlY3Vyc2l2ZURlbGV0ZShnaXRkaXIpOwogCQlhc3NlcnRGYWxzZShnaXRkaXIuZXhpc3RzKCkpOwogCkBAIC0xNDMsNiArMTQ0LDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDYWNoZU9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZUtleSBsb2MgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCWZpbmFsIFJlcG9zaXRvcnkgZDIgPSBSZXBvc2l0b3J5Q2FjaGUub3Blbihsb2MpOwogCQlhc3NlcnROb3RTYW1lKGRiLCBkMik7CiAJCWFzc2VydFNhbWUoZDIsIFJlcG9zaXRvcnlDYWNoZS5vcGVuKEZpbGVLZXkuZXhhY3QobG9jLmdldEZpbGUoKSwgZGIuZ2V0RlMoKSkpKTsKQEAgLTE3Niw2ICsxNzgsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlVc2FnZUNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUZpbGVLZXkgbG9jID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IGQyID0gUmVwb3NpdG9yeUNhY2hlLm9wZW4obG9jKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGQyLnVzZUNudC5nZXQoKSk7CiAJCVJlcG9zaXRvcnlDYWNoZS5vcGVuKEZpbGVLZXkuZXhhY3QobG9jLmdldEZpbGUoKSwgZGIuZ2V0RlMoKSkpOwpAQCAtMTg5LDYgKzE5Miw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVzYWdlQ291bnRXaXRoUmVnaXN0ZXJlZFJlcG9zaXRvcnkoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgcmVwbyA9IGNyZWF0ZVJlcG9zaXRvcnkoZmFsc2UsIGZhbHNlKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHJlcG8udXNlQ250LmdldCgpKTsKIAkJUmVwb3NpdG9yeUNhY2hlLnJlZ2lzdGVyKHJlcG8pOwpAQCAtMjAwLDYgKzIwNCw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeU5vdFVucmVnaXN0ZXJpbmdXaGVuQ2xvc2luZygpIHRocm93cyBFeGNlcHRpb24gewogCQlGaWxlS2V5IGxvYyA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSBkMiA9IFJlcG9zaXRvcnlDYWNoZS5vcGVuKGxvYyk7CiAJCWFzc2VydEVxdWFscygxLCBkMi51c2VDbnQuZ2V0KCkpOwogCQlhc3NlcnRUaGF0KFJlcG9zaXRvcnlDYWNoZS5nZXRSZWdpc3RlcmVkS2V5cygpLApAQCAtMjE0LDYgKzIxOSw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVucmVnaXN0ZXJpbmdXaGVuRXhwaXJlZEFuZFVzYWdlQ291bnROZWdhdGl2ZSgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgcmVwb0EgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwb0EpOwogCkBAIC0yMzQsNyArMjQwLDkgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlVbnJlZ2lzdGVyaW5nV2hlbkV4cGlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgcmVwb0EgPSBjcmVhdGVSZXBvc2l0b3J5KHRydWUsIGZhbHNlKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCVJlcG9zaXRvcnkgcmVwb0IgPSBjcmVhdGVSZXBvc2l0b3J5KHRydWUsIGZhbHNlKTsKIAkJUmVwb3NpdG9yeSByZXBvQyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CiAJCVJlcG9zaXRvcnlDYWNoZS5yZWdpc3RlcihyZXBvQSk7CkBAIC0yNjgsNiArMjc2LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlY29uZmlndXJlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG8gPSBjcmVhdGVSZXBvc2l0b3J5KGZhbHNlLCBmYWxzZSk7CiAJCVJlcG9zaXRvcnlDYWNoZS5yZWdpc3RlcihyZXBvKTsKIAkJYXNzZXJ0VHJ1ZShSZXBvc2l0b3J5Q2FjaGUuaXNDYWNoZWQocmVwbykpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5UmVzb2x2ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEKaW5kZXggMWQyYTRlOS4uMDViNzhlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5UmVzb2x2ZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlSZXNvbHZlVGVzdC5qYXZhCkBAIC0zMjQsNiArMzI0LDggQEAKIAkJYXNzZXJ0RmFsc2UoUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZSgieC9hXFxiIikpOwogCQlhc3NlcnRGYWxzZShSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKCJ4L2FcdTAwMDAiKSk7CiAKKwkJZGIucmVzb2x2ZSgieC9hQCIpOworCiAJCWFzc2VydFVucGFyc2VhYmxlKCIuIik7CiAJCWFzc2VydFVucGFyc2VhYmxlKCJ4QHszIik7CiAJCWFzc2VydFVucGFyc2VhYmxlKCJ4W2IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvU3F1YXNoQ29tbWl0TXNnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKaW5kZXggM2JjZDc4Ny4uMjAzYzAwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKQEAgLTY2LDEyICs2Niw5IEBACiAJCWRiLndyaXRlU3F1YXNoQ29tbWl0TXNnKG51bGwpOwogCQlhc3NlcnRFcXVhbHMoZGIucmVhZFNxdWFzaENvbW1pdE1zZygpLCBudWxsKTsKIAkJYXNzZXJ0RmFsc2UobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5TUVVBU0hfTVNHKS5leGlzdHMoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksCi0JCQkJQ29uc3RhbnRzLlNRVUFTSF9NU0cpKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuU1FVQVNIX01TRykpKSB7CiAJCQlmb3Mud3JpdGUoc3F1YXNoTXNnLmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvcy5jbG9zZSgpOwogCQl9CiAJCWFzc2VydEVxdWFscyhkYi5yZWFkU3F1YXNoQ29tbWl0TXNnKCksIHNxdWFzaE1zZyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9WYWxpZFJlZk5hbWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQppbmRleCBkNDMxYTg5Li44N2U5MDFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgVmFsaWRSZWZOYW1lVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWxpZChmaW5hbCBib29sZWFuIGV4cCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZhbGlkKGJvb2xlYW4gZXhwLCBTdHJpbmcgbmFtZSkgewogCQlTeXN0ZW1SZWFkZXIgaW5zdGFuY2UgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKTsKIAkJdHJ5IHsKIAkJCXNldFVuaXhTeXN0ZW1SZWFkZXIoKTsKQEAgLTgxLDcgKzgxLDcgQEAKIAkJfSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRJbnZhbGlkT25XaW5kb3dzKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRJbnZhbGlkT25XaW5kb3dzKFN0cmluZyBuYW1lKSB7CiAJCVN5c3RlbVJlYWRlciBpbnN0YW5jZSA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpOwogCQl0cnkgewogCQkJc2V0VW5peFN5c3RlbVJlYWRlcigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NoZXJyeVBpY2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ2hlcnJ5UGlja1Rlc3QuamF2YQppbmRleCA0OTQ4YjM3Li4xOWY2ZGNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ2hlcnJ5UGlja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ2hlcnJ5UGlja1Rlc3QuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCWFzc2VydEZhbHNlKHR3Lm5leHQoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0SWQoZmluYWwgRGlyQ2FjaGUgdHJlZVQsIGZpbmFsIFRyZWVXYWxrIHR3KSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0SWQoRGlyQ2FjaGUgdHJlZVQsIFRyZWVXYWxrIHR3KSB7CiAJCWFzc2VydEVxdWFscyh0cmVlVC5nZXRFbnRyeSh0dy5nZXRQYXRoU3RyaW5nKCkpLmdldE9iamVjdElkKCksIHR3CiAJCQkJLmdldE9iamVjdElkKDApKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVjdXJzaXZlTWVyZ2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVjdXJzaXZlTWVyZ2VyVGVzdC5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ3Jpc3NDcm9zc01lcmdlVGVzdC5qYXZhCmluZGV4IDE5MDIyNGEuLmFhYTA4YTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZWN1cnNpdmVNZXJnZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YQpAQCAtODMsNyArODMsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogQFJ1bldpdGgoVGhlb3JpZXMuY2xhc3MpCi1wdWJsaWMgY2xhc3MgUmVjdXJzaXZlTWVyZ2VyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CitwdWJsaWMgY2xhc3MgQ3Jpc3NDcm9zc01lcmdlVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAJc3RhdGljIGludCBjb3VudGVyID0gMDsKIAogCUBEYXRhUG9pbnRzCkBAIC03ODMsNyArNzgzLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzZXRJbmRleChmaW5hbCBPYmplY3RJZCBpZCwgU3RyaW5nIHBhdGgpCisJcHJpdmF0ZSB2b2lkIHNldEluZGV4KE9iamVjdElkIGlkLCBTdHJpbmcgcGF0aCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCURpckNhY2hlIGxvY2tlZERpcmNhY2hlOwogCQlEaXJDYWNoZUVkaXRvciBkY2VkaXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXJUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKaW5kZXggOTMyMmE0Ny4uNTgwOTNhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9CTE9COwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKQEAgLTkxLDE5ICs5MSwxNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllcy5EYXRhUG9pbnQ7CitpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllcy5EYXRhUG9pbnRzOwogaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXMuVGhlb3JpZXM7CiBpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllcy5UaGVvcnk7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogCiBAUnVuV2l0aChUaGVvcmllcy5jbGFzcykKLXB1YmxpYyBjbGFzcyBSZXNvbHZlTWVyZ2VyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CitwdWJsaWMgY2xhc3MgTWVyZ2VyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAKLQlARGF0YVBvaW50Ci0JcHVibGljIHN0YXRpYyBNZXJnZVN0cmF0ZWd5IHJlc29sdmUgPSBNZXJnZVN0cmF0ZWd5LlJFU09MVkU7Ci0KLQlARGF0YVBvaW50Ci0JcHVibGljIHN0YXRpYyBNZXJnZVN0cmF0ZWd5IHJlY3Vyc2l2ZSA9IE1lcmdlU3RyYXRlZ3kuUkVDVVJTSVZFOworCUBEYXRhUG9pbnRzCisJcHVibGljIHN0YXRpYyBNZXJnZVN0cmF0ZWd5W10gc3RyYXRlZ2llc1VuZGVyVGVzdCA9IG5ldyBNZXJnZVN0cmF0ZWd5W10geworCQkJTWVyZ2VTdHJhdGVneS5SRUNVUlNJVkUsIE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSB9OwogCiAJQFRoZW9yeQogCXB1YmxpYyB2b2lkIGZhaWxpbmdEZWxldGVPZkRpcmVjdG9yeVdpdGhVbnRyYWNrZWRDb250ZW50KApAQCAtNzU2LDcgKzc1NCw3IEBACiAJCX0KIAkJYmluYXJ5WzUwXSA9ICdcMCc7CiAKLQkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgVVRGXzgpKTsKKwkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgQ0hBUlNFVCkpOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUiKS5jYWxsKCk7CiAJCVJldkNvbW1pdCBmaXJzdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRlZCBmaWxlIikuY2FsbCgpOwogCkBAIC03NjQsNyArNzYyLDcgQEAKIAkJaW50IGlkeCA9IExJTkVMRU4gKiAxMjAwICsgMTsKIAkJYnl0ZSBzYXZlID0gYmluYXJ5W2lkeF07CiAJCWJpbmFyeVtpZHhdID0gJ0AnOwotCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBVVEZfOCkpOworCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBDSEFSU0VUKSk7CiAKIAkJYmluYXJ5W2lkeF0gPSBzYXZlOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUiKS5jYWxsKCk7CkBAIC03NzMsNyArNzcxLDcgQEAKIAogCQlnaXQuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0U3RhcnRQb2ludChmaXJzdCkuc2V0TmFtZSgic2lkZSIpLmNhbGwoKTsKIAkJYmluYXJ5W0xJTkVMRU4gKiAxNTAwICsgMV0gPSAnISc7Ci0JCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIFVURl84KSk7CisJCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIENIQVJTRVQpKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlIikuY2FsbCgpOwogCQlSZXZDb21taXQgc2lkZUNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRBbGwodHJ1ZSkKIAkJCS5zZXRNZXNzYWdlKCJtb2RpZmllZCBmaWxlIGwgMTUwMCIpLmNhbGwoKTsKQEAgLTkzNSw3ICs5MzMsNyBAQAogCQkJbWVyZ2VyLmdldE1lcmdlUmVzdWx0cygpLmdldCgiZmlsZSIpOwogCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJZm10LmZvcm1hdE1lcmdlKG91dCwgbWVyZ2VyLmdldE1lcmdlUmVzdWx0cygpLmdldCgiZmlsZSIpLAotCQkJCQkJIkJBU0UiLCAiT1VSUyIsICJUSEVJUlMiLCBVVEZfOC5uYW1lKCkpOworCQkJCQkJIkJBU0UiLCAiT1VSUyIsICJUSEVJUlMiLCBDSEFSU0VULm5hbWUoKSk7CiAJCQkJU3RyaW5nIGV4cGVjdGVkID0gIjw8PDw8PDwgT1VSU1xuIgogCQkJCQkJKyAiMW1hc3RlclxuIgogCQkJCQkJKyAiPT09PT09PVxuIgpAQCAtOTQzLDcgKzk0MSw3IEBACiAJCQkJCQkrICI+Pj4+Pj4+IFRIRUlSU1xuIgogCQkJCQkJKyAiMlxuIgogCQkJCQkJKyAiMyI7Ci0JCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCBVVEZfOCkpOworCQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCkpOwogCQkJfQogCQl9CiAJfQpAQCAtMTAzMywxOSArMTAzMSwyMSBAQAogCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkZWQgYy50eHQiKS5jYWxsKCk7CiAKIAkJLy8gR2V0IGEgaGFuZGxlIHRvIHRoZSB0aGUgZmlsZSBzbyBvbiB3aW5kb3dzIGl0IGNhbid0IGJlIGRlbGV0ZWQuCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksCi0JCQkJImIudHh0IikpOwotCQlNZXJnZVJlc3VsdCBtZXJnZVJlcyA9IGdpdC5tZXJnZSgpLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KQotCQkJCS5pbmNsdWRlKG1hc3RlckNvbW1pdCkuY2FsbCgpOwotCQlpZiAobWVyZ2VSZXMuZ2V0TWVyZ2VTdGF0dXMoKS5lcXVhbHMoTWVyZ2VTdGF0dXMuRkFJTEVEKSkgewotCQkJLy8gcHJvYmFibHkgd2luZG93cwotCQkJYXNzZXJ0RXF1YWxzKDEsIG1lcmdlUmVzLmdldEZhaWxpbmdQYXRocygpLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTWVyZ2VGYWlsdXJlUmVhc29uLkNPVUxEX05PVF9ERUxFVEUsIG1lcmdlUmVzCi0JCQkJCS5nZXRGYWlsaW5nUGF0aHMoKS5nZXQoImIudHh0IikpOworCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJiLnR4dCIpKSkgeworCQkJTWVyZ2VSZXN1bHQgbWVyZ2VSZXMgPSBnaXQubWVyZ2UoKS5zZXRTdHJhdGVneShzdHJhdGVneSkKKwkJCQkJLmluY2x1ZGUobWFzdGVyQ29tbWl0KS5jYWxsKCk7CisJCQlpZiAobWVyZ2VSZXMuZ2V0TWVyZ2VTdGF0dXMoKS5lcXVhbHMoTWVyZ2VTdGF0dXMuRkFJTEVEKSkgeworCQkJCS8vIHByb2JhYmx5IHdpbmRvd3MKKwkJCQlhc3NlcnRFcXVhbHMoMSwgbWVyZ2VSZXMuZ2V0RmFpbGluZ1BhdGhzKCkuc2l6ZSgpKTsKKwkJCQlhc3NlcnRFcXVhbHMoTWVyZ2VGYWlsdXJlUmVhc29uLkNPVUxEX05PVF9ERUxFVEUsCisJCQkJCQltZXJnZVJlcy5nZXRGYWlsaW5nUGF0aHMoKS5nZXQoImIudHh0IikpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiW2EudHh0LCBtb2RlOjEwMDY0NCwgY29udGVudDptYXN0ZXJdIgorCQkJCQkJCSsgIltjLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6c2lkZV0iLAorCQkJCQlpbmRleFN0YXRlKENPTlRFTlQpKTsKIAkJfQotCQlhc3NlcnRFcXVhbHMoIlthLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6bWFzdGVyXSIKLQkJCQkrICJbYy50eHQsIG1vZGU6MTAwNjQ0LCBjb250ZW50OnNpZGVdIiwgaW5kZXhTdGF0ZShDT05URU5UKSk7Ci0JCWZpcy5jbG9zZSgpOwogCX0KIAogCUBUaGVvcnkKQEAgLTEzMjgsNiArMTMyOCw2IEBACiAJCWlmIChvYmogPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcocncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihvYmosIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBVVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKHJ3LmdldE9iamVjdFJlYWRlcigpLm9wZW4ob2JqLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKSwgQ0hBUlNFVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1NpbXBsZU1lcmdlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1NpbXBsZU1lcmdlVGVzdC5qYXZhCmluZGV4IDk1MTU2OGUuLmRkMmMyZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TaW1wbGVNZXJnZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEKQEAgLTQwMyw3ICs0MDMsNyBAQAogCQlhc3NlcnRGYWxzZShtZXJnZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0SWQoZmluYWwgRGlyQ2FjaGUgdHJlZVQsIGZpbmFsIFRyZWVXYWxrIHR3KSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0SWQoRGlyQ2FjaGUgdHJlZVQsIFRyZWVXYWxrIHR3KSB7CiAJCWFzc2VydEVxdWFscyh0cmVlVC5nZXRFbnRyeSh0dy5nZXRQYXRoU3RyaW5nKCkpLmdldE9iamVjdElkKCksIHR3CiAJCQkJLmdldE9iamVjdElkKDApKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRWRpdExpc3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRWRpdExpc3RUZXN0LmphdmEKaW5kZXggNjAyN2FmZi4uNmMxMDdmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FZGl0TGlzdFRlc3QuamF2YQpAQCAtODksNyArODksNyBAQAogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMjMgLSAxLCAyNSAtIDEsIDIyIC0gMSwgMjggLSAxKSwgZS5nZXQoMikpOwogCX0KIAotCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKGZpbmFsIFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CiAJCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyVGVzdC5qYXZhCmluZGV4IDdiNGUwMTQuLjI0ZmJkYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyVGVzdC5qYXZhCkBAIC00MzMsMzAgKzQzMywzMCBAQAogCQlhc3NlcnRUcnVlKE9iamVjdElkLmZyb21TdHJpbmcobmlkKS5zdGFydHNXaXRoKGZoLmdldE5ld0lkKCkpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFBhcnNlKGZpbmFsIEZpbGVIZWFkZXIgZmgpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFBhcnNlKEZpbGVIZWFkZXIgZmgpIHsKIAkJaW50IHB0ciA9IGZoLnBhcnNlR2l0RmlsZU5hbWUoMCwgZmguYnVmLmxlbmd0aCk7CiAJCWFzc2VydFRydWUocHRyID4gMCk7CiAJCXB0ciA9IGZoLnBhcnNlR2l0SGVhZGVycyhwdHIsIGZoLmJ1Zi5sZW5ndGgpOwogCQlhc3NlcnRUcnVlKHB0ciA+IDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZGF0YShmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyBGaWxlSGVhZGVyIGRhdGEoU3RyaW5nIGluKSB7CiAJCXJldHVybiBuZXcgRmlsZUhlYWRlcihDb25zdGFudHMuZW5jb2RlQVNDSUkoaW4pLCAwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlSGVhZGVyIGhlYWRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgaGVhZGVyKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiBkYXRhKGdpdExpbmUocGF0aCkgKyAiLS0tICIgKyBwYXRoICsgIlxuIik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdpdExpbmUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2l0TGluZShTdHJpbmcgcGF0aCkgewogCQlyZXR1cm4gImEvIiArIHBhdGggKyAiIGIvIiArIHBhdGggKyAiXG4iOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZHFIZWFkZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHN0YXRpYyBGaWxlSGVhZGVyIGRxSGVhZGVyKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiBkYXRhKGRxR2l0TGluZShwYXRoKSArICItLS0gIiArIHBhdGggKyAiXG4iKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHFHaXRMaW5lKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRxR2l0TGluZShTdHJpbmcgcGF0aCkgewogCQlyZXR1cm4gIlwiYS8iICsgcGF0aCArICJcIiBcImIvIiArIHBhdGggKyAiXCJcbiI7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0dldFRleHRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvR2V0VGV4dFRlc3QuamF2YQppbmRleCA2NTM3NWM3Li43YjU4NjhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvR2V0VGV4dFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvR2V0VGV4dFRlc3QuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC04Myw3ICs4Myw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dF9Db252ZXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2hhcnNldCBjc09sZCA9IElTT184ODU5XzE7Ci0JCWZpbmFsIENoYXJzZXQgY3NOZXcgPSBVVEZfODsKKwkJZmluYWwgQ2hhcnNldCBjc05ldyA9IENIQVJTRVQ7CiAJCWZpbmFsIFBhdGNoIHAgPSBwYXJzZVRlc3RQYXRjaEZpbGUoKTsKIAkJYXNzZXJ0VHJ1ZShwLmdldEVycm9ycygpLmlzRW1wdHkoKSk7CiAJCWFzc2VydEVxdWFscygxLCBwLmdldEZpbGVzKCkuc2l6ZSgpKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEdldFRleHRfRGlmZkNjKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2hhcnNldCBjc09sZCA9IElTT184ODU5XzE7Ci0JCWZpbmFsIENoYXJzZXQgY3NOZXcgPSBVVEZfODsKKwkJZmluYWwgQ2hhcnNldCBjc05ldyA9IENIQVJTRVQ7CiAJCWZpbmFsIFBhdGNoIHAgPSBwYXJzZVRlc3RQYXRjaEZpbGUoKTsKIAkJYXNzZXJ0VHJ1ZShwLmdldEVycm9ycygpLmlzRW1wdHkoKSk7CiAJCWFzc2VydEVxdWFscygxLCBwLmdldEZpbGVzKCkuc2l6ZSgpKTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZFRlc3RQYXRjaEZpbGUoZmluYWwgQ2hhcnNldCBjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFN0cmluZyByZWFkVGVzdFBhdGNoRmlsZShDaGFyc2V0IGNzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlID0gSkdpdFRlc3RVdGlsLmdldE5hbWUoKSArICIucGF0Y2giOwogCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKIAkJCWlmIChpbiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY0Vycm9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YQppbmRleCBlNGI0MzE3Li42OTg5MzQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY0Vycm9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjRXJyb3JUZXN0LmphdmEKQEAgLTk2LDE3ICs5NiwxNCBAQAogCiAJcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlID0gSkdpdFRlc3RVdGlsLmdldE5hbWUoKSArICIucGF0Y2giOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwotCQlpZiAoaW4gPT0gbnVsbCkgewotCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKLQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCi0JCX0KLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CisJCQlpZiAoaW4gPT0gbnVsbCkgeworCQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7CisJCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKKwkJCX0KIAkJCWZpbmFsIFBhdGNoIHAgPSBuZXcgUGF0Y2goKTsKIAkJCXAucGFyc2UoaW4pOwogCQkJcmV0dXJuIHA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjVGVzdC5qYXZhCmluZGV4IDgzNzQxNGIuLjRhMjZkNTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjVGVzdC5qYXZhCkBAIC0xOTksMTcgKzE5OSwxNCBAQAogCiAJcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlID0gSkdpdFRlc3RVdGlsLmdldE5hbWUoKSArICIucGF0Y2giOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwotCQlpZiAoaW4gPT0gbnVsbCkgewotCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKLQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCi0JCX0KLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CisJCQlpZiAoaW4gPT0gbnVsbCkgeworCQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7CisJCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKKwkJCX0KIAkJCWZpbmFsIFBhdGNoIHAgPSBuZXcgUGF0Y2goKTsKIAkJCXAucGFyc2UoaW4pOwogCQkJcmV0dXJuIHA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoRXJyb3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hFcnJvclRlc3QuamF2YQppbmRleCA1MmUzODc0Li4zYmRmODUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hFcnJvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hFcnJvclRlc3QuamF2YQpAQCAtMTc3LDE3ICsxNzcsMTQgQEAKIAogCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKTsKLQkJaWYgKGluID09IG51bGwpIHsKLQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgeworCQkJaWYgKGluID09IG51bGwpIHsKKwkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOworCQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCisJCQl9CiAJCQlmaW5hbCBQYXRjaCBwID0gbmV3IFBhdGNoKCk7CiAJCQlwLnBhcnNlKGluKTsKIAkJCXJldHVybiBwOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaFRlc3QuamF2YQppbmRleCA5ZjU3YWI5Li42YTA5YTQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoVGVzdC5qYXZhCkBAIC0zNTcsMTcgKzM1NywxNCBAQAogCiAJcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlID0gSkdpdFRlc3RVdGlsLmdldE5hbWUoKSArICIucGF0Y2giOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwotCQlpZiAoaW4gPT0gbnVsbCkgewotCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKLQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCi0JCX0KLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CisJCQlpZiAoaW4gPT0gbnVsbCkgeworCQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7CisJCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKKwkJCX0KIAkJCWZpbmFsIFBhdGNoIHAgPSBuZXcgUGF0Y2goKTsKIAkJCXAucGFyc2UoaW4pOwogCQkJcmV0dXJuIHA7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmVUZXN0LmphdmEKaW5kZXggODdjODU0Ny4uYWQ4MzI3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhCkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJYXNzZXJ0RmFsc2UoIm5vdCBDQyIsIGxpbmUubWF0Y2hlcyhGb290ZXJLZXkuQ0MpKTsKIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlKFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYnVmLmFwcGVuZCgidHJlZSAiICsgT2JqZWN0SWQuemVyb0lkKCkubmFtZSgpICsgIlxuIik7CiAJCWJ1Zi5hcHBlbmQoImF1dGhvciBBLiBVLiBUaG9yIDxhQGV4YW1wbGUuY29tPiAxICswMDAwXG4iKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdFBhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKaW5kZXggODhmMjQwYi4uY2ZlZmFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJYXNzZXJ0TnVsbChjLmdldFRyZWUoKSk7CiAJCWFzc2VydE51bGwoYy5wYXJlbnRzKTsKIAotCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0Tm90TnVsbChjLmdldFRyZWUoKSk7CiAJCWFzc2VydEVxdWFscyh0cmVlSWQsIGMuZ2V0VHJlZSgpLmdldElkKCkpOwogCQlhc3NlcnRTYW1lKHJ3Lmxvb2t1cFRyZWUodHJlZUlkKSwgYy5nZXRUcmVlKCkpOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCWFzc2VydEVxdWFscyhUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIiArIGNvbW1pdHRlclRpbWVab25lKSwgY0NvbW1pdHRlci5nZXRUaW1lWm9uZSgpKTsKIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBjcmVhdGUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlKFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iKTsKIAkJYi5hcHBlbmQoImF1dGhvciBBIFUuIFRob3IgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIGM7CiAJfQogCkBAIC0xNjEsNyArMTYxLDcgQEAKIAogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7Ci0JCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYXNzZXJ0RXF1YWxzKCIiLCBjLmdldEZ1bGxNZXNzYWdlKCkpOwogCQlhc3NlcnRFcXVhbHMoIiIsIGMuZ2V0U2hvcnRNZXNzYWdlKCkpOwpAQCAtMTc2LDcgKzE3Niw3IEBACiAKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwotCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCWFzc2VydEVxdWFscyhuZXcgUGVyc29uSWRlbnQoIiIsICJhX3VfdGhvckBleGFtcGxlLmNvbSIsIDEyMTgxMjMzODcwMDBsLCA3KSwgYy5nZXRBdXRob3JJZGVudCgpKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBQZXJzb25JZGVudCgiIiwgIiIsIDEyMTgxMjMzOTAwMDBsLCAtNSksIGMuZ2V0Q29tbWl0dGVySWRlbnQoKSk7CkBAIC0xODUsMTMgKzE4NSwxMyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2ltcGxpY2l0X1VURjhfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjA1LDEzICsyMDUsMTMgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbXBsaWNpdF9taXhlZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOyAvLyBib2d1cyBpZAogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTI2MCwxNCArMjYwLDE0IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSkpOwotCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBFVUMtSlBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBFVUMtSlBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yOTEsMTQgKzI5MSwxNCBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgSVNPLTg4NTktMVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZmluYWwgUmV2Q29tbWl0IGM7CiAJCWMgPSBuZXcgUmV2Q29tbWl0KGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOyAvLyBib2d1cyBpZAogCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTMxMywxMyArMzEzLDEzIEBACiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2luY29ycmVjdFV0ZjhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYi53cml0ZSgiY29tbWl0dGVyIGNvIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nICd1dGY4J1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgJ3V0ZjgnXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZDb21taXQgYyA9IG5ldyBSZXZDb21taXQoCiAJCQkJaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CkBAIC0zMzgsMTIgKzMzOCwxMiBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2lsbGVnYWxFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgdXRmLThsb2dvdXRwdXRlbmNvZGluZz1nYmtcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIGNvIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgdXRmLThsb2dvdXRwdXRlbmNvZGluZz1nYmtcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZDb21taXQgYyA9IG5ldyBSZXZDb21taXQoCiAJCQkJaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CkBAIC0zNjUsMTIgKzM2NSwxMiBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX3Vuc3VwcG9ydGVkRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIGNvIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIGl0X0lULlVURjhcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIGNvIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgaXRfSVQuVVRGOFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldkNvbW1pdCBjID0gbmV3IFJldkNvbW1pdCgKIAkJCQlpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQlhc3NlcnRFcXVhbHMoc2hvcnRNc2csIGMuZ2V0U2hvcnRNZXNzYWdlKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBpZChTdHJpbmcgc3RyKSB7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tU3RyaW5nKHN0cik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0VGVzdC5qYXZhCmluZGV4IDEyMmEzOTcuLjhlMzg5YWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKIAogCQlmaW5hbCBSZXZDb21taXQgYTI7CiAJCWZpbmFsIFJldkNvbW1pdCBiMjsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHJ3MiA9IG5ldyBSZXZXYWxrKGRiKSkgeworCQl0cnkgKFJldldhbGsgcncyID0gbmV3IFJldldhbGsoZGIpKSB7CiAJCQlhMiA9IHJ3Mi5wYXJzZUNvbW1pdChhMSk7CiAJCQliMiA9IHJ3Mi5wYXJzZUNvbW1pdChiMSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnUGFyc2VUZXN0LmphdmEKaW5kZXggMzhiZDM3MS4uZTExY2VmNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnUGFyc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnUGFyc2VUZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC04Miw3ICs4Miw3IEBACiAJCXRlc3RPbmVUeXBlKENvbnN0YW50cy5PQkpfVEFHKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdGVzdE9uZVR5cGUoZmluYWwgaW50IHR5cGVDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdGVzdE9uZVR5cGUoaW50IHR5cGVDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgT2JqZWN0SWQgaWQgPSBpZCgiOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2NyIpOwogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgib2JqZWN0ICIgKyBpZC5uYW1lKCkgKyAiXG4iKTsKQEAgLTk4LDcgKzk4LDcgQEAKIAkJYXNzZXJ0TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0TnVsbChjLmdldFRhZ05hbWUoKSk7CiAKLQkJYy5wYXJzZUNhbm9uaWNhbChydywgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwocncsIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydE5vdE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydEVxdWFscyhpZCwgYy5nZXRPYmplY3QoKS5nZXRJZCgpKTsKIAkJYXNzZXJ0U2FtZShydy5sb29rdXBBbnkoaWQsIHR5cGVDb2RlKSwgYy5nZXRPYmplY3QoKSk7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkJYXNzZXJ0TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0TnVsbChjLmdldFRhZ05hbWUoKSk7CiAKLQkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydE5vdE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydEVxdWFscyh0cmVlSWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldE9iamVjdCgpKTsKQEAgLTE4OSw3ICsxODksNyBAQAogCQlhc3NlcnROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnROdWxsKGMuZ2V0VGFnTmFtZSgpKTsKIAotCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0Tm90TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRPYmplY3QoKS5nZXRJZCgpKTsKIAkJYXNzZXJ0U2FtZShydy5sb29rdXBUcmVlKHRyZWVJZCksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJCWFzc2VydE51bGwoYy5nZXRUYWdnZXJJZGVudCgpKTsKIAl9CiAKLQlwcml2YXRlIFJldlRhZyBjcmVhdGUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZUYWcgY3JlYXRlKFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIpOwogCQliLmFwcGVuZCgidHlwZSB0cmVlXG4iKTsKQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAJCWZpbmFsIFJldlRhZyBjOwogCQljID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIGM7CiAJfQogCkBAIC0yMjEsMTcgKzIyMSwxNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbXBsaWNpdF9VVEY4X2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQliCiAJCQkJLndyaXRlKCJ0YWdnZXIgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIKLQkJCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiU21cdTAwZjZyZ1x1MDBlNXNib3JkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldlRhZyBjOwogCQljID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yNDYsMTUgKzI0NiwxNSBAQAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbXBsaWNpdF9taXhlZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoInRhZ2dlciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIgogCQkJCS5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzA3LDE3ICszMDcsMTcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCiAJCQkJCQkuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSkpOwotCQliLndyaXRlKCJlbmNvZGluZyBFVUMtSlBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzQyLDE3ICszNDIsMTcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIKIAkJCQkud3JpdGUoInRhZ2dlciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIgotCQkJCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIElTTy04ODU5LTFcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIElTTy04ODU5LTFcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJIaVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldlRhZyBjOwogCQljID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0zNjUsMTMgKzM2NSwxMyBAQAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2lsbGVnYWxFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZ2dlciB0IDx0QGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWdnZXIgdCA8dEBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2VGFnIHQgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQl0LnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTM4NCwxMyArMzg0LDEzIEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfdW5zdXBwb3J0ZWRFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZ2dlciB0IDx0QGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIGl0X0lULlVURjhcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZ2dlciB0IDx0QGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgaXRfSVQuVVRGOFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldlRhZyB0ID0gbmV3IFJldlRhZyhpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKIAkJdC5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC00ODAsNyArNDgwLDcgQEAKIAkJYXNzZXJ0RXF1YWxzKHNyYy5nZXRNZXNzYWdlKCksIHAuZ2V0RnVsbE1lc3NhZ2UoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWQoZmluYWwgU3RyaW5nIHN0cikgeworCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKFN0cmluZyBzdHIpIHsKIAkJcmV0dXJuIE9iamVjdElkLmZyb21TdHJpbmcoc3RyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrRm9sbG93RmlsdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YQppbmRleCBhYjI3MDVjLi43MDA1MDI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrRm9sbG93RmlsdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtGb2xsb3dGaWx0ZXJUZXN0LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkJZGlmZkNvbGxlY3RvciA9IG5ldyBEaWZmQ29sbGVjdG9yKCk7CiAJfQogCi0JcHJvdGVjdGVkIEZvbGxvd0ZpbHRlciBmb2xsb3coZmluYWwgU3RyaW5nIGZvbGxvd1BhdGgpIHsKKwlwcm90ZWN0ZWQgRm9sbG93RmlsdGVyIGZvbGxvdyhTdHJpbmcgZm9sbG93UGF0aCkgewogCQlGb2xsb3dGaWx0ZXIgZm9sbG93RmlsdGVyID0KIAkJCUZvbGxvd0ZpbHRlci5jcmVhdGUoZm9sbG93UGF0aCwgbmV3IENvbmZpZygpLmdldChEaWZmQ29uZmlnLktFWSkpOwogCQlmb2xsb3dGaWx0ZXIuc2V0UmVuYW1lQ2FsbGJhY2soZGlmZkNvbGxlY3Rvcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjFUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjFUZXN0LmphdmEKaW5kZXggNmVjNTI5Yy4uYjU1YTQ1YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyMVRlc3QuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdCBleHRlbmRzIFJldldhbGtUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIHZvaWQgZmlsdGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJvdGVjdGVkIHZvaWQgZmlsdGVyKFN0cmluZyBwYXRoKSB7CiAJCXJ3LnNldFRyZWVGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUoUGF0aEZpbHRlckdyb3VwCiAJCQkJLmNyZWF0ZUZyb21TdHJpbmdzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXRoKSksCiAJCQkJVHJlZUZpbHRlci5BTllfRElGRikpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXI2MDEyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXI2MDEyVGVzdC5qYXZhCmluZGV4IDYzMWUzOTUuLmNlZjU1MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjYwMTJUZXN0LmphdmEKQEAgLTEwMiwxNyArMTAyLDE3IEBACiAJCX0KIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBjaGVjayhmaW5hbCBSZXZDb21taXQuLi4gb3JkZXIpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGNoZWNrKFJldkNvbW1pdC4uLiBvcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCW1hcmtTdGFydChpKTsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBhY3QgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCB6IDogcncpIHsKKwkJZm9yIChSZXZDb21taXQgeiA6IHJ3KSB7CiAJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGJ5TmFtZS5nZXQoeik7CiAJCQlhc3NlcnROb3ROdWxsKG5hbWUpOwogCQkJYWN0LmFwcGVuZChuYW1lKTsKIAkJCWFjdC5hcHBlbmQoJyAnKTsKIAkJfQogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGV4cCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IHogOiBvcmRlcikgeworCQlmb3IgKFJldkNvbW1pdCB6IDogb3JkZXIpIHsKIAkJCWZpbmFsIFN0cmluZyBuYW1lID0gYnlOYW1lLmdldCh6KTsKIAkJCWFzc2VydE5vdE51bGwobmFtZSk7CiAJCQlleHAuYXBwZW5kKG5hbWUpOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCWFzc2VydEVxdWFscyhleHAudG9TdHJpbmcoKSwgYWN0LnRvU3RyaW5nKCkpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGZpbHRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByb3RlY3RlZCB2b2lkIGZpbHRlcihTdHJpbmcgcGF0aCkgewogCQlydy5zZXRUcmVlRmlsdGVyKEFuZFRyZWVGaWx0ZXIuY3JlYXRlKFBhdGhGaWx0ZXJHcm91cAogCQkJCS5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGF0aCkpLAogCQkJCVRyZWVGaWx0ZXIuQU5ZX0RJRkYpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1Rlc3RDYXNlLmphdmEKaW5kZXggZjEyY2MwOC4uNTQ0Mzk4MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1Rlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1Rlc3RDYXNlLmphdmEKQEAgLTc0LDM4ICs3NCwzOCBAQAogCQlyZXR1cm4gdXRpbC5nZXREYXRlKCk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgdGljayhmaW5hbCBpbnQgc2VjRGVsdGEpIHsKKwlwcm90ZWN0ZWQgdm9pZCB0aWNrKGludCBzZWNEZWx0YSkgewogCQl1dGlsLnRpY2soc2VjRGVsdGEpOwogCX0KIAotCXByb3RlY3RlZCBSZXZCbG9iIGJsb2IoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCBSZXZCbG9iIGJsb2IoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5ibG9iKGNvbnRlbnQpOwogCX0KIAotCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGZpbGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFJldkJsb2IgYmxvYikKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBmaWxlKFN0cmluZyBwYXRoLCBSZXZCbG9iIGJsb2IpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuZmlsZShwYXRoLCBibG9iKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2VHJlZSB0cmVlKGZpbmFsIERpckNhY2hlRW50cnkuLi4gZW50cmllcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFJldlRyZWUgdHJlZShEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC50cmVlKGVudHJpZXMpOwogCX0KIAotCXByb3RlY3RlZCBSZXZPYmplY3QgZ2V0KGZpbmFsIFJldlRyZWUgdHJlZSwgZmluYWwgU3RyaW5nIHBhdGgpCisJcHJvdGVjdGVkIFJldk9iamVjdCBnZXQoUmV2VHJlZSB0cmVlLCBTdHJpbmcgcGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5nZXQodHJlZSwgcGF0aCk7CiAJfQogCi0JcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KFJldkNvbW1pdC4uLiBwYXJlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHBhcmVudHMpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIFJldlRyZWUgdHJlZSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoUmV2VHJlZSB0cmVlLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5jb21taXQodHJlZSwgcGFyZW50cyk7CiAJfQogCi0JcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoZmluYWwgaW50IHNlY0RlbHRhLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChpbnQgc2VjRGVsdGEsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmNvbW1pdChzZWNEZWx0YSwgcGFyZW50cyk7CiAJfQpAQCAtMTE1LDcgKzExNSw3IEBACiAJCXJldHVybiB1dGlsLmNvbW1pdChzZWNEZWx0YSwgdHJlZSwgcGFyZW50cyk7CiAJfQogCi0JcHJvdGVjdGVkIFJldlRhZyB0YWcoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldk9iamVjdCBkc3QpCisJcHJvdGVjdGVkIFJldlRhZyB0YWcoU3RyaW5nIG5hbWUsIFJldk9iamVjdCBkc3QpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwudGFnKG5hbWUsIGRzdCk7CiAJfQpAQCAtMTI1LDE5ICsxMjUsMTkgQEAKIAkJcmV0dXJuIHV0aWwuY29tbWl0KCk7CiAJfQogCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShmaW5hbCBUIHQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCA8VCBleHRlbmRzIFJldk9iamVjdD4gVCBwYXJzZUJvZHkoVCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwucGFyc2VCb2R5KHQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIG1hcmtTdGFydChmaW5hbCBSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBtYXJrU3RhcnQoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJ3Lm1hcmtTdGFydChjb21taXQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIG1hcmtVbmludGVyZXN0aW5nKGZpbmFsIFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIG1hcmtVbmludGVyZXN0aW5nKFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24gewogCQlydy5tYXJrVW5pbnRlcmVzdGluZyhjb21taXQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGFzc2VydENvbW1pdChmaW5hbCBSZXZDb21taXQgZXhwLCBmaW5hbCBSZXZDb21taXQgYWN0KSB7CisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWl0KFJldkNvbW1pdCBleHAsIFJldkNvbW1pdCBhY3QpIHsKIAkJYXNzZXJ0U2FtZShleHAsIGFjdCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhCmluZGV4IDEwYmVhMGEuLmEyNmFlMTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtVdGlsc1JlYWNoYWJsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVXRpbHNSZWFjaGFibGVUZXN0LmphdmEKQEAgLTEwOSw3ICsxMDksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZWYgYnJhbmNoKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBSZXZDb21taXQgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIFJlZiBicmFuY2goU3RyaW5nIG5hbWUsIFJldkNvbW1pdCBkc3QpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gR2l0LndyYXAoZGIpLmJyYW5jaENyZWF0ZSgpLnNldE5hbWUobmFtZSkKIAkJCQkuc2V0U3RhcnRQb2ludChkc3QubmFtZSgpKS5jYWxsKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YQppbmRleCA3ZjBkNjAyLi4wZGVhNWNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMucGF0aFRvU3RyaW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0VVRGOHdpdGhvdXRCT00oKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewotCQlmaW5hbCBGaWxlIGZpbGUgPSBjcmVhdGVGaWxlKENPTlRFTlQxLmdldEJ5dGVzKFVURl84KSk7CisJCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY29uZmlnID0gbmV3IEZpbGVCYXNlZENvbmZpZyhmaWxlLCBGUy5ERVRFQ1RFRCk7CiAJCWNvbmZpZy5sb2FkKCk7CiAJCWFzc2VydEVxdWFscyhBTElDRSwgY29uZmlnLmdldFN0cmluZyhVU0VSLCBudWxsLCBOQU1FKSk7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJYm9zMS53cml0ZSgweEVGKTsKIAkJYm9zMS53cml0ZSgweEJCKTsKIAkJYm9zMS53cml0ZSgweEJGKTsKLQkJYm9zMS53cml0ZShDT05URU5UMS5nZXRCeXRlcyhVVEZfOCkpOworCQlib3MxLndyaXRlKENPTlRFTlQxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlmaW5hbCBGaWxlIGZpbGUgPSBjcmVhdGVGaWxlKGJvczEudG9CeXRlQXJyYXkoKSk7CiAJCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBuZXcgRmlsZUJhc2VkQ29uZmlnKGZpbGUsIEZTLkRFVEVDVEVEKTsKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQlib3MyLndyaXRlKDB4RUYpOwogCQlib3MyLndyaXRlKDB4QkIpOwogCQlib3MyLndyaXRlKDB4QkYpOwotCQlib3MyLndyaXRlKENPTlRFTlQyLmdldEJ5dGVzKFVURl84KSk7CisJCWJvczIud3JpdGUoQ09OVEVOVDIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnRBcnJheUVxdWFscyhib3MyLnRvQnl0ZUFycmF5KCksIElPLnJlYWRGdWxseShmaWxlKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZUFkZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlQWRkVGVzdC5qYXZhCmluZGV4IDkzZjQ3MDkuLjU3ODA5NzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlQWRkVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlQWRkVGVzdC5qYXZhCkBAIC0xMjksMTAgKzEyOSwxMSBAQAogCQkJY29tbWFuZC5zZXRQYXRoKHBhdGgpOwogCQkJU3RyaW5nIHVyaSA9IGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKTsKIAkJCWNvbW1hbmQuc2V0VVJJKHVyaSk7Ci0JCQlSZXBvc2l0b3J5IHJlcG8gPSBjb21tYW5kLmNhbGwoKTsKLQkJCWFzc2VydE5vdE51bGwocmVwbyk7Ci0JCQlPYmplY3RJZCBzdWJDb21taXQgPSByZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQkJcmVwby5jbG9zZSgpOworCQkJT2JqZWN0SWQgc3ViQ29tbWl0OworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG8gPSBjb21tYW5kLmNhbGwoKSkgeworCQkJCWFzc2VydE5vdE51bGwocmVwbyk7CisJCQkJc3ViQ29tbWl0ID0gcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKKwkJCX0KIAogCQkJU3VibW9kdWxlV2FsayBnZW5lcmF0b3IgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGRiKTsKIAkJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7CkBAIC0xNDEsMTAgKzE0MiwxMCBAQAogCQkJYXNzZXJ0RXF1YWxzKHVyaSwgZ2VuZXJhdG9yLmdldE1vZHVsZXNVcmwoKSk7CiAJCQlhc3NlcnRFcXVhbHMocGF0aCwgZ2VuZXJhdG9yLmdldE1vZHVsZXNQYXRoKCkpOwogCQkJYXNzZXJ0RXF1YWxzKHVyaSwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJCVJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOwotCQkJYXNzZXJ0RXF1YWxzKHN1YkNvbW1pdCwgY29tbWl0KTsKLQkJCXN1Yk1vZFJlcG8uY2xvc2UoKTsKKwkJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJCWFzc2VydE5vdE51bGwoc3ViTW9kUmVwbyk7CisJCQkJYXNzZXJ0RXF1YWxzKHN1YkNvbW1pdCwgY29tbWl0KTsKKwkJCX0KIAogCQkJU3RhdHVzIHN0YXR1cyA9IEdpdC53cmFwKGRiKS5zdGF0dXMoKS5jYWxsKCk7CiAJCQlhc3NlcnRUcnVlKHN0YXR1cy5nZXRBZGRlZCgpLmNvbnRhaW5zKENvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpKTsKQEAgLTI0MCwxNiArMjQxLDE0IEBACiAJCQkJZnVsbFVyaSA9IGZ1bGxVcmkucmVwbGFjZSgnXFwnLCAnLycpOwogCQkJfQogCQkJYXNzZXJ0RXF1YWxzKGZ1bGxVcmksIGdlbmVyYXRvci5nZXRDb25maWdVcmwoKSk7Ci0JCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQkJYXNzZXJ0Tm90TnVsbChzdWJNb2RSZXBvKTsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkJZnVsbFVyaSwKLQkJCQkJc3ViTW9kUmVwbwotCQkJCQkJCS5nZXRDb25maWcoKQotCQkJCQkJCS5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKLQkJCQkJCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAotCQkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7Ci0JCQlzdWJNb2RSZXBvLmNsb3NlKCk7CisJCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOworCQkJCWFzc2VydEVxdWFscyhmdWxsVXJpLAorCQkJCQkJc3ViTW9kUmVwby5nZXRDb25maWcoKS5nZXRTdHJpbmcoCisJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCisJCQkJCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAorCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKKwkJCX0KIAkJCWFzc2VydEVxdWFscyhjb21taXQsIHJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOwogCiAJCQlTdGF0dXMgc3RhdHVzID0gR2l0LndyYXAoZGIpLnN0YXR1cygpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlU3luY1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlU3luY1Rlc3QuamF2YQppbmRleCAxM2RiNDRhLi42ZjNiNTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVN5bmNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhCkBAIC0xMzUsMTIgKzEzNSwxNCBAQAogCQlnZW5lcmF0b3IgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGRiKTsKIAkJYXNzZXJ0VHJ1ZShnZW5lcmF0b3IubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKHVybCwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5ID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJU3RvcmVkQ29uZmlnIHN1Ym1vZHVsZUNvbmZpZyA9IHN1Yk1vZFJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7Ci0JCXN1Yk1vZFJlcG9zaXRvcnkuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKHVybCwgc3VibW9kdWxlQ29uZmlnLmdldFN0cmluZygKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAotCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1Yk1vZFJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlTdG9yZWRDb25maWcgc3VibW9kdWxlQ29uZmlnID0gc3ViTW9kUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKKwkJCWFzc2VydEVxdWFscyh1cmwsCisJCQkJCXN1Ym1vZHVsZUNvbmZpZy5nZXRTdHJpbmcoCisJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKKwkJCQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwKKwkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0yMDgsMTEgKzIxMCwxMyBAQAogCQlnZW5lcmF0b3IgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGRiKTsKIAkJYXNzZXJ0VHJ1ZShnZW5lcmF0b3IubmV4dCgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJnaXQ6Ly9zZXJ2ZXIvc3ViLmdpdCIsIGdlbmVyYXRvci5nZXRDb25maWdVcmwoKSk7Ci0JCVJlcG9zaXRvcnkgc3ViTW9kUmVwb3NpdG9yeTEgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdG9yZWRDb25maWcgc3VibW9kdWxlQ29uZmlnID0gc3ViTW9kUmVwb3NpdG9yeTEuZ2V0Q29uZmlnKCk7Ci0JCXN1Yk1vZFJlcG9zaXRvcnkxLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiZ2l0Oi8vc2VydmVyL3N1Yi5naXQiLCBzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAotCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCi0JCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwb3NpdG9yeTEgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlTdG9yZWRDb25maWcgc3VibW9kdWxlQ29uZmlnID0gc3ViTW9kUmVwb3NpdG9yeTEuZ2V0Q29uZmlnKCk7CisJCQlhc3NlcnRFcXVhbHMoImdpdDovL3NlcnZlci9zdWIuZ2l0IiwKKwkJCQkJc3VibW9kdWxlQ29uZmlnLmdldFN0cmluZygKKwkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAorCQkJCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVVcGRhdGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVVwZGF0ZVRlc3QuamF2YQppbmRleCA3MDY0ZjYwLi5iYmNlNDEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVVwZGF0ZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVVwZGF0ZVRlc3QuamF2YQpAQCAtMTIxLDEwICsxMjEsMTAgQEAKIAogCQlTdWJtb2R1bGVXYWxrIGdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQlhc3NlcnROb3ROdWxsKHN1YlJlcG8pOwotCQlhc3NlcnRFcXVhbHMoY29tbWl0LCBzdWJSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpKTsKLQkJc3ViUmVwby5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWFzc2VydE5vdE51bGwoc3ViUmVwbyk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LCBzdWJSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhCmluZGV4IDY1OGI5NzEuLmQzMGFjODQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9CTE9COwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJCQlSZWYgcmVmID0gcmVwby5leGFjdFJlZihyZWZOYW1lKTsKIAkJCWFzc2VydE5vdE51bGwocmVmKTsKIAkJCWFzc2VydEVxdWFscyhpZCwgcmVmLmdldE9iamVjdElkKCkpOwotCQkJYXNzZXJ0RXF1YWxzKGRhdGEsIG5ldyBTdHJpbmcocmVwby5vcGVuKGlkLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKSwgVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLCBuZXcgU3RyaW5nKHJlcG8ub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIENIQVJTRVQpKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEKaW5kZXggMmZlYThhOS4uNGU1ZDU2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiAKQEAgLTczLDExICs3NCwxMSBAQAogCQljb25maWdGaWxlID0gbmV3IEZpbGUoaG9tZSwgIi5uZXRyYyIpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjb25maWcoZmluYWwgU3RyaW5nIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIE91dHB1dFN0cmVhbVdyaXRlciBmdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnRmlsZSksICJVVEYtOCIpOwotCQlmdy53cml0ZShkYXRhKTsKLQkJZncuY2xvc2UoKTsKKwlwcml2YXRlIHZvaWQgY29uZmlnKFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgKE91dHB1dFN0cmVhbVdyaXRlciBmdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnRmlsZSksIENIQVJTRVQpKSB7CisJCQlmdy53cml0ZShkYXRhKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEKaW5kZXggZDYwNDc1MS4uYWJmODBlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YQpAQCAtNDMsNiArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKQEAgLTg5LDExICs5MCwxMSBAQAogCQlvc2MgPSBuZXcgT3BlblNzaENvbmZpZyhob21lLCBjb25maWdGaWxlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY29uZmlnKGZpbmFsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBjb25maWcoU3RyaW5nIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWxvbmcgbGFzdE10aW1lID0gY29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKTsKIAkJZG8gewogCQkJdHJ5IChmaW5hbCBPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWdGaWxlKSwgIlVURi04IikpIHsKKwkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnRmlsZSksIENIQVJTRVQpKSB7CiAJCQkJZncud3JpdGUoZGF0YSk7CiAJCQl9CiAJCX0gd2hpbGUgKGxhc3RNdGltZSA9PSBjb25maWdGaWxlLmxhc3RNb2RpZmllZCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQppbmRleCA1ZDliZGJkLi5iNmQwNjExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCkBAIC05Myw4ICs5Myw3IEBACiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyAgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhY2tGaWxlID0gSkdpdFRlc3RVdGlsLmdldFRlc3RSZXNvdXJjZUZpbGUoInBhY2stMzRiZTkwMzJhYzI4MmIxMWZhOWJhYmRjMmIyYTkzY2E5OTZjOWMyZi5wYWNrIik7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSk7Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tGaWxlKSkgewogCQkJT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlciBwID0gKE9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIpIGluZGV4KGlzKTsKIAkJCXAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CiAJCQlQYWNrRmlsZSBmaWxlID0gcC5nZXRQYWNrRmlsZSgpOwpAQCAtMTA3LDggKzEwNiw2IEBACiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoIjkwMmQ1NDc2ZmEyNDliN2FiYzlkODRjNjExNTc3YTgxMzgxZjAzMjciKSkpOwogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCJhYWJmMmZmYWVjOWI0OTdmMDk1MDM1MmIzZTU4MmQ3MzAzNWMyMDM1IikpKTsKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiYzU5NzU5ZjE0M2ZiMWZlMjFjMTk3OTgxZGY3NWE3ZWUwMDI5MDc5OSIpKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwogCQl9CiAJfQogCkBAIC0xMjEsOCArMTE4LDcgQEAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGFja0ZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0VGVzdFJlc291cmNlRmlsZSgicGFjay1kZjI5ODJmMjg0YmJhYmI2YmRiNTllZTNmY2M2ZWIwOTgzZTIwMzcxLnBhY2siKTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tGaWxlKTsKLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja0ZpbGUpKSB7CiAJCQlPYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyIHAgPSAoT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlcikgaW5kZXgoaXMpOwogCQkJcC5wYXJzZShOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFKTsKIAkJCVBhY2tGaWxlIGZpbGUgPSBwLmdldFBhY2tGaWxlKCk7CkBAIC0xNDAsOCArMTM2LDYgQEAKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiMjBhOGFkZTc3NjM5NDkxZWEwYmQ2NjdiZjk1ZGU4YWJmM2E0MzRjOCIpKSk7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoIjI2NzUxODhmZDg2OTc4ZDViYzRkNzIxMTY5OGIyMTE4YWUzYmY2NTgiKSkpOwogCQkJLy8gYW5kIGxvdHMgbW9yZS4uLgotCQl9IGZpbmFsbHkgewotCQkJaXMuY2xvc2UoKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVJblRlc3QuamF2YQppbmRleCAxM2ZjNjhkLi44YjFkODYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVJblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVJblRlc3QuamF2YQpAQCAtMTE2LDE3ICsxMTYsNiBAQAogCX0KIAogCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfTGVuMDAwMSgpIHsKLQkJaW5pdCgiMDAwMSIpOwotCQl0cnkgewotCQkJaW4ucmVhZFN0cmluZygpOwotCQkJZmFpbCgiaW5jb3JyZWN0bHkgYWNjZXB0ZWQgaW52YWxpZCBwYWNrZXQgaGVhZGVyIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW52YWxpZCBwYWNrZXQgbGluZSBoZWFkZXI6IDAwMDEiLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0xlbjAwMDIoKSB7CiAJCWluaXQoIjAwMDIiKTsKIAkJdHJ5IHsKQEAgLTE2NCw2ICsxNTMsMTMgQEAKIAkJYXNzZXJ0RU9GKCk7CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ19EZWxpbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQoIjAwMDEiKTsKKwkJYXNzZXJ0U2FtZShQYWNrZXRMaW5lSW4uREVMSU0sIGluLnJlYWRTdHJpbmcoKSk7CisJCWFzc2VydEVPRigpOworCX0KKwogCS8vIHJlYWRTdHJpbmdOb0xGCiAKIAlAVGVzdApAQCAtMzMwLDcgKzMyNiw3IEBACiAKIAkvLyB0ZXN0IHN1cHBvcnQKIAotCXByaXZhdGUgdm9pZCBpbml0KGZpbmFsIFN0cmluZyBtc2cpIHsKKwlwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgbXNnKSB7CiAJCXJhd0luID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKENvbnN0YW50cy5lbmNvZGVBU0NJSShtc2cpKTsKIAkJaW4gPSBuZXcgUGFja2V0TGluZUluKHJhd0luKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXRUZXN0LmphdmEKaW5kZXggZWNhNTQ3NS4uMzkxYTcwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dFRlc3QuamF2YQpAQCAtMTEzLDYgKzExMywxMiBAQAogCQlhc3NlcnRFcXVhbHMoMSwgZmx1c2hDbnRbMF0pOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFdyaXRlRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvdXQud3JpdGVEZWxpbSgpOworCQlhc3NlcnRCdWZmZXIoIjAwMDEiKTsKKwl9CisKIAkvLyB3cml0ZVBhY2tldAogCiAJQFRlc3QKQEAgLTE2Nyw3ICsxNzMsNyBAQAogCQlhc3NlcnRFcXVhbHMoMSwgZmx1c2hDbnRbMF0pOwogCX0KIAotCXByaXZhdGUgdm9pZCBhc3NlcnRCdWZmZXIoZmluYWwgU3RyaW5nIGV4cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgYXNzZXJ0QnVmZmVyKFN0cmluZyBleHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhleHAsIG5ldyBTdHJpbmcocmF3T3V0LnRvQnl0ZUFycmF5KCksCiAJCQkJQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbm5lY3Rpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhCmluZGV4IGMxNmMxYjIuLjYzNDc4ZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YQpAQCAtNTEsMTIgKzUxLDE2IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwpAQCAtNzYsNiArODAsNyBAQAogCXByaXZhdGUgT2JqZWN0IGN0eCA9IG5ldyBPYmplY3QoKTsKIAlwcml2YXRlIEluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXI7CiAJcHJpdmF0ZSBJbk1lbW9yeVJlcG9zaXRvcnkgY2xpZW50OworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHByb2Nlc3NlZFJlZnM7CiAJcHJpdmF0ZSBPYmplY3RJZCBvYmoxOwogCXByaXZhdGUgT2JqZWN0SWQgb2JqMjsKIAlwcml2YXRlIE9iamVjdElkIG9iajM7CkBAIC04NSw2ICs5MCw3IEBACiAJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2VydmVyID0gbmV3UmVwbygic2VydmVyIik7CiAJCWNsaWVudCA9IG5ld1JlcG8oImNsaWVudCIpOworCQlwcm9jZXNzZWRSZWZzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKIAkJCQludWxsLAogCQkJCW5ldyBSZWNlaXZlUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKQEAgLTkyLDcgKzk4LDE4IEBACiAJCQkJCXB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCiAJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewotCQkJCQkJcmV0dXJuIG5ldyBSZWNlaXZlUGFjayhkYik7CisJCQkJCQlSZWNlaXZlUGFjayBycCA9IG5ldyBSZWNlaXZlUGFjayhkYik7CisJCQkJCQlycC5zZXRQcmVSZWNlaXZlSG9vaygKKwkJCQkJCQkJbmV3IFByZVJlY2VpdmVIb29rKCkgeworCQkJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJCQlwdWJsaWMgdm9pZCBvblByZVJlY2VpdmUoUmVjZWl2ZVBhY2sgcmVjZWl2ZVBhY2ssCisJCQkJCQkJCQkJCUNvbGxlY3Rpb248UmVjZWl2ZUNvbW1hbmQ+IGNtZHMpIHsKKwkJCQkJCQkJCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNtZHMpIHsKKwkJCQkJCQkJCQkJcHJvY2Vzc2VkUmVmcy5hZGQoY21kLmdldFJlZk5hbWUoKSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9KTsKKwkJCQkJCXJldHVybiBycDsKIAkJCQkJfQogCQkJCX0pOwogCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIpOwpAQCAtMTk2LDQgKzIxMyw0NSBAQAogCQkJfQogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21tYW5kT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVGVzdFJlcG9zaXRvcnk8Pz4gdHIgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihjbGllbnQpOworCQlMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyBBcmJpdHJhcnkgbm9uLXNvcnRlZCBvcmRlci4KKwkJZm9yIChpbnQgaSA9IDk7IGkgPj0gMDsgaS0tKSB7CisJCQlTdHJpbmcgbmFtZSA9ICJyZWZzL2hlYWRzL2IiICsgaTsKKwkJCXRyLmJyYW5jaChuYW1lKS5jb21taXQoKS5jcmVhdGUoKTsKKwkJCVJlbW90ZVJlZlVwZGF0ZSBycnUgPSBuZXcgUmVtb3RlUmVmVXBkYXRlKGNsaWVudCwgbmFtZSwgbmFtZSwgZmFsc2UsIG51bGwsCisJCQkJCU9iamVjdElkLnplcm9JZCgpKTsKKwkJCXVwZGF0ZXMuYWRkKHJydSk7CisJCX0KKworCQlQdXNoUmVzdWx0IHJlc3VsdDsKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlciIpKSB7CisJCQlyZXN1bHQgPSB0bi5wdXNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHVwZGF0ZXMpOworCQl9CisKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcmVtb3RlVXBkYXRlIDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkidXBkYXRlIHNob3VsZCBzdWNjZWVkIG9uICIgKyByZW1vdGVVcGRhdGUuZ2V0UmVtb3RlTmFtZSgpLAorCQkJCQlSZW1vdGVSZWZVcGRhdGUuU3RhdHVzLk9LLCByZW1vdGVVcGRhdGUuZ2V0U3RhdHVzKCkpOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gcmVtb3RlUmVmTmFtZXModXBkYXRlcyk7CisJCWFzc2VydEVxdWFscygKKwkJCQkicmVmIG5hbWVzIHByb2Nlc3NlZCBieSBSZWNlaXZlUGFjayBzaG91bGQgbWF0Y2ggaW5wdXQgcmVmIG5hbWVzIGluIG9yZGVyIiwKKwkJCQlleHBlY3RlZCwgcHJvY2Vzc2VkUmVmcyk7CisJCWFzc2VydEVxdWFscygKKwkJCQkicmVtb3RlIHJlZiBuYW1lcyBzaG91bGQgbWF0Y2ggaW5wdXQgcmVmIG5hbWVzIGluIG9yZGVyIiwKKwkJCQlleHBlY3RlZCwgcmVtb3RlUmVmTmFtZXMocmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkpOworCX0KKworCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZW1vdGVSZWZOYW1lcyhDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgeworCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CisJCQlyZXN1bHQuYWRkKHUuZ2V0UmVtb3RlTmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCmluZGV4IDEwNGE2OWMuLjYxMWNkMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQpAQCAtNDIyLDcgKzQyMiw3IEBACiAJCQlQdXNoQ29ubmVjdGlvbiB7CiAJCU1vY2tQdXNoQ29ubmVjdGlvbigpIHsKIAkJCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gcmVmc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJCWZvciAoZmluYWwgUmVmIHIgOiBhZHZlcnRpc2VkUmVmcykKKwkJCWZvciAoUmVmIHIgOiBhZHZlcnRpc2VkUmVmcykKIAkJCQlyZWZzTWFwLnB1dChyLmdldE5hbWUoKSwgcik7CiAJCQlhdmFpbGFibGUocmVmc01hcCk7CiAJCX0KQEAgLTQ0Myw3ICs0NDMsNyBAQAogCQlwdWJsaWMgdm9pZCBwdXNoKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJCU1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVmc1RvVXBkYXRlKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewotCQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmc1RvVXBkYXRlLnZhbHVlcygpKSB7CisJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZzVG9VcGRhdGUudmFsdWVzKCkpIHsKIAkJCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PVF9BVFRFTVBURUQsIHJydS5nZXRTdGF0dXMoKSk7CiAJCQkJcnJ1LnNldFN0YXR1cyhjb25uZWN0aW9uVXBkYXRlU3RhdHVzKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQppbmRleCAzODM2YjdkLi4wZmZiZTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJdHJ5IChUcmFuc3BvcnRMb2NhbCB0ID0gbmV3IFRyYW5zcG9ydExvY2FsKHNyYywgdXJpT2YoZHN0KSwKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQotCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkYikgeworCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewogCQkJCWRiLmNsb3NlKCk7CiAJCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKIApAQCAtMTk5LDYgKzE5OSwyMyBAQAogCQlhc3NlcnRGYWxzZShoYXZlcy5nZXQoKS5jb250YWlucyhQKSk7CiAJfQogCisJcHJpdmF0ZSBUcmFuc3BvcnRMb2NhbCBuZXdUcmFuc3BvcnRMb2NhbFdpdGhTdHJpY3RWYWxpZGF0aW9uKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gbmV3IFRyYW5zcG9ydExvY2FsKHNyYywgdXJpT2YoZHN0KSwgZHN0LmdldERpcmVjdG9yeSgpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKFJlcG9zaXRvcnkgZGIpIHsKKwkJCQlkYi5jbG9zZSgpOworCQkJCWRzdC5pbmNyZW1lbnRPcGVuKCk7CisKKwkJCQlmaW5hbCBSZWNlaXZlUGFjayBycCA9IHN1cGVyLmNyZWF0ZVJlY2VpdmVQYWNrKGRzdCk7CisJCQkJcnAuc2V0Q2hlY2tSZWNlaXZlZE9iamVjdHModHJ1ZSk7CisJCQkJcnAuc2V0Q2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZSh0cnVlKTsKKwkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgSGlkZVByaXZhdGVIb29rKCkpOworCQkJCXJldHVybiBycDsKKwkJCX0KKwkJfTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIE1hbnVhbGx5IGZvcmNlIGEgZGVsdGEgb2YgYW4gb2JqZWN0IHNvIHdlIHJldXNlIGl0IGxhdGVyLgpAQCAtMjMwLDE5ICsyNDcsNyBAQAogCiAJCS8vIFB1c2ggdGhpcyBuZXcgY29udGVudCB0byB0aGUgcmVtb3RlLCBkb2luZyBzdHJpY3QgdmFsaWRhdGlvbi4KIAkJLy8KLQkJVHJhbnNwb3J0TG9jYWwgdCA9IG5ldyBUcmFuc3BvcnRMb2NhbChzcmMsIHVyaU9mKGRzdCksIGRzdC5nZXREaXJlY3RvcnkoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGRiKSB7Ci0JCQkJZGIuY2xvc2UoKTsKLQkJCQlkc3QuaW5jcmVtZW50T3BlbigpOwotCi0JCQkJZmluYWwgUmVjZWl2ZVBhY2sgcnAgPSBzdXBlci5jcmVhdGVSZWNlaXZlUGFjayhkc3QpOwotCQkJCXJwLnNldENoZWNrUmVjZWl2ZWRPYmplY3RzKHRydWUpOwotCQkJCXJwLnNldENoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUodHJ1ZSk7Ci0JCQkJcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IEhpZGVQcml2YXRlSG9vaygpKTsKLQkJCQlyZXR1cm4gcnA7Ci0JCQl9Ci0JCX07CisJCVB1c2hSZXN1bHQgcjsKIAkJUmVtb3RlUmVmVXBkYXRlIHUgPSBuZXcgUmVtb3RlUmVmVXBkYXRlKCAvLwogCQkJCXNyYywgLy8KIAkJCQlSX01BU1RFUiwgLy8gc3JjIG5hbWUKQEAgLTI1MSwxMiArMjU2LDkgQEAKIAkJCQludWxsLCAvLyBsb2NhbCB0cmFja2luZyBicmFuY2gKIAkJCQludWxsIC8vIGV4cGVjdGVkIGlkCiAJCSk7Ci0JCVB1c2hSZXN1bHQgcjsKLQkJdHJ5IHsKKwkJdHJ5IChUcmFuc3BvcnRMb2NhbCB0ID0gbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpKSB7CiAJCQl0LnNldFB1c2hUaGluKHRydWUpOwogCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXQuY2xvc2UoKTsKIAkJfQogCiAJCWFzc2VydE5vdE51bGwoImhhdmUgcmVzdWx0Iiwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCmluZGV4IGEwY2YwZDIuLjlhYWJkNzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCkBAIC02NywxMiArNjcsMTIgQEAKIAkJY29uZmlnID0gbmV3IENvbmZpZygpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkQ29uZmlnKGZpbmFsIFN0cmluZyBkYXQpIHRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcmVhZENvbmZpZyhTdHJpbmcgZGF0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWNvbmZpZyA9IG5ldyBDb25maWcoKTsKIAkJY29uZmlnLmZyb21UZXh0KGRhdCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlnKGZpbmFsIFN0cmluZyBleHApIHsKKwlwcml2YXRlIHZvaWQgY2hlY2tDb25maWcoU3RyaW5nIGV4cCkgewogCQlhc3NlcnRFcXVhbHMoZXhwLCBjb25maWcudG9UZXh0KCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNDU3MTYxOS4uNGQzZTE2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0yNTksNyArMjU5LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhc3NlcnRCdWZmZXIoZmluYWwgU3RyaW5nIGV4cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgYXNzZXJ0QnVmZmVyKFN0cmluZyBleHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhleHAsIG5ldyBTdHJpbmcocmF3T3V0LnRvQnl0ZUFycmF5KCksCiAJCQkJQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRUZXN0LmphdmEKaW5kZXggZDRjNDdkMy4uYzIzOTkyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRUZXN0LmphdmEKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQlhc3NlcnRFcXVhbHMoMTIsIHJlc3VsdC5zaXplKCkpOwogCQlib29sZWFuIGZvdW5kQSA9IGZhbHNlOwogCQlib29sZWFuIGZvdW5kQiA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CiAJCQlpZiAoInJlZnMvaGVhZHMvYSIuZXF1YWxzKHJydS5nZXRTcmNSZWYoKSkKIAkJCQkJJiYgInJlZnMvaGVhZHMvdGVzdC9hIi5lcXVhbHMocnJ1LmdldFJlbW90ZU5hbWUoKSkpCiAJCQkJZm91bmRBID0gdHJ1ZTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCQlhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CiAJCWJvb2xlYW4gZm91bmRBID0gZmFsc2U7CiAJCWJvb2xlYW4gZm91bmRDID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKIAkJCWlmICgicmVmcy9oZWFkcy9hIi5lcXVhbHMocnJ1LmdldFNyY1JlZigpKQogCQkJCQkmJiAicmVmcy9oZWFkcy9iIi5lcXVhbHMocnJ1LmdldFJlbW90ZU5hbWUoKSkpCiAJCQkJZm91bmRBID0gdHJ1ZTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQlhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CiAJCWJvb2xlYW4gZm91bmRBID0gZmFsc2U7CiAJCWJvb2xlYW4gZm91bmRDID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKIAkJCWlmICgicmVmcy9oZWFkcy9hIi5lcXVhbHMocnJ1LmdldFNyY1JlZigpKQogCQkJCQkmJiAicmVmcy9oZWFkcy9iIi5lcXVhbHMocnJ1LmdldFJlbW90ZU5hbWUoKSkpIHsKIAkJCQlmb3VuZEEgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhCmluZGV4IGE4MTI3YWIuLmVmMDgzZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEKQEAgLTEsMjIgKzEsNDEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc0l0ZW1zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy50aGVJbnN0YW5jZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5QYWNrUHJvdG9jb2xFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzR2FyYmFnZUNvbGxlY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlNldHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuVGV4dFByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2QmxvYjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUYWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFjay5SZXF1ZXN0UG9saWN5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlVwbG9hZFBhY2tGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5OdWxsT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTE3MCw0ICsxODksODk5IEBACiAJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoYmxvYi5uYW1lKCkpKSk7CiAJCX0KIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZXRjaFdpdGhCbG9iTm9uZUZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBibG9iMSA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2IgYmxvYjIgPSByZW1vdGUyLmJsb2IoImZvb2JhIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZTIudHJlZShyZW1vdGUyLmZpbGUoIjEiLCBibG9iMSksCisJCQkJcmVtb3RlMi5maWxlKCIyIiwgYmxvYjIpKTsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZTIuY29tbWl0KHRyZWUpOworCQlyZW1vdGUyLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKworCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCisJCQkJbmV3IFVwbG9hZFBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKKwkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCisJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCQkJCXJldHVybiB1cDsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIyKTsKKworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyMiIpKSB7CisJCQl0bi5zZXRGaWx0ZXJCbG9iTGltaXQoMCk7CisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QodHJlZS50b09iamVjdElkKCkpKTsKKwkJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoYmxvYjEudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJsb2IyLnRvT2JqZWN0SWQoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYkxpbWl0RmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXIyID0gbmV3UmVwbygic2VydmVyMiIpOworCQlUZXN0UmVwb3NpdG9yeTxJbk1lbW9yeVJlcG9zaXRvcnk+IHJlbW90ZTIgPQorCQkJCW5ldyBUZXN0UmVwb3NpdG9yeTw+KHNlcnZlcjIpOworCQlSZXZCbG9iIGxvbmdCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYXIiKTsKKwkJUmV2QmxvYiBzaG9ydEJsb2IgPSByZW1vdGUyLmJsb2IoImZvb2JhIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZTIudHJlZShyZW1vdGUyLmZpbGUoIjEiLCBsb25nQmxvYiksCisJCQkJcmVtb3RlMi5maWxlKCIyIiwgc2hvcnRCbG9iKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisKKwkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAorCQkJCW5ldyBVcGxvYWRQYWNrRmFjdG9yeTxPYmplY3Q+KCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFVwbG9hZFBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCisJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKKwkJCQkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQkJCQlyZXR1cm4gdXA7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyMik7CisKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlcjIiKSkgeworCQkJdG4uc2V0RmlsdGVyQmxvYkxpbWl0KDUpOworCQkJdG4uZmV0Y2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhjb21taXQubmFtZSgpKSkpOworCQkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChsb25nQmxvYi50b09iamVjdElkKCkpKTsKKwkJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChzaG9ydEJsb2IudG9PYmplY3RJZCgpKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZXRjaFdpdGhCbG9iTGltaXRGaWx0ZXJBbmRCaXRtYXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXIyID0gbmV3UmVwbygic2VydmVyMiIpOworCQlUZXN0UmVwb3NpdG9yeTxJbk1lbW9yeVJlcG9zaXRvcnk+IHJlbW90ZTIgPQorCQkJCW5ldyBUZXN0UmVwb3NpdG9yeTw+KHNlcnZlcjIpOworCQlSZXZCbG9iIGxvbmdCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYXIiKTsKKwkJUmV2QmxvYiBzaG9ydEJsb2IgPSByZW1vdGUyLmJsb2IoImZvb2JhIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZTIudHJlZShyZW1vdGUyLmZpbGUoIjEiLCBsb25nQmxvYiksCisJCQkJcmVtb3RlMi5maWxlKCIyIiwgc2hvcnRCbG9iKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisKKwkJLy8gZ2VuZXJhdGUgYml0bWFwcworCQluZXcgRGZzR2FyYmFnZUNvbGxlY3RvcihzZXJ2ZXIyKS5wYWNrKG51bGwpOworCQlzZXJ2ZXIyLnNjYW5Gb3JSZXBvQ2hhbmdlcygpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCg1KTsKKwkJCXRuLmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoY29tbWl0Lm5hbWUoKSkpKTsKKwkJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QobG9uZ0Jsb2IudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3Qoc2hvcnRCbG9iLnRvT2JqZWN0SWQoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoTm9uU3VwcG9ydGluZ1NlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBibG9iID0gcmVtb3RlMi5ibG9iKCJmb28iKTsKKwkJUmV2VHJlZSB0cmVlID0gcmVtb3RlMi50cmVlKHJlbW90ZTIuZmlsZSgiMSIsIGJsb2IpKTsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZTIuY29tbWl0KHRyZWUpOworCQlyZW1vdGUyLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCBmYWxzZSk7CisKKwkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAorCQkJCW5ldyBVcGxvYWRQYWNrRmFjdG9yeTxPYmplY3Q+KCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFVwbG9hZFBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCisJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKKwkJCQkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQkJCQlyZXR1cm4gdXA7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyMik7CisKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlcjIiKSkgeworCQkJdG4uc2V0RmlsdGVyQmxvYkxpbWl0KDApOworCisJCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgiZmlsdGVyIHJlcXVpcmVzIHNlcnZlciB0byBhZHZlcnRpc2UgdGhhdCBjYXBhYmlsaXR5Iik7CisKKwkJCXRuLmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoY29tbWl0Lm5hbWUoKSkpKTsKKwkJfQorCX0KKworCS8qCisJICogSW52b2tlcyBVcGxvYWRQYWNrIHdpdGggcHJvdG9jb2wgdjIgYW5kIHNlbmRzIGl0IHRoZSBnaXZlbiBsaW5lcywKKwkgKiBhbmQgcmV0dXJucyBVcGxvYWRQYWNrJ3Mgb3V0cHV0IHN0cmVhbS4KKwkgKi8KKwlwcml2YXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIHVwbG9hZFBhY2tWMlNldHVwKFJlcXVlc3RQb2xpY3kgcmVxdWVzdFBvbGljeSwKKwkJCVJlZkZpbHRlciByZWZGaWx0ZXIsIFN0cmluZy4uLiBpbnB1dExpbmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2VuZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJUGFja2V0TGluZU91dCBwY2tPdXQgPSBuZXcgUGFja2V0TGluZU91dChzZW5kKTsKKwkJZm9yIChTdHJpbmcgbGluZSA6IGlucHV0TGluZXMpIHsKKwkJCWlmIChsaW5lID09IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCQlwY2tPdXQuZW5kKCk7CisJCQl9IGVsc2UgaWYgKGxpbmUgPT0gUGFja2V0TGluZUluLkRFTElNKSB7CisJCQkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJCX0gZWxzZSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKGxpbmUpOworCQkJfQorCQl9CisKKwkJc2VydmVyLmdldENvbmZpZygpLnNldFN0cmluZygicHJvdG9jb2wiLCBudWxsLCAidmVyc2lvbiIsICIyIik7CisJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhzZXJ2ZXIpOworCQlpZiAocmVxdWVzdFBvbGljeSAhPSBudWxsKQorCQkJdXAuc2V0UmVxdWVzdFBvbGljeShyZXF1ZXN0UG9saWN5KTsKKwkJaWYgKHJlZkZpbHRlciAhPSBudWxsKQorCQkJdXAuc2V0UmVmRmlsdGVyKHJlZkZpbHRlcik7CisJCXVwLnNldEV4dHJhUGFyYW1ldGVycyhTZXRzLm9mKCJ2ZXJzaW9uPTIiKSk7CisKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlY3YgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCXVwLnVwbG9hZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2VuZC50b0J5dGVBcnJheSgpKSwgcmVjdiwgbnVsbCk7CisKKwkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZWN2LnRvQnl0ZUFycmF5KCkpOworCX0KKworCS8qCisJICogSW52b2tlcyBVcGxvYWRQYWNrIHdpdGggcHJvdG9jb2wgdjIgYW5kIHNlbmRzIGl0IHRoZSBnaXZlbiBsaW5lcy4KKwkgKiBSZXR1cm5zIFVwbG9hZFBhY2sncyBvdXRwdXQgc3RyZWFtLCBub3QgaW5jbHVkaW5nIHRoZSBjYXBhYmlsaXR5CisJICogYWR2ZXJ0aXNlbWVudCBieSB0aGUgc2VydmVyLgorCSAqLworCXByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gdXBsb2FkUGFja1YyKFJlcXVlc3RQb2xpY3kgcmVxdWVzdFBvbGljeSwKKwkJCVJlZkZpbHRlciByZWZGaWx0ZXIsIFN0cmluZy4uLiBpbnB1dExpbmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9CisJCQl1cGxvYWRQYWNrVjJTZXR1cChyZXF1ZXN0UG9saWN5LCByZWZGaWx0ZXIsIGlucHV0TGluZXMpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCS8vIGRyYWluIGNhcGFiaWxpdGllcworCQl3aGlsZSAocGNrSW4ucmVhZFN0cmluZygpICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCQlyZXR1cm4gcmVjdlN0cmVhbTsKKwl9CisKKwlwcml2YXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIHVwbG9hZFBhY2tWMihTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiB1cGxvYWRQYWNrVjIobnVsbCwgbnVsbCwgaW5wdXRMaW5lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJDYXBhYmlsaXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9CisJCQl1cGxvYWRQYWNrVjJTZXR1cChudWxsLCBudWxsLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInZlcnNpb24gMiIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCUFycmF5cy5hc0xpc3QocGNrSW4ucmVhZFN0cmluZygpLCBwY2tJbi5yZWFkU3RyaW5nKCkpLAorCQkJLy8gVE9ETyhqb25hdGhhbnRhbm15KSBUaGlzIGNoZWNrIGlzIHdyaXR0ZW4gdGhpcyB3YXkKKwkJCS8vIHRvIG1ha2UgaXQgc2ltcGxlIHRvIHNlZSB0aGF0IHdlIGV4cGVjdCB0aGlzIGxpc3Qgb2YKKwkJCS8vIGNhcGFiaWxpdGllcywgYnV0IHByb2JhYmx5IHNob3VsZCBiZSBsb29zZW5lZCB0bworCQkJLy8gYWxsb3cgYWRkaXRpb25hbCBjb21tYW5kcyB0byBiZSBhZGRlZCB0byB0aGUgbGlzdCwKKwkJCS8vIGFuZCBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyB0byBiZSBhZGRlZCB0byBleGlzdGluZworCQkJLy8gY29tbWFuZHMgd2l0aG91dCByZXF1aXJpbmcgdGVzdCBjaGFuZ2VzLgorCQkJaGFzSXRlbXMoImxzLXJlZnMiLCAiZmV0Y2g9c2hhbGxvdyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJDYXBhYmlsaXRpZXNBbGxvd0ZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0KKwkJCXVwbG9hZFBhY2tWMlNldHVwKG51bGwsIG51bGwsIFBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygidmVyc2lvbiAyIikpOworCQlhc3NlcnRUaGF0KAorCQkJQXJyYXlzLmFzTGlzdChwY2tJbi5yZWFkU3RyaW5nKCksIHBja0luLnJlYWRTdHJpbmcoKSksCisJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpIFRoaXMgY2hlY2sgb3ZlcnNwZWNpZmllcyB0aGUKKwkJCS8vIG9yZGVyIG9mIHRoZSBjYXBhYmlsaXRpZXMgb2YgImZldGNoIi4KKwkJCWhhc0l0ZW1zKCJscy1yZWZzIiwgImZldGNoPWZpbHRlciBzaGFsbG93IikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorCXB1YmxpYyB2b2lkIHRlc3RWMkVtcHR5UmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKFBhY2tldExpbmVJbi5FTkQpOworCQkvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBub3RoaW5nIG1vcmUgYWZ0ZXIgdGhlIGNhcGFiaWxpdHkKKwkJLy8gYWR2ZXJ0aXNlbWVudC4KKwkJYXNzZXJ0VGhhdChyZWN2U3RyZWFtLmF2YWlsYWJsZSgpLCBpcygwKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXNlcnZlci51cGRhdGVSZWYoIkhFQUQiKS5saW5rKCJyZWZzL2hlYWRzL21hc3RlciIpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNTeW1yZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlzZXJ2ZXIudXBkYXRlUmVmKCJIRUFEIikubGluaygicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkRFTElNLCAic3ltcmVmcyIsIFBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCBzeW1yZWYtdGFyZ2V0OnJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzUGVlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKCJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgInBlZWwiLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlwY2tJbi5yZWFkU3RyaW5nKCksCisJCQlpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyBwZWVsZWQ6IgorCQkJCSsgdGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNNdWx0aXBsZUNvbW1hbmRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlzZXJ2ZXIudXBkYXRlUmVmKCJIRUFEIikubGluaygicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uREVMSU0sICJzeW1yZWZzIiwgInBlZWwiLCBQYWNrZXRMaW5lSW4uRU5ELAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkRFTElNLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQgc3ltcmVmLXRhcmdldDpyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCXBja0luLnJlYWRTdHJpbmcoKSwKKwkJCWlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIHBlZWxlZDoiCisJCQkJKyB0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzUmVmUHJlZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJvdGhlciIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInlldEFub3RoZXIiLCB0aXApOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9tYXN0ZSIsCisJCQkicmVmLXByZWZpeCByZWZzL2hlYWRzL290aGVyIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9vdGhlciIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNSZWZQcmVmaXhOb1NsYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJvdGhlciIsIHRpcCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkicmVmLXByZWZpeCByZWZzL2hlYWRzL21hc3RlIiwKKwkJCSJyZWYtcHJlZml4IHIiLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL290aGVyIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1VucmVjb2duaXplZEFyZ3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93bi5leHBlY3QoUGFja1Byb3RvY29sRXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoInVuZXhwZWN0ZWQgaW52YWxpZC1hcmd1bWVudCIpOworCQl1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJImludmFsaWQtYXJndW1lbnRcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwkvKgorCSAqIFBhcnNlIG11bHRpcGxleGVkIHBhY2tmaWxlIG91dHB1dCBmcm9tIHVwbG9hZC1wYWNrIHVzaW5nIHByb3RvY29sIFYyCisJICogaW50byB0aGUgY2xpZW50IHJlcG9zaXRvcnkuCisJICovCisJcHJpdmF0ZSBSZWNlaXZlZFBhY2tTdGF0aXN0aWNzIHBhcnNlUGFjayhCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHBhcnNlUGFjayhyZWN2U3RyZWFtLCBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFKTsKKwl9CisKKwlwcml2YXRlIFJlY2VpdmVkUGFja1N0YXRpc3RpY3MgcGFyc2VQYWNrKEJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0sIFByb2dyZXNzTW9uaXRvciBwbSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlTaWRlQmFuZElucHV0U3RyZWFtIHNiID0gbmV3IFNpZGVCYW5kSW5wdXRTdHJlYW0oCisJCQkJcmVjdlN0cmVhbSwgcG0sCisJCQkJbmV3IFN0cmluZ1dyaXRlcigpLCBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKTsKKwkJUGFja1BhcnNlciBwcCA9IGNsaWVudC5uZXdPYmplY3RJbnNlcnRlcigpLm5ld1BhY2tQYXJzZXIoc2IpOworCQlwcC5wYXJzZShOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFKTsKKwkJcmV0dXJuIHBwLmdldFJlY2VpdmVkUGFja1N0YXRpc3RpY3MoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeUFkdmVydGlzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGFkdmVydGl6ZWQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdW5hZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGFkdmVydGl6ZWQpOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BRFZFUlRJU0VELAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGFkdmVydGl6ZWQubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgdW5hZHZlcnRpemVkLm5hbWUoKSArICIgbm90IHZhbGlkIikpOworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LkFEVkVSVElTRUQsCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdW5hZHZlcnRpemVkLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeVJlYWNoYWJsZUNvbW1pdCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGFkdmVydGl6ZWQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChyZWFjaGFibGUpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdW5yZWFjaGFibGUgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgYWR2ZXJ0aXplZCk7CisKKwkJLy8gVGhpcyB3b3JrcworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlJFQUNIQUJMRV9DT01NSVQsCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcmVhY2hhYmxlLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKworCQkvLyBUaGlzIGRvZXNuJ3QKKwkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZShNYXRjaGVycy5jb250YWluc1N0cmluZygKKwkJCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICIgbm90IHZhbGlkIikpOworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlJFQUNIQUJMRV9DT01NSVQsCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5VGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBwYXJlbnRPZlRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChwYXJlbnRPZlRpcCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoInNlY3JldCIsIHRpcCk7CisKKwkJLy8gVGhpcyB3b3JrcworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlRJUCwKKwkJCW5ldyBSZWplY3RBbGxSZWZGaWx0ZXIoKSwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHRpcC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisKKwkJLy8gVGhpcyBkb2Vzbid0CisJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoCisJCQkJCSJ3YW50ICIgKyBwYXJlbnRPZlRpcC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBwYXJlbnRPZlRpcC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lSZWFjaGFibGVDb21taXRUaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHBhcmVudE9mVGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KHBhcmVudE9mVGlwKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgic2VjcmV0IiwgdGlwKTsKKworCQkvLyBUaGlzIHdvcmtzCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuUkVBQ0hBQkxFX0NPTU1JVF9USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBwYXJlbnRPZlRpcC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisKKwkJLy8gVGhpcyBkb2Vzbid0CisJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoCisJCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlUX1RJUCwKKwkJCW5ldyBSZWplY3RBbGxSZWZGaWx0ZXIoKSwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeUFueSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdW5yZWFjaGFibGUgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCisJCS8vIEV4ZXJjaXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGV2ZW4gdW5yZWFjaGFibGUgY29tbWl0cyBjYW4gYmUgZmV0Y2hlZAorCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LkFOWSwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFNlcnZlckRvZXNOb3RTdG9wTmVnb3RpYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGZvb1BhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBmb29DaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KGZvb1BhcmVudCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJQYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChiYXJQYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgZm9vQ2hpbGQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gyIiwgYmFyQ2hpbGQpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBmb29DaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJ3YW50ICIgKyBiYXJDaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoImFja25vd2xlZGdtZW50cyIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJBQ0sgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCB0aGVJbnN0YW5jZShQYWNrZXRMaW5lSW4uRU5EKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFNlcnZlclN0b3BzTmVnb3RpYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGZvb1BhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBmb29DaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KGZvb1BhcmVudCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJQYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChiYXJQYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgZm9vQ2hpbGQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gyIiwgYmFyQ2hpbGQpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBmb29DaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJ3YW50ICIgKyBiYXJDaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgYmFyUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJhY2tub3dsZWRnbWVudHMiKSk7CisJCWFzc2VydFRoYXQoCisJCQlBcnJheXMuYXNMaXN0KHBja0luLnJlYWRTdHJpbmcoKSwgcGNrSW4ucmVhZFN0cmluZygpKSwKKwkJCWhhc0l0ZW1zKAorCQkJCSJBQ0sgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpLAorCQkJCSJBQ0sgIiArIGJhclBhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicmVhZHkiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCB0aGVJbnN0YW5jZShQYWNrZXRMaW5lSW4uREVMSU0pKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGZvb1BhcmVudC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGZvb0NoaWxkLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJhclBhcmVudC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGJhckNoaWxkLnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hDbGllbnRTdG9wc05lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoZm9vUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoZm9vQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJQYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoVGhpblBhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbW1vbkluQmxvYiA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKKwkJUmV2QmxvYiBwYXJlbnRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImEiKTsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIHBhcmVudEJsb2IpKSk7CisJCVJldkJsb2IgY2hpbGRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImIiKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdChyZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiZm9vIiwgY2hpbGRCbG9iKSksIHBhcmVudCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjaGlsZCk7CisKKwkJLy8gUHJldGVuZCB0aGF0IHdlIGhhdmUgcGFyZW50IHRvIGdldCBhIHRoaW4gcGFjayBiYXNlZCBvbiBpdC4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIHBhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJ0aGluLXBhY2tcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisKKwkJLy8gVmVyaWZ5IHRoYXQgd2UgcmVjZWl2ZWQgYSB0aGluIHBhY2sgYnkgdHJ5aW5nIHRvIGFwcGx5IGl0CisJCS8vIGFnYWluc3QgdGhlIGNsaWVudCByZXBvLCB3aGljaCBkb2VzIG5vdCBoYXZlIHBhcmVudC4KKwkJdGhyb3duLmV4cGVjdChJT0V4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJwYWNrIGhhcyB1bnJlc29sdmVkIGRlbHRhcyIpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaE5vUHJvZ3Jlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjb21taXQpOworCisJCS8vIFdpdGhvdXQgbm8tcHJvZ3Jlc3MsIHByb2dyZXNzIGlzIHJlcG9ydGVkLgorCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSwgbmV3IFRleHRQcm9ncmVzc01vbml0b3Ioc3cpKTsKKwkJYXNzZXJ0RmFsc2Uoc3cudG9TdHJpbmcoKS5pc0VtcHR5KCkpOworCisJCS8vIFdpdGggbm8tcHJvZ3Jlc3MsIHByb2dyZXNzIGlzIG5vdCByZXBvcnRlZC4KKwkJc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkibm8tcHJvZ3Jlc3NcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtLCBuZXcgVGV4dFByb2dyZXNzTW9uaXRvcihzdykpOworCQlhc3NlcnRUcnVlKHN3LnRvU3RyaW5nKCkuaXNFbXB0eSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoSW5jbHVkZVRhZygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIGNvbW1pdCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjb21taXQpOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQkvLyBXaXRob3V0IGluY2x1ZGUtdGFnLgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KHRhZy50b09iamVjdElkKCkpKTsKKworCQkvLyBXaXRoIHRhZy4KKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJpbmNsdWRlLXRhZ1xuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QodGFnLnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hPZnNEZWx0YSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY29tbW9uSW5CbG9iID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKworCQlSZXZCbG9iIHBhcmVudEJsb2IgPSByZW1vdGUuYmxvYihjb21tb25JbkJsb2IgKyAiYSIpOworCQlSZXZDb21taXQgcGFyZW50ID0gcmVtb3RlLmNvbW1pdChyZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiZm9vIiwgcGFyZW50QmxvYikpKTsKKwkJUmV2QmxvYiBjaGlsZEJsb2IgPSByZW1vdGUuYmxvYihjb21tb25JbkJsb2IgKyAiYiIpOworCQlSZXZDb21taXQgY2hpbGQgPSByZW1vdGUuY29tbWl0KHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCJmb28iLCBjaGlsZEJsb2IpKSwgcGFyZW50KTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNoaWxkKTsKKworCQkvLyBXaXRob3V0IG9mcy1kZWx0YS4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJUmVjZWl2ZWRQYWNrU3RhdGlzdGljcyBzdGF0cyA9IHBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShzdGF0cy5nZXROdW1PZnNEZWx0YSgpID09IDApOworCisJCS8vIFdpdGggb2ZzLWRlbHRhLgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkib2ZzLWRlbHRhXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlzdGF0cyA9IHBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShzdGF0cy5nZXROdW1PZnNEZWx0YSgpICE9IDApOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTaGFsbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21tb25QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgicGFyZW50IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBmb29DaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KGNvbW1vblBhcmVudCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KGNvbW1vblBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBiYXJDaGlsZCk7CisKKwkJLy8gV2l0aG91dCBzaGFsbG93LCB0aGUgc2VydmVyIHRoaW5rcyB0aGF0IHdlIGhhdmUKKwkJLy8gY29tbW9uUGFyZW50LCBzbyBpdCBkb2Vzbid0IHNlbmQgaXQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBiYXJDaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBmb29DaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGJhckNoaWxkLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGNvbW1vblBhcmVudC50b09iamVjdElkKCkpKTsKKworCQkvLyBXaXRoIHNoYWxsb3csIHRoZSBzZXJ2ZXIga25vd3MgdGhhdCB3ZSBkb24ndCBoYXZlCisJCS8vIGNvbW1vblBhcmVudCwgc28gaXQgc2VuZHMgaXQuCisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBiYXJDaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBmb29DaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJzaGFsbG93ICIgKyBmb29DaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoY29tbW9uUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hEZWVwZW5BbmREb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBwYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgicGFyZW50IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBjaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikucGFyZW50KHBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjaGlsZCk7CisKKwkJLy8gImRlZXBlbiAxIiBzZW5kcyBvbmx5IHRoZSBjaGlsZC4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRlZXBlbiAxXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJzaGFsbG93LWluZm8iKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygic2hhbGxvdyAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkRFTElNKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGNoaWxkLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KHBhcmVudC50b09iamVjdElkKCkpKTsKKworCQkvLyBXaXRob3V0IHRoYXQsIHRoZSBwYXJlbnQgaXMgc2VudCB0b28uCisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QocGFyZW50LnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hEZWVwZW5XaXRob3V0RG9uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgY2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkZWVwZW4gMVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCS8vIFZlcmlmeSB0aGF0IG9ubHkgdGhlIGNvcnJlY3Qgc2VjdGlvbiBpcyBzZW50LiAic2hhbGxvdy1pbmZvIgorCQkvLyBpcyBub3Qgc2VudCBiZWNhdXNlLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sIGl0IGlzCisJCS8vIHNlbnQgb25seSBpZiBhIHBhY2tmaWxlIGlzIHNlbnQuCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiYWNrbm93bGVkZ21lbnRzIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoIk5BSyIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5FTkQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoVW5yZWNvZ25pemVkQXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhyb3duLmV4cGVjdChQYWNrUHJvdG9jb2xFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgidW5leHBlY3RlZCBpbnZhbGlkLWFyZ3VtZW50Iik7CisJCXVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJImludmFsaWQtYXJndW1lbnRcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkJsb2IgYmlnID0gcmVtb3RlLmJsb2IoImZvb2JhciIpOworCQlSZXZCbG9iIHNtYWxsID0gcmVtb3RlLmJsb2IoImZvb2JhIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCIxIiwgYmlnKSwKKwkJCQlyZW1vdGUuZmlsZSgiMiIsIHNtYWxsKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUuY29tbWl0KHRyZWUpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlci5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJmaWx0ZXIgYmxvYjpsaW1pdD01XG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QoYmlnLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3Qoc21hbGwudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEZpbHRlcldoZW5Ob3RBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgiMCIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlci5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgZmFsc2UpOworCisJCXRocm93bi5leHBlY3QoUGFja1Byb3RvY29sRXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoInVuZXhwZWN0ZWQgZmlsdGVyIGJsb2I6bGltaXQ9NSIpOworCQl1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZmlsdGVyIGJsb2I6bGltaXQ9NVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVqZWN0QWxsUmVmRmlsdGVyIGltcGxlbWVudHMgUmVmRmlsdGVyIHsKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBNYXA8U3RyaW5nLCBSZWY+IGZpbHRlcihNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHsKKwkJCXJldHVybiBuZXcgSGFzaE1hcDw+KCk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YQppbmRleCBjYjA0ZjgzLi4zM2UyNTI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5XYWxrRW5jcnlwdGlvblRlc3QuVXRpbC5jcnlwdG9DaXBoZXJMaXN0UEJFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5XYWxrRW5jcnlwdGlvblRlc3QuVXRpbC5jcnlwdG9DaXBoZXJMaXN0VHJhbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LldhbGtFbmNyeXB0aW9uVGVzdC5VdGlsLmZvbGRlckRlbGV0ZTsKQEAgLTM2MCw3ICszNjAsNyBAQAogCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCQkgKi8KIAkJc3RhdGljIFN0cmluZyB0ZXh0UmVhZChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBTdHJpbmcoRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGUudG9QYXRoKCkpLCBVVEZfOCk7CisJCQlyZXR1cm4gbmV3IFN0cmluZyhGaWxlcy5yZWFkQWxsQnl0ZXMoZmlsZS50b1BhdGgoKSksIENIQVJTRVQpOwogCQl9CiAKIAkJLyoqCkBAIC0zNzEsNyArMzcxLDcgQEAKIAkJICogQHRocm93cyBFeGNlcHRpb24KIAkJICovCiAJCXN0YXRpYyB2b2lkIHRleHRXcml0ZShGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCUZpbGVzLndyaXRlKGZpbGUudG9QYXRoKCksIHRleHQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCUZpbGVzLndyaXRlKGZpbGUudG9QYXRoKCksIHRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAKIAkJc3RhdGljIHZvaWQgdmVyaWZ5RmlsZUNvbnRlbnQoRmlsZSBmaWxlT25lLCBGaWxlIGZpbGVUd28pCkBAIC00MTksMTIgKzQxOSw5IEBACiAJCQkJVVJMQ29ubmVjdGlvbiBjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CiAJCQkJYy5zZXRDb25uZWN0VGltZW91dCg1MDApOwogCQkJCWMuc2V0UmVhZFRpbWVvdXQoNTAwKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoYy5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjLmdldElucHV0U3RyZWFtKCkpKSkgewogCQkJCQlyZXR1cm4gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gfCBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKIAkJCQlyZXR1cm4gIkNhbid0IHJlYWNoIGh0dHA6Ly9jaGVja2lwLmFtYXpvbmF3cy5jb20gdG8iCkBAIC02NTQsOSArNjUxLDkgQEAKIAkJCVByb3BlcnRpZXMgcHJvcHMgPSBQcm9wcy5kaXNjb3ZlcigpOwogCQkJcHJvcHMucHV0KEFtYXpvblMzLktleXMuUEFTU1dPUkQsIEpHSVRfUEFTUyk7CiAJCQlwcm9wcy5wdXQoQW1hem9uUzMuS2V5cy5DUllQVE9fQUxHLCBhbGdvcml0aG0pOwotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKEpHSVRfQ09ORl9GSUxFKTsKLQkJCXByb3BzLnN0b3JlKHdyaXRlciwgIkpHSVQgUzMgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuIik7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKKwkJCXRyeSAoUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKEpHSVRfQ09ORl9GSUxFKSkgeworCQkJCXByb3BzLnN0b3JlKHdyaXRlciwgIkpHSVQgUzMgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCQl9CiAJCX0KIAogCQkvKioKQEAgLTY2OCw5ICs2NjUsOSBAQAogCQlzdGF0aWMgdm9pZCBjb25maWdDcmVhdGUoUHJvcGVydGllcyBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewogCQkJUHJvcGVydGllcyB0YXJnZXQgPSBQcm9wcy5kaXNjb3ZlcigpOwogCQkJdGFyZ2V0LnB1dEFsbChzb3VyY2UpOwotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKEpHSVRfQ09ORl9GSUxFKTsKLQkJCXRhcmdldC5zdG9yZSh3cml0ZXIsICJKR0lUIFMzIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiBmaWxlLiIpOwotCQkJd3JpdGVyLmNsb3NlKCk7CisJCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihKR0lUX0NPTkZfRklMRSkpIHsKKwkJCQl0YXJnZXQuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJCX0KIAkJfQogCiAJCS8qKgpAQCAtNzQxLDcgKzczOCw3IEBACiAJCQlBbWF6b25TMyBzMyA9IG5ldyBBbWF6b25TMyhwcm9wcyk7CiAJCQlTdHJpbmcgZmlsZSA9IEpHSVRfVVNFUiArICItIiArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CiAJCQlTdHJpbmcgcGF0aCA9IEpHSVRfUkVNT1RFX0RJUiArICIvIiArIGZpbGU7Ci0JCQlzMy5wdXQoYnVja2V0LCBwYXRoLCBmaWxlLmdldEJ5dGVzKFVURl84KSk7CisJCQlzMy5wdXQoYnVja2V0LCBwYXRoLCBmaWxlLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCXMzLmRlbGV0ZShidWNrZXQsIHBhdGgpOwogCQl9CiAKQEAgLTgzNiwxMCArODMzLDEwIEBACiAJCQl7CiAJCQkJYnl0ZVtdIG9yaWdpbiA9IHNvdXJjZVRleHQuZ2V0Qnl0ZXMoY2hhcnNldCk7CiAJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHRhcmdldCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlPdXRwdXRTdHJlYW0gc291cmNlID0gY3J5cHRvLmVuY3J5cHQodGFyZ2V0KTsKLQkJCQlzb3VyY2Uud3JpdGUob3JpZ2luKTsKLQkJCQlzb3VyY2UuZmx1c2goKTsKLQkJCQlzb3VyY2UuY2xvc2UoKTsKKwkJCQl0cnkgKE91dHB1dFN0cmVhbSBzb3VyY2UgPSBjcnlwdG8uZW5jcnlwdCh0YXJnZXQpKSB7CisJCQkJCXNvdXJjZS53cml0ZShvcmlnaW4pOworCQkJCQlzb3VyY2UuZmx1c2goKTsKKwkJCQl9CiAJCQkJY2lwaGVyVGV4dCA9IHRhcmdldC50b0J5dGVBcnJheSgpOwogCQkJfQogCQkJewpAQCAtMTA3NCwxMCArMTA3MSwxMCBAQAogCQkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKIAkJCQljb25maWcuc2F2ZSgpOwogCi0JCQkJR2l0IGdpdCA9IEdpdC5vcGVuKGRpck9uZSk7Ci0JCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOwotCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKLQkJCQlnaXQuY2xvc2UoKTsKKwkJCQl0cnkgKEdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpKSB7CisJCQkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUocmVtb3RlKS5zZXRSZWZTcGVjcyhzcGVjcykuY2FsbCgpOworCQkJCX0KIAogCQkJCUZpbGUgZmlsZVN0YXRpYyA9IG5ldyBGaWxlKGRpck9uZSwgbmFtZVN0YXRpYyk7CiAJCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgc2V0dXAiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKQEAgLTEwODksMTEgKzEwODYsMTEgQEAKIAkJCQlGaWxlIGZpbGVTdGF0aWMgPSBuZXcgRmlsZShkaXJUd28sIG5hbWVTdGF0aWMpOwogCQkJCWFzc2VydEZhbHNlKCJOb3QgUHJvdmlkZWQgYnkgc2V0dXAiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKHVyaSkuc2V0RGlyZWN0b3J5KGRpclR3bykKLQkJCQkJCS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldFVSSSh1cmkpCisJCQkJCQkuc2V0RGlyZWN0b3J5KGRpclR3bykuY2FsbCgpKSB7CisJCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNsb25lIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CisJCQkJfQogCi0JCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgY2xvbmUiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKIAkJCX0KIAogCQkJeyAvLyBWZXJpZnkgc3RhdGljIGZpbGUgY29udGVudC4KQEAgLTExMTEsMTEgKzExMDgsMTEgQEAKIAkJCQlhc3NlcnRUcnVlKCJQcm92aWRlZCBieSBjcmVhdGUiLCBmaWxlRHluYW1pYy5leGlzdHMoKSk7CiAJCQkJYXNzZXJ0VHJ1ZSgiTmVlZCBjb250ZW50IHRvIGVuY3J5cHQiLCBmaWxlRHluYW1pYy5sZW5ndGgoKSA+IDApOwogCi0JCQkJR2l0IGdpdCA9IEdpdC5vcGVuKGRpck9uZSk7Ci0JCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKG5hbWVEeW5hbWljKS5jYWxsKCk7Ci0JCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UobmFtZUR5bmFtaWMpLmNhbGwoKTsKLQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKSkgeworCQkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obmFtZUR5bmFtaWMpLmNhbGwoKTsKKwkJCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UobmFtZUR5bmFtaWMpLmNhbGwoKTsKKwkJCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUocmVtb3RlKS5zZXRSZWZTcGVjcyhzcGVjcykuY2FsbCgpOworCQkJCX0KIAogCQkJfQogCkBAIC0xMTI0LDkgKzExMjEsOSBAQAogCQkJCUZpbGUgZmlsZUR5bmFtaWMgPSBuZXcgRmlsZShkaXJUd28sIG5hbWVEeW5hbWljKTsKIAkJCQlhc3NlcnRGYWxzZSgiTm90IFByb3ZpZGVkIGJ5IHNldHVwIiwgZmlsZUR5bmFtaWMuZXhpc3RzKCkpOwogCi0JCQkJR2l0IGdpdCA9IEdpdC5vcGVuKGRpclR3byk7Ci0JCQkJZ2l0LnB1bGwoKS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyVHdvKSkgeworCQkJCQlnaXQucHVsbCgpLmNhbGwoKTsKKwkJCQl9CiAKIAkJCQlhc3NlcnRUcnVlKCJQcm92aWRlZCBieSBwdWxsIiwgZmlsZUR5bmFtaWMuZXhpc3RzKCkpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlclRlc3QuamF2YQppbmRleCBmNWU5N2MyLi42MTk1ZTY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlclRlc3QuamF2YQpAQCAtOTEsOSArOTEsOSBAQAogCQkJCWhhc2hfc29tZXRyZWUpLCBlbnRyeShtNjQ0LCAiZm9vIiwgaGFzaF9mb28pKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gbWt0cmVlKGZpbmFsIGJ5dGVbXS4uLiBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gbWt0cmVlKGJ5dGVbXS4uLiBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJZm9yIChmaW5hbCBieXRlW10gZSA6IGRhdGEpCisJCWZvciAoYnl0ZVtdIGUgOiBkYXRhKQogCQkJb3V0LndyaXRlKGUpOwogCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvclRlc3QuamF2YQppbmRleCBlMzRjYjk3Li4wZTAwOWI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvclRlc3QuamF2YQpAQCAtODIxLDcgKzgyMSw3IEBACiAJCWFzc2VydEVxdWFscyhzaGExc3RyaW5nLCB0dy5nZXRPYmplY3RJZCgxKS5nZXROYW1lKCkgLyogMT1maWxldHJlZSBoZXJlICovKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCBpLnBhdGgsIDAsIGkucGF0aExlbik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sLmphdmEKaW5kZXggNzE3YTJmMy4uZmM3OWQ0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbC5qYXZhCkBAIC05Myw3ICs5Myw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXJldHVybiBuZXcgRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbCh0aGlzLAogCQkJCSgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsIG1vZFRpbWVzKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEKaW5kZXggNmFkNDdjMi4uMjMyNDIyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1Bvc3RPcmRlclRyZWVXYWxrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Qb3N0T3JkZXJUcmVlV2Fsa1Rlc3QuamF2YQpAQCAtNjAsMTQgKzYwLDE0IEBACiBwdWJsaWMgY2xhc3MgUG9zdE9yZGVyVHJlZVdhbGtUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplX05vUG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlhc3NlcnRGYWxzZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVfVG9nZ2xlUG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlhc3NlcnRGYWxzZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCWFzc2VydFRydWUodHcuaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKSk7CkBAIC03OCw3ICs3OCw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXNldERvZXNOb3RBZmZlY3RQb3N0T3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCWFzc2VydFRydWUodHcuaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKSk7CiAJCQl0dy5yZXNldCgpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCWIuZmluaXNoKCk7CiAJCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldEVudHJ5Q291bnQoKSk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbChmYWxzZSk7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKHRyZWUpKTsKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAJCWIuZmluaXNoKCk7CiAJCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldEVudHJ5Q291bnQoKSk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKHRydWUpOwogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcih0cmVlKSk7CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBEaXJDYWNoZUVudHJ5IG1ha2VGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIERpckNhY2hlRW50cnkgbWFrZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY3JlYXRlRW50cnkocGF0aCwgUkVHVUxBUl9GSUxFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0Fsd2F5c0Nsb25lVHJlZUZpbHRlci5qYXZhCmluZGV4IDhlMmNjYTQuLmQ5Y2ZiNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbHdheXNDbG9uZVRyZWVGaWx0ZXIuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyVGVzdC5qYXZhCmluZGV4IGY3YTdmYjguLmM2Mzg5ZmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXJUZXN0LmphdmEKQEAgLTU3LDEyICs1NywxMyBAQAogcHVibGljIGNsYXNzIE5vdFRyZWVGaWx0ZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RXcmFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKTsKLQkJZmluYWwgVHJlZUZpbHRlciBhID0gVHJlZUZpbHRlci5BTEw7Ci0JCWZpbmFsIFRyZWVGaWx0ZXIgbiA9IE5vdFRyZWVGaWx0ZXIuY3JlYXRlKGEpOwotCQlhc3NlcnROb3ROdWxsKG4pOwotCQlhc3NlcnRUcnVlKGEuaW5jbHVkZSh0dykpOwotCQlhc3NlcnRGYWxzZShuLmluY2x1ZGUodHcpKTsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJCWZpbmFsIFRyZWVGaWx0ZXIgYSA9IFRyZWVGaWx0ZXIuQUxMOworCQkJZmluYWwgVHJlZUZpbHRlciBuID0gTm90VHJlZUZpbHRlci5jcmVhdGUoYSk7CisJCQlhc3NlcnROb3ROdWxsKG4pOworCQkJYXNzZXJ0VHJ1ZShhLmluY2x1ZGUodHcpKTsKKwkJCWFzc2VydEZhbHNlKG4uaW5jbHVkZSh0dykpOworCQl9CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXBUZXN0LmphdmEKaW5kZXggZDkyMWFhYi4uNzFhMmYzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXBUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXBUZXN0LmphdmEKQEAgLTI1NCw3ICsyNTQsNyBAQAogCQl9CiAJfQogCi0JVHJlZVdhbGsgZmFrZVdhbGsoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJVHJlZVdhbGsgZmFrZVdhbGsoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCURpckNhY2hlIGRjID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CiAJCURpckNhY2hlRWRpdG9yIGRjZSA9IGRjLmVkaXRvcigpOwogCQlkY2UuYWRkKG5ldyBEaXJDYWNoZUVkaXRvci5QYXRoRWRpdChwYXRoKSB7CkBAIC0yNzQsNyArMjc0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlUcmVlV2FsayBmYWtlV2Fsa0F0U3VidHJlZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlUcmVlV2FsayBmYWtlV2Fsa0F0U3VidHJlZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJRGlyQ2FjaGVFZGl0b3IgZGNlID0gZGMuZWRpdG9yKCk7CiAJCWRjZS5hZGQobmV3IERpckNhY2hlRWRpdG9yLlBhdGhFZGl0KHBhdGggKyAiL1JFQURNRSIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YQppbmRleCAzOGFkZGEzLi4xNDhkNWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyVGVzdC5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogCXByaXZhdGUgTGlzdDxTdHJpbmc+IGdldE1hdGNoaW5nUGF0aHMoU3RyaW5nIHN1ZmZpeEZpbHRlciwKIAkJCWZpbmFsIE9iamVjdElkIHRyZWVJZCwgYm9vbGVhbiByZWN1cnNpdmVXYWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0RmlsdGVyKFBhdGhTdWZmaXhGaWx0ZXIuY3JlYXRlKHN1ZmZpeEZpbHRlcikpOwogCQkJdHcuc2V0UmVjdXJzaXZlKHJlY3Vyc2l2ZVdhbGspOwogCQkJdHcuYWRkVHJlZSh0cmVlSWQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyVGVzdC5qYXZhCmluZGV4IGMzNDIzYjYuLjg2ODZjNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIHB1YmxpYyBjbGFzcyBUcmVlRmlsdGVyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0QUxMX0luY2x1ZGVzQW55dGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwogCQkJYXNzZXJ0VHJ1ZShUcmVlRmlsdGVyLkFMTC5pbmNsdWRlKHR3KSk7CiAJCX0KQEAgLTczLDcgKzczLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE5vdEFMTF9JbmNsdWRlc05vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwogCQkJYXNzZXJ0RmFsc2UoVHJlZUZpbHRlci5BTEwubmVnYXRlKCkuaW5jbHVkZSh0dykpOwogCQl9CkBAIC04MSw3ICs4MSw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBTllfRElGRl9JbmNsdWRlc1NpbmdsZVRyZWVDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKIAkJCWFzc2VydFRydWUoVHJlZUZpbHRlci5BTllfRElGRi5pbmNsdWRlKHR3KSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YQppbmRleCA2ZmVkMjMzLi44MTQ2N2MyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DaGFuZ2VJZFV0aWxUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2hhbmdlSWRVdGlsVGVzdC5qYXZhCkBAIC02ODAsMTUgKzY4MCwxNSBAQAogCQkJCSJcbiIpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaG9va0RvZXNOb3RNb2RpZnkoZmluYWwgU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgaG9va0RvZXNOb3RNb2RpZnkoU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGluLCBjYWxsKGluKSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgY2FsbChmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgY2FsbChTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjYWxsKGJvZHksIGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBjYWxsKGZpbmFsIFN0cmluZyBib2R5LCBib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgY2FsbChTdHJpbmcgYm9keSwgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24gewogCQlPYmplY3RJZCBjb21wdXRlQ2hhbmdlSWQgPSBDaGFuZ2VJZFV0aWwuY29tcHV0ZUNoYW5nZUlkKHRyZWVJZDEsCiAJCQkJcGFyZW50SWQxLCBhdXRob3IsIGNvbW1pdHRlciwgYm9keSk7CiAJCWlmIChjb21wdXRlQ2hhbmdlSWQgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhCmluZGV4IGE2ODBlZjkuLmUzNGMzY2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YQpAQCAtMjQxLDcgKzI0MSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIEZpbGUgd3JpdGVIb29rRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRhdGEpCisJcHJpdmF0ZSBGaWxlIHdyaXRlSG9va0ZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSArICIvLmdpdC9ob29rcy8iLCBuYW1lKTsKIAkJSkdpdFRlc3RVdGlsLndyaXRlKHBhdGgsIGRhdGEpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTkJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9OQlRlc3QuamF2YQppbmRleCBkMmQ0NGZmLi44MzBmMjBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9OQlRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9OQlRlc3QuamF2YQpAQCAtMzM4LDcgKzMzOCw3IEBACiAJCWFzc2VydE91dHB1dChiKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpLCBvdXQsIDMpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcGFyZU91dHB1dChmaW5hbCBieXRlW10gYnVmKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlT3V0cHV0KGJ5dGVbXSBidWYpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspCiAJCQlidWZbaV0gPSAoYnl0ZSkgKDB4NzcgKyBpKTsKIAl9CkBAIC0zNTMsMTEgKzM1MywxMSBAQAogCQkJYXNzZXJ0RXF1YWxzKChieXRlKSAoMHg3NyArIGkpLCBidWZbaV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiKGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiKGludCBhLCBpbnQgYikgewogCQlyZXR1cm4gbmV3IGJ5dGVbXSB7IChieXRlKSBhLCAoYnl0ZSkgYiB9OwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBwYWRiKGZpbmFsIGludCBsZW4sIGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBwYWRiKGludCBsZW4sIGludCBhLCBpbnQgYikgewogCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2xlbiArIDJdOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQogCQkJcltpXSA9IChieXRlKSAweGFmOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAJCXJldHVybiBuZXcgYnl0ZVtdIHsgKGJ5dGUpIGEsIChieXRlKSBiLCAoYnl0ZSkgYyB9OwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiKGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYiwgZmluYWwgaW50IGMsIGZpbmFsIGludCBkKSB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGIoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKIAkJcmV0dXJuIG5ldyBieXRlW10geyAoYnl0ZSkgYSwgKGJ5dGUpIGIsIChieXRlKSBjLCAoYnl0ZSkgZCB9OwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVTdHlsZVRlc3QuamF2YQppbmRleCA2NTA3ODc2Li40OWFkNTVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVTdHlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVTdHlsZVRlc3QuamF2YQpAQCAtNTIsMTQgKzUyLDE0IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBRdW90ZWRTdHJpbmdCb3VybmVTdHlsZVRlc3QgewotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoZmluYWwgU3RyaW5nIGluLCBmaW5hbCBTdHJpbmcgZXhwKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShTdHJpbmcgaW4sIFN0cmluZyBleHApIHsKIAkJZmluYWwgU3RyaW5nIHIgPSBCT1VSTkUucXVvdGUoaW4pOwogCQlhc3NlcnROb3RTYW1lKGluLCByKTsKIAkJYXNzZXJ0RmFsc2UoaW4uZXF1YWxzKHIpKTsKIAkJYXNzZXJ0RXF1YWxzKCdcJycgKyBleHAgKyAnXCcnLCByKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoZmluYWwgU3RyaW5nIGV4cCwgZmluYWwgU3RyaW5nIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKFN0cmluZyBleHAsIFN0cmluZyBpbikgewogCQlmaW5hbCBieXRlW10gYiA9IENvbnN0YW50cy5lbmNvZGUoJ1wnJyArIGluICsgJ1wnJyk7CiAJCWZpbmFsIFN0cmluZyByID0gQk9VUk5FLmRlcXVvdGUoYiwgMCwgYi5sZW5ndGgpOwogCQlhc3NlcnRFcXVhbHMoZXhwLCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhCmluZGV4IDc0NjM1MjguLjE3ZjFiNzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QuamF2YQpAQCAtNTIsMTQgKzUyLDE0IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBRdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShmaW5hbCBTdHJpbmcgaW4sIGZpbmFsIFN0cmluZyBleHApIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKFN0cmluZyBpbiwgU3RyaW5nIGV4cCkgewogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORV9VU0VSX1BBVEgucXVvdGUoaW4pOwogCQlhc3NlcnROb3RTYW1lKGluLCByKTsKIAkJYXNzZXJ0RmFsc2UoaW4uZXF1YWxzKHIpKTsKIAkJYXNzZXJ0RXF1YWxzKCdcJycgKyBleHAgKyAnXCcnLCByKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoZmluYWwgU3RyaW5nIGV4cCwgZmluYWwgU3RyaW5nIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKFN0cmluZyBleHAsIFN0cmluZyBpbikgewogCQlmaW5hbCBieXRlW10gYiA9IENvbnN0YW50cy5lbmNvZGUoJ1wnJyArIGluICsgJ1wnJyk7CiAJCWZpbmFsIFN0cmluZyByID0gQk9VUk5FX1VTRVJfUEFUSC5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0LmphdmEKaW5kZXggYTZmMzM0NS4uOWEwYzk2ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QuamF2YQpAQCAtNTQsMTQgKzU0LDE0IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIHB1YmxpYyBjbGFzcyBRdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoU3RyaW5nIGV4cCwgU3RyaW5nIGluKSB7CiAJCWZpbmFsIFN0cmluZyByID0gR0lUX1BBVEgucXVvdGUoaW4pOwogCQlhc3NlcnROb3RTYW1lKGluLCByKTsKIAkJYXNzZXJ0RmFsc2UoaW4uZXF1YWxzKHIpKTsKIAkJYXNzZXJ0RXF1YWxzKCciJyArIGV4cCArICciJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSAoJyInICsgaW4gKyAnIicpLmdldEJ5dGVzKElTT184ODU5XzEpOwogCQlmaW5hbCBTdHJpbmcgciA9IEdJVF9QQVRILmRlcXVvdGUoYiwgMCwgYi5sZW5ndGgpOwogCQlhc3NlcnRFcXVhbHMoZXhwLCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfSGV4UGFyc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhCmluZGV4IGY1YjU2ZTcuLmYzYzA0NmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfSGV4UGFyc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19IZXhQYXJzZVRlc3QuamF2YQpAQCAtODEsNyArODEsNyBAQAogCQlhc3NlcnROb3RIZXgoJy4nKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE5vdEhleChmaW5hbCBjaGFyIGMpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE5vdEhleChjaGFyIGMpIHsKIAkJdHJ5IHsKIAkJCVJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ0KChieXRlKSBjKTsKIAkJCWZhaWwoIkluY29ycmVjdGx5IGFjY2NlcHRlZCAiICsgYyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0LmphdmEKaW5kZXggMDI0Mzc5OC4uNzYzMGMxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QuamF2YQpAQCAtNDcsMTggKzQ3LDI1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkJpbmFyeUJsb2JFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdCB7CisJQFJ1bGUKKwlwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gZXhjZXB0aW9uID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKKwlwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAobmV3IGJ5dGVbXSB7fSwgMCwgMCk7CiAJCWFzc2VydE5vdE51bGwobWFwKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFLCAwfSwgYXNJbnRzKG1hcCkpOwogCX0KIAogCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE9uZUJsYW5rTGluZSgpIHsKKwlwdWJsaWMgdm9pZCB0ZXN0T25lQmxhbmtMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewogCQlmaW5hbCBJbnRMaXN0IG1hcCA9IFJhd1BhcnNlVXRpbHMubGluZU1hcChuZXcgYnl0ZVtdIHsgJ1xuJyB9LCAwLCAxKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFLCAwLCAxfSwgYXNJbnRzKG1hcCkpOwogCX0KQEAgLTg1LDYgKzkyLDEzIEBACiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TGluZU1hcE9yQmluYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZpbmFsIGJ5dGVbXSBidWYgPSAieHh4Zm9vXG5iXDBhciIuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSk7CisJCWV4Y2VwdGlvbi5leHBlY3QoQmluYXJ5QmxvYkV4Y2VwdGlvbi5jbGFzcyk7CisJCVJhd1BhcnNlVXRpbHMubGluZU1hcE9yQmluYXJ5KGJ1ZiwgMywgYnVmLmxlbmd0aCk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Rm91ckxpbmVCbGFua3MoKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSAiZm9vXG5cblxuYmFyXG4iLmdldEJ5dGVzKElTT184ODU5XzEpOwogCQlmaW5hbCBJbnRMaXN0IG1hcCA9IFJhd1BhcnNlVXRpbHMubGluZU1hcChidWYsIDAsIGJ1Zi5sZW5ndGgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVyblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEKaW5kZXggZTg1NjZkMi4uYTc0OGI1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVyblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKQEAgLTkzLDcgKzkzLDcgQEAKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgcmF3KFN0cmluZyB0ZXh0KSB7Ci0JCWJ5dGVbXSBieXRlcyA9IHRleHQuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gYnl0ZXMgPSB0ZXh0LmdldEJ5dGVzKENIQVJTRVQpOwogCQlyZXR1cm4gbmV3IFJhd0NoYXJTZXF1ZW5jZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZMaXN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YQppbmRleCA1YTE0NjhhLi5kMTI0ZDczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZMaXN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZkxpc3RUZXN0LmphdmEKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCQlyZXR1cm4gYi50b1JlZkxpc3QoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgUmVmIG5ld1JlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IE9iamVjdElkUmVmLlVucGVlbGVkKFJlZi5TdG9yYWdlLkxPT1NFLCBuYW1lLCBJRCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhCmluZGV4IGQ5Nzg4MDQuLmVkY2NlMTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXJUZXN0LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIHB1YmxpYyBjbGFzcyBUZW1wb3JhcnlCdWZmZXJUZXN0IHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCXRyeSB7CiAJCQliLmNsb3NlKCk7CkBAIC03NSw2ICs3Niw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZSB0ZXN0ID0gKGJ5dGUpIG5ldyBUZXN0Um5nKGdldE5hbWUoKSkubmV4dEludCgpOwogCQl0cnkgewpAQCAtODcsMTAgKzg5LDggQEAKIAkJCQlhc3NlcnRFcXVhbHMoMSwgci5sZW5ndGgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0LCByWzBdKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscygxLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QsIHJbMF0pOwpAQCAtMTAyLDYgKzEwMiw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja19CdWxrV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5CbG9jay5TWik7CkBAIC0xMTgsMTAgKzExOSw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTEzMyw2ICsxMzIsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkJsb2NrLlNaICogMyAvIDIpOwpAQCAtMTQ5LDEwICsxNDksOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0xNjQsNiArMTYyLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9TaW5nbGVXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkJsb2NrLlNaICogMyAvIDIpOwpAQCAtMTc4LDEwICsxNzcsOCBAQAogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0xOTMsNiArMTkwLDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9Db3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1ogKiAzIC8gMik7CkBAIC0yMDgsMTAgKzIwNiw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTIyMyw2ICsyMTksNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VfU2luZ2xlV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAzKTsKQEAgLTIzNiwxMCArMjMzLDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMjUzLDE4ICsyNDgsMTggQEAKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgY250ID0gMjU2OwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkubmV4dEJ5dGVzKGNudCk7Ci0JCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoY250ICsgNCk7Ci0JCWIud3JpdGUodGVzdCk7Ci0JCWIuY2xvc2UoKTsKLQotCQlJbnB1dFN0cmVhbSBpbiA9IGIub3BlbklucHV0U3RyZWFtKCk7Ci0JCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtjbnRdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgY250KTsKLQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgYWN0KTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKGNudCArIDQpKSB7CisJCQliLndyaXRlKHRlc3QpOworCQkJSW5wdXRTdHJlYW0gaW4gPSBiLm9wZW5JbnB1dFN0cmVhbSgpOworCQkJYnl0ZVtdIGFjdCA9IG5ldyBieXRlW2NudF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgY250KTsKKwkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIGFjdCk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hPbkFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKyAxKTsKQEAgLTI3OSwxMCArMjc0LDggQEAKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMjk0LDYgKzI4Nyw3IEBACiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hCZWZvcmVBcHBlbmRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMyk7CkBAIC0zMDgsMTAgKzMwMiw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTMyMyw2ICszMTUsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoT25Db3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMik7CkBAIC0zNDAsMTAgKzMzMyw4IEBACiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTM1NSw3ICszNDYsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RGVzdHJveVdoaWxlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIgLyogamF2YSA3ICovKQorCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQl0cnkgewogCQkJYi53cml0ZShuZXcgVGVzdFJuZyhnZXROYW1lKCkpCkBAIC0zNjcsNiArMzU4LDcgQEAKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJhbmRvbVdyaXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIFRlc3RSbmcgcm5nID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKTsKIAkJZmluYWwgaW50IG1heCA9IFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAyOwpAQCAtMzk5LDEwICszOTEsOCBAQAogCQkJCWFzc2VydEVxdWFscyhleHBlY3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHMoZXhwZWN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyhleHBlY3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHMoZXhwZWN0LCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggYTcyZDMzYy4uMDY1NTgyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTk2LDMyICs5NiwzMSBAQAogCQlmb3IgKGludCBpID0gLTQ7IGkgPCA1OyArK2kpIHsKIAkJCWludCBzaXplID0gTWF0aC5hYnMoaSk7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbmJ5dGVzKTsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEF1dG9DUkxGT3V0cHV0U3RyZWFtKGJvcyk7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKLQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluYnl0ZXMpOworCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEF1dG9DUkxGT3V0cHV0U3RyZWFtKGJvcykpIHsKKwkJCQlpZiAoaSA+IDApIHsKKwkJCQkJaW50IG47CisJCQkJCXdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGkgPCAwKSB7CisJCQkJCWludCBuOworCQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKKwkJCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbl07CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgYiwgMCwgbik7CisJCQkJCQlvdXQud3JpdGUoYik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgYzsKKwkJCQkJd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkKKwkJCQkJCW91dC53cml0ZShjKTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKGkgPCAwKSB7Ci0JCQkJaW50IG47Ci0JCQkJd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+PSAwKSB7Ci0JCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBiLCAwLCBuKTsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGM7Ci0JCQkJd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkKLQkJCQkJb3V0LndyaXRlKGMpOworCQkJCW91dC5mbHVzaCgpOworCQkJCWJ5dGVbXSBhY3R1YWxCeXRlcyA9IGJvcy50b0J5dGVBcnJheSgpOworCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoImJ1ZnNpemU9IiArIHNpemUsIGVuY29kZShleHBlY3RCeXRlcyksCisJCQkJCQllbmNvZGUoYWN0dWFsQnl0ZXMpKTsKIAkJCX0KLQkJCW91dC5mbHVzaCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQkJYnl0ZVtdIGFjdHVhbEJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0JCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJidWZzaXplPSIgKyBzaXplLCBlbmNvZGUoZXhwZWN0Qnl0ZXMpLAotCQkJCQllbmNvZGUoYWN0dWFsQnl0ZXMpKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAzODE5OWQ4Li41MDU4MTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC05NywzOCArOTcsNDEgQEAKIAogCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdChieXRlW10gaW5wdXQsIGJ5dGVbXSBleHBlY3RlZCwKIAkJCWJvb2xlYW4gZGV0ZWN0QmluYXJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBJbnB1dFN0cmVhbSBiaXMxID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gY2lzMSA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMxLCBkZXRlY3RCaW5hcnkpOwotCQlpbnQgaW5kZXgxID0gMDsKLQkJZm9yIChpbnQgYiA9IGNpczEucmVhZCgpOyBiICE9IC0xOyBiID0gY2lzMS5yZWFkKCkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFtpbmRleDFdLCAoYnl0ZSkgYik7Ci0JCQlpbmRleDErKzsKLQkJfQotCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGluZGV4MSk7Ci0KLQkJZm9yIChpbnQgYnVmZmVyU2l6ZSA9IDE7IGJ1ZmZlclNpemUgPCAxMDsgYnVmZmVyU2l6ZSsrKSB7Ci0JCQlmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07Ci0JCQlmaW5hbCBJbnB1dFN0cmVhbSBiaXMyID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGNpczIgPSBuZXcgQXV0b0xGSW5wdXRTdHJlYW0oYmlzMiwgZGV0ZWN0QmluYXJ5KTsKLQotCQkJaW50IHJlYWQgPSAwOwotCQkJZm9yIChpbnQgcmVhZE5vdyA9IGNpczIucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOyByZWFkTm93ICE9IC0xCi0JCQkJCSYmIHJlYWQgPCBleHBlY3RlZC5sZW5ndGg7IHJlYWROb3cgPSBjaXMyLnJlYWQoYnVmZmVyLCAwLAotCQkJCQlidWZmZXIubGVuZ3RoKSkgewotCQkJCWZvciAoaW50IGluZGV4MiA9IDA7IGluZGV4MiA8IHJlYWROb3c7IGluZGV4MisrKSB7Ci0JCQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFtyZWFkICsgaW5kZXgyXSwgYnVmZmVyW2luZGV4Ml0pOwotCQkJCX0KLQkJCQlyZWFkICs9IHJlYWROb3c7CisJCXRyeSAoSW5wdXRTdHJlYW0gYmlzMSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dCk7CisJCQkJSW5wdXRTdHJlYW0gY2lzMSA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMxLCBkZXRlY3RCaW5hcnkpKSB7CisJCQlpbnQgaW5kZXgxID0gMDsKKwkJCWZvciAoaW50IGIgPSBjaXMxLnJlYWQoKTsgYiAhPSAtMTsgYiA9IGNpczEucmVhZCgpKSB7CisJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2luZGV4MV0sIChieXRlKSBiKTsKKwkJCQlpbmRleDErKzsKIAkJCX0KIAotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmVhZCk7Ci0JCQljaXMyLmNsb3NlKCk7CisJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBpbmRleDEpOworCisJCQlmb3IgKGludCBidWZmZXJTaXplID0gMTsgYnVmZmVyU2l6ZSA8IDEwOyBidWZmZXJTaXplKyspIHsKKwkJCQlmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisJCQkJdHJ5IChJbnB1dFN0cmVhbSBiaXMyID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKKwkJCQkJCUlucHV0U3RyZWFtIGNpczIgPSBuZXcgQXV0b0xGSW5wdXRTdHJlYW0oYmlzMiwKKwkJCQkJCQkJZGV0ZWN0QmluYXJ5KSkgeworCisJCQkJCWludCByZWFkID0gMDsKKwkJCQkJZm9yIChpbnQgcmVhZE5vdyA9IGNpczIucmVhZChidWZmZXIsIDAsCisJCQkJCQkJYnVmZmVyLmxlbmd0aCk7IHJlYWROb3cgIT0gLTEKKwkJCQkJCQkJCSYmIHJlYWQgPCBleHBlY3RlZC5sZW5ndGg7IHJlYWROb3cgPSBjaXMyCisJCQkJCQkJCQkJCS5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpIHsKKwkJCQkJCWZvciAoaW50IGluZGV4MiA9IDA7IGluZGV4MiA8IHJlYWROb3c7IGluZGV4MisrKSB7CisJCQkJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW3JlYWQgKyBpbmRleDJdLAorCQkJCQkJCQkJYnVmZmVyW2luZGV4Ml0pOworCQkJCQkJfQorCQkJCQkJcmVhZCArPSByZWFkTm93OworCQkJCQl9CisKKwkJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmVhZCk7CisJCQkJfQorCQkJfQogCQl9Ci0JCWNpczEuY2xvc2UoKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBieXRlW10gYXNCeXRlcyhTdHJpbmcgaW4pIHsKLQkJcmV0dXJuIGluLmdldEJ5dGVzKFVURl84KTsKKwkJcmV0dXJuIGluLmdldEJ5dGVzKENIQVJTRVQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDZiNWVmN2UuLmI4MjRmYWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtNTgsMTMgKzU4LDEzIEBACiBwdWJsaWMgY2xhc3MgVW5pb25JbnB1dFN0cmVhbVRlc3QgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEVtcHR5U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKTsKLQkJYXNzZXJ0VHJ1ZSh1LmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHUucmVhZChuZXcgYnl0ZVsxXSwgMCwgMSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdS5hdmFpbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB1LnNraXAoMSkpOwotCQl1LmNsb3NlKCk7CisJCXRyeSAoVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKSkgeworCQkJYXNzZXJ0VHJ1ZSh1LmlzRW1wdHkoKSk7CisJCQlhc3NlcnRFcXVhbHMoLTEsIHUucmVhZCgpKTsKKwkJCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKG5ldyBieXRlWzFdLCAwLCAxKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgdS5hdmFpbGFibGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgdS5za2lwKDEpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0yMTEsMjUgKzIxMSwyNCBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VEdXJpbmdDbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCk7CiAJCWZpbmFsIGJvb2xlYW4gY2xvc2VkW10gPSBuZXcgYm9vbGVhblsyXTsKLQkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJY2xvc2VkWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMiB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCWNsb3NlZFsxXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOworCQl0cnkgKFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCkpIHsKKwkJCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMSB9KSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQkJCWNsb3NlZFswXSA9IHRydWU7CisJCQkJfQorCQkJfSk7CisJCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDIgfSkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQkJCQljbG9zZWRbMV0gPSB0cnVlOworCQkJCX0KKwkJCX0pOwogCi0JCWFzc2VydEZhbHNlKGNsb3NlZFswXSk7Ci0JCWFzc2VydEZhbHNlKGNsb3NlZFsxXSk7Ci0KLQkJdS5jbG9zZSgpOworCQkJYXNzZXJ0RmFsc2UoY2xvc2VkWzBdKTsKKwkJCWFzc2VydEZhbHNlKGNsb3NlZFsxXSk7CisJCX0KIAogCQlhc3NlcnRUcnVlKGNsb3NlZFswXSk7CiAJCWFzc2VydFRydWUoY2xvc2VkWzFdKTsKQEAgLTIzNyw2ICsyMzYsNyBAQAogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uRHVyaW5nQ2xvc2UoKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlmaW5hbCBVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpOwogCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDEgfSkgewogCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTFUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTFUZXN0LmphdmEKaW5kZXggZTYwNDVhOS4uM2M2MTJlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMVRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTk1LDE1ICs5NSwxNSBAQAogCQkJCS5mcm9tU3RyaW5nKCJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIik7CiAKIAkJTWVzc2FnZURpZ2VzdCBtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTEiKTsKLQkJbS51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbS51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBtMSA9IE9iamVjdElkLmZyb21SYXcobS5kaWdlc3QoKSk7CiAKIAkJU0hBMSBzID0gU0hBMS5uZXdJbnN0YW5jZSgpOwotCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMxID0gT2JqZWN0SWQuZnJvbVJhdyhzLmRpZ2VzdCgpKTsKIAogCQlzLnJlc2V0KCk7Ci0JCXMudXBkYXRlKFRFU1QxLmdldEJ5dGVzKFVURl84KSk7CisJCXMudXBkYXRlKFRFU1QxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgczIgPSBzLnRvT2JqZWN0SWQoKTsKIAogCQlhc3NlcnRFcXVhbHMobTEsIHMxKTsKQEAgLTExNywxNSArMTE3LDE1IEBACiAJCQkJLmZyb21TdHJpbmcoIjg0OTgzZTQ0MWMzYmQyNmViYWFlNGFhMWY5NTEyOWU1ZTU0NjcwZjEiKTsKIAogCQlNZXNzYWdlRGlnZXN0IG0gPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMSIpOwotCQltLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhVVEZfOCkpOworCQltLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIG0xID0gT2JqZWN0SWQuZnJvbVJhdyhtLmRpZ2VzdCgpKTsKIAogCQlTSEExIHMgPSBTSEExLm5ld0luc3RhbmNlKCk7Ci0JCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKFVURl84KSk7CisJCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgczEgPSBPYmplY3RJZC5mcm9tUmF3KHMuZGlnZXN0KCkpOwogCiAJCXMucmVzZXQoKTsKLQkJcy51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcy51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBzMiA9IHMudG9PYmplY3RJZCgpOwogCiAJCWFzc2VydEVxdWFscyhtMSwgczEpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTRhMjZiOS4uNzY2N2FmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC00LDE0ICs0LDE0IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249IjQuMTEuOCIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI1LjAuNCIKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCmluZGV4IGEwNzI3NzguLjdkMTBjMDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKQEAgLTUyLDcgKzUyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC51aTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQVdUUGxvdFJlbmRlcmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhCmluZGV4IGJjY2YwYzAuLmIxZmZmZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQVdUUGxvdFJlbmRlcmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9BV1RQbG90UmVuZGVyZXIuamF2YQpAQCAtNjYsMTEgKzY2LDExIEBACiAKIAl0cmFuc2llbnQgR3JhcGhpY3MyRCBnOwogCi0JQVdUUGxvdFJlbmRlcmVyKGZpbmFsIEdyYXBoQ2VsbFJlbmRlciBjKSB7CisJQVdUUGxvdFJlbmRlcmVyKEdyYXBoQ2VsbFJlbmRlciBjKSB7CiAJCWNlbGwgPSBjOwogCX0KIAotCXZvaWQgcGFpbnQoZmluYWwgR3JhcGhpY3MgaW4sIGZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjb21taXQpIHsKKwl2b2lkIHBhaW50KEdyYXBoaWNzIGluLCBQbG90Q29tbWl0PFN3aW5nTGFuZT4gY29tbWl0KSB7CiAJCWcgPSAoR3JhcGhpY3MyRCkgaW4uY3JlYXRlKCk7CiAJCXRyeSB7CiAJCQlmaW5hbCBpbnQgaCA9IGNlbGwuZ2V0SGVpZ2h0KCk7CkBAIC0xMjUsNyArMTI1LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RleHQoZmluYWwgU3RyaW5nIG1zZywgZmluYWwgaW50IHgsIGZpbmFsIGludCB5KSB7CisJcHJvdGVjdGVkIHZvaWQgZHJhd1RleHQoU3RyaW5nIG1zZywgaW50IHgsIGludCB5KSB7CiAJCWZpbmFsIGludCB0ZXh0aCA9IGcuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKIAkJZmluYWwgaW50IHkwID0gKHkgLSB0ZXh0aCkgLyAyICsgKGNlbGwuZ2V0SGVpZ2h0KCkgLSB0ZXh0aCkgLyAyOwogCQlnLnNldENvbG9yKGNlbGwuZ2V0Rm9yZWdyb3VuZCgpKTsKQEAgLTEzNCwxMSArMTM0LDExIEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xvciBsYW5lQ29sb3IoZmluYWwgU3dpbmdMYW5lIG15TGFuZSkgeworCXByb3RlY3RlZCBDb2xvciBsYW5lQ29sb3IoU3dpbmdMYW5lIG15TGFuZSkgewogCQlyZXR1cm4gbXlMYW5lICE9IG51bGwgPyBteUxhbmUuY29sb3IgOiBDb2xvci5ibGFjazsKIAl9CiAKLQl2b2lkIHBhaW50VHJpYW5nbGVEb3duKGZpbmFsIGludCBjeCwgZmluYWwgaW50IHksIGZpbmFsIGludCBoKSB7CisJdm9pZCBwYWludFRyaWFuZ2xlRG93bihpbnQgY3gsIGludCB5LCBpbnQgaCkgewogCQlmaW5hbCBpbnQgdGlwWCA9IGN4OwogCQlmaW5hbCBpbnQgdGlwWSA9IHkgKyBoOwogCQlmaW5hbCBpbnQgYmFzZVgxID0gY3ggLSAxMCAvIDI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Db21taXRHcmFwaFBhbmUuamF2YQppbmRleCBkMTIyYTc3Li45NDNhMzI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQ29tbWl0R3JhcGhQYW5lLmphdmEKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChmaW5hbCBUYWJsZU1vZGVsIGRhdGFNb2RlbCkgeworCXB1YmxpYyB2b2lkIHNldE1vZGVsKFRhYmxlTW9kZWwgZGF0YU1vZGVsKSB7CiAJCWlmIChkYXRhTW9kZWwgIT0gbnVsbCAmJiAhKGRhdGFNb2RlbCBpbnN0YW5jZW9mIENvbW1pdFRhYmxlTW9kZWwpKQogCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihVSVRleHQuZ2V0KCkubXVzdEJlU3BlY2lhbFRhYmxlTW9kZWwpOwogCQlzdXBlci5zZXRNb2RlbChkYXRhTW9kZWwpOwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGZpbmFsIGludCByb3dJbmRleCwgZmluYWwgaW50IGNvbHVtbkluZGV4KSB7CisJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewogCQkJZmluYWwgUGxvdENvbW1pdDxTd2luZ0xhbmU+IGMgPSBhbGxDb21taXRzLmdldChyb3dJbmRleCk7CiAJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7CiAJCQljYXNlIDA6CkBAIC0xNzUsNyArMTc1LDcgQEAKIAkJCX0KIAkJfQogCi0JCVBlcnNvbklkZW50IGF1dGhvckZvcihmaW5hbCBQbG90Q29tbWl0PFN3aW5nTGFuZT4gYykgeworCQlQZXJzb25JZGVudCBhdXRob3JGb3IoUGxvdENvbW1pdDxTd2luZ0xhbmU+IGMpIHsKIAkJCWlmIChjICE9IGxhc3RDb21taXQpIHsKIAkJCQlsYXN0Q29tbWl0ID0gYzsKIAkJCQlsYXN0QXV0aG9yID0gYy5nZXRBdXRob3JJZGVudCgpOwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoZmluYWwgR3JhcGhpY3MgaW5wdXRHcmFwaGljcykgeworCQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBpbnB1dEdyYXBoaWNzKSB7CiAJCQlpZiAoaW5wdXRHcmFwaGljcyA9PSBudWxsKQogCQkJCXJldHVybjsKIAkJCXJlbmRlcmVyLnBhaW50KGlucHV0R3JhcGhpY3MsIGNvbW1pdCk7CkBAIC0yNTksNyArMjU5LDcgQEAKIAkJCXN0cm9rZUNhY2hlW2ldID0gbmV3IEJhc2ljU3Ryb2tlKGkpOwogCX0KIAotCXN0YXRpYyBTdHJva2Ugc3Ryb2tlKGZpbmFsIGludCB3aWR0aCkgeworCXN0YXRpYyBTdHJva2Ugc3Ryb2tlKGludCB3aWR0aCkgewogCQlpZiAod2lkdGggPCBzdHJva2VDYWNoZS5sZW5ndGgpCiAJCQlyZXR1cm4gc3Ryb2tlQ2FjaGVbd2lkdGhdOwogCQlyZXR1cm4gbmV3IEJhc2ljU3Ryb2tlKHdpZHRoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvU3dpbmdDb21taXRMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL1N3aW5nQ29tbWl0TGlzdC5qYXZhCmluZGV4IDc0M2ViNzguLjEwNTE5Y2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvU3dpbmdDb21taXRMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YQpAQCAtNzksNyArNzksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWN5Y2xlTGFuZShmaW5hbCBTd2luZ0xhbmUgbGFuZSkgeworCXByb3RlY3RlZCB2b2lkIHJlY3ljbGVMYW5lKFN3aW5nTGFuZSBsYW5lKSB7CiAJCWNvbG9ycy5hZGQobGFuZS5jb2xvcik7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMgYi9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKaW5kZXggY2MwZDcwZC4uZTZhNjk4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpAQCAtMywxNyArMyw4IEBACiAgICAgPHJlc291cmNlIHBhdGg9Ik1FVEEtSU5GL01BTklGRVNULk1GIj4KICAgICAgICAgPGZpbHRlciBpZD0iOTI0ODQ0MDM5Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMS43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEuMCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMiPgotICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KLSAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTE9DS19TVUZGSVgiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wLjQiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wLjAiLz4KICAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgIDwvZmlsdGVyPgogICAgIDwvcmVzb3VyY2U+CkBAIC0zNyw3ICsyOCw3IEBACiAgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDE4OTkyNjYiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjciLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAiLz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlTmV3RmlsZUF0b21pYyhGaWxlKSIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CkBAIC01Miw3ICs0Myw3IEBACiAgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDE4OTkyNjYiPgogICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjciLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC4xMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjAiLz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9ja1Rva2VuIi8+CiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDJhNTVkOGEuLmE4MTE0ZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMiArMywxMiBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iNC4xMS44IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKQEAgLTIyLDUyICsyMiw1MiBAQAogICAgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycyIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucGF0Y2gsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAorIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuYXBpLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcueG1sLnNheC5oZWxwZXJzLAogICAgb3JnLnhtbC5zYXgiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZS5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249IjQuMTEuOCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmtldGNoO3ZlcnNpb249IjQuMTEuOCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmZzY2s7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNS4wLjQiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjUuMC40IjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cCwKQEAgLTc1LDEyICs3NSwxMiBAQAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSwKICAgIG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCkBAIC05MCwzMyArOTAsMzMgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQuZGlmZiIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayxvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayxvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2ssCkBAIC0xMjgsMjQgKzEyOCwyNCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLAogICAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2siLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0iamF2YXgubmV0LnNzbCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0iamF2YXgubmV0LnNzbCIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUsCiAgICBvcmcuaWV0Zi5qZ3NzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249IjQuMTEuOCIKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSI1LjAuNCIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogY29tLmdvb2dsZWNvZGUuamF2YWV3YWg7dmVyc2lvbj0iWzEuMS42LDIuMC4wKSIsCiAgY29tLmpjcmFmdC5qc2NoO3ZlcnNpb249IlswLjEuMzcsMC4yLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNDZhNzNmOC4uYjJkNjk0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdDt2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0O3ZlcnNpb249IjUuMC40LnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKaW5kZXggZjQ1N2MzOC4uMmI1NmQwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbApAQCAtNTMsNyArNTMsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCmluZGV4IDgxNWM2NzIuLjAxNzY2MmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKQEAgLTIyNiw2ICsyMjYsOCBAQAogY3JlZGVudGlhbFVzZXJuYW1lPVVzZXJuYW1lCiBkYWVtb25BbHJlYWR5UnVubmluZz1EYWVtb24gYWxyZWFkeSBydW5uaW5nCiBkYXlzQWdvPXswfSBkYXlzIGFnbworZGVlcGVuTm90V2l0aERlZXBlbj1DYW5ub3QgY29tYmluZSBkZWVwZW4gd2l0aCBkZWVwZW4tbm90CitkZWVwZW5TaW5jZVdpdGhEZWVwZW49Q2Fubm90IGNvbWJpbmUgZGVlcGVuIHdpdGggZGVlcGVuLXNpbmNlCiBkZWxldGVCcmFuY2hVbmV4cGVjdGVkUmVzdWx0PURlbGV0ZSBicmFuY2ggcmV0dXJuZWQgdW5leHBlY3RlZCByZXN1bHQgezB9CiBkZWxldGVGaWxlRmFpbGVkPUNvdWxkIG5vdCBkZWxldGUgZmlsZSB7MH0KIGRlbGV0ZVJlcXVpcmVzWmVyb05ld0lkPURlbGV0ZSByZXF1aXJlcyBuZXcgSUQgdG8gYmUgemVybwpAQCAtMzExLDYgKzMxMyw3IEBACiBmaWxlTW9kZU5vdFNldEZvclBhdGg9RmlsZU1vZGUgbm90IHNldCBmb3IgcGF0aCB7MH0KIGZpbHRlckV4ZWN1dGlvbkZhaWxlZD1FeGVjdXRpb24gb2YgZmlsdGVyIGNvbW1hbmQgJyd7MH0nJyBvbiBmaWxlICcnezF9JycgZmFpbGVkCiBmaWx0ZXJFeGVjdXRpb25GYWlsZWRSYz1FeGVjdXRpb24gb2YgZmlsdGVyIGNvbW1hbmQgJyd7MH0nJyBvbiBmaWxlICcnezF9JycgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgJyd7Mn0nJywgbWVzc2FnZSBvbiBzdGRlcnI6ICcnezN9JycKK2ZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eT1maWx0ZXIgcmVxdWlyZXMgc2VydmVyIHRvIGFkdmVydGlzZSB0aGF0IGNhcGFiaWxpdHkKIGZpbmRpbmdHYXJiYWdlPUZpbmRpbmcgZ2FyYmFnZQogZmxhZ0lzRGlzcG9zZWQ9ezB9IGlzIGRpc3Bvc2VkLgogZmxhZ05vdEZyb21UaGlzPXswfSBub3QgZnJvbSB0aGlzLgpAQCAtMzYyLDYgKzM2NSw3IEBACiBpbnZhbGlkRGVwdGg9SW52YWxpZCBkZXB0aDogezB9CiBpbnZhbGlkRW5jcnlwdGlvbj1JbnZhbGlkIGVuY3J5cHRpb24KIGludmFsaWRFeHBhbmRXaWxkY2FyZD1FeHBhbmRGcm9tU291cmNlIG9uIGEgcmVmc3BlYyB0aGF0IGNhbiBoYXZlIG1pc21hdGNoZWQgd2lsZGNhcmRzIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCitpbnZhbGlkRmlsdGVyPUludmFsaWQgZmlsdGVyOiB7MH0KIGludmFsaWRHaXRkaXJSZWYgPSBJbnZhbGlkIC5naXQgcmVmZXJlbmNlIGluIGZpbGUgJyd7MH0nJwogaW52YWxpZEdpdE1vZHVsZXM9SW52YWxpZCAuZ2l0bW9kdWxlcyBmaWxlCiBpbnZhbGlkR2l0VHlwZT1pbnZhbGlkIGdpdCB0eXBlOiB7MH0KQEAgLTM5OCw2ICs0MDIsNyBAQAogaW52YWxpZFN5c3RlbVByb3BlcnR5PUludmFsaWQgc3lzdGVtIHByb3BlcnR5ICcnezB9Jyc6ICcnezF9Jyc7IHVzaW5nIGRlZmF1bHQgdmFsdWUgezJ9CiBpbnZhbGlkVGFnT3B0aW9uPUludmFsaWQgdGFnIG9wdGlvbjogezB9CiBpbnZhbGlkVGltZW91dD1JbnZhbGlkIHRpbWVvdXQ6IHswfQoraW52YWxpZFRpbWVzdGFtcD1JbnZhbGlkIHRpbWVzdGFtcCBpbiB7MH0KIGludmFsaWRUaW1lVW5pdFZhbHVlMj1JbnZhbGlkIHRpbWUgdW5pdCB2YWx1ZTogezB9LnsxfT17Mn0KIGludmFsaWRUaW1lVW5pdFZhbHVlMz1JbnZhbGlkIHRpbWUgdW5pdCB2YWx1ZTogezB9LnsxfS57Mn09ezN9CiBpbnZhbGlkVHJlZVplcm9MZW5ndGhOYW1lPUNhbm5vdCBhcHBlbmQgYSB0cmVlIGVudHJ5IHdpdGggemVyby1sZW5ndGggbmFtZQpAQCAtNjI5LDYgKzYzNCw3IEBACiBzb3VyY2VSZWZEb2VzbnRSZXNvbHZlVG9BbnlPYmplY3Q9U291cmNlIHJlZiB7MH0gZG9lc24nJ3QgcmVzb2x2ZSB0byBhbnkgb2JqZWN0Lgogc291cmNlUmVmTm90U3BlY2lmaWVkRm9yUmVmc3BlYz1Tb3VyY2UgcmVmIG5vdCBzcGVjaWZpZWQgZm9yIHJlZnNwZWM6IHswfQogc3F1YXNoQ29tbWl0Tm90VXBkYXRpbmdIRUFEPVNxdWFzaCBjb21taXQgLS0gbm90IHVwZGF0aW5nIEhFQUQKK3NzaENvbW1hbmRGYWlsZWQ9RXhlY3V0aW9uIG9mIHNzaCBjb21tYW5kICcnezB9JycgZmFpbGVkIHdpdGggZXJyb3IgJyd7MX0nJwogc3NoVXNlck5hbWVFcnJvcj1Kc2NoIGVycm9yOiBmYWlsZWQgdG8gc2V0IFNTSCB1c2VyIG5hbWUgY29ycmVjdGx5IHRvICcnezB9Jyc7IHVzaW5nICcnezF9JycgcGlja2VkIHVwIGZyb20gU1NIIGNvbmZpZyBmaWxlLgogc3NsRmFpbHVyZUV4Y2VwdGlvbk1lc3NhZ2U9U2VjdXJlIGNvbm5lY3Rpb24gdG8gezB9IGNvdWxkIG5vdCBiZSBzdGFibGlzaGVkIGJlY2F1c2Ugb2YgU1NMIHByb2JsZW1zCiBzc2xGYWlsdXJlSW5mbz1BIHNlY3VyZSBjb25uZWN0aW9uIHRvIHswfVxuY291bGQgbm90IGJlIGVzdGFibGlzaGVkIGJlY2F1c2UgdGhlIHNlcnZlcicncyBjZXJ0aWZpY2F0ZSBjb3VsZCBub3QgYmUgdmFsaWRhdGVkLgpAQCAtNjczLDYgKzY3OSw3IEBACiB0aW1lSXNVbmNlcnRhaW49VGltZSBpcyB1bmNlcnRhaW4KIHRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQ9VGltZXIgYWxyZWFkeSB0ZXJtaW5hdGVkCiB0b29NYW55Q29tbWFuZHM9VG9vIG1hbnkgY29tbWFuZHMKK3Rvb01hbnlGaWx0ZXJzPVRvbyBtYW55ICJmaWx0ZXIiIGxpbmVzIGluIHJlcXVlc3QKIHRvb01hbnlJbmNsdWRlUmVjdXJzaW9ucz1Ub28gbWFueSByZWN1cnNpb25zOyBjaXJjdWxhciBpbmNsdWRlcyBpbiBjb25maWcgZmlsZShzKT8KIHRvcG9sb2dpY2FsU29ydFJlcXVpcmVkPVRvcG9sb2dpY2FsIHNvcnQgcmVxdWlyZWQuCiB0cmFuc2FjdGlvbkFib3J0ZWQ9dHJhbnNhY3Rpb24gYWJvcnRlZApAQCAtNzE2LDYgKzcyMyw3IEBACiB1bmV4cGVjdGVkRW9mSW5QYWNrPVVuZXhwZWN0ZWQgRU9GIGluIHBhcnRpYWxseSBjcmVhdGVkIHBhY2sKIHVuZXhwZWN0ZWRIdW5rVHJhaWxlcj1VbmV4cGVjdGVkIGh1bmsgdHJhaWxlcgogdW5leHBlY3RlZE9kZFJlc3VsdD1vZGQ6IHswfSArIHsxfSAtIHsyfQordW5leHBlY3RlZFBhY2tldExpbmU9dW5leHBlY3RlZCB7MH0KIHVuZXhwZWN0ZWRSZWZSZXBvcnQ9ezB9OiB1bmV4cGVjdGVkIHJlZiByZXBvcnQ6IHsxfQogdW5leHBlY3RlZFJlcG9ydExpbmU9dW5leHBlY3RlZCByZXBvcnQgbGluZTogezB9CiB1bmV4cGVjdGVkUmVwb3J0TGluZTI9ezB9IHVuZXhwZWN0ZWQgcmVwb3J0IGxpbmU6IHsxfQpAQCAtNzMwLDYgKzczOCw3IEBACiB1bmtub3duT2JqZWN0VHlwZTI9dW5rbm93bgogdW5rbm93blJlcG9zaXRvcnlGb3JtYXQ9VW5rbm93biByZXBvc2l0b3J5IGZvcm1hdAogdW5rbm93blJlcG9zaXRvcnlGb3JtYXQyPVVua25vd24gcmVwb3NpdG9yeSBmb3JtYXQgInswfSI7IGV4cGVjdGVkICIwIi4KK3Vua25vd25UcmFuc3BvcnRDb21tYW5kPXVua25vd24gY29tbWFuZCB7MH0KIHVua25vd25abGliRXJyb3I9VW5rbm93biB6bGliIGVycm9yLgogdW5sb2NrTG9ja0ZpbGVGYWlsZWQ9VW5sb2NraW5nIExvY2tGaWxlICcnezB9JycgZmFpbGVkCiB1bm1lcmdlZFBhdGg9VW5tZXJnZWQgcGF0aDogezB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YQppbmRleCAxMDM5N2Y4Li4yN2JiNWE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kLmphdmEKQEAgLTE1NywzMCArMTU3LDYgQEAKIAkJICoKIAkJICogQHBhcmFtIG91dAogCQkgKiAgICAgICAgICAgIGFyY2hpdmUgb2JqZWN0IGZyb20gY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbQotCQkgKiBAcGFyYW0gcGF0aAotCQkgKiAgICAgICAgICAgIGZ1bGwgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGFyY2hpdmUgKHdpdGgKLQkJICogICAgICAgICAgICB0cmFpbGluZyAnLycgZm9yIGRpcmVjdG9yaWVzKQotCQkgKiBAcGFyYW0gbW9kZQotCQkgKiAgICAgICAgICAgIG1vZGUgKGZvciBleGFtcGxlIEZpbGVNb2RlLlJFR1VMQVJfRklMRSBvcgotCQkgKiAgICAgICAgICAgIEZpbGVNb2RlLlNZTUxJTkspCi0JCSAqIEBwYXJhbSBsb2FkZXIKLQkJICogICAgICAgICAgICBibG9iIG9iamVjdCB3aXRoIGRhdGEgZm9yIHRoaXMgZW50cnkgKG51bGwgZm9yCi0JCSAqICAgICAgICAgICAgZGlyZWN0b3JpZXMpCi0JCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkJICogICAgICAgICAgICAgdGhyb3duIGJ5IHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZm9yIEkvTyBlcnJvcnMKLQkJICogQGRlcHJlY2F0ZWQgdXNlCi0JCSAqICAgICAgICAgICAgIHtAbGluayAjcHV0RW50cnkoQ2xvc2VhYmxlLCBPYmplY3RJZCwgU3RyaW5nLCBGaWxlTW9kZSwgT2JqZWN0TG9hZGVyKX0KLQkJICogICAgICAgICAgICAgaW5zdGVhZAotCQkgKi8KLQkJQERlcHJlY2F0ZWQKLQkJdm9pZCBwdXRFbnRyeShUIG91dCwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsCi0JCQkJCSAgT2JqZWN0TG9hZGVyIGxvYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JCS8qKgotCQkgKiBXcml0ZSBhbiBlbnRyeSB0byBhbiBhcmNoaXZlLgotCQkgKgotCQkgKiBAcGFyYW0gb3V0Ci0JCSAqICAgICAgICAgICAgYXJjaGl2ZSBvYmplY3QgZnJvbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtCiAJCSAqIEBwYXJhbSB0cmVlCiAJCSAqICAgICAgICAgICAgdGhlIHRhZywgY29tbWl0LCBvciB0cmVlIG9iamVjdCB0byBwcm9kdWNlIGFuIGFyY2hpdmUgZm9yCiAJCSAqIEBwYXJhbSBwYXRoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQppbmRleCBmNDVlMzllLi42NWI3MmY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKQEAgLTI4OCw3ICsyODgsNyBAQAogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICogQHNpbmNlIDMuMQogCSAqLwotCXB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZCBzZXRSZWZsb2dQcmVmaXgoZmluYWwgU3RyaW5nIHByZWZpeCkgeworCXB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZCBzZXRSZWZsb2dQcmVmaXgoU3RyaW5nIHByZWZpeCkgewogCQl0aGlzLnJlZmxvZ1ByZWZpeCA9IHByZWZpeDsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2xvbmVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YQppbmRleCA3OWIwZWZiLi41YzA2YmFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YQpAQCAtMTkxLDEyICsxOTEsMTIgQEAKIAkJCXRocm93IG5ldyBJbnZhbGlkUmVtb3RlRXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkVVJMLCB1cmkpKTsKIAkJfQotCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBudWxsOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgYnkgY2FsbGVyCisJCVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGluaXQoKTsKIAkJRmV0Y2hSZXN1bHQgZmV0Y2hSZXN1bHQgPSBudWxsOwogCQlUaHJlYWQgY2xlYW51cEhvb2sgPSBuZXcgVGhyZWFkKCgpIC0+IGNsZWFudXAoKSk7CiAJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhjbGVhbnVwSG9vayk7CiAJCXRyeSB7Ci0JCQlyZXBvc2l0b3J5ID0gaW5pdCgpOwogCQkJZmV0Y2hSZXN1bHQgPSBmZXRjaChyZXBvc2l0b3J5LCB1KTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAJCQlpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJcmV0dXJuIGNvbW1hbmQuY2FsbCgpOwogCX0KIAotCXByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhmaW5hbCBTdHJpbmcgZHN0KSB7CisJcHJpdmF0ZSBMaXN0PFJlZlNwZWM+IGNhbGN1bGF0ZVJlZlNwZWNzKFN0cmluZyBkc3QpIHsKIAkJUmVmU3BlYyB3Y3JzID0gbmV3IFJlZlNwZWMoKTsKIAkJd2NycyA9IHdjcnMuc2V0Rm9yY2VVcGRhdGUodHJ1ZSk7CiAJCXdjcnMgPSB3Y3JzLnNldFNvdXJjZURlc3RpbmF0aW9uKENvbnN0YW50cy5SX0hFQURTICsgIioiLCBkc3QpOyAvLyROT04tTkxTLTEkCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJCXNwZWNzLmFkZCh3Y3JzKTsKIAkJZWxzZSBpZiAoYnJhbmNoZXNUb0Nsb25lICE9IG51bGwKIAkJCQkmJiBicmFuY2hlc1RvQ2xvbmUuc2l6ZSgpID4gMCkgewotCQkJZm9yIChmaW5hbCBTdHJpbmcgc2VsZWN0ZWRSZWYgOiBicmFuY2hlc1RvQ2xvbmUpCisJCQlmb3IgKFN0cmluZyBzZWxlY3RlZFJlZiA6IGJyYW5jaGVzVG9DbG9uZSkKIAkJCQlpZiAod2Nycy5tYXRjaFNvdXJjZShzZWxlY3RlZFJlZikpCiAJCQkJCXNwZWNzLmFkZCh3Y3JzLmV4cGFuZEZyb21Tb3VyY2Uoc2VsZWN0ZWRSZWYpKTsKIAkJfQpAQCAtMzg2LDEyICszODYsOSBAQAogCQlpZiAoIXVwZGF0ZS5jYWxsKCkuaXNFbXB0eSgpKSB7CiAJCQlTdWJtb2R1bGVXYWxrIHdhbGsgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGNsb25lZFJlcG8pOwogCQkJd2hpbGUgKHdhbGsubmV4dCgpKSB7Ci0JCQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gd2Fsay5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgewotCQkJCQl0cnkgeworCQkJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gd2Fsay5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgewogCQkJCQkJY2xvbmVTdWJtb2R1bGVzKHN1YlJlcG8pOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtNDEzLDcgKzQxMCw3IEBACiAJCX0KIAogCQlSZWYgZm91bmRCcmFuY2ggPSBudWxsOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVzdWx0LmdldEFkdmVydGlzZWRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IHJlc3VsdC5nZXRBZHZlcnRpc2VkUmVmcygpKSB7CiAJCQlmaW5hbCBTdHJpbmcgbiA9IHIuZ2V0TmFtZSgpOwogCQkJaWYgKCFuLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCWNvbnRpbnVlOwpAQCAtNDQzLDExICs0NDAsMTEgQEAKIAkJY2xvbmVkUmVwby5nZXRDb25maWcoKS5zYXZlKCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgUmVwb3NpdG9yeSBjbG9uZWRSZXBvLCBmaW5hbCBSZWYgcmVmKQorCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgUmVmIHJlZikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZXZDb21taXQgY29tbWl0OwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgewogCQkJY29tbWl0ID0gcncucGFyc2VDb21taXQocmVmLmdldE9iamVjdElkKCkpOwogCQl9CiAJCXJldHVybiBjb21taXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKaW5kZXggZjI1NzI4My4uZDA3NTMyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLk5vRmlsZXBhdHRlcm5FeGNlcHRpb247CkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJCQkJUmV2Q29tbWl0IGhlYWRDb21taXQgPSBydy5wYXJzZUNvbW1pdChoZWFkSWQpOwogCQkJCQloZWFkQ29tbWl0LmdldFRyZWUoKTsKIAkJCQkJaWYgKGluZGV4VHJlZUlkLmVxdWFscyhoZWFkQ29tbWl0LmdldFRyZWUoKSkpIHsKLQkJCQkJCXRocm93IG5ldyBFbXRweUNvbW1pdEV4Y2VwdGlvbigKKwkJCQkJCXRocm93IG5ldyBFbXB0eUNvbW1pdEV4Y2VwdGlvbigKIAkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZW1wdHlDb21taXQpOwogCQkJCQl9CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhCmluZGV4IDI5YmFmNGMuLmJhNmYzZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NyZWF0ZUJyYW5jaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEKQEAgLTQzLDYgKzQzLDkgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuSEVBRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfSEVBRFM7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogCkBAIC03OCw3ICs4MSw3IEBACiAKIAlwcml2YXRlIFNldHVwVXBzdHJlYW1Nb2RlIHVwc3RyZWFtTW9kZTsKIAotCXByaXZhdGUgU3RyaW5nIHN0YXJ0UG9pbnQgPSBDb25zdGFudHMuSEVBRDsKKwlwcml2YXRlIFN0cmluZyBzdGFydFBvaW50ID0gSEVBRDsKIAogCXByaXZhdGUgUmV2Q29tbWl0IHN0YXJ0Q29tbWl0OwogCkBAIC0xMjEsNyArMTI0LDcgQEAKIAkJdHJ5IChSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhyZXBvKSkgewogCQkJUmVmIHJlZlRvQ2hlY2sgPSByZXBvLmZpbmRSZWYobmFtZSk7CiAJCQlib29sZWFuIGV4aXN0cyA9IHJlZlRvQ2hlY2sgIT0gbnVsbAotCQkJCQkmJiByZWZUb0NoZWNrLmdldE5hbWUoKS5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKTsKKwkJCQkJJiYgcmVmVG9DaGVjay5nZXROYW1lKCkuc3RhcnRzV2l0aChSX0hFQURTKTsKIAkJCWlmICghZm9yY2UgJiYgZXhpc3RzKQogCQkJCXRocm93IG5ldyBSZWZBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkucmVmQWxyZWFkeUV4aXN0czEsIG5hbWUpKTsKQEAgLTE1Myw3ICsxNTYsNyBAQAogCQkJCWVsc2UKIAkJCQkJcmVmTG9nTWVzc2FnZSA9ICJicmFuY2g6IENyZWF0ZWQgZnJvbSBjb21taXQgIiArIGJhc2VDb21taXQ7IC8vJE5PTi1OTFMtMSQKIAotCQkJfSBlbHNlIGlmIChzdGFydFBvaW50RnVsbE5hbWUuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykKKwkJCX0gZWxzZSBpZiAoc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoUl9IRUFEUykKIAkJCQkJfHwgc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfUkVNT1RFUykpIHsKIAkJCQliYXNlQnJhbmNoID0gc3RhcnRQb2ludEZ1bGxOYW1lOwogCQkJCWlmIChleGlzdHMpCkBAIC0xNzEsNyArMTc0LDcgQEAKIAkJCQkJCQkrIHN0YXJ0UG9pbnRGdWxsTmFtZTsKIAkJCX0KIAotCQkJUmVmVXBkYXRlIHVwZGF0ZVJlZiA9IHJlcG8udXBkYXRlUmVmKENvbnN0YW50cy5SX0hFQURTICsgbmFtZSk7CisJCQlSZWZVcGRhdGUgdXBkYXRlUmVmID0gcmVwby51cGRhdGVSZWYoUl9IRUFEUyArIG5hbWUpOwogCQkJdXBkYXRlUmVmLnNldE5ld09iamVjdElkKHN0YXJ0QXQpOwogCQkJdXBkYXRlUmVmLnNldFJlZkxvZ01lc3NhZ2UocmVmTG9nTWVzc2FnZSwgZmFsc2UpOwogCQkJUmVzdWx0IHVwZGF0ZVJlc3VsdDsKQEAgLTI3OSwxNyArMjgyLDM0IEBACiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRQb2ludE9ySGVhZCgpIHsKLQkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBDb25zdGFudHMuSEVBRDsKKwkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBIRUFEOwogCX0KIAogCXByaXZhdGUgdm9pZCBwcm9jZXNzT3B0aW9ucygpIHRocm93cyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiB7CiAJCWlmIChuYW1lID09IG51bGwKLQkJCQl8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpKQorCQkJCXx8ICFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKFJfSEVBRFMgKyBuYW1lKQorCQkJCXx8ICFpc1ZhbGlkQnJhbmNoTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAogCQkJCQkuZ2V0KCkuYnJhbmNoTmFtZUludmFsaWQsIG5hbWUgPT0gbnVsbCA/ICI8bnVsbD4iIDogbmFtZSkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJLyoqCisJICogQ2hlY2sgaWYgdGhlIGdpdmVuIGJyYW5jaCBuYW1lIGlzIHZhbGlkCisJICoKKwkgKiBAcGFyYW0gYnJhbmNoTmFtZQorCSAqICAgICAgICAgICAgYnJhbmNoIG5hbWUgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYnJhbmNoIG5hbWUgaXMgdmFsaWQKKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEJyYW5jaE5hbWUoU3RyaW5nIGJyYW5jaE5hbWUpIHsKKwkJaWYgKEhFQUQuZXF1YWxzKGJyYW5jaE5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuICFicmFuY2hOYW1lLnN0YXJ0c1dpdGgoIi0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgogCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgbmV3IGJyYW5jaAogCSAqCiAJICogQHBhcmFtIG5hbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKaW5kZXggNWJkOTMyZC4uYTQ4NDc0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKQEAgLTEwNyw2ICsxMDcsMTEgQEAKIAlwcml2YXRlIExpc3Q8SU1hdGNoZXI+IG1hdGNoZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkvKioKKwkgKiBXaGV0aGVyIHRvIHVzZSBhbGwgdGFncyAoaW5jbC4gbGlnaHR3ZWlnaHQpIG9yIG5vdAorCSAqLworCXByaXZhdGUgYm9vbGVhbiB1c2VUYWdzID0gZmFsc2U7CisKKwkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgRGVzY3JpYmVDb21tYW5kLgogCSAqCiAJICogQHBhcmFtIHJlcG8KQEAgLTE3Niw2ICsxODEsMjIgQEAKIAkJcmV0dXJuIHRoaXM7CiAJfQogCisJLyoqCisJICogSW5zdGVhZCBvZiB1c2luZyBvbmx5IHRoZSBhbm5vdGF0ZWQgdGFncywgdXNlIGFueSB0YWcgZm91bmQgaW4gcmVmcy90YWdzCisJICogbmFtZXNwYWNlLiBUaGlzIG9wdGlvbiBlbmFibGVzIG1hdGNoaW5nIGxpZ2h0d2VpZ2h0IChub24tYW5ub3RhdGVkKSB0YWdzCisJICogb3Igbm90LgorCSAqCisJICogQHBhcmFtIHRhZ3MKKwkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGVuYWJsZXMgbWF0Y2hpbmcgbGlnaHR3ZWlnaHQgKG5vbi1hbm5vdGF0ZWQpCisJICogICAgICAgICAgICB0YWdzIGxpa2Ugc2V0dGluZyBvcHRpb24gLS10YWdzIGluIGMgZ2l0CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIERlc2NyaWJlQ29tbWFuZCBzZXRUYWdzKGJvb2xlYW4gdGFncykgeworCQl0aGlzLnVzZVRhZ3MgPSB0YWdzOworCQlyZXR1cm4gdGhpczsKKwl9CisKIAlwcml2YXRlIFN0cmluZyBsb25nRGVzY3JpcHRpb24oUmVmIHRhZywgaW50IGRlcHRoLCBPYmplY3RJZCB0aXApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgKQEAgLTI0MywxMiArMjY0LDE2IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIGdldE9iamVjdElkRnJvbVJlZihSZWYgcikgewotCQlPYmplY3RJZCBrZXkgPSByZXBvLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlrZXkgPSByLmdldE9iamVjdElkKCk7CisJcHJpdmF0ZSBPYmplY3RJZCBnZXRPYmplY3RJZEZyb21SZWYoUmVmIHIpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24geworCQl0cnkgeworCQkJT2JqZWN0SWQga2V5ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKKwkJCWlmIChrZXkgPT0gbnVsbCkgeworCQkJCWtleSA9IHIuZ2V0T2JqZWN0SWQoKTsKKwkJCX0KKwkJCXJldHVybiBrZXk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9Ci0JCXJldHVybiBrZXk7CiAJfQogCiAJLyoqCkBAIC0yNjEsMTIgKzI4NiwxNCBAQAogCXB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQl0cnkgewogCQkJY2hlY2tDYWxsYWJsZSgpOwotCi0JCQlpZiAodGFyZ2V0ID09IG51bGwpCisJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQlzZXRUYXJnZXQoQ29uc3RhbnRzLkhFQUQpOworCQkJfQogCi0JCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJfVEFHUykudmFsdWVzKCk7CisJCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CiAJCQlNYXA8T2JqZWN0SWQsIExpc3Q8UmVmPj4gdGFncyA9IHRhZ0xpc3Quc3RyZWFtKCkKKwkJCQkJLmZpbHRlcih0aGlzOjpmaWx0ZXJMaWdodHdlaWdodFRhZ3MpCiAJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeSh0aGlzOjpnZXRPYmplY3RJZEZyb21SZWYpKTsKIAogCQkJLy8gY29tYmluZWQgZmxhZ3Mgb2YgYWxsIHRoZSBjYW5kaWRhdGUgaW5zdGFuY2VzCkBAIC0zOTAsNCArNDE3LDIyIEBACiAJCQl3LmNsb3NlKCk7CiAJCX0KIAl9CisKKwkvKioKKwkgKiBXaGV0aGVyIHdlIHVzZSBsaWdodHdlaWdodCB0YWdzIG9yIG5vdCBmb3IgZGVzY3JpYmUgQ2FuZGlkYXRlcworCSAqCisJICogQHBhcmFtIHJlZgorCSAqICAgICAgICAgICAgcmVmZXJlbmNlIHVuZGVyIGluc3BlY3Rpb24KKwkgKiBAcmV0dXJuIHRydWUgaWYgaXQgc2hvdWxkIGJlIHVzZWQgZm9yIGRlc2NyaWJlIG9yIG5vdCByZWdhcmRpbmcKKwkgKiAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5EZXNjcmliZUNvbW1hbmQjdXNlVGFnc30KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygibnVsbCIpCisJcHJpdmF0ZSBib29sZWFuIGZpbHRlckxpZ2h0d2VpZ2h0VGFncyhSZWYgcmVmKSB7CisJCU9iamVjdElkIGlkID0gcmVmLmdldE9iamVjdElkKCk7CisJCXRyeSB7CisJCQlyZXR1cm4gdGhpcy51c2VUYWdzIHx8IChpZCAhPSBudWxsICYmICh3LnBhcnNlVGFnKGlkKSAhPSBudWxsKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kLmphdmEKaW5kZXggNWQxNzhiYy4uNzNlOTNhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kLmphdmEKQEAgLTEwNSw2ICsxMDUsOCBAQAogCiAJcHJpdmF0ZSBDYWxsYmFjayBjYWxsYmFjazsKIAorCXByaXZhdGUgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlOworCiAJLyoqCiAJICogQ2FsbGJhY2sgZm9yIHN0YXR1cyBvZiBmZXRjaCBvcGVyYXRpb24uCiAJICoKQEAgLTE5OCw3ICsyMDAsOCBAQAogCQkJCQkJCQkuc2V0VGFnT3B0KHRhZ09wdGlvbikKIAkJCQkJCQkJLnNldENoZWNrRmV0Y2hlZE9iamVjdHMoY2hlY2tGZXRjaGVkT2JqZWN0cykKIAkJCQkJCQkJLnNldFJlbW92ZURlbGV0ZWRSZWZzKGlzUmVtb3ZlRGVsZXRlZFJlZnMoKSkKLQkJCQkJCQkJLnNldFRoaW4odGhpbikuc2V0UmVmU3BlY3MocmVmU3BlY3MpCisJCQkJCQkJCS5zZXRUaGluKHRoaW4pCisJCQkJCQkJCS5zZXRSZWZTcGVjcyhhcHBseU9wdGlvbnMocmVmU3BlY3MpKQogCQkJCQkJCQkuc2V0RHJ5UnVuKGRyeVJ1bikKIAkJCQkJCQkJLnNldFJlY3Vyc2VTdWJtb2R1bGVzKHJlY3Vyc2VNb2RlKTsKIAkJCQkJCWNvbmZpZ3VyZShmKTsKQEAgLTIzNyw4ICsyNDAsOCBAQAogCQkJCXRyYW5zcG9ydC5zZXRUYWdPcHQodGFnT3B0aW9uKTsKIAkJCXRyYW5zcG9ydC5zZXRGZXRjaFRoaW4odGhpbik7CiAJCQljb25maWd1cmUodHJhbnNwb3J0KTsKLQotCQkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gdHJhbnNwb3J0LmZldGNoKG1vbml0b3IsIHJlZlNwZWNzKTsKKwkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IHRyYW5zcG9ydC5mZXRjaChtb25pdG9yLAorCQkJCQlhcHBseU9wdGlvbnMocmVmU3BlY3MpKTsKIAkJCWlmICghcmVwby5pc0JhcmUoKSkgewogCQkJCWZldGNoU3VibW9kdWxlcyhyZXN1bHQpOwogCQkJfQpAQCAtMjYxLDYgKzI2NCwxNyBAQAogCiAJfQogCisJcHJpdmF0ZSBMaXN0PFJlZlNwZWM+IGFwcGx5T3B0aW9ucyhMaXN0PFJlZlNwZWM+IHJlZlNwZWNzMikgeworCQlpZiAoIWlzRm9yY2VVcGRhdGUoKSkgeworCQkJcmV0dXJuIHJlZlNwZWNzMjsKKwkJfQorCQlMaXN0PFJlZlNwZWM+IHVwZGF0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oMyk7CisJCWZvciAoUmVmU3BlYyByZWZTcGVjIDogcmVmU3BlY3MyKSB7CisJCQl1cGRhdGVkLmFkZChyZWZTcGVjLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlZDsKKwl9CisKIAkvKioKIAkgKiBTZXQgdGhlIG1vZGUgdG8gYmUgdXNlZCBmb3IgcmVjdXJzaW5nIGludG8gc3VibW9kdWxlcy4KIAkgKgpAQCAtNTE3LDQgKzUzMSwyNyBAQAogCQl0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJCXJldHVybiB0aGlzOwogCX0KKworCS8qKgorCSAqIFdoZXRoZXIgZmV0Y2ggLS1mb3JjZSBvcHRpb24gaXMgZW5hYmxlZAorCSAqCisJICogQHJldHVybiB3aGV0aGVyIHJlZnMgYWZmZWN0ZWQgYnkgdGhlIGZldGNoIGFyZSB1cGRhdGVkIGZvcmNlZnVsbHkKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGb3JjZVVwZGF0ZSgpIHsKKwkJcmV0dXJuIHRoaXMuaXNGb3JjZVVwZGF0ZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgZmV0Y2ggLS1mb3JjZSBvcHRpb24KKwkgKgorCSAqIEBwYXJhbSBmb3JjZQorCSAqICAgICAgICAgICAgd2hldGhlciB0byB1cGRhdGUgcmVmcyBhZmZlY3RlZCBieSB0aGUgZmV0Y2ggZm9yY2VmdWxseQorCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBGZXRjaENvbW1hbmQgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBmb3JjZSkgeworCQl0aGlzLmlzRm9yY2VVcGRhdGUgPSBmb3JjZTsKKwkJcmV0dXJuIHRoaXM7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RCcmFuY2hDb21tYW5kLmphdmEKaW5kZXggY2RhZTc4Mi4uMjhhMjdhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhCkBAIC0xODcsNiArMTg3LDYgQEAKIAl9CiAKIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBnZXRSZWZzKFN0cmluZyBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhwcmVmaXgpLnZhbHVlcygpOworCQlyZXR1cm4gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChwcmVmaXgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhCmluZGV4IDkxNjEyMTEuLjAxYzE5OTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdFRhZ0NvbW1hbmQuamF2YQpAQCAtNDcsNyArNDcsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwpAQCAtNzgsMTEgKzc3LDExIEBACiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8UmVmPiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCWNoZWNrQ2FsbGFibGUoKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZMaXN0OwogCQlMaXN0PFJlZj4gdGFncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7Ci0JCQlyZWZMaXN0ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfVEFHUyk7Ci0JCQlmb3IgKFJlZiByZWYgOiByZWZMaXN0LnZhbHVlcygpKSB7CisJCQlMaXN0PFJlZj4gcmVmTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1RBR1MpOworCQkJZm9yIChSZWYgcmVmIDogcmVmTGlzdCkgewogCQkJCXRhZ3MuYWRkKHJlZik7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YQppbmRleCBmZDZjMWZhLi5jZjNkMzVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZC5qYXZhCkBAIC00MiwxMyArNDIsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTI3NSwxMCArMjcyLDkgQEAKIAkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlcyBjb3VsZCBub3QgYmUgYWNjZXNzZWQKIAkgKi8KIAlwdWJsaWMgTG9nQ29tbWFuZCBhbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoUmVmIHJlZiA6IHJlZnMudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgcmVmIDogZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQlpZighcmVmLmlzUGVlbGVkKCkpCi0JCQkJcmVmID0gZ2V0UmVwb3NpdG9yeSgpLnBlZWwocmVmKTsKKwkJCQlyZWYgPSBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAKIAkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKaW5kZXggY2Q1MGNhZS4uYjhmYTc0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKQEAgLTExMiw2ICsxMTIsOCBAQAogCiAJcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKIAorCXByaXZhdGUgYm9vbGVhbiBpbnNlcnRDaGFuZ2VJZDsKKwogCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwogCiAJLyoqCkBAIC0yNTMsNyArMjU1LDcgQEAKIAkJCXJlZkxvZ01lc3NhZ2UuYXBwZW5kKHJlZi5nZXROYW1lKCkpOwogCiAJCQkvLyBoYW5kbGUgYW5ub3RhdGVkIHRhZ3MKLQkJCXJlZiA9IHJlcG8ucGVlbChyZWYpOworCQkJcmVmID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkKIAkJCQlvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwpAQCAtMzkyLDYgKzM5NCw3IEBACiAJCQkJCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCQkJCQluZXdIZWFkSWQgPSBnaXQuY29tbWl0KCkKIAkJCQkJCQkJCS5zZXRSZWZsb2dDb21tZW50KHJlZkxvZ01lc3NhZ2UudG9TdHJpbmcoKSkKKwkJCQkJCQkJCS5zZXRJbnNlcnRDaGFuZ2VJZChpbnNlcnRDaGFuZ2VJZCkKIAkJCQkJCQkJCS5jYWxsKCkuZ2V0SWQoKTsKIAkJCQkJCX0KIAkJCQkJCW1lcmdlU3RhdHVzID0gTWVyZ2VTdGF0dXMuTUVSR0VEOwpAQCAtNjE5LDYgKzYyMiwyMyBAQAogCX0KIAogCS8qKgorCSAqIElmIHNldCB0byB0cnVlIGEgY2hhbmdlIGlkIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29tbWl0IG1lc3NhZ2UKKwkgKgorCSAqIEFuIGV4aXN0aW5nIGNoYW5nZSBpZCBpcyBub3QgcmVwbGFjZWQuIEFuIGluaXRpYWwgY2hhbmdlIGlkIChJMDAwLi4uKQorCSAqIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNoYW5nZSBpZC4KKwkgKgorCSAqIEBwYXJhbSBpbnNlcnRDaGFuZ2VJZAorCSAqICAgICAgICAgICAgd2hldGhlciB0byBpbnNlcnQgYSBjaGFuZ2UgaWQKKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgTWVyZ2VDb21tYW5kIHNldEluc2VydENoYW5nZUlkKGJvb2xlYW4gaW5zZXJ0Q2hhbmdlSWQpIHsKKwkJY2hlY2tDYWxsYWJsZSgpOworCQl0aGlzLmluc2VydENoYW5nZUlkID0gaW5zZXJ0Q2hhbmdlSWQ7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFRoZSBwcm9ncmVzcyBtb25pdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlmZiBvcGVyYXRpb24uIEJ5IGRlZmF1bHQsIHRoaXMKIAkgKiBpcyBzZXQgdG8gPGNvZGU+TnVsbFByb2dyZXNzTW9uaXRvcjwvY29kZT4KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL05hbWVSZXZDb21tYW5kLmphdmEKaW5kZXggYTlkOTc1OS4uYTJiMjAwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhCkBAIC0yNTEsOCArMjUxLDcgQEAKIAkgKiBwcmVmaXggYWRkZWQgYnkge0BsaW5rICNhZGRQcmVmaXgoU3RyaW5nKX0uCiAJICoKIAkgKiBAcGFyYW0gcHJlZml4Ci0JICogICAgICAgICAgICBwcmVmaXggdG8gYWRkOyBzZWUKLQkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZSNnZXRSZWZzKFN0cmluZyl9CisJICogICAgICAgICAgICBwcmVmaXggdG8gYWRkOyB0aGUgcHJlZml4IG11c3QgZW5kIHdpdGggYSBzbGFzaAogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCiAJcHVibGljIE5hbWVSZXZDb21tYW5kIGFkZFByZWZpeChTdHJpbmcgcHJlZml4KSB7CkBAIC0yNzksNyArMjc4LDggQEAKIAkJaWYgKHJlZnMgPT0gbnVsbCkKIAkJCXJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IHsKLQkJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKENvbnN0YW50cy5SX1RBR1MpLnZhbHVlcygpKSB7CisJCQlmb3IgKFJlZiByZWYgOiByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9UQUdTKSkgewogCQkJCU9iamVjdElkIGlkID0gcmVmLmdldE9iamVjdElkKCk7CiAJCQkJaWYgKGlkICE9IG51bGwgJiYgKHdhbGsucGFyc2VBbnkoaWQpIGluc3RhbmNlb2YgUmV2VGFnKSkKIAkJCQkJYWRkUmVmKHJlZik7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAogCXByaXZhdGUgdm9pZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCwgTWFwPE9iamVjdElkLCBTdHJpbmc+IG5vbkNvbW1pdHMsCiAJCQlGSUZPUmV2UXVldWUgcGVuZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMocHJlZml4KS52YWx1ZXMoKSkKKwkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChwcmVmaXgpKQogCQkJYWRkUmVmKHJlZiwgbm9uQ29tbWl0cywgcGVuZGluZyk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQppbmRleCAxOWJkZDM1Li40NTk0NTFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKQEAgLTE1Myw3ICsxNTMsOCBAQAogCiAJCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0czsKIAkJCXRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsIFRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7Ci0JCQlmb3IgKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQgOiB0cmFuc3BvcnRzKSB7CisJCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkKKwkJCQkJZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCA6IHRyYW5zcG9ydHMpIHsKIAkJCQl0cmFuc3BvcnQuc2V0UHVzaFRoaW4odGhpbik7CiAJCQkJdHJhbnNwb3J0LnNldFB1c2hBdG9taWMoYXRvbWljKTsKIAkJCQlpZiAocmVjZWl2ZVBhY2sgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQppbmRleCBkYTFmZjA2Li45OGMxNmI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCkBAIC0xNzM0LDIzICsxNzM0LDE3IEBACiAJCQkJU3RyaW5nIGNvbnRlbnQpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhcmVudERpciwgbmFtZSk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkgewogCQkJCWZvcy53cml0ZShjb250ZW50LmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCQlmb3Mud3JpdGUoJ1xuJyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKIAkJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRUb0ZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCB0cnVlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgdHJ1ZSkpIHsKIAkJCQlmb3Mud3JpdGUoY29udGVudC5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQkJZm9zLndyaXRlKCdcbicpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YQppbmRleCBjNDNjNWM2Li5hOGZkY2QyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZW1vdGVBZGRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVtb3RlQWRkQ29tbWFuZC5qYXZhCkBAIC04Niw5ICs4NiwxMiBAQAogCSAqCiAJICogQHBhcmFtIG5hbWUKIAkgKiAgICAgICAgICAgIGEgcmVtb3RlIG5hbWUKKwkgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UKKwkgKiBAc2luY2UgNS4wCiAJICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZW1vdGVBZGRDb21tYW5kIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5uYW1lID0gbmFtZTsKKwkJcmV0dXJuIHRoaXM7CiAJfQogCiAJLyoqCkBAIC05Niw5ICs5OSwxMiBAQAogCSAqCiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgYW4gVVJMIGZvciB0aGUgcmVtb3RlCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShVUklpc2ggdXJpKSB7CisJcHVibGljIFJlbW90ZUFkZENvbW1hbmQgc2V0VXJpKFVSSWlzaCB1cmkpIHsKIAkJdGhpcy51cmkgPSB1cmk7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQppbmRleCBiZTQ0NmY5Li4xM2NlNGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBPYmplY3RJZCBjb21taXRJZCkgeworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KE9iamVjdElkIGNvbW1pdElkKSB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CiAJCQlyZXR1cm4gcncucGFyc2VDb21taXQoY29tbWl0SWQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0zNjAsNyArMzYwLDcgQEAKIAogCXByaXZhdGUgdm9pZCByZXNldEluZGV4Rm9yUGF0aHMoT2JqZWN0SWQgY29tbWl0VHJlZSkgewogCQlEaXJDYWNoZSBkYyA9IG51bGw7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgewogCQkJZGMgPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKaW5kZXggMDg4YWExNS4uZDJmNGJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlEaXJDYWNoZSBkYyA9IG51bGw7CiAKIAkJTGlzdDxTdHJpbmc+IGFjdHVhbGx5RGVsZXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgewogCQkJZGMgPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAJCQl0dy5yZXNldCgpOyAvLyBkcm9wIHRoZSBmaXJzdCBlbXB0eSB0cmVlLCB3aGljaCB3ZSBkbyBub3QgbmVlZCBoZXJlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hBcHBseUNvbW1hbmQuamF2YQppbmRleCA1Zjc5MjhkLi4wMWQwNzBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEKQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSB0byBhcHBseSB0aGUgc3Rhc2gKIAkgKiAgICAgICAgICAgIHRvCiAJICovCi0JcHVibGljIFN0YXNoQXBwbHlDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJfQogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHN0YXNoIHtAY29kZSBSZWZ9IHRvIGFwcGx5CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgU3RyaW5nIHN0YXNoUmVmKSB7CisJcHVibGljIFN0YXNoQXBwbHlDb21tYW5kIHNldFN0YXNoUmVmKFN0cmluZyBzdGFzaFJlZikgewogCQl0aGlzLnN0YXNoUmVmID0gc3Rhc2hSZWY7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggMzQ5NWZmOC4uYzMyODkwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKQEAgLTE5NSw3ICsxOTUsNyBAQAogCiAJcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwKIAkJCWZpbmFsIE9iamVjdElkIGhlYWRJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZWFkZXIpKSB7CisJCXRyeSAoUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsocmVhZGVyKSkgewogCQkJcmV0dXJuIHdhbGsucGFyc2VDb21taXQoaGVhZElkKTsKIAkJfQogCX0KQEAgLTMwMywxMiArMzAzLDkgQEAKIAkJCQkJCWVudHJ5LnNldExhc3RNb2RpZmllZCh3dEl0ZXIuZ2V0RW50cnlMYXN0TW9kaWZpZWQoKSk7CiAJCQkJCQllbnRyeS5zZXRGaWxlTW9kZSh3dEl0ZXIuZ2V0RW50cnlGaWxlTW9kZSgpKTsKIAkJCQkJCWxvbmcgY29udGVudExlbmd0aCA9IHd0SXRlci5nZXRFbnRyeUNvbnRlbnRMZW5ndGgoKTsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gd3RJdGVyLm9wZW5FbnRyeVN0cmVhbSgpOwotCQkJCQkJdHJ5IHsKKwkJCQkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSB3dEl0ZXIub3BlbkVudHJ5U3RyZWFtKCkpIHsKIAkJCQkJCQllbnRyeS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoCiAJCQkJCQkJCQlDb25zdGFudHMuT0JKX0JMT0IsIGNvbnRlbnRMZW5ndGgsIGluKSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWluLmNsb3NlKCk7CiAJCQkJCQl9CiAKIAkJCQkJCWlmIChpbmRleEl0ZXIgPT0gbnVsbCAmJiBoZWFkSXRlciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhCmluZGV4IGNkOGY4ZTYuLjdmMDJhYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoRHJvcENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaERyb3BDb21tYW5kLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIHN0YXNoIHJlZmVyZW5jZQogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgaW50IHN0YXNoUmVmKSB7CisJcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0U3Rhc2hSZWYoaW50IHN0YXNoUmVmKSB7CiAJCWlmIChzdGFzaFJlZiA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogCSAqICAgICAgICAgICAge0BsaW5rICNzZXRTdGFzaFJlZihpbnQpfQogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0QWxsKGZpbmFsIGJvb2xlYW4gYWxsKSB7CisJcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0QWxsKGJvb2xlYW4gYWxsKSB7CiAJCXRoaXMuYWxsID0gYWxsOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmVXBkYXRlIGNyZWF0ZVJlZlVwZGF0ZShmaW5hbCBSZWYgc3Rhc2hSZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZWZVcGRhdGUgY3JlYXRlUmVmVXBkYXRlKFJlZiBzdGFzaFJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmVXBkYXRlIHVwZGF0ZSA9IHJlcG8udXBkYXRlUmVmKFJfU1RBU0gpOwogCQl1cGRhdGUuZGlzYWJsZVJlZkxvZygpOwogCQl1cGRhdGUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChzdGFzaFJlZi5nZXRPYmplY3RJZCgpKTsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQlyZXR1cm4gdXBkYXRlOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVSZWYoZmluYWwgUmVmIHN0YXNoUmVmKSB7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlZihSZWYgc3Rhc2hSZWYpIHsKIAkJdHJ5IHsKIAkJCVJlc3VsdCByZXN1bHQgPSBjcmVhdGVSZWZVcGRhdGUoc3Rhc2hSZWYpLmRlbGV0ZSgpOwogCQkJaWYgKFJlc3VsdC5GT1JDRUQgIT0gcmVzdWx0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhCmluZGV4IDY0NTFiNzAuLmYzMTZiMjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoTGlzdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaExpc3RDb21tYW5kLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAKIAkgKgogCSAqIEBwYXJhbSByZXBvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgU3Rhc2hMaXN0Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3Rhc2hMaXN0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEKaW5kZXggODFlYTM1MC4uOWQ5NjI2ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlQWRkQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YQpAQCAtODksNyArODksNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtMTAwLDcgKzEwMCw3IEBACiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFVSSShmaW5hbCBTdHJpbmcgdXJpKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0VVJJKFN0cmluZyB1cmkpIHsKIAkJdGhpcy51cmkgPSB1cmk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEyNiw3ICsxMjYsNyBAQAogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yfSBvYmplY3QuCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlSW5pdENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEKaW5kZXggNmFmMjdkNy4uMmRiMTJiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlSW5pdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVJbml0Q29tbWFuZC5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZUluaXRDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC04OSw3ICs4OSw3IEBACiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhCmluZGV4IDk3YWU2NjguLjA2MDZjNWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN0YXR1c0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTdGF0dXNDb21tYW5kLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVTdGF0dXNDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVTdGF0dXNDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC04OSw3ICs4OSw3IEBACiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3RhdHVzQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEzMCwxNiArMTMwLDE0IEBACiAJCQkJCWlkKTsKIAogCQkvLyBSZXBvcnQgdW5pbml0aWFsaXplZCBpZiBubyBzdWJtb2R1bGUgcmVwb3NpdG9yeQotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQlpZiAoc3ViUmVwbyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdWJtb2R1bGVTdGF0dXMoU3VibW9kdWxlU3RhdHVzVHlwZS5VTklOSVRJQUxJWkVELCBwYXRoLAotCQkJCQlpZCk7CisJCU9iamVjdElkIGhlYWRJZCA9IG51bGw7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgU3VibW9kdWxlU3RhdHVzKFN1Ym1vZHVsZVN0YXR1c1R5cGUuVU5JTklUSUFMSVpFRCwKKwkJCQkJCXBhdGgsIGlkKTsKKwkJCX0KIAotCQlPYmplY3RJZCBoZWFkSWQ7Ci0JCXRyeSB7CiAJCQloZWFkSWQgPSBzdWJSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQl9IGZpbmFsbHkgewotCQkJc3ViUmVwby5jbG9zZSgpOwogCQl9CiAKIAkJLy8gUmVwb3J0IHVuaW5pdGlhbGl6ZWQgaWYgbm8gSEVBRCBjb21taXQgaW4gc3VibW9kdWxlIHJlcG9zaXRvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN5bmNDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTeW5jQ29tbWFuZC5qYXZhCmluZGV4IGQyMmQ4MjAuLjdjZjRiNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN5bmNDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YQpAQCAtNzksNyArNzksNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN5bmNDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtOTEsNyArOTEsNyBAQAogCSAqICAgICAgICAgICAgKHdpdGggPGNvZGU+LzwvY29kZT4gYXMgc2VwYXJhdG9yKQogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN5bmNDb21tYW5kIGFkZFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAqIEByZXR1cm4gc2hvcnRlbmVkIGJyYW5jaCBuYW1lLCBudWxsIG9uIGZhaWx1cmVzCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkQnJhbmNoKGZpbmFsIFJlcG9zaXRvcnkgc3ViUmVwbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRCcmFuY2goUmVwb3NpdG9yeSBzdWJSZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWYgaGVhZCA9IHN1YlJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOwogCQlpZiAoaGVhZCAhPSBudWxsICYmIGhlYWQuaXNTeW1ib2xpYygpKQogCQkJcmV0dXJuIFJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUoaGVhZC5nZXRMZWFmKCkuZ2V0TmFtZSgpKTsKQEAgLTEzMiwzMCArMTMyLDMxIEBACiAJCQkJCQlwYXRoLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsIHJlbW90ZVVybCk7CiAJCQkJc3luY2VkLnB1dChwYXRoLCByZW1vdGVVcmwpOwogCi0JCQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJCQlpZiAoc3ViUmVwbyA9PSBudWxsKQotCQkJCQljb250aW51ZTsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KIAotCQkJCVN0b3JlZENvbmZpZyBzdWJDb25maWc7Ci0JCQkJU3RyaW5nIGJyYW5jaDsKLQkJCQl0cnkgeworCQkJCQlTdG9yZWRDb25maWcgc3ViQ29uZmlnOworCQkJCQlTdHJpbmcgYnJhbmNoOworCiAJCQkJCXN1YkNvbmZpZyA9IHN1YlJlcG8uZ2V0Q29uZmlnKCk7CiAJCQkJCS8vIEdldCBuYW1lIG9mIHJlbW90ZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBicmFuY2ggYW5kCiAJCQkJCS8vIGZhbGwgYmFjayB0byBkZWZhdWx0IHJlbW90ZSBuYW1lIGFzIGxhc3QgcmVzb3J0CiAJCQkJCWJyYW5jaCA9IGdldEhlYWRCcmFuY2goc3ViUmVwbyk7CiAJCQkJCVN0cmluZyByZW1vdGUgPSBudWxsOwotCQkJCQlpZiAoYnJhbmNoICE9IG51bGwpCisJCQkJCWlmIChicmFuY2ggIT0gbnVsbCkgewogCQkJCQkJcmVtb3RlID0gc3ViQ29uZmlnLmdldFN0cmluZygKIAkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19CUkFOQ0hfU0VDVElPTiwgYnJhbmNoLAogCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9SRU1PVEUpOwotCQkJCQlpZiAocmVtb3RlID09IG51bGwpCisJCQkJCX0KKwkJCQkJaWYgKHJlbW90ZSA9PSBudWxsKSB7CiAJCQkJCQlyZW1vdGUgPSBDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKKwkJCQkJfQogCiAJCQkJCXN1YkNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKIAkJCQkJCQlyZW1vdGUsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCwgcmVtb3RlVXJsKTsKIAkJCQkJc3ViQ29uZmlnLnNhdmUoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdWJSZXBvLmNsb3NlKCk7CiAJCQkJfQogCQkJfQogCQkJaWYgKCFzeW5jZWQuaXNFbXB0eSgpKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlVXBkYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlVXBkYXRlQ29tbWFuZC5qYXZhCmluZGV4IDMzNjJkNDYuLjM5OGYyMWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVVcGRhdGVDb21tYW5kLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTEzMiw3ICsxMzIsNyBAQAogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICogQHNpbmNlIDQuOQogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kIHNldEZldGNoKGZpbmFsIGJvb2xlYW4gZmV0Y2gpIHsKKwlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBzZXRGZXRjaChib29sZWFuIGZldGNoKSB7CiAJCXRoaXMuZmV0Y2ggPSBmZXRjaDsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTQ0LDExICsxNDQsNDMgQEAKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kIGFkZFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCisJcHJpdmF0ZSBSZXBvc2l0b3J5IGdldE9yQ2xvbmVTdWJtb2R1bGUoU3VibW9kdWxlV2FsayBnZW5lcmF0b3IsIFN0cmluZyB1cmwpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7CisJCVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7CisJCWlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKKwkJCWlmIChjYWxsYmFjayAhPSBudWxsKSB7CisJCQkJY2FsbGJhY2suY2xvbmluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKKwkJCX0KKwkJCUNsb25lQ29tbWFuZCBjbG9uZSA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKTsKKwkJCWNvbmZpZ3VyZShjbG9uZSk7CisJCQljbG9uZS5zZXRVUkkodXJsKTsKKwkJCWNsb25lLnNldERpcmVjdG9yeShnZW5lcmF0b3IuZ2V0RGlyZWN0b3J5KCkpOworCQkJY2xvbmUuc2V0R2l0RGlyKAorCQkJCQluZXcgRmlsZShuZXcgRmlsZShyZXBvLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuTU9EVUxFUyksCisJCQkJCQkJZ2VuZXJhdG9yLmdldFBhdGgoKSkpOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCWNsb25lLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKKwkJCX0KKwkJCXJlcG9zaXRvcnkgPSBjbG9uZS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOworCQl9IGVsc2UgaWYgKHRoaXMuZmV0Y2gpIHsKKwkJCWlmIChmZXRjaENhbGxiYWNrICE9IG51bGwpIHsKKwkJCQlmZXRjaENhbGxiYWNrLmZldGNoaW5nU3VibW9kdWxlKGdlbmVyYXRvci5nZXRQYXRoKCkpOworCQkJfQorCQkJRmV0Y2hDb21tYW5kIGZldGNoQ29tbWFuZCA9IEdpdC53cmFwKHJlcG9zaXRvcnkpLmZldGNoKCk7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQkJZmV0Y2hDb21tYW5kLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKKwkJCX0KKwkJCWNvbmZpZ3VyZShmZXRjaENvbW1hbmQpOworCQkJZmV0Y2hDb21tYW5kLmNhbGwoKTsKKwkJfQorCQlyZXR1cm4gcmVwb3NpdG9yeTsKKwl9CisKIAkvKioKIAkgKiB7QGluaGVyaXREb2N9CiAJICoKQEAgLTE3NSwzNCArMjA3LDggQEAKIAkJCQlpZiAodXJsID09IG51bGwpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJUmVwb3NpdG9yeSBzdWJtb2R1bGVSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJCQkvLyBDbG9uZSByZXBvc2l0b3J5IGlmIG5vdCBwcmVzZW50Ci0JCQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkgewotCQkJCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotCQkJCQkJY2FsbGJhY2suY2xvbmluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKLQkJCQkJfQotCQkJCQlDbG9uZUNvbW1hbmQgY2xvbmUgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7Ci0JCQkJCWNvbmZpZ3VyZShjbG9uZSk7Ci0JCQkJCWNsb25lLnNldFVSSSh1cmwpOwotCQkJCQljbG9uZS5zZXREaXJlY3RvcnkoZ2VuZXJhdG9yLmdldERpcmVjdG9yeSgpKTsKLQkJCQkJY2xvbmUuc2V0R2l0RGlyKG5ldyBGaWxlKG5ldyBGaWxlKHJlcG8uZ2V0RGlyZWN0b3J5KCksCi0JCQkJCQkJQ29uc3RhbnRzLk1PRFVMRVMpLCBnZW5lcmF0b3IuZ2V0UGF0aCgpKSk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCQljbG9uZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCQkJCXN1Ym1vZHVsZVJlcG8gPSBjbG9uZS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5mZXRjaCkgewotCQkJCQlpZiAoZmV0Y2hDYWxsYmFjayAhPSBudWxsKSB7Ci0JCQkJCQlmZXRjaENhbGxiYWNrLmZldGNoaW5nU3VibW9kdWxlKGdlbmVyYXRvci5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJCUZldGNoQ29tbWFuZCBmZXRjaENvbW1hbmQgPSBHaXQud3JhcChzdWJtb2R1bGVSZXBvKS5mZXRjaCgpOwotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlmZXRjaENvbW1hbmQuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWNvbmZpZ3VyZShmZXRjaENvbW1hbmQpOwotCQkJCQlmZXRjaENvbW1hbmQuY2FsbCgpOwotCQkJCX0KLQotCQkJCXRyeSAoUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsoc3VibW9kdWxlUmVwbykpIHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbyA9IGdldE9yQ2xvbmVTdWJtb2R1bGUoZ2VuZXJhdG9yLAorCQkJCQkJdXJsKTsgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsoc3VibW9kdWxlUmVwbykpIHsKIAkJCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHdhbGsKIAkJCQkJCQkucGFyc2VDb21taXQoZ2VuZXJhdG9yLmdldE9iamVjdElkKCkpOwogCkBAIC0yMzcsOCArMjQzLDYgQEAKIAkJCQkJCQkJCWdlbmVyYXRvci5nZXRQYXRoKCkpOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3VibW9kdWxlUmVwby5jbG9zZSgpOwogCQkJCX0KIAkJCQl1cGRhdGVkLmFkZChnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1RyYW5zcG9ydENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1RyYW5zcG9ydENvbW1hbmQuamF2YQppbmRleCA5YzkxNTM3Li5kMzRiYjVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UcmFuc3BvcnRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhCkBAIC04MCw3ICs4MCw3IEBACiAJICoKIAkgKiBAcGFyYW0gcmVwbyBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHJvdGVjdGVkIFRyYW5zcG9ydENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHJvdGVjdGVkIFRyYW5zcG9ydENvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlzZXRDcmVkZW50aWFsc1Byb3ZpZGVyKENyZWRlbnRpYWxzUHJvdmlkZXIuZ2V0RGVmYXVsdCgpKTsKIAl9CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlRyYW5zcG9ydH0gb2JqZWN0LgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHJvdGVjdGVkIEMgY29uZmlndXJlKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKwlwcm90ZWN0ZWQgQyBjb25maWd1cmUoVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogCQlpZiAoY3JlZGVudGlhbHNQcm92aWRlciAhPSBudWxsKQogCQkJdHJhbnNwb3J0LnNldENyZWRlbnRpYWxzUHJvdmlkZXIoY3JlZGVudGlhbHNQcm92aWRlcik7CiAJCXRyYW5zcG9ydC5zZXRUaW1lb3V0KHRpbWVvdXQpOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5UcmFuc3BvcnRDb21tYW5kfSBvYmplY3QuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwcm90ZWN0ZWQgQyBjb25maWd1cmUoZmluYWwgVHJhbnNwb3J0Q29tbWFuZCBjaGlsZENvbW1hbmQpIHsKKwlwcm90ZWN0ZWQgQyBjb25maWd1cmUoVHJhbnNwb3J0Q29tbWFuZCBjaGlsZENvbW1hbmQpIHsKIAkJY2hpbGRDb21tYW5kLnNldENyZWRlbnRpYWxzUHJvdmlkZXIoY3JlZGVudGlhbHNQcm92aWRlcik7CiAJCWNoaWxkQ29tbWFuZC5zZXRUaW1lb3V0KHRpbWVvdXQpOwogCQljaGlsZENvbW1hbmQuc2V0VHJhbnNwb3J0Q29uZmlnQ2FsbGJhY2sodHJhbnNwb3J0Q29uZmlnQ2FsbGJhY2spOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0Fib3J0ZWRCeUhvb2tFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9BYm9ydGVkQnlIb29rRXhjZXB0aW9uLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0VtdHB5Q29tbWl0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0VtcHR5Q29tbWl0RXhjZXB0aW9uLmphdmEKaW5kZXggZWEwZTcxOC4uODdlMWE2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0VtdHB5Q29tbWl0RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0VtcHR5Q29tbWl0RXhjZXB0aW9uLmphdmEKQEAgLTQwLDMwICs0MCwzMCBAQAogLyoqCiAgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBuZXdseSBjcmVhdGVkIGNvbW1pdCBkb2VzIG5vdCBjb250YWluIGFueSBjaGFuZ2VzCiAgKgotICogQHNpbmNlIDQuMgorICogQHNpbmNlIDUuMAogICovCi1wdWJsaWMgY2xhc3MgRW10cHlDb21taXRFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24geyAvLyBUT0RPOiBDb3JyZWN0IHNwZWxsaW5nIG9mIHRoaXMgY2xhc3MgbmFtZSBpbiA1LjAKK3B1YmxpYyBjbGFzcyBFbXB0eUNvbW1pdEV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKIAkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW10cHlDb21taXRFeGNlcHRpb24KKwkgKiBDb25zdHJ1Y3RvciBmb3IgRW1wdHlDb21taXRFeGNlcHRpb24KIAkgKgogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuVGhyb3dhYmxlfQogCSAqLwotCXB1YmxpYyBFbXRweUNvbW1pdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIEVtcHR5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogCX0KIAogCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbXRweUNvbW1pdEV4Y2VwdGlvbi4KKwkgKiBDb25zdHJ1Y3RvciBmb3IgRW1wdHlDb21taXRFeGNlcHRpb24uCiAJICoKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBFbXRweUNvbW1pdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyBFbXB0eUNvbW1pdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvU3Rhc2hBcHBseUZhaWx1cmVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9TdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDUxN2I1MTIuLmIxMmMwMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9TdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9TdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbi5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgU3Rhc2hBcHBseUZhaWx1cmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgU3Rhc2hBcHBseUZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKIAkJc3VwZXIobWVzc2FnZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL1JldmVyc2VXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL1JldmVyc2VXYWxrLmphdmEKaW5kZXggMmViMzEzZi4uMTA2NzM3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9SZXZlcnNlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YQpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoOwogCQl9CiAKLQkJUmV2ZXJzZUNvbW1pdCBnZXRDaGlsZChmaW5hbCBpbnQgbnRoKSB7CisJCVJldmVyc2VDb21taXQgZ2V0Q2hpbGQoaW50IG50aCkgewogCQkJcmV0dXJuIGNoaWxkcmVuW250aF07CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZDb25maWcuamF2YQppbmRleCAwNjNjZWZmLi4yMWRjYTZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmQ29uZmlnLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKIAogCXByaXZhdGUgZmluYWwgaW50IHJlbmFtZUxpbWl0OwogCi0JcHJpdmF0ZSBEaWZmQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXByaXZhdGUgRGlmZkNvbmZpZyhDb25maWcgcmMpIHsKIAkJbm9QcmVmaXggPSByYy5nZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfRElGRl9TRUNUSU9OLAogCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX05PUFJFRklYLCBmYWxzZSk7CiAJCXJlbmFtZURldGVjdGlvblR5cGUgPSBwYXJzZVJlbmFtZURldGVjdGlvblR5cGUocmMuZ2V0U3RyaW5nKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKaW5kZXggMmUyOWI4MS4uN2FhYTUwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbiBhbmQgYWZ0ZXIgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHdpdGhpbiBhIGh1bmsgb2YKIAkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoZmluYWwgaW50IGxpbmVDb3VudCkgeworCXB1YmxpYyB2b2lkIHNldENvbnRleHQoaW50IGxpbmVDb3VudCkgewogCQlpZiAobGluZUNvdW50IDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmNvbnRleHRNdXN0QmVOb25OZWdhdGl2ZSk7CkBAIC0yMzUsNyArMjM1LDcgQEAKIAkgKiBAcGFyYW0gY291bnQKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBkaWdpdHMgdG8gc2hvdyBpbiBhbiBPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBYmJyZXZpYXRpb25MZW5ndGgoZmluYWwgaW50IGNvdW50KSB7CisJcHVibGljIHZvaWQgc2V0QWJicmV2aWF0aW9uTGVuZ3RoKGludCBjb3VudCkgewogCQlpZiAoY291bnQgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYWJicmV2aWF0aW9uTGVuZ3RoTXVzdEJlTm9uTmVnYXRpdmUpOwpAQCAtNzQyLDcgKzc0Miw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgd3JpdGluZyB0byB0aGUgc3VwcGxpZWQgc3RyZWFtIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoZmluYWwgRmlsZUhlYWRlciBoZWFkLCBmaW5hbCBSYXdUZXh0IGEsIGZpbmFsIFJhd1RleHQgYikKKwlwdWJsaWMgdm9pZCBmb3JtYXQoRmlsZUhlYWRlciBoZWFkLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIFJldXNlIHRoZSBleGlzdGluZyBGaWxlSGVhZGVyIGFzLWlzIGJ5IGJsaW5kbHkgY29weWluZyBpdHMKIAkJLy8gaGVhZGVyIGxpbmVzLCBidXQgYXZvaWRpbmcgaXRzIGh1bmtzLiBJbnN0ZWFkIHdlIHJlY3JlYXRlCkBAIC03NjgsNyArNzY4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSB0ZXh0IEIgd2hpY2ggd2FzIGNvbXBhcmVkCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHZvaWQgZm9ybWF0KGZpbmFsIEVkaXRMaXN0IGVkaXRzLCBmaW5hbCBSYXdUZXh0IGEsIGZpbmFsIFJhd1RleHQgYikKKwlwdWJsaWMgdm9pZCBmb3JtYXQoRWRpdExpc3QgZWRpdHMsIFJhd1RleHQgYSwgUmF3VGV4dCBiKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZm9yIChpbnQgY3VySWR4ID0gMDsgY3VySWR4IDwgZWRpdHMuc2l6ZSgpOykgewogCQkJRWRpdCBjdXJFZGl0ID0gZWRpdHMuZ2V0KGN1cklkeCk7CkBAIC04MTYsMTIgKzgxNiwxMiBAQAogCSAqICAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdpdGhpbiB0ZXh0CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVDb250ZXh0TGluZShmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKQorCXByb3RlY3RlZCB2b2lkIHdyaXRlQ29udGV4dExpbmUoUmF3VGV4dCB0ZXh0LCBpbnQgbGluZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlTGluZSgnICcsIHRleHQsIGxpbmUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbmRPZkxpbmVNaXNzaW5nKGZpbmFsIFJhd1RleHQgdGV4dCwgZmluYWwgaW50IGxpbmUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5kT2ZMaW5lTWlzc2luZyhSYXdUZXh0IHRleHQsIGludCBsaW5lKSB7CiAJCXJldHVybiBsaW5lICsgMSA9PSB0ZXh0LnNpemUoKSAmJiB0ZXh0LmlzTWlzc2luZ05ld2xpbmVBdEVuZCgpOwogCX0KIApAQCAtODM0LDcgKzgzNCw3IEBACiAJICogICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2l0aGluIHRleHQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUFkZGVkTGluZShmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKQorCXByb3RlY3RlZCB2b2lkIHdyaXRlQWRkZWRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJysnLCB0ZXh0LCBsaW5lKTsKIAl9CkBAIC04NDgsNyArODQ4LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlUmVtb3ZlZExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlbW92ZWRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJy0nLCB0ZXh0LCBsaW5lKTsKIAl9CkBAIC04NzgsNyArODc4LDcgQEAKIAkJb3V0LndyaXRlKCdcbicpOwogCX0KIAotCXByaXZhdGUgdm9pZCB3cml0ZVJhbmdlKGZpbmFsIGNoYXIgcHJlZml4LCBmaW5hbCBpbnQgYmVnaW4sIGZpbmFsIGludCBjbnQpCisJcHJpdmF0ZSB2b2lkIHdyaXRlUmFuZ2UoY2hhciBwcmVmaXgsIGludCBiZWdpbiwgaW50IGNudCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dC53cml0ZSgnICcpOwogCQlvdXQud3JpdGUocHJlZml4KTsKQEAgLTEyMTMsNyArMTIxMyw3IEBACiAJCW8ud3JpdGUoZW5jb2RlKCIrKysgIiArIG5ld3AgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgaW50IGZpbmRDb21iaW5lZEVuZChmaW5hbCBMaXN0PEVkaXQ+IGVkaXRzLCBmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgaW50IGZpbmRDb21iaW5lZEVuZChMaXN0PEVkaXQ+IGVkaXRzLCBpbnQgaSkgewogCQlpbnQgZW5kID0gaSArIDE7CiAJCXdoaWxlIChlbmQgPCBlZGl0cy5zaXplKCkKIAkJCQkmJiAoY29tYmluZUEoZWRpdHMsIGVuZCkgfHwgY29tYmluZUIoZWRpdHMsIGVuZCkpKQpAQCAtMTIyMSwxNSArMTIyMSwxNSBAQAogCQlyZXR1cm4gZW5kIC0gMTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gY29tYmluZUEoZmluYWwgTGlzdDxFZGl0PiBlLCBmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQShMaXN0PEVkaXQ+IGUsIGludCBpKSB7CiAJCXJldHVybiBlLmdldChpKS5nZXRCZWdpbkEoKSAtIGUuZ2V0KGkgLSAxKS5nZXRFbmRBKCkgPD0gMiAqIGNvbnRleHQ7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVCKGZpbmFsIExpc3Q8RWRpdD4gZSwgZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGJvb2xlYW4gY29tYmluZUIoTGlzdDxFZGl0PiBlLCBpbnQgaSkgewogCQlyZXR1cm4gZS5nZXQoaSkuZ2V0QmVnaW5CKCkgLSBlLmdldChpIC0gMSkuZ2V0RW5kQigpIDw9IDIgKiBjb250ZXh0OwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5kKGZpbmFsIEVkaXQgZWRpdCwgZmluYWwgaW50IGEsIGZpbmFsIGludCBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmQoRWRpdCBlZGl0LCBpbnQgYSwgaW50IGIpIHsKIAkJcmV0dXJuIGVkaXQuZ2V0RW5kQSgpIDw9IGEgJiYgZWRpdC5nZXRFbmRCKCkgPD0gYjsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRWRpdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YQppbmRleCA3NzVkMTFhLi41Yzg3NmU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRWRpdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9FZGl0LmphdmEKQEAgLTk0LDcgKzk0LDcgQEAKIAkgKiBAcGFyYW0gYnMKIAkgKiAgICAgICAgICAgIGJlZ2luQjogc3RhcnQgYW5kIGVuZCBvZiByZWdpb24gaW4gc2VxdWVuY2UgQjsgMCBiYXNlZC4KIAkgKi8KLQlwdWJsaWMgRWRpdChmaW5hbCBpbnQgYXMsIGZpbmFsIGludCBicykgeworCXB1YmxpYyBFZGl0KGludCBhcywgaW50IGJzKSB7CiAJCXRoaXMoYXMsIGFzLCBicywgYnMpOwogCX0KIApAQCAtMTEwLDcgKzExMCw3IEBACiAJICogQHBhcmFtIGJlCiAJICogICAgICAgICAgICBlbmRCOiBlbmQgb2YgcmVnaW9uIGluIHNlcXVlbmNlIEI7IG11c3QgYmUgJmd0OyA9IGJzLgogCSAqLwotCXB1YmxpYyBFZGl0KGZpbmFsIGludCBhcywgZmluYWwgaW50IGFlLCBmaW5hbCBpbnQgYnMsIGZpbmFsIGludCBiZSkgeworCXB1YmxpYyBFZGl0KGludCBhcywgaW50IGFlLCBpbnQgYnMsIGludCBiZSkgewogCQliZWdpbkEgPSBhczsKIAkJZW5kQSA9IGFlOwogCkBAIC0yNzksNyArMjc5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgRWRpdCkgewogCQkJZmluYWwgRWRpdCBlID0gKEVkaXQpIG87CiAJCQlyZXR1cm4gdGhpcy5iZWdpbkEgPT0gZS5iZWdpbkEgJiYgdGhpcy5lbmRBID09IGUuZW5kQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhCmluZGV4IDA0Yzc5ZmMuLjNmODEzZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9IaXN0b2dyYW1EaWZmSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvSGlzdG9ncmFtRGlmZkluZGV4LmphdmEKQEAgLTIzMCw3ICsyMzAsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIGludCB0cnlMb25nZXN0Q29tbW9uU2VxdWVuY2UoZmluYWwgaW50IGJQdHIpIHsKKwlwcml2YXRlIGludCB0cnlMb25nZXN0Q29tbW9uU2VxdWVuY2UoaW50IGJQdHIpIHsKIAkJaW50IGJOZXh0ID0gYlB0ciArIDE7CiAJCWludCBySWR4ID0gdGFibGVbaGFzaChiLCBiUHRyKV07CiAJCWZvciAobG9uZyByZWM7IHJJZHggIT0gMDsgcklkeCA9IHJlY05leHQocmVjKSkgewpAQCAtMzI4LDcgKzMyOCw3IEBACiAJCXJldHVybiAoKGludCkgcmVjKSAmIFJFQ19DTlRfTUFTSzsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVCaXRzKGZpbmFsIGludCBzeikgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZUJpdHMoaW50IHN6KSB7CiAJCWludCBiaXRzID0gMzEgLSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKHN6KTsKIAkJaWYgKGJpdHMgPT0gMCkKIAkJCWJpdHMgPSAxOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL015ZXJzRGlmZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL015ZXJzRGlmZi5qYXZhCmluZGV4IDY0NmYyNjQuLmNhYWZmZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvTXllcnNEaWZmLmphdmEKQEAgLTM1OSw3ICszNTksNyBAQAogCQkJYWJzdHJhY3QgaW50IGdldExlZnQoaW50IHgpOwogCQkJYWJzdHJhY3QgaW50IGdldFJpZ2h0KGludCB4KTsKIAkJCWFic3RyYWN0IGJvb2xlYW4gaXNCZXR0ZXIoaW50IGxlZnQsIGludCByaWdodCk7Ci0JCQlhYnN0cmFjdCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KTsKKwkJCWFic3RyYWN0IHZvaWQgYWRqdXN0TWluTWF4SyhpbnQgaywgaW50IHgpOwogCQkJYWJzdHJhY3QgYm9vbGVhbiBtZWV0cyhpbnQgZCwgaW50IGssIGludCB4LCBsb25nIHNuYWtlKTsKIAogCQkJZmluYWwgbG9uZyBuZXdTbmFrZShpbnQgaywgaW50IHgpIHsKQEAgLTQ2OSwyMiArNDY5LDIyIEBACiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgaW50IGdldExlZnQoZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIGludCBnZXRMZWZ0KGludCB4KSB7CiAJCQkJcmV0dXJuIHg7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgaW50IGdldFJpZ2h0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0UmlnaHQoaW50IHgpIHsKIAkJCQlyZXR1cm4geCArIDE7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihmaW5hbCBpbnQgbGVmdCwgZmluYWwgaW50IHJpZ2h0KSB7CisJCQlmaW5hbCBib29sZWFuIGlzQmV0dGVyKGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKIAkJCQlyZXR1cm4gbGVmdCA+IHJpZ2h0OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIHZvaWQgYWRqdXN0TWluTWF4SyhmaW5hbCBpbnQgaywgZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIHZvaWQgYWRqdXN0TWluTWF4SyhpbnQgaywgaW50IHgpIHsKIAkJCQlpZiAoeCA+PSBlbmRBIHx8IGsgKyB4ID49IGVuZEIpIHsKIAkJCQkJaWYgKGsgPiBiYWNrd2FyZC5taWRkbGVLKQogCQkJCQkJbWF4SyA9IGs7CkBAIC01MTcsMjIgKzUxNywyMiBAQAogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRMZWZ0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0TGVmdChpbnQgeCkgewogCQkJCXJldHVybiB4IC0gMTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBpbnQgZ2V0UmlnaHQoZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIGludCBnZXRSaWdodChpbnQgeCkgewogCQkJCXJldHVybiB4OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAJCQkJcmV0dXJuIGxlZnQgPCByaWdodDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KSB7CiAJCQkJaWYgKHggPD0gYmVnaW5BIHx8IGsgKyB4IDw9IGJlZ2luQikgewogCQkJCQlpZiAoayA+IGZvcndhcmQubWlkZGxlSykKIAkJCQkJCW1heEsgPSBrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKaW5kZXggZWM4OGNlNC4uYmQ0MWQ5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCkBAIC04OCwxMiArODgsMjkgQEAKIAkgKiBUaGUgZW50aXJlIGFycmF5IChpbmRleGVzIDAgdGhyb3VnaCBsZW5ndGgtMSkgaXMgdXNlZCBhcyB0aGUgY29udGVudC4KIAkgKgogCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBhcnJheSBpcyBuZXZlciBtb2RpZmllZCwgc28gcGFzc2luZwotCSAqICAgICAgICAgICAgdGhyb3VnaCBjYWNoZWQgYXJyYXlzIGlzIHNhZmUuCisJICogICAgICAgICAgICB0aGUgY29udGVudCBhcnJheS4gVGhlIG9iamVjdCByZXRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoaXMKKwkgKiAgICAgICAgICAgIGFycmF5LCBzbyBpdCBzaG91bGQgYmUgaW1tdXRhYmxlLgogCSAqLwotCXB1YmxpYyBSYXdUZXh0KGZpbmFsIGJ5dGVbXSBpbnB1dCkgeworCXB1YmxpYyBSYXdUZXh0KGJ5dGVbXSBpbnB1dCkgeworCQl0aGlzKGlucHV0LCBSYXdQYXJzZVV0aWxzLmxpbmVNYXAoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBzZXF1ZW5jZSBmcm9tIHRoZSBleGlzdGluZyBjb250ZW50IGJ5dGUgYXJyYXkgYW5kIHRoZSBsaW5lCisJICogbWFwIGluZGljYXRpbmcgbGluZSBib3VuZGFyaWVzLgorCSAqCisJICogQHBhcmFtIGlucHV0CisJICogICAgICAgICAgICB0aGUgY29udGVudCBhcnJheS4gVGhlIG9iamVjdCByZXRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoaXMKKwkgKiAgICAgICAgICAgIGFycmF5LCBzbyBpdCBzaG91bGQgYmUgaW1tdXRhYmxlLgorCSAqIEBwYXJhbSBsaW5lTWFwCisJICogICAgICAgICAgICBhbiBhcnJheSB3aXRoIDEtYmFzZWQgb2Zmc2V0cyBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZS4KKwkgKiAgICAgICAgICAgIFRoZSBmaXJzdCBhbmQgbGFzdCBlbnRyaWVzIHNob3VsZCBiZSB7QGxpbmsgSW50ZWdlciNNSU5fVkFMVUV9CisJICogICAgICAgICAgICBhbmQgYW4gb2Zmc2V0IG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIGxhc3QgbGluZSwgcmVzcGVjdGl2ZWx5LgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgUmF3VGV4dChieXRlW10gaW5wdXQsIEludExpc3QgbGluZU1hcCkgewogCQljb250ZW50ID0gaW5wdXQ7Ci0JCWxpbmVzID0gUmF3UGFyc2VVdGlscy5saW5lTWFwKGNvbnRlbnQsIDAsIGNvbnRlbnQubGVuZ3RoKTsKKwkJbGluZXMgPSBsaW5lTWFwOwogCX0KIAogCS8qKgpAQCAtMTQ3LDcgKzE2NCw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0ZSBvcGVyYXRpb24gZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlTGluZShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBpbnQgaSkKKwlwdWJsaWMgdm9pZCB3cml0ZUxpbmUoT3V0cHV0U3RyZWFtIG91dCwgaW50IGkpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgc3RhcnQgPSBnZXRTdGFydChpKTsKIAkJaW50IGVuZCA9IGdldEVuZChpKTsKQEAgLTIyMSwxMSArMjM4LDExIEBACiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShjb250ZW50LCBzdGFydCwgZW5kKTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRTdGFydChmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgaW50IGdldFN0YXJ0KGludCBpKSB7CiAJCXJldHVybiBsaW5lcy5nZXQoaSArIDEpOwogCX0KIAotCXByaXZhdGUgaW50IGdldEVuZChmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgaW50IGdldEVuZChpbnQgaSkgewogCQlyZXR1cm4gbGluZXMuZ2V0KGkgKyAyKTsKIAl9CiAKQEAgLTMyNSw3ICszNDIsOCBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJhd1RleHQgbG9hZChPYmplY3RMb2FkZXIgbGRyLCBpbnQgdGhyZXNob2xkKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJpbmFyeUJsb2JFeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgUmF3VGV4dCBsb2FkKE9iamVjdExvYWRlciBsZHIsIGludCB0aHJlc2hvbGQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEJpbmFyeUJsb2JFeGNlcHRpb24gewogCQlsb25nIHN6ID0gbGRyLmdldFNpemUoKTsKIAogCQlpZiAoc3ogPiB0aHJlc2hvbGQpIHsKQEAgLTM2OSw3ICszODcsNyBAQAogCiAJCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWQsIDAsIGRhdGEsIDAsIGhlYWQubGVuZ3RoKTsKIAkJCUlPLnJlYWRGdWxseShzdHJlYW0sIGRhdGEsIG9mZiwgKGludCkgKHN6LW9mZikpOwotCQkJcmV0dXJuIG5ldyBSYXdUZXh0KGRhdGEpOworCQkJcmV0dXJuIG5ldyBSYXdUZXh0KGRhdGEsIFJhd1BhcnNlVXRpbHMubGluZU1hcE9yQmluYXJ5KGRhdGEsIDAsIChpbnQpIHN6KSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dENvbXBhcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0Q29tcGFyYXRvci5qYXZhCmluZGV4IGVkMmVlYmIuLjFlNjhjMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0Q29tcGFyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0Q29tcGFyYXRvci5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKIAkJCWludCBoYXNoID0gNTM4MTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQogCQkJCWhhc2ggPSAoKGhhc2ggPDwgNSkgKyBoYXNoKSArIChyYXdbcHRyXSAmIDB4ZmYpOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKKwkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKIAkJCWludCBoYXNoID0gNTM4MTsKIAkJCXB0ciA9IHRyaW1MZWFkaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQpAQCAtMTk5LDcgKzE5OSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKKwkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKIAkJCWludCBoYXNoID0gNTM4MTsKIAkJCWVuZCA9IHRyaW1UcmFpbGluZ1doaXRlc3BhY2UocmF3LCBwdHIsIGVuZCk7CiAJCQlmb3IgKDsgcHRyIDwgZW5kOyBwdHIrKykKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CisJCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQlpbnQgaGFzaCA9IDUzODE7CiAJCQllbmQgPSB0cmltVHJhaWxpbmdXaGl0ZXNwYWNlKHJhdywgcHRyLCBlbmQpOwogCQkJd2hpbGUgKHB0ciA8IGVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleC5qYXZhCmluZGV4IDhiNGQyZWMuLjU4OTdmZmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4LmphdmEKQEAgLTE0NywyMyArMTQ3LDE3IEBACiAKIAlwcml2YXRlIHZvaWQgaGFzaExhcmdlT2JqZWN0KE9iamVjdExvYWRlciBvYmopIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVRhYmxlRnVsbEV4Y2VwdGlvbiB7Ci0JCU9iamVjdFN0cmVhbSBpbjEgPSBvYmoub3BlblN0cmVhbSgpOwogCQlib29sZWFuIHRleHQ7Ci0JCXRyeSB7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluMSA9IG9iai5vcGVuU3RyZWFtKCkpIHsKIAkJCXRleHQgPSAhUmF3VGV4dC5pc0JpbmFyeShpbjEpOwotCQl9IGZpbmFsbHkgewotCQkJaW4xLmNsb3NlKCk7CiAJCX0KIAotCQlPYmplY3RTdHJlYW0gaW4yID0gb2JqLm9wZW5TdHJlYW0oKTsKLQkJdHJ5IHsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4yID0gb2JqLm9wZW5TdHJlYW0oKSkgewogCQkJaGFzaChpbjIsIGluMi5nZXRTaXplKCksIHRleHQpOwotCQl9IGZpbmFsbHkgewotCQkJaW4yLmNsb3NlKCk7CiAJCX0KIAl9CiAKLQl2b2lkIGhhc2goYnl0ZVtdIHJhdywgaW50IHB0ciwgZmluYWwgaW50IGVuZCkgdGhyb3dzIFRhYmxlRnVsbEV4Y2VwdGlvbiB7CisJdm9pZCBoYXNoKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHRocm93cyBUYWJsZUZ1bGxFeGNlcHRpb24gewogCQlmaW5hbCBib29sZWFuIHRleHQgPSAhUmF3VGV4dC5pc0JpbmFyeShyYXcpOwogCQloYXNoZWRDbnQgPSAwOwogCQl3aGlsZSAocHRyIDwgZW5kKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0Jhc2VEaXJDYWNoZUVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YQppbmRleCAwMjI4ZjRkLi5hYTIyOWY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0Jhc2VEaXJDYWNoZUVkaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvQmFzZURpckNhY2hlRWRpdG9yLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAKIAkgKiAgICAgICAgICAgIGVzdGltYXRlZCBudW1iZXIgb2YgZW50cmllcyB0aGUgZWRpdG9yIHdpbGwgaGF2ZSB1cG9uCiAJICogICAgICAgICAgICBjb21wbGV0aW9uLiBUaGlzIHNpemVzIHRoZSBpbml0aWFsIGVudHJ5IHRhYmxlLgogCSAqLwotCXByb3RlY3RlZCBCYXNlRGlyQ2FjaGVFZGl0b3IoZmluYWwgRGlyQ2FjaGUgZGMsIGZpbmFsIGludCBlY250KSB7CisJcHJvdGVjdGVkIEJhc2VEaXJDYWNoZUVkaXRvcihEaXJDYWNoZSBkYywgaW50IGVjbnQpIHsKIAkJY2FjaGUgPSBkYzsKIAkJZW50cmllcyA9IG5ldyBEaXJDYWNoZUVudHJ5W2VjbnRdOwogCX0KQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqIEBwYXJhbSBuZXdFbnRyeQogCSAqICAgICAgICAgICAgdGhlIG5ldyBlbnRyeSB0byBhZGQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZmFzdEFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHJvdGVjdGVkIHZvaWQgZmFzdEFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChlbnRyaWVzLmxlbmd0aCA9PSBlbnRyeUNudCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeVtdIG4gPSBuZXcgRGlyQ2FjaGVFbnRyeVsoZW50cnlDbnQgKyAxNikgKiAzIC8gMl07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG4sIDAsIGVudHJ5Q250KTsKQEAgLTE0MCw3ICsxNDAsNyBAQAogCSAqIEBwYXJhbSBjbnQKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIHRvIGNvcHkuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZmFzdEtlZXAoZmluYWwgaW50IHBvcywgaW50IGNudCkgeworCXByb3RlY3RlZCB2b2lkIGZhc3RLZWVwKGludCBwb3MsIGludCBjbnQpIHsKIAkJaWYgKGVudHJ5Q250ICsgY250ID4gZW50cmllcy5sZW5ndGgpIHsKIAkJCWZpbmFsIGludCBtMSA9IChlbnRyeUNudCArIDE2KSAqIDMgLyAyOwogCQkJZmluYWwgaW50IG0yID0gZW50cnlDbnQgKyBjbnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlLmphdmEKaW5kZXggY2M0MzFkYi4uMTQ2NTNmZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGUuamF2YQpAQCAtNDUsMTYgKzQ1LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKKwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTg3LDYgKzg3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuTXV0YWJsZUludGVnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk5COwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5UZW1wb3JhcnlCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlNpbGVudEZpbGVJbnB1dFN0cmVhbTsKIAogLyoqCiAgKiBTdXBwb3J0IGZvciB0aGUgR2l0IGRpcmNhY2hlIChha2EgaW5kZXggZmlsZSkuCkBAIC0xMTIsNyArMTEzLDcgQEAKIAogCXN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERpckNhY2hlRW50cnk+IEVOVF9DTVAgPSBuZXcgQ29tcGFyYXRvcjxEaXJDYWNoZUVudHJ5PigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBEaXJDYWNoZUVudHJ5IG8xLCBmaW5hbCBEaXJDYWNoZUVudHJ5IG8yKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShEaXJDYWNoZUVudHJ5IG8xLCBEaXJDYWNoZUVudHJ5IG8yKSB7CiAJCQlmaW5hbCBpbnQgY3IgPSBjbXAobzEsIG8yKTsKIAkJCWlmIChjciAhPSAwKQogCQkJCXJldHVybiBjcjsKQEAgLTEyMCwxMSArMTIxLDExIEBACiAJCX0KIAl9OwogCi0Jc3RhdGljIGludCBjbXAoZmluYWwgRGlyQ2FjaGVFbnRyeSBhLCBmaW5hbCBEaXJDYWNoZUVudHJ5IGIpIHsKKwlzdGF0aWMgaW50IGNtcChEaXJDYWNoZUVudHJ5IGEsIERpckNhY2hlRW50cnkgYikgewogCQlyZXR1cm4gY21wKGEucGF0aCwgYS5wYXRoLmxlbmd0aCwgYik7CiAJfQogCi0Jc3RhdGljIGludCBjbXAoZmluYWwgYnl0ZVtdIGFQYXRoLCBmaW5hbCBpbnQgYUxlbiwgZmluYWwgRGlyQ2FjaGVFbnRyeSBiKSB7CisJc3RhdGljIGludCBjbXAoYnl0ZVtdIGFQYXRoLCBpbnQgYUxlbiwgRGlyQ2FjaGVFbnRyeSBiKSB7CiAJCXJldHVybiBjbXAoYVBhdGgsIGFMZW4sIGIucGF0aCwgYi5wYXRoLmxlbmd0aCk7CiAJfQogCkBAIC0xODgsNyArMTg5LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBpcyB1c2luZyBhIGZvcm1hdCBvciBleHRlbnNpb24gdGhhdCB0aGlzCiAJICogICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCisJcHVibGljIHN0YXRpYyBEaXJDYWNoZSByZWFkKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGMgPSByZWFkKHJlcG9zaXRvcnkuZ2V0SW5kZXhGaWxlKCksIHJlcG9zaXRvcnkuZ2V0RlMoKSk7CiAJCWMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7CkBAIC0yMTUsNyArMjE2LDcgQEAKIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBpcyB1c2luZyBhIGZvcm1hdCBvciBleHRlbnNpb24gdGhhdCB0aGlzCiAJICogICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChGaWxlIGluZGV4TG9jYXRpb24sIEZTIGZzKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgYyA9IG5ldyBEaXJDYWNoZShpbmRleExvY2F0aW9uLCBmcyk7CiAJCWMucmVhZCgpOwpAQCAtMjQ0LDcgKzI0NSw3IEBACiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIGxvY2soZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykKKwlwdWJsaWMgc3RhdGljIERpckNhY2hlIGxvY2soRmlsZSBpbmRleExvY2F0aW9uLCBGUyBmcykKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGMgPSBuZXcgRGlyQ2FjaGUoaW5kZXhMb2NhdGlvbiwgZnMpOwogCQlpZiAoIWMubG9jaygpKQpAQCAtMzcyLDcgKzM3Myw3IEBACiAJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQogCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZShmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKSB7CisJcHVibGljIERpckNhY2hlKEZpbGUgaW5kZXhMb2NhdGlvbiwgRlMgZnMpIHsKIAkJbGl2ZUZpbGUgPSBpbmRleExvY2F0aW9uOwogCQljbGVhcigpOwogCX0KQEAgLTQwMyw3ICs0MDQsNyBAQAogCQlyZXR1cm4gbmV3IERpckNhY2hlRWRpdG9yKHRoaXMsIGVudHJ5Q250ICsgMTYpOwogCX0KIAotCXZvaWQgcmVwbGFjZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gZSwgZmluYWwgaW50IGNudCkgeworCXZvaWQgcmVwbGFjZShEaXJDYWNoZUVudHJ5W10gZSwgaW50IGNudCkgewogCQlzb3J0ZWRFbnRyaWVzID0gZTsKIAkJZW50cnlDbnQgPSBjbnQ7CiAJCXRyZWUgPSBudWxsOwpAQCAtNDI5LDE4ICs0MzAsMTAgQEAKIAkJaWYgKCFsaXZlRmlsZS5leGlzdHMoKSkKIAkJCWNsZWFyKCk7CiAJCWVsc2UgaWYgKHNuYXBzaG90ID09IG51bGwgfHwgc25hcHNob3QuaXNNb2RpZmllZChsaXZlRmlsZSkpIHsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsaXZlRmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJY2xlYXIoKTsKLQkJCQkJcmVhZEZyb20oaW5TdHJlYW0pOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIyKSB7Ci0JCQkJCQkvLyBJZ25vcmUgYW55IGNsb3NlIGZhaWx1cmVzLgotCQkJCQl9Ci0JCQkJfQorCQkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKAorCQkJCQlsaXZlRmlsZSkpIHsKKwkJCQljbGVhcigpOworCQkJCXJlYWRGcm9tKGluU3RyZWFtKTsKIAkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CiAJCQkJaWYgKGxpdmVGaWxlLmV4aXN0cygpKSB7CiAJCQkJCS8vIFBhbmljOiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYnV0IHdlIGNhbid0IHJlYWQgaXQKQEAgLTQ4MCw3ICs0NzMsNyBAQAogCQlyZWFkSW5kZXhDaGVja3N1bSA9IE5PX0NIRUNLU1VNOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCByZWFkRnJvbShJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpblN0cmVhbSk7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwpAQCAtNTg4LDEyICs1ODEsMTEgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRFeHRlbnNpb25OYW1lKGZpbmFsIGJ5dGVbXSBoZHIpCi0JCQl0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAiJyIgKyBuZXcgU3RyaW5nKGhkciwgMCwgNCwgIklTTy04ODU5LTEiKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0RXh0ZW5zaW9uTmFtZShieXRlW10gaGRyKSB7CisJCXJldHVybiAiJyIgKyBuZXcgU3RyaW5nKGhkciwgMCwgNCwgSVNPXzg4NTlfMSkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNfRElSQyhmaW5hbCBieXRlW10gaGRyKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc19ESVJDKGJ5dGVbXSBoZHIpIHsKIAkJaWYgKGhkci5sZW5ndGggPCBTSUdfRElSQy5sZW5ndGgpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgU0lHX0RJUkMubGVuZ3RoOyBpKyspCkBAIC02NTYsNyArNjQ4LDcgQEAKIAkJfQogCX0KIAotCXZvaWQgd3JpdGVUbyhGaWxlIGRpciwgZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGVUbyhGaWxlIGRpciwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBNZXNzYWdlRGlnZXN0IGZvb3QgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwogCQlmaW5hbCBEaWdlc3RPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERpZ2VzdE91dHB1dFN0cmVhbShvcywgZm9vdCk7CiAKQEAgLTcxMCw2ICs3MDIsOCBAQAogCQl9CiAKIAkJaWYgKHdyaXRlVHJlZSkgeworCQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gRXhwbGljaXRseSBjbG9zZWQgaW4gdHJ5IGJsb2NrLCBhbmQKKwkJCQkJCQkJCQkJLy8gZGVzdHJveWVkIGluIGZpbmFsbHkKIAkJCVRlbXBvcmFyeUJ1ZmZlciBiYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKGRpciwgNSA8PCAyMCk7CiAJCQl0cnkgewogCQkJCXRyZWUud3JpdGUodG1wLCBiYik7CkBAIC03NDMsMTYgKzczNywxOCBAQAogCQlmaW5hbCBMb2NrRmlsZSB0bXAgPSBteUxvY2s7CiAJCXJlcXVpcmVMb2NrZWQodG1wKTsKIAkJbXlMb2NrID0gbnVsbDsKLQkJaWYgKCF0bXAuY29tbWl0KCkpCisJCWlmICghdG1wLmNvbW1pdCgpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CisJCX0KIAkJc25hcHNob3QgPSB0bXAuZ2V0Q29tbWl0U25hcHNob3QoKTsKIAkJaWYgKGluZGV4Q2hhbmdlZExpc3RlbmVyICE9IG51bGwKLQkJCQkmJiAhQXJyYXlzLmVxdWFscyhyZWFkSW5kZXhDaGVja3N1bSwgd3JpdGVJbmRleENoZWNrc3VtKSkKLQkJCWluZGV4Q2hhbmdlZExpc3RlbmVyLm9uSW5kZXhDaGFuZ2VkKG5ldyBJbmRleENoYW5nZWRFdmVudCgpKTsKKwkJCQkmJiAhQXJyYXlzLmVxdWFscyhyZWFkSW5kZXhDaGVja3N1bSwgd3JpdGVJbmRleENoZWNrc3VtKSkgeworCQkJaW5kZXhDaGFuZ2VkTGlzdGVuZXIub25JbmRleENoYW5nZWQobmV3IEluZGV4Q2hhbmdlZEV2ZW50KHRydWUpKTsKKwkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVxdWlyZUxvY2tlZChmaW5hbCBMb2NrRmlsZSB0bXApIHsKKwlwcml2YXRlIHZvaWQgcmVxdWlyZUxvY2tlZChMb2NrRmlsZSB0bXApIHsKIAkJaWYgKGxpdmVGaWxlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmRpckNhY2hlSXNOb3RMb2NrZWQpOwogCQlpZiAodG1wID09IG51bGwpCkBAIC03ODMsNyArNzc5LDcgQEAKIAkgKiAgICAgICAgIHRoZSBpbmRleDsgcGFzcyB0byB7QGxpbmsgI2dldEVudHJ5KGludCl9IHRvIG9idGFpbiB0aGUgZW50cnkKIAkgKiAgICAgICAgIGluZm9ybWF0aW9uLiBJZiAmbHQ7IDAgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgaW50IGZpbmRFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBpbnQgZmluZEVudHJ5KFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIGJ5dGVbXSBwID0gQ29uc3RhbnRzLmVuY29kZShwYXRoKTsKIAkJcmV0dXJuIGZpbmRFbnRyeShwLCBwLmxlbmd0aCk7CiAJfQpAQCAtODM5LDcgKzgzNSw3IEBACiAJICogICAgICAgICAgICBlbnRyeSBwb3NpdGlvbiBvZiB0aGUgcGF0aCB0aGF0IHNob3VsZCBiZSBza2lwcGVkLgogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIG5leHQgZW50cnkgd2hvc2UgcGF0aCBpcyBhZnRlciB0aGUgaW5wdXQuCiAJICovCi0JcHVibGljIGludCBuZXh0RW50cnkoZmluYWwgaW50IHBvc2l0aW9uKSB7CisJcHVibGljIGludCBuZXh0RW50cnkoaW50IHBvc2l0aW9uKSB7CiAJCURpckNhY2hlRW50cnkgbGFzdCA9IHNvcnRlZEVudHJpZXNbcG9zaXRpb25dOwogCQlpbnQgbmV4dElkeCA9IHBvc2l0aW9uICsgMTsKIAkJd2hpbGUgKG5leHRJZHggPCBlbnRyeUNudCkgewpAQCAtODUyLDcgKzg0OCw3IEBACiAJCXJldHVybiBuZXh0SWR4OwogCX0KIAotCWludCBuZXh0RW50cnkoZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuLCBpbnQgbmV4dElkeCkgeworCWludCBuZXh0RW50cnkoYnl0ZVtdIHAsIGludCBwTGVuLCBpbnQgbmV4dElkeCkgewogCQl3aGlsZSAobmV4dElkeCA8IGVudHJ5Q250KSB7CiAJCQlmaW5hbCBEaXJDYWNoZUVudHJ5IG5leHQgPSBzb3J0ZWRFbnRyaWVzW25leHRJZHhdOwogCQkJaWYgKCFEaXJDYWNoZVRyZWUucGVxKHAsIG5leHQucGF0aCwgcExlbikpCkBAIC04ODYsNyArODgyLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIG9mIHRoZSBlbnRyeSB0byBnZXQuCiAJICogQHJldHVybiB0aGUgZW50cnkgYXQgcG9zaXRpb24gPGNvZGU+aTwvY29kZT4uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShpbnQgaSkgewogCQlyZXR1cm4gc29ydGVkRW50cmllc1tpXTsKIAl9CiAKQEAgLTg5Nyw3ICs4OTMsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gc2VhcmNoIGZvci4KIAkgKiBAcmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIDxjb2RlPnBhdGg8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGdldEVudHJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHBhdGgpIHsKIAkJZmluYWwgaW50IGkgPSBmaW5kRW50cnkocGF0aCk7CiAJCXJldHVybiBpIDwgMCA/IG51bGwgOiBzb3J0ZWRFbnRyaWVzW2ldOwogCX0KQEAgLTk0Niw3ICs5NDIsNyBAQAogCSAqIEByZXR1cm4gdGhlIGNhY2hlIHRyZWU7IG51bGwgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBjYWNoZSB0cmVlIGF2YWlsYWJsZQogCSAqICAgICAgICAgYW5kIDxjb2RlPmJ1aWxkPC9jb2RlPiB3YXMgZmFsc2UuCiAJICovCi0JcHVibGljIERpckNhY2hlVHJlZSBnZXRDYWNoZVRyZWUoZmluYWwgYm9vbGVhbiBidWlsZCkgeworCXB1YmxpYyBEaXJDYWNoZVRyZWUgZ2V0Q2FjaGVUcmVlKGJvb2xlYW4gYnVpbGQpIHsKIAkJaWYgKGJ1aWxkKSB7CiAJCQlpZiAodHJlZSA9PSBudWxsKQogCQkJCXRyZWUgPSBuZXcgRGlyQ2FjaGVUcmVlKCk7CkBAIC05NzIsNyArOTY4LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdyaXRpbmcgdG8gdGhlIG9iamVjdCBzdG9yZS4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0SWQgd3JpdGVUcmVlKGZpbmFsIE9iamVjdEluc2VydGVyIG93KQorCXB1YmxpYyBPYmplY3RJZCB3cml0ZVRyZWUoT2JqZWN0SW5zZXJ0ZXIgb3cpCiAJCQl0aHJvd3MgVW5tZXJnZWRQYXRoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRDYWNoZVRyZWUodHJ1ZSkud3JpdGVUcmVlKHNvcnRlZEVudHJpZXMsIDAsIDAsIG93KTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YQppbmRleCA2ZTM2ODJhLi5lODA1NDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmphdmEKQEAgLTk2LDcgKzk2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBjYWNoZSBidWlsZGVyIGZvciB0aGUgY2FjaGUgdG8gd2Fsay4gVGhlIGNhY2hlIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGFscmVhZHkgbG9hZGVkIGludG8gbWVtb3J5LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGRjYikgeworCXB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoRGlyQ2FjaGVCdWlsZGVyIGRjYikgewogCQlzdXBlcihkY2IuZ2V0RGlyQ2FjaGUoKSk7CiAJCWJ1aWxkZXIgPSBkY2I7CiAJfQpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoY3VycmVudFN1YnRyZWUgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKGdldEVudHJ5T2JqZWN0SWQoKSwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhCmluZGV4IDJmZjdiYjkuLmM1ZmY5YWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXIuamF2YQpAQCAtODMsNyArODMsNyBAQAogCSAqICAgICAgICAgICAgZXN0aW1hdGVkIG51bWJlciBvZiBlbnRyaWVzIHRoZSBidWlsZGVyIHdpbGwgaGF2ZSB1cG9uCiAJICogICAgICAgICAgICBjb21wbGV0aW9uLiBUaGlzIHNpemVzIHRoZSBpbml0aWFsIGVudHJ5IHRhYmxlLgogCSAqLwotCXByb3RlY3RlZCBEaXJDYWNoZUJ1aWxkZXIoZmluYWwgRGlyQ2FjaGUgZGMsIGZpbmFsIGludCBlY250KSB7CisJcHJvdGVjdGVkIERpckNhY2hlQnVpbGRlcihEaXJDYWNoZSBkYywgaW50IGVjbnQpIHsKIAkJc3VwZXIoZGMsIGVjbnQpOwogCX0KIApAQCAtMTAyLDcgKzEwMiw3IEBACiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgSWYgdGhlIEZpbGVNb2RlIG9mIHRoZSBlbnRyeSB3YXMgbm90IHNldCBieSB0aGUgY2FsbGVyLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHVibGljIHZvaWQgYWRkKERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkJaWYgKG5ld0VudHJ5LmdldFJhd01vZGUoKSA9PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuZmlsZU1vZGVOb3RTZXRGb3JQYXRoLApAQCAtMTMxLDcgKzEzMSw3IEBACiAJICogQHBhcmFtIGNudAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgdG8gY29weS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBrZWVwKGZpbmFsIGludCBwb3MsIGludCBjbnQpIHsKKwlwdWJsaWMgdm9pZCBrZWVwKGludCBwb3MsIGludCBjbnQpIHsKIAkJYmVmb3JlQWRkKGNhY2hlLmdldEVudHJ5KHBvcykpOwogCQlmYXN0S2VlcChwb3MsIGNudCk7CiAJfQpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCXJlcGxhY2UoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYmVmb3JlQWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKKwlwcml2YXRlIHZvaWQgYmVmb3JlQWRkKERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkJaWYgKHNvcnRlZCAmJiBlbnRyeUNudCA+IDApIHsKIAkJCWZpbmFsIERpckNhY2hlRW50cnkgbGFzdEVudHJ5ID0gZW50cmllc1tlbnRyeUNudCAtIDFdOwogCQkJZmluYWwgaW50IGNyID0gRGlyQ2FjaGUuY21wKGxhc3RFbnRyeSwgbmV3RW50cnkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVkaXRvci5qYXZhCmluZGV4IDMwZTNhM2MuLjc0YmE5N2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRWRpdG9yLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAKIHB1YmxpYyBjbGFzcyBEaXJDYWNoZUVkaXRvciBleHRlbmRzIEJhc2VEaXJDYWNoZUVkaXRvciB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQYXRoRWRpdD4gRURJVF9DTVAgPSBuZXcgQ29tcGFyYXRvcjxQYXRoRWRpdD4oKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgUGF0aEVkaXQgbzEsIGZpbmFsIFBhdGhFZGl0IG8yKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShQYXRoRWRpdCBvMSwgUGF0aEVkaXQgbzIpIHsKIAkJCWZpbmFsIGJ5dGVbXSBhID0gbzEucGF0aDsKIAkJCWZpbmFsIGJ5dGVbXSBiID0gbzIucGF0aDsKIAkJCXJldHVybiBjbXAoYSwgYS5sZW5ndGgsIGIsIGIubGVuZ3RoKTsKQEAgLTk2LDcgKzk2LDcgQEAKIAkgKiAgICAgICAgICAgIGVzdGltYXRlZCBudW1iZXIgb2YgZW50cmllcyB0aGUgZWRpdG9yIHdpbGwgaGF2ZSB1cG9uCiAJICogICAgICAgICAgICBjb21wbGV0aW9uLiBUaGlzIHNpemVzIHRoZSBpbml0aWFsIGVudHJ5IHRhYmxlLgogCSAqLwotCXByb3RlY3RlZCBEaXJDYWNoZUVkaXRvcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVFZGl0b3IoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCXN1cGVyKGRjLCBlY250KTsKIAkJZWRpdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAKIAkgKiBAcGFyYW0gZWRpdAogCSAqICAgICAgICAgICAgYW5vdGhlciBlZGl0IGNvbW1hbmQuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIFBhdGhFZGl0IGVkaXQpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUGF0aEVkaXQgZWRpdCkgewogCQllZGl0cy5hZGQoZWRpdCk7CiAJfQogCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJICogQHBhcmFtIGVudHJ5UGF0aAogCQkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGZpbGUgd2l0aGluIHRoZSByZXBvc2l0b3J5LgogCQkgKi8KLQkJcHVibGljIFBhdGhFZGl0KGZpbmFsIFN0cmluZyBlbnRyeVBhdGgpIHsKKwkJcHVibGljIFBhdGhFZGl0KFN0cmluZyBlbnRyeVBhdGgpIHsKIAkJCXBhdGggPSBDb25zdGFudHMuZW5jb2RlKGVudHJ5UGF0aCk7CiAJCX0KIApAQCAtMzE5LDcgKzMxOSw3IEBACiAJCSAqICAgICAgICAgICAgZW50cnkgaW5zdGFuY2UgdG8gbWF0Y2ggcGF0aCBvZi4gT25seSB0aGUgcGF0aCBvZiB0aGlzCiAJCSAqICAgICAgICAgICAgZW50cnkgaXMgYWN0dWFsbHkgY29uc2lkZXJlZCBkdXJpbmcgY29tbWFuZCBldmFsdWF0aW9uLgogCQkgKi8KLQkJcHVibGljIFBhdGhFZGl0KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyBQYXRoRWRpdChEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJcGF0aCA9IGVudC5wYXRoOwogCQl9CiAKQEAgLTM3NCw3ICszNzQsNyBAQAogCQkgKiBAcGFyYW0gZW50cnlQYXRoCiAJCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgZmlsZSB3aXRoaW4gdGhlIHJlcG9zaXRvcnkuCiAJCSAqLwotCQlwdWJsaWMgRGVsZXRlUGF0aChmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CisJCXB1YmxpYyBEZWxldGVQYXRoKFN0cmluZyBlbnRyeVBhdGgpIHsKIAkJCXN1cGVyKGVudHJ5UGF0aCk7CiAJCX0KIApAQCAtMzg1LDEyICszODUsMTIgQEAKIAkJICogICAgICAgICAgICBlbnRyeSBpbnN0YW5jZSB0byByZW1vdmUuIE9ubHkgdGhlIHBhdGggb2YgdGhpcyBlbnRyeSBpcwogCQkgKiAgICAgICAgICAgIGFjdHVhbGx5IGNvbnNpZGVyZWQgZHVyaW5nIGNvbW1hbmQgZXZhbHVhdGlvbi4KIAkJICovCi0JCXB1YmxpYyBEZWxldGVQYXRoKGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyBEZWxldGVQYXRoKERpckNhY2hlRW50cnkgZW50KSB7CiAJCQlzdXBlcihlbnQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkubm9BcHBseUluRGVsZXRlKTsKIAkJfQogCX0KQEAgLTQ0MCw3ICs0NDAsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkubm9BcHBseUluRGVsZXRlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKaW5kZXggN2MwM2M2NC4uZmVlOWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKQEAgLTIyNyw3ICsyMjcsNyBAQAogCSAqICAgICAgICAgICAgICJcMCIuIFRoZXNlIHNlcXVlbmNlcyBhcmUgbm90IHBlcm1pdHRlZCBpbiBhIGdpdCB0cmVlIG9iamVjdAogCSAqICAgICAgICAgICAgIG9yIERpckNhY2hlIGZpbGUuCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgU3RyaW5nIG5ld1BhdGgpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeShTdHJpbmcgbmV3UGF0aCkgewogCQl0aGlzKENvbnN0YW50cy5lbmNvZGUobmV3UGF0aCksIFNUQUdFXzApOwogCX0KIApAQCAtMjQ0LDcgKzI0NCw3IEBACiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4gIE9yIGlmIHtAY29kZSBzdGFnZX0gaXMgb3V0c2lkZSBvZiB0aGUKIAkgKiAgICAgICAgICAgICByYW5nZSAwLi4zLCBpbmNsdXNpdmUuCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgU3RyaW5nIG5ld1BhdGgsIGZpbmFsIGludCBzdGFnZSkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KFN0cmluZyBuZXdQYXRoLCBpbnQgc3RhZ2UpIHsKIAkJdGhpcyhDb25zdGFudHMuZW5jb2RlKG5ld1BhdGgpLCBzdGFnZSk7CiAJfQogCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkgKiAgICAgICAgICAgICAiXDAiLiBUaGVzZSBzZXF1ZW5jZXMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gYSBnaXQgdHJlZSBvYmplY3QKIAkgKiAgICAgICAgICAgICBvciBEaXJDYWNoZSBmaWxlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGZpbmFsIGJ5dGVbXSBuZXdQYXRoKSB7CisJcHVibGljIERpckNhY2hlRW50cnkoYnl0ZVtdIG5ld1BhdGgpIHsKIAkJdGhpcyhuZXdQYXRoLCBTVEFHRV8wKTsKIAl9CiAKQEAgLTI3Niw3ICsyNzYsNyBAQAogCSAqICAgICAgICAgICAgIHJhbmdlIDAuLjMsIGluY2x1c2l2ZS4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShieXRlW10gcGF0aCwgZmluYWwgaW50IHN0YWdlKSB7CisJcHVibGljIERpckNhY2hlRW50cnkoYnl0ZVtdIHBhdGgsIGludCBzdGFnZSkgewogCQljaGVja1BhdGgocGF0aCk7CiAJCWlmIChzdGFnZSA8IDAgfHwgMyA8IHN0YWdlKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKQEAgLTMxMiw3ICszMTIsNyBAQAogCQlTeXN0ZW0uYXJyYXljb3B5KHNyYy5pbmZvLCBzcmMuaW5mb09mZnNldCwgaW5mbywgMCwgSU5GT19MRU4pOwogCX0KIAotCXZvaWQgd3JpdGUoZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgbGVuID0gaXNFeHRlbmRlZCgpID8gSU5GT19MRU5fRVhURU5ERUQgOiBJTkZPX0xFTjsKIAkJZmluYWwgaW50IHBhdGhMZW4gPSBwYXRoLmxlbmd0aDsKIAkJb3Mud3JpdGUoaW5mbywgaW5mb09mZnNldCwgbGVuKTsKQEAgLTM0Myw3ICszNDMsNyBAQAogCSAqICAgICAgICAgICAgbmFub3NlY29uZHMgY29tcG9uZW50IG9mIHRoZSBpbmRleCdzIGxhc3QgbW9kaWZpZWQgdGltZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgZXh0cmEgY2FyZWZ1bCBjaGVja3Mgc2hvdWxkIGJlIHVzZWQuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gbWlnaHRCZVJhY2lseUNsZWFuKGZpbmFsIGludCBzbXVkZ2VfcywgZmluYWwgaW50IHNtdWRnZV9ucykgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIG1pZ2h0QmVSYWNpbHlDbGVhbihpbnQgc211ZGdlX3MsIGludCBzbXVkZ2VfbnMpIHsKIAkJLy8gSWYgdGhlIGluZGV4IGhhcyBhIG1vZGlmaWNhdGlvbiB0aW1lIHRoZW4gaXQgY2FtZSBmcm9tIGRpc2sKIAkJLy8gYW5kIHdhcyBub3QgZ2VuZXJhdGVkIGZyb20gc2NyYXRjaCBpbiBtZW1vcnkuIEluIHN1Y2ggY2FzZXMKIAkJLy8gdGhlIGVudHJ5IGlzICdyYWNpbHkgY2xlYW4nIGlmIHRoZSBlbnRyeSdzIGNhY2hlZCBtb2RpZmljYXRpb24KQEAgLTQyMCw3ICs0MjAsNyBAQAogCSAqICAgICAgICAgICAgdHJ1ZSB0byBpZ25vcmUgYXBwYXJlbnQgbW9kaWZpY2F0aW9uczsgZmFsc2UgdG8gbG9vayBhdCBsYXN0CiAJICogICAgICAgICAgICBtb2RpZmllZCB0byBkZXRlY3QgZmlsZSBtb2RpZmljYXRpb25zLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc3VtZVZhbGlkKGZpbmFsIGJvb2xlYW4gYXNzdW1lKSB7CisJcHVibGljIHZvaWQgc2V0QXNzdW1lVmFsaWQoYm9vbGVhbiBhc3N1bWUpIHsKIAkJaWYgKGFzc3VtZSkKIAkJCWluZm9baW5mb09mZnNldCArIFBfRkxBR1NdIHw9IEFTU1VNRV9WQUxJRDsKIAkJZWxzZQpAQCAtNTE4LDcgKzUxOCw3IEBACiAJICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlI1RSRUV9LCBvciBhbnkgb3RoZXIgdHlwZQogCSAqICAgICAgICAgICAgIGNvZGUgbm90IHBlcm1pdHRlZCBpbiBhIHRyZWUgb2JqZWN0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVNb2RlKGZpbmFsIEZpbGVNb2RlIG1vZGUpIHsKKwlwdWJsaWMgdm9pZCBzZXRGaWxlTW9kZShGaWxlTW9kZSBtb2RlKSB7CiAJCXN3aXRjaCAobW9kZS5nZXRCaXRzKCkgJiBGaWxlTW9kZS5UWVBFX01BU0spIHsKIAkJY2FzZSBGaWxlTW9kZS5UWVBFX01JU1NJTkc6CiAJCWNhc2UgRmlsZU1vZGUuVFlQRV9UUkVFOgpAQCAtNTQ4LDcgKzU0OCw3IEBACiAJICogQHBhcmFtIHdoZW4KIAkgKiAgICAgICAgICAgIG5ldyBjYWNoZWQgY3JlYXRpb24gdGltZSBvZiB0aGUgZmlsZSwgaW4gbWlsbGlzZWNvbmRzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShmaW5hbCBsb25nIHdoZW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUobG9uZyB3aGVuKSB7CiAJCWVuY29kZVRTKFBfQ1RJTUUsIHdoZW4pOwogCX0KIApAQCAtNTcyLDcgKzU3Miw3IEBACiAJICogQHBhcmFtIHdoZW4KIAkgKiAgICAgICAgICAgIG5ldyBjYWNoZWQgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGZpbGUsIGluIG1pbGxpc2Vjb25kcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQoZmluYWwgbG9uZyB3aGVuKSB7CisJcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgd2hlbikgewogCQllbmNvZGVUUyhQX01USU1FLCB3aGVuKTsKIAl9CiAKQEAgLTYwNCw3ICs2MDQsNyBAQAogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBzaXplIG9mIHRoZSBmaWxlLCBhcyBieXRlcy4gSWYgdGhlIGZpbGUgaXMgbGFyZ2VyCiAJICogICAgICAgICAgICB0aGFuIDJHLCBjYXN0IGl0IHRvIChpbnQpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChmaW5hbCBpbnQgc3opIHsKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IHN6KSB7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGluZm9PZmZzZXQgKyBQX1NJWkUsIHN6KTsKIAl9CiAKQEAgLTYxNCw3ICs2MTQsNyBAQAogCSAqIEBwYXJhbSBzegogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBzaXplIG9mIHRoZSBmaWxlLCBhcyBieXRlcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoZmluYWwgbG9uZyBzeikgeworCXB1YmxpYyB2b2lkIHNldExlbmd0aChsb25nIHN6KSB7CiAJCXNldExlbmd0aCgoaW50KSBzeik7CiAJfQogCkBAIC02MzgsNyArNjM4LDcgQEAKIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZCN6ZXJvSWQoKX0gdG8gcmVtb3ZlIHRoZQogCSAqICAgICAgICAgICAgY3VycmVudCBpZGVudGlmaWVyLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdElkKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIHZvaWQgc2V0T2JqZWN0SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJaWQuY29weVJhd1RvKGlkQnVmZmVyKCksIGlkT2Zmc2V0KCkpOwogCX0KIApAQCAtNjUxLDcgKzY1MSw3IEBACiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdElkRnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgc2V0T2JqZWN0SWRGcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJZmluYWwgaW50IG4gPSBDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSDsKIAkJU3lzdGVtLmFycmF5Y29weShicywgcCwgaWRCdWZmZXIoKSwgaWRPZmZzZXQoKSwgbik7CiAJfQpAQCAtNzA0LDcgKzcwNCw3IEBACiAJICogQHBhcmFtIHNyYwogCSAqICAgICAgICAgICAgdGhlIGVudHJ5IHRvIGNvcHkgT2JqZWN0SWQgYW5kIG1ldGEgZmllbGRzIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgY29weU1ldGFEYXRhKGZpbmFsIERpckNhY2hlRW50cnkgc3JjKSB7CisJcHVibGljIHZvaWQgY29weU1ldGFEYXRhKERpckNhY2hlRW50cnkgc3JjKSB7CiAJCWNvcHlNZXRhRGF0YShzcmMsIGZhbHNlKTsKIAl9CiAKQEAgLTcxOSw3ICs3MTksNyBAQAogCSAqIEBwYXJhbSBrZWVwU3RhZ2UKIAkgKiAgICAgICAgICAgIGlmIHRydWUsIHRoZSBzdGFnZSBhdHRyaWJ1dGUgd2lsbCBub3QgYmUgY29waWVkCiAJICovCi0Jdm9pZCBjb3B5TWV0YURhdGEoZmluYWwgRGlyQ2FjaGVFbnRyeSBzcmMsIGJvb2xlYW4ga2VlcFN0YWdlKSB7CisJdm9pZCBjb3B5TWV0YURhdGEoRGlyQ2FjaGVFbnRyeSBzcmMsIGJvb2xlYW4ga2VlcFN0YWdlKSB7CiAJCWludCBvcmlnZmxhZ3MgPSBOQi5kZWNvZGVVSW50MTYoaW5mbywgaW5mb09mZnNldCArIFBfRkxBR1MpOwogCQlpbnQgbmV3ZmxhZ3MgPSBOQi5kZWNvZGVVSW50MTYoc3JjLmluZm8sIHNyYy5pbmZvT2Zmc2V0ICsgUF9GTEFHUyk7CiAJCVN5c3RlbS5hcnJheWNvcHkoc3JjLmluZm8sIHNyYy5pbmZvT2Zmc2V0LCBpbmZvLCBpbmZvT2Zmc2V0LCBJTkZPX0xFTik7CkBAIC03NDEsMTQgKzc0MSwxNCBAQAogCQlyZXR1cm4gKGluZm9baW5mb09mZnNldCArIFBfRkxBR1NdICYgRVhURU5ERUQpICE9IDA7CiAJfQogCi0JcHJpdmF0ZSBsb25nIGRlY29kZVRTKGZpbmFsIGludCBwSWR4KSB7CisJcHJpdmF0ZSBsb25nIGRlY29kZVRTKGludCBwSWR4KSB7CiAJCWZpbmFsIGludCBiYXNlID0gaW5mb09mZnNldCArIHBJZHg7CiAJCWZpbmFsIGludCBzZWMgPSBOQi5kZWNvZGVJbnQzMihpbmZvLCBiYXNlKTsKIAkJZmluYWwgaW50IG1zID0gTkIuZGVjb2RlSW50MzIoaW5mbywgYmFzZSArIDQpIC8gMTAwMDAwMDsKIAkJcmV0dXJuIDEwMDBMICogc2VjICsgbXM7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGVuY29kZVRTKGZpbmFsIGludCBwSWR4LCBmaW5hbCBsb25nIHdoZW4pIHsKKwlwcml2YXRlIHZvaWQgZW5jb2RlVFMoaW50IHBJZHgsIGxvbmcgd2hlbikgewogCQlmaW5hbCBpbnQgYmFzZSA9IGluZm9PZmZzZXQgKyBwSWR4OwogCQlOQi5lbmNvZGVJbnQzMihpbmZvLCBiYXNlLCAoaW50KSAod2hlbiAvIDEwMDApKTsKIAkJTkIuZW5jb2RlSW50MzIoaW5mbywgYmFzZSArIDQsICgoaW50KSAod2hlbiAlIDEwMDApKSAqIDEwMDAwMDApOwpAQCAtNzcxLDcgKzc3MSw3IEBACiAJCX0KIAl9CiAKLQlzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIGJ5dGVbXSBwYXRoKSB7CisJc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlW10gcGF0aCkgewogCQlyZXR1cm4gQ29uc3RhbnRzLkNIQVJTRVQuZGVjb2RlKEJ5dGVCdWZmZXIud3JhcChwYXRoKSkudG9TdHJpbmcoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yLmphdmEKaW5kZXggZDc2ODIxNi4uMTljOTE2ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUl0ZXJhdG9yLmphdmEKQEAgLTExNCw3ICsxMTQsNyBAQAogCSAqIEBwYXJhbSBkYwogCSAqICAgICAgICAgICAgdGhlIGNhY2hlIHRvIHdhbGsuIEl0IG11c3QgYmUgYWxyZWFkeSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JcHVibGljIERpckNhY2hlSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGUgZGMpIHsKKwlwdWJsaWMgRGlyQ2FjaGVJdGVyYXRvcihEaXJDYWNoZSBkYykgewogCQljYWNoZSA9IGRjOwogCQl0cmVlID0gZGMuZ2V0Q2FjaGVUcmVlKHRydWUpOwogCQl0cmVlU3RhcnQgPSAwOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQlwYXJzZUVudHJ5KCk7CiAJfQogCi0JRGlyQ2FjaGVJdGVyYXRvcihmaW5hbCBEaXJDYWNoZUl0ZXJhdG9yIHAsIGZpbmFsIERpckNhY2hlVHJlZSBkY3QpIHsKKwlEaXJDYWNoZUl0ZXJhdG9yKERpckNhY2hlSXRlcmF0b3IgcCwgRGlyQ2FjaGVUcmVlIGRjdCkgewogCQlzdXBlcihwLCBwLnBhdGgsIHAucGF0aExlbiArIDEpOwogCQljYWNoZSA9IHAuY2FjaGU7CiAJCXRyZWUgPSBkY3Q7CkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjdXJyZW50U3VidHJlZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZ2V0RW50cnlPYmplY3RJZCgpLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZVRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVUcmVlLmphdmEKaW5kZXggZGM4MjVkNC4uYjYwNWYzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZVRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhCkBAIC04Miw3ICs4Miw3IEBACiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERpckNhY2hlVHJlZT4gVFJFRV9DTVAgPSBuZXcgQ29tcGFyYXRvcjxEaXJDYWNoZVRyZWU+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIERpckNhY2hlVHJlZSBvMSwgZmluYWwgRGlyQ2FjaGVUcmVlIG8yKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShEaXJDYWNoZVRyZWUgbzEsIERpckNhY2hlVHJlZSBvMikgewogCQkJZmluYWwgYnl0ZVtdIGEgPSBvMS5lbmNvZGVkTmFtZTsKIAkJCWZpbmFsIGJ5dGVbXSBiID0gbzIuZW5jb2RlZE5hbWU7CiAJCQlmaW5hbCBpbnQgYUxlbiA9IGEubGVuZ3RoOwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJCWNoaWxkQ250ID0gc3ViY250OwogCX0KIAotCXZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIHRtcCwgZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGUoYnl0ZVtdIHRtcCwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgcHRyID0gdG1wLmxlbmd0aDsKIAkJdG1wWy0tcHRyXSA9ICdcbic7CiAJCXB0ciA9IFJhd1BhcnNlVXRpbHMuZm9ybWF0QmFzZTEwKHRtcCwgcHRyLCBjaGlsZENudCk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBjaGlsZCB0byBvYnRhaW4uCiAJICogQHJldHVybiB0aGUgY2hpbGQgdHJlZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENoaWxkKGZpbmFsIGludCBpKSB7CisJcHVibGljIERpckNhY2hlVHJlZSBnZXRDaGlsZChpbnQgaSkgewogCQlyZXR1cm4gY2hpbGRyZW5baV07CiAJfQogCkBAIC0zODksNyArMzg5LDcgQEAKIAkJcmV0dXJuIHNpemU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZE5hbWUoZmluYWwgU3RyaW5nQnVpbGRlciByKSB7CisJcHJpdmF0ZSB2b2lkIGFwcGVuZE5hbWUoU3RyaW5nQnVpbGRlciByKSB7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCkgewogCQkJcGFyZW50LmFwcGVuZE5hbWUocik7CiAJCQlyLmFwcGVuZChnZXROYW1lU3RyaW5nKCkpOwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJCXJldHVybiBlbmNvZGVkTmFtZS5sZW5ndGg7CiAJfQogCi0JZmluYWwgYm9vbGVhbiBjb250YWlucyhmaW5hbCBieXRlW10gYSwgaW50IGFPZmYsIGZpbmFsIGludCBhTGVuKSB7CisJZmluYWwgYm9vbGVhbiBjb250YWlucyhieXRlW10gYSwgaW50IGFPZmYsIGludCBhTGVuKSB7CiAJCWZpbmFsIGJ5dGVbXSBlID0gZW5jb2RlZE5hbWU7CiAJCWZpbmFsIGludCBlTGVuID0gZS5sZW5ndGg7CiAJCWZvciAoaW50IGVPZmYgPSAwOyBlT2ZmIDwgZUxlbiAmJiBhT2ZmIDwgYUxlbjsgZU9mZisrLCBhT2ZmKyspCkBAIC01MDMsNyArNTAzLDcgQEAKIAkJCXJlbW92ZUNoaWxkKGNoaWxkQ250IC0gMSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydENoaWxkKGZpbmFsIGludCBzdElkeCwgZmluYWwgRGlyQ2FjaGVUcmVlIHN0KSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydENoaWxkKGludCBzdElkeCwgRGlyQ2FjaGVUcmVlIHN0KSB7CiAJCWZpbmFsIERpckNhY2hlVHJlZVtdIGMgPSBjaGlsZHJlbjsKIAkJaWYgKGNoaWxkQ250ICsgMSA8PSBjLmxlbmd0aCkgewogCQkJaWYgKHN0SWR4IDwgY2hpbGRDbnQpCkBAIC01MjQsMTQgKzUyNCwxNCBAQAogCQljaGlsZENudCsrOwogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVDaGlsZChmaW5hbCBpbnQgc3RJZHgpIHsKKwlwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGQoaW50IHN0SWR4KSB7CiAJCWZpbmFsIGludCBuID0gLS1jaGlsZENudDsKIAkJaWYgKHN0SWR4IDwgbikKIAkJCVN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIHN0SWR4ICsgMSwgY2hpbGRyZW4sIHN0SWR4LCBuIC0gc3RJZHgpOwogCQljaGlsZHJlbltuXSA9IG51bGw7CiAJfQogCi0Jc3RhdGljIGJvb2xlYW4gcGVxKGZpbmFsIGJ5dGVbXSBhLCBmaW5hbCBieXRlW10gYiwgaW50IGFMZW4pIHsKKwlzdGF0aWMgYm9vbGVhbiBwZXEoYnl0ZVtdIGEsIGJ5dGVbXSBiLCBpbnQgYUxlbikgewogCQlpZiAoYi5sZW5ndGggPCBhTGVuKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmb3IgKGFMZW4tLTsgYUxlbiA+PSAwOyBhTGVuLS0pCkBAIC01NDAsNyArNTQwLDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVjbXAoZmluYWwgYnl0ZVtdIGEsIGludCBhUG9zLCBmaW5hbCBEaXJDYWNoZVRyZWUgY3QpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgbmFtZWNtcChieXRlW10gYSwgaW50IGFQb3MsIERpckNhY2hlVHJlZSBjdCkgewogCQlpZiAoY3QgPT0gbnVsbCkKIAkJCXJldHVybiAtMTsKIAkJZmluYWwgYnl0ZVtdIGIgPSBjdC5lbmNvZGVkTmFtZTsKQEAgLTU1Nyw3ICs1NTcsNyBAQAogCQlyZXR1cm4gYUxlbiAtIGJMZW47CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHNsYXNoKGZpbmFsIGJ5dGVbXSBhLCBpbnQgYVBvcykgeworCXByaXZhdGUgc3RhdGljIGludCBzbGFzaChieXRlW10gYSwgaW50IGFQb3MpIHsKIAkJZmluYWwgaW50IGFMZW4gPSBhLmxlbmd0aDsKIAkJZm9yICg7IGFQb3MgPCBhTGVuOyBhUG9zKyspCiAJCQlpZiAoYVthUG9zXSA9PSAnLycpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db21wb3VuZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YQppbmRleCA2MmZmOTkwLi4xZGY3MGUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db21wb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbXBvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTU2LDEwICs1NiwxMCBAQAogcHVibGljIGNsYXNzIENvbXBvdW5kRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXQoZmluYWwgQ29sbGVjdGlvbjxUaHJvd2FibGU+IGNhdXNlcykgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXQoQ29sbGVjdGlvbjxUaHJvd2FibGU+IGNhdXNlcykgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCW1zZy5hcHBlbmQoSkdpdFRleHQuZ2V0KCkuZmFpbHVyZUR1ZVRvT25lT2ZUaGVGb2xsb3dpbmcpOwotCQlmb3IgKGZpbmFsIFRocm93YWJsZSBjIDogY2F1c2VzKSB7CisJCWZvciAoVGhyb3dhYmxlIGMgOiBjYXVzZXMpIHsKIAkJCW1zZy5hcHBlbmQoIiAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCW1zZy5hcHBlbmQoYy5nZXRNZXNzYWdlKCkpOwogCQkJbXNnLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJApAQCAtNzUsNyArNzUsNyBAQAogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIFR3byBvciBtb3JlIGV4Y2VwdGlvbnMgdGhhdCBtYXkgaGF2ZSBiZWVuIHRoZSBwcm9ibGVtLgogCSAqLwotCXB1YmxpYyBDb21wb3VuZEV4Y2VwdGlvbihmaW5hbCBDb2xsZWN0aW9uPFRocm93YWJsZT4gd2h5KSB7CisJcHVibGljIENvbXBvdW5kRXhjZXB0aW9uKENvbGxlY3Rpb248VGhyb3dhYmxlPiB3aHkpIHsKIAkJc3VwZXIoZm9ybWF0KHdoeSkpOwogCQljYXVzZUxpc3QgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8Pih3aHkpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEKaW5kZXggYTdlMWQwMi4uMjRmNDNjZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNTUsNyArNTUsNyBAQAogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICB3aHkgdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4KIAkgKi8KLQlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CiAJCXN1cGVyKG1lc3NhZ2UpOwogCX0KIApAQCAtNjcsNyArNjcsNyBAQAogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBvZiB0aGUgZXJyb3IuCiAJICovCi0JcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0VudHJ5RXhpc3RzRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCmluZGV4IDhkZDBkNTMuLmI5N2QyMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0VudHJ5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvRW50cnlFeGlzdHNFeGNlcHRpb24uamF2YQpAQCAtNjEsNyArNjEsNyBAQAogCSAqCiAJICogQHBhcmFtIG5hbWUgd29ya2RpciByZWxhdGl2ZSBmaWxlIG5hbWUKIAkgKi8KLQlwdWJsaWMgRW50cnlFeGlzdHNFeGNlcHRpb24oZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgRW50cnlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudHJlZUVudHJ5QWxyZWFkeUV4aXN0cywgbmFtZSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0lsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKaW5kZXggYTY0NzEyMS4uNzg1Y2I5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKIAkgKiBAcGFyYW0gbXNnCiAJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCiAJICovCi0JcHVibGljIElsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbihmaW5hbCBTdHJpbmcgbXNnKSB7CisJcHVibGljIElsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbihTdHJpbmcgbXNnKSB7CiAJCXN1cGVyKG1zZyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDdiYTNhMDAuLjVhYmQwYzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLmphdmEKQEAgLTcwLDcgKzcwLDcgQEAKIAkgKiBAcGFyYW0gaWQgU0hBLTEKIAkgKiBAcGFyYW0gdHlwZSBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworCXB1YmxpYyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKE9iamVjdElkIGlkLCBTdHJpbmcgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5vYmplY3RJc05vdEEsIGlkLm5hbWUoKSwgdHlwZSkpOwogCX0KIApAQCAtODIsNyArODIsNyBAQAogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXRoaXMoaWQsIENvbnN0YW50cy50eXBlU3RyaW5nKHR5cGUpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFJlYWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDcwZjY1MGQuLmUwN2QzMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4V3JpdGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4V3JpdGVFeGNlcHRpb24uamF2YQppbmRleCBkZTE5YzA2Li4zNGZkN2E4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFdyaXRlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAJICoKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICovCi0JcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgSW5kZXhXcml0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICogQHBhcmFtIGNhdXNlIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBJbmRleFdyaXRlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDA5YmI0YTkuLmIzN2QyMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uLmphdmEKQEAgLTU2LDEwICs1NiwxMCBAQAogcHVibGljIGNsYXNzIE1pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBNYXA8T2JqZWN0SWQsIFN0cmluZz4gbWlzc2luZ0NvbW1pdHMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nQ29tbWl0cykgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlyLmFwcGVuZChKR2l0VGV4dC5nZXQoKS5taXNzaW5nUHJlcmVxdWlzaXRlQ29tbWl0cyk7Ci0JCWZvciAoZmluYWwgTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBtaXNzaW5nQ29tbWl0cy5lbnRyeVNldCgpKSB7CisJCWZvciAoTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBtaXNzaW5nQ29tbWl0cy5lbnRyeVNldCgpKSB7CiAJCQlyLmFwcGVuZCgiXG4gICIpOyAvLyROT04tTkxTLTEkCiAJCQlyLmFwcGVuZChlLmdldEtleSgpLm5hbWUoKSk7CiAJCQlpZiAoZS5nZXRWYWx1ZSgpICE9IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEKaW5kZXggZjZhYTA5Mi4uYzZjNDdmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ09iamVjdEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdPYmplY3RFeGNlcHRpb24uamF2YQpAQCAtNjksNyArNjksNyBAQAogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyB0eXBlKSB7CisJcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oT2JqZWN0SWQgaWQsIFN0cmluZyB0eXBlKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm1pc3NpbmdPYmplY3QsIHR5cGUsIGlkLm5hbWUoKSkpOwogCQltaXNzaW5nID0gaWQuY29weSgpOwogCX0KQEAgLTgxLDcgKzgxLDcgQEAKIAkgKiBAcGFyYW0gaWQgU0hBLTEKIAkgKiBAcGFyYW0gdHlwZSBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKE9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQl0aGlzKGlkLCBDb25zdGFudHMudHlwZVN0cmluZyh0eXBlKSk7CiAJfQogCkBAIC05NCw3ICs5NCw3IEBACiAJICogQHBhcmFtIHR5cGUKIAkgKiAgICAgICAgICAgIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBpZCwgZmluYWwgaW50IHR5cGUpIHsKKwlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihBYmJyZXZpYXRlZE9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5taXNzaW5nT2JqZWN0LCBDb25zdGFudHMKIAkJCQkudHlwZVN0cmluZyh0eXBlKSwgaWQubmFtZSgpKSk7CiAJCW1pc3NpbmcgPSBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQppbmRleCAyOGU5Nzg4Li44YzJlODcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQpAQCAtNjAsNyArNjAsNyBAQAogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGVycm9yLgogCSAqLwotCXB1YmxpYyBOb1BhY2tTaWduYXR1cmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHdoeSkgeworCXB1YmxpYyBOb1BhY2tTaWduYXR1cmVFeGNlcHRpb24oU3RyaW5nIHdoeSkgewogCQlzdXBlcih3aHkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKaW5kZXggZmUwNzNkNS4uNTI0OTY4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24oZmluYWwgVVJJaXNoIHVyaSwgZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uKFVSSWlzaCB1cmksIFN0cmluZyBzKSB7CiAJCXN1cGVyKHVyaSwgcyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQppbmRleCAxMjQ2ODBlLi4xMTRlNjYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCSAqCiAJICogQHBhcmFtIHMgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBpc3N1ZQogCSAqLwotCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIApAQCAtNzAsNyArNzAsNyBAQAogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGEgbG93ZXIgbGV2ZWwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaXNzdWUuCiAJICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIHdoeSkgeworCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSB3aHkpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZSh3aHkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YQppbmRleCA4YWYxOTkxLi5iYmVlNDJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9PYmplY3RXcml0aW5nRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbi5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJICoKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICovCi0JcHVibGljIE9iamVjdFdyaXRpbmdFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICogQHBhcmFtIGNhdXNlIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIE9iamVjdFdyaXRpbmdFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja0ludmFsaWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEKaW5kZXggOTg4NmUxNS4uYTgzZGUwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja0ludmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrSW52YWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGludmFsaWQgcGFjayBmaWxlLgogCSAqLwotCXB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBGaWxlIHBhdGgpIHsKKwlwdWJsaWMgUGFja0ludmFsaWRFeGNlcHRpb24oRmlsZSBwYXRoKSB7CiAJCXRoaXMocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAJfQogCkBAIC03MSw3ICs3MSw3IEBACiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGludmFsaWQgcGFjayBmaWxlLgogCSAqLwotCXB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgcGF0aCkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5wYWNrRmlsZUludmFsaWQsIHBhdGgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrTWlzbWF0Y2hFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCmluZGV4IDViOWE0YjkuLmVhMWU2NWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgZXJyb3IuCiAJICovCi0JcHVibGljIFBhY2tNaXNtYXRjaEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgd2h5KSB7CisJcHVibGljIFBhY2tNaXNtYXRjaEV4Y2VwdGlvbihTdHJpbmcgd2h5KSB7CiAJCXN1cGVyKHdoeSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja1Byb3RvY29sRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrUHJvdG9jb2xFeGNlcHRpb24uamF2YQppbmRleCA0NGJjMTY0Li5kZDEzNzQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrUHJvdG9jb2xFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrUHJvdG9jb2xFeGNlcHRpb24uamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlLCB3aGljaCBtYXkgYmUgc2hvd24gdG8gYW4gZW5kLXVzZXIuCiAJICovCi0JcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihmaW5hbCBVUklpc2ggdXJpLCBmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC04OCw3ICs4OCw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UsIHdoaWNoIG1heSBiZSBzaG93biB0byBhbiBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTEwMCw3ICsxMDAsNyBAQAogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24uamF2YQppbmRleCBhYWJiNDZhLi4wNGZkOGVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24uamF2YQpAQCAtNjAsNyArNjAsNyBAQAogCSAqIEBwYXJhbSBsb2NhdGlvbgogCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkgbm90IGZvdW5kLCB1c3VhbGx5IGZpbGUgcGF0aC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24pIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKEZpbGUgbG9jYXRpb24pIHsKIAkJdGhpcyhsb2NhdGlvbi5nZXRQYXRoKCkpOwogCX0KIApAQCAtNzIsNyArNzIsNyBAQAogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIHdoeSB0aGUgcmVwb3NpdG9yeSBkb2VzIG5vdCBleGlzdC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24sIFRocm93YWJsZSB3aHkpIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKEZpbGUgbG9jYXRpb24sIFRocm93YWJsZSB3aHkpIHsKIAkJdGhpcyhsb2NhdGlvbi5nZXRQYXRoKCksIHdoeSk7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBACiAJICogQHBhcmFtIGxvY2F0aW9uCiAJICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSBub3QgZm91bmQsIHVzdWFsbHkgZmlsZSBwYXRoLgogCSAqLwotCXB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oZmluYWwgU3RyaW5nIGxvY2F0aW9uKSB7CisJcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKIAkJc3VwZXIobWVzc2FnZShsb2NhdGlvbikpOwogCX0KIApAQCAtOTgsNyArOTgsNyBAQAogCQlzdXBlcihtZXNzYWdlKGxvY2F0aW9uKSwgd2h5KTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWVzc2FnZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWVzc2FnZShTdHJpbmcgbG9jYXRpb24pIHsKIAkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnJlcG9zaXRvcnlOb3RGb3VuZCwgbG9jYXRpb24pOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JldldhbGtFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JldldhbGtFeGNlcHRpb24uamF2YQppbmRleCA4MjY1NGU4Li5mNjg1MmI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXZXYWxrRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICB0aGUgY2hlY2tlZCBleGNlcHRpb24gdGhhdCBkZXNjcmliZXMgd2h5IHRoZSB3YWxrIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgUmV2V2Fsa0V4Y2VwdGlvbihmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgUmV2V2Fsa0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIoSkdpdFRleHQuZ2V0KCkud2Fsa0ZhaWx1cmUsIGNhdXNlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24uamF2YQppbmRleCA4ZmExNGM3Li42MTFmZDY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEKQEAgLTU2LDIxICs1Niw2IEBACiAJICoKIAkgKiBAcGFyYW0gb3RwCiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHdob3NlIGN1cnJlbnQgcmVwcmVzZW50YXRpb24gaXMgbm8gbG9uZ2VyIHByZXNlbnQuCi0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rICNTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbihPYmplY3RUb1BhY2ssIFRocm93YWJsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZC4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24oT2JqZWN0VG9QYWNrIG90cCkgewotCQkvLyBEbyBub3RoaW5nLgotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlcnJvciBmb3IgYW4gb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIG90cAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBjdXJyZW50IHJlcHJlc2VudGF0aW9uIGlzIG5vIGxvbmdlciBwcmVzZW50LgogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgY2F1c2UKIAkgKiBAc2luY2UgNC4xMApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKaW5kZXggNjBkN2FhMC4uZGM1OWM4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJICoKIAkgKiBAcGFyYW0gcyBuYW1lIG9mIGxpbmsgaW4gdHJlZSBvciB3b3JrZGlyCiAJICovCi0JcHVibGljIFN5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFN5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBzKSB7CiAJCXN1cGVyKHMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKaW5kZXggODZkZWE4Mi4uNWZlY2YwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKQEAgLTY0LDcgKzY0LDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oZmluYWwgVVJJaXNoIHVyaSwgZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKFVSSWlzaCB1cmksIFN0cmluZyBzKSB7CiAJCXN1cGVyKHVyaS5zZXRQYXNzKG51bGwpICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC05MCw3ICs5MCw3IEBACiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5tZXJnZWRQYXRoRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQppbmRleCA0ZmM1MzRiLi42ZGU5MTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQpAQCAtNjMsNyArNjMsNyBAQAogCSAqIEBwYXJhbSBkY2UKIAkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub24temVybyBzdGFnZSBvZiB0aGUgdW5tZXJnZWQgcGF0aC4KIAkgKi8KLQlwdWJsaWMgVW5tZXJnZWRQYXRoRXhjZXB0aW9uKGZpbmFsIERpckNhY2hlRW50cnkgZGNlKSB7CisJcHVibGljIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbihEaXJDYWNoZUVudHJ5IGRjZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bm1lcmdlZFBhdGgsIGRjZS5nZXRQYXRoU3RyaW5nKCkpKTsKIAkJZW50cnkgPSBkY2U7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhCmluZGV4IDg4YzJlZjYuLjliYWI2ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFVuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpLnNldFBhc3MobnVsbCkgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDBiN2NjZjUuLjBhNGZlZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQHBhcmFtIHZlcnNpb24KIAkgKiAgICAgICAgICAgIHBhY2sgaW5kZXggdmVyc2lvbgogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24oZmluYWwgaW50IHZlcnNpb24pIHsKKwlwdWJsaWMgVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uKGludCB2ZXJzaW9uKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbiwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YodmVyc2lvbikpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMjM2MTE4Ni4uY2JmOGYzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24uamF2YQpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBwYXJhbSB2ZXJzaW9uCiAJICogICAgICAgICAgICBwYWNrIHZlcnNpb24KIAkgKi8KLQlwdWJsaWMgVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbihmaW5hbCBsb25nIHZlcnNpb24pIHsKKwlwdWJsaWMgVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbihsb25nIHZlcnNpb24pIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5zdXBwb3J0ZWRQYWNrVmVyc2lvbiwKIAkJCQlMb25nLnZhbHVlT2YodmVyc2lvbikpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2V2ZW50cy9JbmRleENoYW5nZWRFdmVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YQppbmRleCA2NDdlYzhhLi5kY2NlODZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2V2ZW50cy9JbmRleENoYW5nZWRFdmVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXZlbnRzL0luZGV4Q2hhbmdlZEV2ZW50LmphdmEKQEAgLTQ3LDYgKzQ3LDI4IEBACiAgKiBEZXNjcmliZXMgYSBjaGFuZ2UgdG8gb25lIG9yIG1vcmUgcGF0aHMgaW4gdGhlIGluZGV4IGZpbGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBJbmRleENoYW5nZWRFdmVudCBleHRlbmRzIFJlcG9zaXRvcnlFdmVudDxJbmRleENoYW5nZWRMaXN0ZW5lcj4geworCXByaXZhdGUgYm9vbGVhbiBpbnRlcm5hbDsKKworCS8qKgorCSAqIE5vdGlmeSB0aGF0IHRoZSBpbmRleCBjaGFuZ2VkCisJICoKKwkgKiBAcGFyYW0gaW50ZXJuYWwKKwkgKiAgICAgICAgICAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5kZXggd2FzIGNoYW5nZWQgYnkgdGhlIHNhbWUKKwkgKiAgICAgICAgICAgICAgICAgICAgIEpHaXQgcHJvY2VzcworCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgSW5kZXhDaGFuZ2VkRXZlbnQoYm9vbGVhbiBpbnRlcm5hbCkgeworCQl0aGlzLmludGVybmFsID0gaW50ZXJuYWw7CisJfQorCisJLyoqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluZGV4IHdhcyBjaGFuZ2VkIGJ5IHRoZSBzYW1lIEpHaXQgcHJvY2VzcworCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVybmFsKCkgeworCQlyZXR1cm4gaW50ZXJuYWw7CisJfQorCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgQ2xhc3M8SW5kZXhDaGFuZ2VkTGlzdGVuZXI+IGdldExpc3RlbmVyVHlwZSgpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9DaGFyYWN0ZXJIZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhCmluZGV4IDk4YWVlMGUuLjcwMzljM2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9DaGFyYWN0ZXJIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0NoYXJhY3RlckhlYWQuamF2YQpAQCAtNTMsMTQgKzUzLDE0IEBACiAJICogQHBhcmFtIGV4cGVjdGVkQ2hhcmFjdGVyCiAJICogICAgICAgICAgICBleHBlY3RlZCB7QGNvZGUgY2hhcn0KIAkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVySGVhZChmaW5hbCBjaGFyIGV4cGVjdGVkQ2hhcmFjdGVyKSB7CisJcHJvdGVjdGVkIENoYXJhY3RlckhlYWQoY2hhciBleHBlY3RlZENoYXJhY3RlcikgewogCQlzdXBlcihmYWxzZSk7CiAJCXRoaXMuZXhwZWN0ZWRDaGFyYWN0ZXIgPSBleHBlY3RlZENoYXJhY3RlcjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoZmluYWwgY2hhciBjKSB7CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMpIHsKIAkJcmV0dXJuIGMgPT0gZXhwZWN0ZWRDaGFyYWN0ZXI7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvRmlsZU5hbWVNYXRjaGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvRmlsZU5hbWVNYXRjaGVyLmphdmEKaW5kZXggNTY2MzAzOS4uYmZjYzU4MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0ZpbGVOYW1lTWF0Y2hlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBACiAJICogQHBhcmFtIGhlYWRzU3RhcnRWYWx1ZQogCSAqICAgICAgICAgICAgbXVzdCBiZSBhIGxpc3Qgd2hpY2ggd2lsbCBuZXZlciBiZSBtb2RpZmllZC4KIAkgKi8KLQlwcml2YXRlIEZpbGVOYW1lTWF0Y2hlcihmaW5hbCBMaXN0PEhlYWQ+IGhlYWRzU3RhcnRWYWx1ZSkgeworCXByaXZhdGUgRmlsZU5hbWVNYXRjaGVyKExpc3Q8SGVhZD4gaGVhZHNTdGFydFZhbHVlKSB7CiAJCXRoaXMoaGVhZHNTdGFydFZhbHVlLCBoZWFkc1N0YXJ0VmFsdWUpOwogCX0KIApAQCAtMzE1LDcgKzMxNSw3IEBACiAJICogQHBhcmFtIGMgbmV3IGNoYXJhY3RlciB0byBhcHBlbmQKIAkgKiBAcmV0dXJuIHRydWUgdG8gY29udGludWUsIGZhbHNlIGlmIHRoZSBtYXRjaGVyIGNhbiBzdG9wIGFwcGVuZGluZwogCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRTdHJpbmdUb01hdGNoQnlPbmVDaGFyYWN0ZXIoZmluYWwgY2hhciBjKSB7CisJcHJpdmF0ZSBib29sZWFuIGV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihjaGFyIGMpIHsKIAkJZmluYWwgTGlzdDxIZWFkPiBuZXdIZWFkcyA9IGxpc3RGb3JMb2NhbFVzZWFnZTsKIAkJbmV3SGVhZHMuY2xlYXIoKTsKIAkJTGlzdDxIZWFkPiBsYXN0QWRkZWRIZWFkcyA9IG51bGw7CkBAIC0zNTcsNyArMzU3LDcgQEAKIAkgKiAgICAgICAgICAgIGV4dGVuZHMgdGhlIHN0cmluZyB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIHBhdHRlcm5zIG9mCiAJICogICAgICAgICAgICB0aGlzIGNsYXNzLgogCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZChmaW5hbCBTdHJpbmcgc3RyaW5nVG9NYXRjaCkgeworCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgc3RyaW5nVG9NYXRjaCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ1RvTWF0Y2gubGVuZ3RoKCk7IGkrKykgewogCQkJZmluYWwgY2hhciBjID0gc3RyaW5nVG9NYXRjaC5jaGFyQXQoaSk7CiAJCQlpZiAoIWV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihjKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YQppbmRleCA5NjVkOTAwLi4xZGM1OTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvR3JvdXBIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0dyb3VwSGVhZC5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW52ZXJzZTsKIAotCUdyb3VwSGVhZChTdHJpbmcgcGF0dGVybiwgZmluYWwgU3RyaW5nIHdob2xlUGF0dGVybikKKwlHcm91cEhlYWQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyB3aG9sZVBhdHRlcm4pCiAJCQl0aHJvd3MgSW52YWxpZFBhdHRlcm5FeGNlcHRpb24gewogCQlzdXBlcihmYWxzZSk7CiAJCXRoaXMuY2hhcmFjdGVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtMTMyLDcgKzEzMiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoZmluYWwgY2hhciBjKSB7CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMpIHsKIAkJZm9yIChDaGFyYWN0ZXJQYXR0ZXJuIHBhdHRlcm4gOiBjaGFyYWN0ZXJDbGFzc2VzKSB7CiAJCQlpZiAocGF0dGVybi5tYXRjaGVzKGMpKSB7CiAJCQkJcmV0dXJuICFpbnZlcnNlOwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgT25lQ2hhcmFjdGVyUGF0dGVybiBpbXBsZW1lbnRzIENoYXJhY3RlclBhdHRlcm4gewogCQlwcml2YXRlIGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXI7CiAKLQkJT25lQ2hhcmFjdGVyUGF0dGVybihmaW5hbCBjaGFyIGMpIHsKKwkJT25lQ2hhcmFjdGVyUGF0dGVybihjaGFyIGMpIHsKIAkJCXRoaXMuZXhwZWN0ZWRDaGFyYWN0ZXIgPSBjOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvUmVzdHJpY3RlZFdpbGRDYXJkSGVhZC5qYXZhCmluZGV4IGMxMzJlMjguLjQ1ZTZlZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1Jlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQuamF2YQpAQCAtNDcsMTQgKzQ3LDE0IEBACiBmaW5hbCBjbGFzcyBSZXN0cmljdGVkV2lsZENhcmRIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAlwcml2YXRlIGZpbmFsIGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXI7CiAKLQlSZXN0cmljdGVkV2lsZENhcmRIZWFkKGZpbmFsIGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXIsIGZpbmFsIGJvb2xlYW4gc3RhcikgeworCVJlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQoY2hhciBleGNsdWRlZENoYXJhY3RlciwgYm9vbGVhbiBzdGFyKSB7CiAJCXN1cGVyKHN0YXIpOwogCQl0aGlzLmV4Y2x1ZGVkQ2hhcmFjdGVyID0gZXhjbHVkZWRDaGFyYWN0ZXI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIGNoYXIgYykgeworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJCXJldHVybiBjICE9IGV4Y2x1ZGVkQ2hhcmFjdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhCmluZGV4IGM4MDZlMjMuLjA3MzYyYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9XaWxkQ2FyZEhlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvV2lsZENhcmRIZWFkLmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCmluZGV4IDhiOGRmODcuLjgwZmQzY2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCkBAIC00MTMsNyArNDEzLDcgQEAKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcn0KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTQ0OCw3ICs0NDgsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGF1dGhvcidzIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudH0KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRBdXRob3IoZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yKSB7CisJcHVibGljIFJlcG9Db21tYW5kIHNldEF1dGhvcihQZXJzb25JZGVudCBhdXRob3IpIHsKIAkJdGhpcy5hdXRob3IgPSBhdXRob3I7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTQ2Myw3ICs0NjMsNyBAQAogCSAqICAgICAgICAgICAgb2JqZWN0LgogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFJlcG9Db21tYW5kIHNldFJlbW90ZVJlYWRlcihmaW5hbCBSZW1vdGVSZWFkZXIgY2FsbGJhY2spIHsKKwlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVtb3RlUmVhZGVyKFJlbW90ZVJlYWRlciBjYWxsYmFjaykgewogCQl0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Qcm9qZWN0LmphdmEKaW5kZXggZTgyNzYxMi4uN2JhODNjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Qcm9qZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Qcm9qZWN0LmphdmEKQEAgLTEzMSwxOCArMTMxLDEwIEBACiAJCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShyZXBvLmdldFdvcmtUcmVlKCksCiAJCQkJCXBhdGggKyAiLyIgKyBzcmMpOyAvLyROT04tTkxTLTEkCiAJCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUocmVwby5nZXRXb3JrVHJlZSgpLCBkZXN0KTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRmlsZSk7Ci0JCQl0cnkgewotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCUZpbGVDaGFubmVsIGNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQkJCW91dHB1dC5nZXRDaGFubmVsKCkudHJhbnNmZXJGcm9tKAotCQkJCQkJCWNoYW5uZWwsIDAsIGNoYW5uZWwuc2l6ZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlucHV0LmNsb3NlKCk7CisJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRmlsZSk7CisJCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpKSB7CisJCQkJRmlsZUNoYW5uZWwgY2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKKwkJCQlvdXRwdXQuZ2V0Q2hhbm5lbCgpLnRyYW5zZmVyRnJvbShjaGFubmVsLCAwLCBjaGFubmVsLnNpemUoKSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0dpdEhvb2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvR2l0SG9vay5qYXZhCmluZGV4IGFkNDNlMmMuLjhhNjFkMWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvR2l0SG9vay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvR2l0SG9vay5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5ob29rczsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQlQcmludFN0cmVhbSBob29rRXJyUmVkaXJlY3QgPSBudWxsOwogCQl0cnkgewogCQkJaG9va0VyclJlZGlyZWN0ID0gbmV3IFByaW50U3RyZWFtKGVycm9yQnl0ZUFycmF5LCBmYWxzZSwKLQkJCQkJVVRGXzgubmFtZSgpKTsKKwkJCQkJQ0hBUlNFVC5uYW1lKCkpOwogCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKIAkJCS8vIFVURi04IGlzIGd1YXJhbnRlZWQgdG8gYmUgYXZhaWxhYmxlCiAJCX0KQEAgLTE2Nyw3ICsxNjcsNyBAQAogCQkJCWhvb2tFcnJSZWRpcmVjdCwgZ2V0U3RkaW5BcmdzKCkpOwogCQlpZiAocmVzdWx0LmlzRXhlY3V0ZWRXaXRoRXJyb3IoKSkgewogCQkJdGhyb3cgbmV3IEFib3J0ZWRCeUhvb2tFeGNlcHRpb24oCi0JCQkJCW5ldyBTdHJpbmcoZXJyb3JCeXRlQXJyYXkudG9CeXRlQXJyYXkoKSwgVVRGXzgpLAorCQkJCQluZXcgU3RyaW5nKGVycm9yQnl0ZUFycmF5LnRvQnl0ZUFycmF5KCksIENIQVJTRVQpLAogCQkJCQlnZXRIb29rTmFtZSgpLCByZXN1bHQuZ2V0RXhpdENvZGUoKSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0hvb2tzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0hvb2tzLmphdmEKaW5kZXggNzkzOTVlZC4uYjgwMWQ2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvSG9va3MuamF2YQpAQCAtMTE1LDcgKzExNSwxMSBAQAogCQkJCQlvdXRwdXRTdHJlYW0pOwogCQkJaWYgKGhvb2sgIT0gbnVsbCkgewogCQkJCWlmIChob29rLmlzTmF0aXZlSG9va1ByZXNlbnQoKSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJUHJpbnRTdHJlYW0gcHMgPSBvdXRwdXRTdHJlYW07CisJCQkJCWlmIChwcyA9PSBudWxsKSB7CisJCQkJCQlwcyA9IFN5c3RlbS5vdXQ7CisJCQkJCX0KKwkJCQkJcHMucHJpbnRsbihNZXNzYWdlRm9ybWF0CiAJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5sZnNIb29rQ29uZmxpY3QsIHJlcG8pKTsKIAkJCQl9CiAJCQkJcmV0dXJuIGhvb2s7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlLmphdmEKaW5kZXggMTIyNGRmNC4uZDU3MGZkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YQpAQCAtMTYzLDM1ICsxNjMsNiBAQAogCSAqICAgICAgICAgICAgKHVzZXMgJy8nIGFuZCBub3QgJ1wnKS4KIAkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIHRhcmdldCBpdGVtIGlzIGEgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBuZWdhdGVGaXJzdE1hdGNoCi0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSBmaXJzdCBtYXRjaCBzaG91bGQgYmUgbmVnYXRlZAotCSAqIEBkZXByZWNhdGVkIG5lZ2F0ZUZpcnN0TWF0Y2ggaXMgbm90IGhvbm9yZWQgYW55bW9yZQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBwYXRoLgotCSAqIEBzaW5jZSAzLjYKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBNYXRjaFJlc3VsdCBpc0lnbm9yZWQoU3RyaW5nIGVudHJ5UGF0aCwgYm9vbGVhbiBpc0RpcmVjdG9yeSwKLQkJCWJvb2xlYW4gbmVnYXRlRmlyc3RNYXRjaCkgewotCQlmaW5hbCBCb29sZWFuIHJlc3VsdCA9IGNoZWNrSWdub3JlZChlbnRyeVBhdGgsIGlzRGlyZWN0b3J5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmVnYXRlRmlyc3RNYXRjaAotCQkJCQk/IE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVF9ORUdBVEVfRklSU1RfTUFUQ0gKLQkJCQkJOiBNYXRjaFJlc3VsdC5DSEVDS19QQVJFTlQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpID8gTWF0Y2hSZXN1bHQuSUdOT1JFRAotCQkJCTogTWF0Y2hSZXN1bHQuTk9UX0lHTk9SRUQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFuIGVudHJ5IHBhdGggbWF0Y2hlcyBhbiBpZ25vcmUgcnVsZS4KLQkgKgotCSAqIEBwYXJhbSBlbnRyeVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRlc3QuIFRoZSBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhpcyBpZ25vcmUKLQkgKiAgICAgICAgICAgIG5vZGUncyBvd24gcmVwb3NpdG9yeSBwYXRoLCBhbmQgaW4gcmVwb3NpdG9yeSBwYXRoIGZvcm1hdAotCSAqICAgICAgICAgICAgKHVzZXMgJy8nIGFuZCBub3QgJ1wnKS4KLQkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIHRhcmdldCBpdGVtIGlzIGEgZGlyZWN0b3J5LgogCSAqIEByZXR1cm4gQm9vbGVhbi5UUlVFLCBpZiB0aGUgZW50cnkgaXMgaWdub3JlZDsgQm9vbGVhbi5GQUxTRSwgaWYgdGhlCiAJICogICAgICAgICBlbnRyeSBpcyBmb3JjZWQgdG8gYmUgbm90IGlnbm9yZWQgKG5lZ2F0ZWQgbWF0Y2gpOyBvciBudWxsLCBpZgogCSAqICAgICAgICAgdW5kZXRlcm1pbmVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKaW5kZXggMTIwZDZhZC4uZDJmNjIzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQpAQCAtMjg3LDYgKzI4Nyw4IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyBjcmVkZW50aWFsVXNlcm5hbWU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkYWVtb25BbHJlYWR5UnVubmluZzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRheXNBZ287CisJLyoqKi8gcHVibGljIFN0cmluZyBkZWVwZW5Ob3RXaXRoRGVlcGVuOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVlcGVuU2luY2VXaXRoRGVlcGVuOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlQnJhbmNoVW5leHBlY3RlZFJlc3VsdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZUZpbGVGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVSZXF1aXJlc1plcm9OZXdJZDsKQEAgLTM3Miw2ICszNzQsNyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmlsZU1vZGVOb3RTZXRGb3JQYXRoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmlsdGVyRXhlY3V0aW9uRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmlsdGVyRXhlY3V0aW9uRmFpbGVkUmM7CisJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJSZXF1aXJlc0NhcGFiaWxpdHk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaW5kaW5nR2FyYmFnZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZsYWdJc0Rpc3Bvc2VkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmxhZ05vdEZyb21UaGlzOwpAQCAtNDIzLDYgKzQyNiw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRGVwdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jcnlwdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRFeHBhbmRXaWxkY2FyZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRGaWx0ZXI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0ZGlyUmVmOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEdpdE1vZHVsZXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0VHlwZTsKQEAgLTQ1OCw2ICs0NjIsNyBAQAogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFN5c3RlbVByb3BlcnR5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRhZ09wdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lb3V0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZFRpbWVzdGFtcDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lVW5pdFZhbHVlMjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lVW5pdFZhbHVlMzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUcmVlWmVyb0xlbmd0aE5hbWU7CkBAIC02OTAsNiArNjk1LDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNvdXJjZVJlZkRvZXNudFJlc29sdmVUb0FueU9iamVjdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzcXVhc2hDb21taXROb3RVcGRhdGluZ0hFQUQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBzc2hDb21tYW5kRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoVXNlck5hbWVFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzbEZhaWx1cmVFeGNlcHRpb25NZXNzYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NsRmFpbHVyZUluZm87CkBAIC03MzUsNiArNzQxLDcgQEAKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVJc1VuY2VydGFpbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55Q29tbWFuZHM7CisJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55RmlsdGVyczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvb01hbnlJbmNsdWRlUmVjdXJzaW9uczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvcG9sb2dpY2FsU29ydFJlcXVpcmVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdHJhbnNwb3J0RXhjZXB0aW9uQmFkUmVmOwpAQCAtNzc3LDYgKzc4NCw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkRW9mSW5QYWNrOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZEh1bmtUcmFpbGVyOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZE9kZFJlc3VsdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRQYWNrZXRMaW5lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZFJlZlJlcG9ydDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRSZXBvcnRMaW5lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZFJlcG9ydExpbmUyOwpAQCAtNzkxLDYgKzc5OSw3IEBACiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duT2JqZWN0VHlwZTI7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duUmVwb3NpdG9yeUZvcm1hdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0MjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25UcmFuc3BvcnRDb21tYW5kOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blpsaWJFcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVubG9ja0xvY2tGaWxlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5tZXJnZWRQYXRoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhCmluZGV4IDE5MDhkNmMuLmQxZDRmNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvS2V0Y2hTeXN0ZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEKQEAgLTI2MCw3ICsyNjAsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBmb2xsb3dlciBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIFVSSS4KIAkgKi8KLQlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykKKwlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKFJlcG9zaXRvcnkgcmVwbykKIAkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQlLZXRjaExlYWRlciBsZWFkZXIgPSBuZXcgS2V0Y2hMZWFkZXIodGhpcykgewogCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9Mb2NhbFJlcGxpY2EuamF2YQppbmRleCA5YzM3YTkwLi43ZGRkZTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvTG9jYWxSZXBsaWNhLmphdmEKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvUmVtb3RlR2l0UmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKaW5kZXggNjc0ZGExZi4uYjYxMjc0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKaW5kZXggMTRkYzgwZi4uNDY4Nzk1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQAogCXByaXZhdGUgUmVmIGNsb2NrSGFuZDsKIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRGZzQmxvY2tDYWNoZShmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgRGZzQmxvY2tDYWNoZShEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgewogCQl0YWJsZVNpemUgPSB0YWJsZVNpemUoY2ZnKTsKIAkJaWYgKHRhYmxlU2l6ZSA8IDEpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRTaXplTXVzdEJlR3JlYXRlck9yRXF1YWwxKTsKQEAgLTMzMCw3ICszMzAsNyBAQAogCQlyZXR1cm4gYmxvY2tTaXplOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoZmluYWwgRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCWZpbmFsIGludCB3c3ogPSBjZmcuZ2V0QmxvY2tTaXplKCk7CiAJCWZpbmFsIGxvbmcgbGltaXQgPSBjZmcuZ2V0QmxvY2tMaW1pdCgpOwogCQlpZiAod3N6IDw9IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCmluZGV4IGNkNzkwMWIuLmRkN2NiODkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiAgICAgICAgICAgIHBhY2sgZmlsZSBkYXRhOyBtdXN0IGJlIHBvc2l0aXZlLgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0QmxvY2tMaW1pdChmaW5hbCBsb25nIG5ld0xpbWl0KSB7CisJcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0QmxvY2tMaW1pdChsb25nIG5ld0xpbWl0KSB7CiAJCWlmIChuZXdMaW1pdCA8PSAwKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5ibG9ja0xpbWl0Tm90UG9zaXRpdmUsCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShmaW5hbCBpbnQgbmV3U2l6ZSkgeworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShpbnQgbmV3U2l6ZSkgewogCQlpbnQgc2l6ZSA9IE1hdGgubWF4KDUxMiwgbmV3U2l6ZSk7CiAJCWlmICgoc2l6ZSAmIChzaXplIC0gMSkpICE9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCkBAIC0yMDYsNyArMjA2LDcgQEAKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gcmVhZCBwcm9wZXJ0aWVzIGZyb20uCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCWxvbmcgY2ZnQmxvY2tMaW1pdCA9IHJjLmdldExvbmcoCiAJCQkJQ09ORklHX0NPUkVfU0VDVElPTiwKIAkJCQlDT05GSUdfREZTX1NFQ1RJT04sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhCmluZGV4IDY5OTg5YTQuLmNhMTFmYjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzR2FyYmFnZUNvbGxlY3Rvci5qYXZhCkBAIC00MDMsNyArNDAzLDcgQEAKIAl9CiAKIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBnZXRBbGxSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVmZGIuZ2V0UmVmcygpOwogCQlMaXN0PFJlZj4gYWRkbCA9IHJlZmRiLmdldEFkZGl0aW9uYWxSZWZzKCk7CiAJCWlmICghYWRkbC5pc0VtcHR5KCkpIHsKIAkJCUxpc3Q8UmVmPiBhbGwgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkgKyBhZGRsLnNpemUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEKaW5kZXggZWIwYTUyNy4uMGQ5ZTJjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YQpAQCAtNjgsNiArNjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTGFyZ2VPYmplY3RFeGNlcHRpb247CkBAIC0zMDksNiArMzEwLDE1IEBACiAJCUNvbGxlY3Rpb25zLnNvcnQob2JqZWN0TGlzdCk7CiAJfQogCisJQE51bGxhYmxlCisJcHJpdmF0ZSBUZW1wb3JhcnlCdWZmZXIuSGVhcCBtYXliZUdldFRlbXBvcmFyeUJ1ZmZlcigKKwkJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCkgeworCQlpZiAobGlzdC5zaXplKCkgPD0gNTgwMDApIHsKKwkJCXJldHVybiBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoMiA8PCAyMCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCiAJUGFja0luZGV4IHdyaXRlUGFja0luZGV4KERmc1BhY2tEZXNjcmlwdGlvbiBwYWNrLCBieXRlW10gcGFja0hhc2gsCiAJCQlMaXN0PFBhY2tlZE9iamVjdEluZm8+IGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXBhY2suc2V0SW5kZXhWZXJzaW9uKElOREVYX1ZFUlNJT04pOwpAQCAtMzE3LDI3ICszMjcsMjAgQEAKIAkJLy8gSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiA1OCwwMDAgb2JqZWN0cywgdGhlIGVudGlyZSBpbmRleCBmaXRzIGluIHVuZGVyCiAJCS8vIDIgTWlCLiBDYWxsZXJzIHdpbGwgcHJvYmFibHkgbmVlZCB0aGUgaW5kZXggaW1tZWRpYXRlbHksIHNvIGJ1ZmZlcgogCQkvLyB0aGUgaW5kZXggaW4gcHJvY2VzcyBhbmQgbG9hZCBmcm9tIHRoZSBidWZmZXIuCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9IG51bGw7CiAJCVBhY2tJbmRleCBwYWNrSW5kZXggPSBudWxsOwotCQlpZiAobGlzdC5zaXplKCkgPD0gNTgwMDApIHsKLQkJCWJ1ZiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKLQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOwotCQkJcGFja0luZGV4ID0gUGFja0luZGV4LnJlYWQoYnVmLm9wZW5JbnB1dFN0cmVhbSgpKTsKLQkJfQotCi0JCXRyeSAoRGZzT3V0cHV0U3RyZWFtIG9zID0gZGIud3JpdGVGaWxlKHBhY2ssIElOREVYKSkgewotCQkJQ291bnRpbmdPdXRwdXRTdHJlYW0gY250ID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG9zKTsKLQkJCWlmIChidWYgIT0gbnVsbCkKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPSBtYXliZUdldFRlbXBvcmFyeUJ1ZmZlcihsaXN0KTsKKwkJCQlEZnNPdXRwdXRTdHJlYW0gb3MgPSBkYi53cml0ZUZpbGUocGFjaywgSU5ERVgpOworCQkJCUNvdW50aW5nT3V0cHV0U3RyZWFtIGNudCA9IG5ldyBDb3VudGluZ091dHB1dFN0cmVhbShvcykpIHsKKwkJCWlmIChidWYgIT0gbnVsbCkgeworCQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOworCQkJCXBhY2tJbmRleCA9IFBhY2tJbmRleC5yZWFkKGJ1Zi5vcGVuSW5wdXRTdHJlYW0oKSk7CiAJCQkJYnVmLndyaXRlVG8oY250LCBudWxsKTsKLQkJCWVsc2UKKwkJCX0gZWxzZSB7CiAJCQkJaW5kZXgoY250LCBwYWNrSGFzaCwgbGlzdCk7CisJCQl9CiAJCQlwYWNrLmFkZEZpbGVFeHQoSU5ERVgpOwogCQkJcGFjay5zZXRCbG9ja1NpemUoSU5ERVgsIG9zLmJsb2NrU2l6ZSgpKTsKIAkJCXBhY2suc2V0RmlsZVNpemUoSU5ERVgsIGNudC5nZXRDb3VudCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWJ1Zi5jbG9zZSgpOwotCQkJfQogCQl9CiAJCXJldHVybiBwYWNrSW5kZXg7CiAJfQpAQCAtNDAzLDcgKzQwNiw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaGRyQnVmWzBdID0gKGJ5dGUpIGI7CiAJCQl3cml0ZShoZHJCdWYsIDAsIDEpOwogCQl9CkBAIC02NjYsNiArNjY5LDcgQEAKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGJlbG93CiAJCQlmaW5hbCBEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7CiAJCQlpZiAoc3JjUGFjayAhPSBwYWNrS2V5KSB7CiAJCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YQppbmRleCA0MmIxYTQ3Li5jYTU0ZWUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iakRhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmpEYXRhYmFzZS5qYXZhCkBAIC00OTcsNyArNDk3LDcgQEAKIAkJfSB3aGlsZSAoIXBhY2tMaXN0LmNvbXBhcmVBbmRTZXQobywgbikpOwogCX0KIAotCVBhY2tMaXN0IHNjYW5QYWNrcyhmaW5hbCBQYWNrTGlzdCBvcmlnaW5hbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlQYWNrTGlzdCBzY2FuUGFja3MoUGFja0xpc3Qgb3JpZ2luYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVBhY2tMaXN0IG8sIG47CiAJCXN5bmNocm9uaXplZCAocGFja0xpc3QpIHsKIAkJCWRvIHsKQEAgLTU0Niw3ICs1NDYsNyBAQAogCQkJfQogCQl9CiAKLQkJaWYgKG5ld1BhY2tzLmlzRW1wdHkoKSkKKwkJaWYgKG5ld1BhY2tzLmlzRW1wdHkoKSAmJiBuZXdSZWZ0YWJsZXMuaXNFbXB0eSgpKQogCQkJcmV0dXJuIG5ldyBQYWNrTGlzdEltcGwoTk9fUEFDS1MucGFja3MsIE5PX1BBQ0tTLnJlZnRhYmxlcyk7CiAJCWlmICghZm91bmROZXcpIHsKIAkJCW9sZC5jbGVhckRpcnR5KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YQppbmRleCAzYTA0ZDcwLi41ZjRkZWUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqZWN0VG9QYWNrLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkvKiogTGVuZ3RoIG9mIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIG9iamVjdC4gKi8KIAlsb25nIGxlbmd0aDsKIAotCURmc09iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGZpbmFsIGludCB0eXBlKSB7CisJRGZzT2JqZWN0VG9QYWNrKEFueU9iamVjdElkIHNyYywgaW50IHR5cGUpIHsKIAkJc3VwZXIoc3JjLCB0eXBlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEKaW5kZXggYWI3NjMzMi4uYjQzYjliMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrQ29tcGFjdG9yLmphdmEKQEAgLTI2OCw4ICsyNjgsNyBAQAogCQlwYy5zZXRSZXVzZURlbHRhcyh0cnVlKTsKIAkJcGMuc2V0UmV1c2VPYmplY3RzKHRydWUpOwogCi0JCVBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihwYywgY3R4KTsKLQkJdHJ5IHsKKwkJdHJ5IChQYWNrV3JpdGVyIHB3ID0gbmV3IFBhY2tXcml0ZXIocGMsIGN0eCkpIHsKIAkJCXB3LnNldERlbHRhQmFzZUFzT2Zmc2V0KHRydWUpOwogCQkJcHcuc2V0UmV1c2VEZWx0YUNvbW1pdHMoZmFsc2UpOwogCkBAIC0yODUsOCArMjg0LDYgQEAKIAkJCQl3cml0ZUluZGV4KG9iamRiLCBvdXREZXNjLCBwdyk7CiAKIAkJCQlQYWNrU3RhdGlzdGljcyBzdGF0cyA9IHB3LmdldFN0YXRpc3RpY3MoKTsKLQkJCQlwdy5jbG9zZSgpOwotCQkJCXB3ID0gbnVsbDsKIAogCQkJCW91dERlc2Muc2V0UGFja1N0YXRzKHN0YXRzKTsKIAkJCQluZXdTdGF0cyA9IHN0YXRzOwpAQCAtMjk2LDEwICsyOTMsNiBAQAogCQkJCQlvYmpkYi5yb2xsYmFja1BhY2soQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvdXREZXNjKSk7CiAJCQkJfQogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB3ICE9IG51bGwpIHsKLQkJCQlwdy5jbG9zZSgpOwotCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKaW5kZXggN2UzNjA0Mi4uMDViOGY2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQpAQCAtMjA5LDggKzIwOSw3IEBACiAJCQl0cnkgewogCQkJCWN0eC5zdGF0cy5yZWFkSWR4Kys7CiAJCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwotCQkJCVJlYWRhYmxlQ2hhbm5lbCByYyA9IGN0eC5kYi5vcGVuRmlsZShkZXNjLCBJTkRFWCk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKFJlYWRhYmxlQ2hhbm5lbCByYyA9IGN0eC5kYi5vcGVuRmlsZShkZXNjLCBJTkRFWCkpIHsKIAkJCQkJSW5wdXRTdHJlYW0gaW4gPSBDaGFubmVscy5uZXdJbnB1dFN0cmVhbShyYyk7CiAJCQkJCWludCB3YW50U2l6ZSA9IDgxOTI7CiAJCQkJCWludCBicyA9IHJjLmJsb2NrU2l6ZSgpOwpAQCAtMjIxLDcgKzIyMCw2IEBACiAJCQkJCWlkeCA9IFBhY2tJbmRleC5yZWFkKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluLCBicykpOwogCQkJCQljdHguc3RhdHMucmVhZElkeEJ5dGVzICs9IHJjLnBvc2l0aW9uKCk7CiAJCQkJfSBmaW5hbGx5IHsKLQkJCQkJcmMuY2xvc2UoKTsKIAkJCQkJY3R4LnN0YXRzLnJlYWRJZHhNaWNyb3MgKz0gZWxhcHNlZE1pY3JvcyhzdGFydCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKQEAgLTI3NiwxMCArMjc0LDkgQEAKIAogCQkJbG9uZyBzaXplOwogCQkJUGFja0JpdG1hcEluZGV4IGlkeDsKLQkJCXRyeSB7Ci0JCQkJY3R4LnN0YXRzLnJlYWRCaXRtYXArKzsKLQkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIEJJVE1BUF9JTkRFWCk7CisJCQljdHguc3RhdHMucmVhZEJpdG1hcCsrOworCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJdHJ5IChSZWFkYWJsZUNoYW5uZWwgcmMgPSBjdHguZGIub3BlbkZpbGUoZGVzYywgQklUTUFQX0lOREVYKSkgewogCQkJCXRyeSB7CiAJCQkJCUlucHV0U3RyZWFtIGluID0gQ2hhbm5lbHMubmV3SW5wdXRTdHJlYW0ocmMpOwogCQkJCQlpbnQgd2FudFNpemUgPSA4MTkyOwpAQCAtMjkzLDcgKzI5MCw2IEBACiAJCQkJCQkJaW4sIGlkeChjdHgpLCBnZXRSZXZlcnNlSWR4KGN0eCkpOwogCQkJCX0gZmluYWxseSB7CiAJCQkJCXNpemUgPSByYy5wb3NpdGlvbigpOwotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeEJ5dGVzICs9IHNpemU7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4TWljcm9zICs9IGVsYXBzZWRNaWNyb3Moc3RhcnQpOwogCQkJCX0KQEAgLTQ0Myw2ICs0MzksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIGNvcHlQYWNrVGhyb3VnaENhY2hlKFBhY2tPdXRwdXRTdHJlYW0gb3V0LCBEZnNSZWFkZXIgY3R4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gRXhwbGljaXRseSBjbG9zZWQgaW4gZmluYWxseSBibG9jawogCQlSZWFkYWJsZUNoYW5uZWwgcmMgPSBudWxsOwogCQl0cnkgewogCQkJbG9uZyBwb3NpdGlvbiA9IDEyOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQppbmRleCBiZjE0ZDE4Li4yZWE1YzM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YQpAQCAtMTE1LDcgKzExNSw3IEBACiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0U3RyZWFtfS4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNSZWFkZXJPcHRpb25zIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CisJcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChpbnQgbmV3TGltaXQpIHsKIAkJc3RyZWFtRmlsZVRocmVzaG9sZCA9IE1hdGgubWF4KDAsIG5ld0xpbWl0KTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQppbmRleCAxOTc2ODE2Li41MTY5ZTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTMzLDcgKzEzMyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKKwlwdWJsaWMgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoYm9vbGVhbiBpbnRlcm5hbCkgewogCQkvLyBEbyBub3Qgc2VuZCBub3RpZmljYXRpb25zLgogCQkvLyBUaGVyZSBpcyBubyBpbmRleCwgYXMgdGhlcmUgaXMgbm8gd29ya2luZyB0cmVlLgogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1N0cmVhbUtleS5qYXZhCmluZGV4IDg3OTNkODMuLmMxMWY2OTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNTdHJlYW1LZXkuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTY3LDcgKzY3LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIERmc1N0cmVhbUtleSBvZihEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24gcmVwbywgU3RyaW5nIG5hbWUsCiAJCQlATnVsbGFibGUgUGFja0V4dCBleHQpIHsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlEZnNTdHJlYW1LZXkocmVwbywgbmFtZS5nZXRCeXRlcyhVVEZfOCksIGV4dCk7CisJCXJldHVybiBuZXcgQnl0ZUFycmF5RGZzU3RyZWFtS2V5KHJlcG8sIG5hbWUuZ2V0Qnl0ZXMoQ0hBUlNFVCksIGV4dCk7CiAJfQogCiAJZmluYWwgaW50IGhhc2g7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCmluZGV4IGZhMmM1MjkuLjM3ZDhkMWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhCkBAIC0xMDQsMzEgKzEwNCwzNCBAQAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJUGFja0lucHV0U3RyZWFtIHBhY2tJbjsKKwkJLy8gY3R4IGlzIGNsb3NlZCBieSBQYWNrSW5wdXRTdHJlYW0sIG9yIGV4cGxpY2l0bHkgaW4gdGhlIGZpbmFsbHkgYmxvY2sKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAkJRGZzUmVhZGVyIGN0eCA9IGRiLm5ld1JlYWRlcigpOwotCQlJbnB1dFN0cmVhbSBpbjsKIAkJdHJ5IHsKLQkJCWluID0gbmV3IFBhY2tJbnB1dFN0cmVhbShwYWNrLCBvYmplY3RPZmZzZXQgKyBoZWFkZXJMZW5ndGgsIGN0eCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHBhY2tHb25lKSB7Ci0JCQkvLyBJZiB0aGUgcGFjayBmaWxlIGNhbm5vdCBiZSBwaW5uZWQgaW50byB0aGUgY3Vyc29yLCBpdAotCQkJLy8gcHJvYmFibHkgd2FzIHJlcGFja2VkIHJlY2VudGx5LiBHbyBmaW5kIHRoZSBvYmplY3QKLQkJCS8vIGFnYWluIGFuZCBvcGVuIHRoZSBzdHJlYW0gZnJvbSB0aGF0IGxvY2F0aW9uIGluc3RlYWQuCi0JCQkvLwogCQkJdHJ5IHsKKwkJCQlwYWNrSW4gPSBuZXcgUGFja0lucHV0U3RyZWFtKAorCQkJCQkJcGFjaywgb2JqZWN0T2Zmc2V0ICsgaGVhZGVyTGVuZ3RoLCBjdHgpOworCQkJCWN0eCA9IG51bGw7IC8vIG93bmVkIGJ5IHBhY2tJbgorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcGFja0dvbmUpIHsKKwkJCQkvLyBJZiB0aGUgcGFjayBmaWxlIGNhbm5vdCBiZSBwaW5uZWQgaW50byB0aGUgY3Vyc29yLCBpdAorCQkJCS8vIHByb2JhYmx5IHdhcyByZXBhY2tlZCByZWNlbnRseS4gR28gZmluZCB0aGUgb2JqZWN0CisJCQkJLy8gYWdhaW4gYW5kIG9wZW4gdGhlIHN0cmVhbSBmcm9tIHRoYXQgbG9jYXRpb24gaW5zdGVhZC4KIAkJCQlPYmplY3RJZCBvYmogPSBwYWNrLmdldFJldmVyc2VJZHgoY3R4KS5maW5kT2JqZWN0KG9iamVjdE9mZnNldCk7CiAJCQkJcmV0dXJuIGN0eC5vcGVuKG9iaiwgdHlwZSkub3BlblN0cmVhbSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQljdHguY2xvc2UoKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKLQkJCWN0eC5jbG9zZSgpOworCQkJaWYgKGN0eCAhPSBudWxsKSB7CisJCQkJY3R4LmNsb3NlKCk7CisJCQl9CiAJCX0KIAogCQkvLyBBbGlnbiBidWZmZXIgdG8gaW5mbGF0ZXIgc2l6ZSwgYXQgYSBsYXJnZXIgdGhhbiBkZWZhdWx0IGJsb2NrLgogCQkvLyBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb250ZXh0IHN3aXRjaGVzIGZyb20gdGhlCiAJCS8vIGNhbGxlciBkb3duIGludG8gdGhlIHBhY2sgc3RyZWFtIGluZmxhdGlvbi4KIAkJaW50IGJ1ZnN6ID0gODE5MjsKLQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLQkJCQluZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShpbiwgY3R4LmluZmxhdGVyKCksIGJ1ZnN6KSwKKwkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKwkJCQluZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShwYWNrSW4sIHBhY2tJbi5jdHguaW5mbGF0ZXIoKSwgYnVmc3opLAogCQkJCWJ1ZnN6KTsKIAkJcmV0dXJuIG5ldyBPYmplY3RTdHJlYW0uRmlsdGVyKHR5cGUsIHNpemUsIGluKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YQppbmRleCBkODgwMTFjLi5iODU5ZDlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvUGFja0lucHV0U3RyZWFtLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBmaW5hbCBjbGFzcyBQYWNrSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBmaW5hbCBEZnNSZWFkZXIgY3R4OworCWZpbmFsIERmc1JlYWRlciBjdHg7CiAKIAlwcml2YXRlIGZpbmFsIERmc1BhY2tGaWxlIHBhY2s7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEKaW5kZXggNmFkZTQzOC4uMWRhNDMwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQml0bWFwSW5kZXhJbXBsLmphdmEKQEAgLTIxMywyMiArMjEzLDYgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBhZGQoQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlKSB7Ci0JCQlpbnQgcG9zaXRpb24gPSBiaXRtYXBJbmRleC5maW5kT3JJbnNlcnQob2JqZWN0SWQsIHR5cGUpOwotCQkJaWYgKGJpdHNldC5jb250YWlucyhwb3NpdGlvbikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlCaXRtYXAgZW50cnkgPSBiaXRtYXBJbmRleC5nZXRCaXRtYXAob2JqZWN0SWQpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlvcihlbnRyeSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQliaXRzZXQuc2V0KHBvc2l0aW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKEFueU9iamVjdElkIG9iamVjdElkKSB7CiAJCQlpbnQgcG9zaXRpb24gPSBiaXRtYXBJbmRleC5maW5kUG9zaXRpb24ob2JqZWN0SWQpOwogCQkJcmV0dXJuIDAgPD0gcG9zaXRpb24gJiYgYml0c2V0LmNvbnRhaW5zKHBvc2l0aW9uKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEKaW5kZXggMzM4ZGY0YS4uYzZmZGViMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUFycmF5V2luZG93LmphdmEKQEAgLTU4LDE0ICs1OCwxNCBAQAogZmluYWwgY2xhc3MgQnl0ZUFycmF5V2luZG93IGV4dGVuZHMgQnl0ZVdpbmRvdyB7CiAJcHJpdmF0ZSBmaW5hbCBieXRlW10gYXJyYXk7CiAKLQlCeXRlQXJyYXlXaW5kb3coZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBvLCBmaW5hbCBieXRlW10gYikgeworCUJ5dGVBcnJheVdpbmRvdyhQYWNrRmlsZSBwYWNrLCBsb25nIG8sIGJ5dGVbXSBiKSB7CiAJCXN1cGVyKHBhY2ssIG8sIGIubGVuZ3RoKTsKIAkJYXJyYXkgPSBiOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CisJcHJvdGVjdGVkIGludCBjb3B5KGludCBwLCBieXRlW10gYiwgaW50IG8sIGludCBuKSB7CiAJCW4gPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSBwLCBuKTsKIAkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgcCwgYiwgbywgbik7CiAJCXJldHVybiBuOwpAQCAtNzMsNyArNzMsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IHNldElucHV0KGZpbmFsIGludCBwb3MsIGZpbmFsIEluZmxhdGVyIGluZikKKwlwcm90ZWN0ZWQgaW50IHNldElucHV0KGludCBwb3MsIEluZmxhdGVyIGluZikKIAkJCXRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJaW50IG4gPSBhcnJheS5sZW5ndGggLSBwb3M7CiAJCWluZi5zZXRJbnB1dChhcnJheSwgcG9zLCBuKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YQppbmRleCA0ZGNmMTMzLi44ZTc5MDRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQnVmZmVyV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhCkBAIC02MCwxNCArNjAsMTQgQEAKIGZpbmFsIGNsYXNzIEJ5dGVCdWZmZXJXaW5kb3cgZXh0ZW5kcyBCeXRlV2luZG93IHsKIAlwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOwogCi0JQnl0ZUJ1ZmZlcldpbmRvdyhmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG8sIGZpbmFsIEJ5dGVCdWZmZXIgYikgeworCUJ5dGVCdWZmZXJXaW5kb3coUGFja0ZpbGUgcGFjaywgbG9uZyBvLCBCeXRlQnVmZmVyIGIpIHsKIAkJc3VwZXIocGFjaywgbywgYi5jYXBhY2l0eSgpKTsKIAkJYnVmZmVyID0gYjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgY29weShmaW5hbCBpbnQgcCwgZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvLCBpbnQgbikgeworCXByb3RlY3RlZCBpbnQgY29weShpbnQgcCwgYnl0ZVtdIGIsIGludCBvLCBpbnQgbikgewogCQlmaW5hbCBCeXRlQnVmZmVyIHMgPSBidWZmZXIuc2xpY2UoKTsKIAkJcy5wb3NpdGlvbihwKTsKIAkJbiA9IE1hdGgubWluKHMucmVtYWluaW5nKCksIG4pOwpAQCAtOTIsNyArOTIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IHNldElucHV0KGZpbmFsIGludCBwb3MsIGZpbmFsIEluZmxhdGVyIGluZikKKwlwcm90ZWN0ZWQgaW50IHNldElucHV0KGludCBwb3MsIEluZmxhdGVyIGluZikKIAkJCXRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUJ1ZmZlciBzID0gYnVmZmVyLnNsaWNlKCk7CiAJCXMucG9zaXRpb24ocG9zKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YQppbmRleCA3OTYzY2VhLi42MDA3M2YzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZVdpbmRvdy5qYXZhCkBAIC03Niw3ICs3Niw3IEBACiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHNpemUgb2YgdGhlIGJ5dGUgd2luZG93CiAJICovCi0JcHJvdGVjdGVkIEJ5dGVXaW5kb3coZmluYWwgUGFja0ZpbGUgcCwgZmluYWwgbG9uZyBzLCBmaW5hbCBpbnQgbikgeworCXByb3RlY3RlZCBCeXRlV2luZG93KFBhY2tGaWxlIHAsIGxvbmcgcywgaW50IG4pIHsKIAkJcGFjayA9IHA7CiAJCXN0YXJ0ID0gczsKIAkJZW5kID0gc3RhcnQgKyBuOwpAQCAtODYsNyArODYsNyBAQAogCQlyZXR1cm4gKGludCkgKGVuZCAtIHN0YXJ0KTsKIAl9CiAKLQlmaW5hbCBib29sZWFuIGNvbnRhaW5zKGZpbmFsIFBhY2tGaWxlIG5lZWRlZEZpbGUsIGZpbmFsIGxvbmcgbmVlZGVkUG9zKSB7CisJZmluYWwgYm9vbGVhbiBjb250YWlucyhQYWNrRmlsZSBuZWVkZWRGaWxlLCBsb25nIG5lZWRlZFBvcykgewogCQlyZXR1cm4gcGFjayA9PSBuZWVkZWRGaWxlICYmIHN0YXJ0IDw9IG5lZWRlZFBvcyAmJiBuZWVkZWRQb3MgPCBlbmQ7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCmluZGV4IGU4MTBhZTAuLjdmN2VjYzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCkBAIC0xODEsMTEgKzE4MSwxMSBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGJvb2xlYW4gaGFzKEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaGFzKG9iamVjdElkLCBudWxsKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaGFzKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykKKwlwcml2YXRlIGJvb2xlYW4gaGFzKEFueU9iamVjdElkIG9iamVjdElkLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh1bnBhY2tlZE9iamVjdHMuY29udGFpbnMob2JqZWN0SWQpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTIwNSw3ICsyMDUsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCU9iamVjdExvYWRlciBvcGVuT2JqZWN0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlPYmplY3RMb2FkZXIgb3Blbk9iamVjdChXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbk9iamVjdChjdXJzLCBvYmplY3RJZCwgbnVsbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0RlbHRhQmFzZUNhY2hlLmphdmEKaW5kZXggYjM5Nzk4OS4uZWQ3M2U3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9EZWx0YUJhc2VDYWNoZS5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAKIAlzdGF0aWMgZmluYWwgU29mdFJlZmVyZW5jZTxFbnRyeT4gREVBRDsKIAotCXByaXZhdGUgc3RhdGljIGludCBoYXNoKGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChsb25nIHBvc2l0aW9uKSB7CiAJCXJldHVybiAoKChpbnQpIHBvc2l0aW9uKSA8PCAyMikgPj4+IDIyOwogCX0KIApAQCAtODIsNyArODIsNyBAQAogCQljYWNoZSA9IG5ldyBTbG90W0NBQ0hFX1NaXTsKIAl9CiAKLQlFbnRyeSBnZXQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCUVudHJ5IGdldChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCVNsb3QgZSA9IGNhY2hlW2hhc2gocG9zaXRpb24pXTsKIAkJaWYgKGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgbW92ZVRvSGVhZChmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgbW92ZVRvSGVhZChTbG90IGUpIHsKIAkJdW5saW5rKGUpOwogCQllLmxydVByZXYgPSBudWxsOwogCQllLmxydU5leHQgPSBscnVIZWFkOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCWxydUhlYWQgPSBlOwogCX0KIAotCXByaXZhdGUgdm9pZCB1bmxpbmsoZmluYWwgU2xvdCBlKSB7CisJcHJpdmF0ZSB2b2lkIHVubGluayhTbG90IGUpIHsKIAkJZmluYWwgU2xvdCBwcmV2ID0gZS5scnVQcmV2OwogCQlmaW5hbCBTbG90IG5leHQgPSBlLmxydU5leHQ7CiAJCWlmIChwcmV2ICE9IG51bGwpCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCW5leHQubHJ1UHJldiA9IHByZXY7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRW50cnkoZmluYWwgU2xvdCBlKSB7CisJcHJpdmF0ZSB2b2lkIGNsZWFyRW50cnkoU2xvdCBlKSB7CiAJCW9wZW5CeXRlQ291bnQgLT0gZS5zejsKIAkJZS5wcm92aWRlciA9IG51bGw7CiAJCWUuZGF0YSA9IERFQUQ7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAogCQlmaW5hbCBpbnQgdHlwZTsKIAotCQlFbnRyeShmaW5hbCBieXRlW10gYURhdGEsIGZpbmFsIGludCBhVHlwZSkgeworCQlFbnRyeShieXRlW10gYURhdGEsIGludCBhVHlwZSkgewogCQkJZGF0YSA9IGFEYXRhOwogCQkJdHlwZSA9IGFUeXBlOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQppbmRleCA5YjgyMjEwLi5kMDI4ODhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKQEAgLTQ2LDggKzQ2LDYgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xMjUsNiArMTIzLDEwIEBACiAJcHJpdmF0ZSBmaW5hbCBGaWxlQmFzZWRDb25maWcgcmVwb0NvbmZpZzsKIAlwcml2YXRlIGZpbmFsIFJlZkRhdGFiYXNlIHJlZnM7CiAJcHJpdmF0ZSBmaW5hbCBPYmplY3REaXJlY3Rvcnkgb2JqZWN0RGF0YWJhc2U7CisKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBzbmFwc2hvdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKwkvLyBwcm90ZWN0ZWQgYnkgc25hcHNob3RMb2NrCiAJcHJpdmF0ZSBGaWxlU25hcHNob3Qgc25hcHNob3Q7CiAKIAkvKioKQEAgLTE0Nyw3ICsxNDksNyBAQAogCSAqICAgICAgICAgICAgIGFjY2Vzc2VkLgogCSAqIEBzZWUgRmlsZVJlcG9zaXRvcnlCdWlsZGVyCiAJICovCi0JcHVibGljIEZpbGVSZXBvc2l0b3J5KGZpbmFsIEZpbGUgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShGaWxlIGdpdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcyhuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkuc2V0R2l0RGlyKGdpdERpcikuc2V0dXAoKSk7CiAJfQogCkBAIC0xNjEsNyArMTYzLDcgQEAKIAkgKiAgICAgICAgICAgICBhY2Nlc3NlZC4KIAkgKiBAc2VlIEZpbGVSZXBvc2l0b3J5QnVpbGRlcgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKG5ldyBGaWxlKGdpdERpcikpOwogCX0KIApAQCAtMTc0LDcgKzE3Niw3IEBACiAJICogICAgICAgICAgICAgdGhlIHVzZXIgY29uZmlndXJhdGlvbiBmaWxlIG9yIHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbiBmaWxlCiAJICogICAgICAgICAgICAgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBCYXNlUmVwb3NpdG9yeUJ1aWxkZXIgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXN1cGVyKG9wdGlvbnMpOwogCiAJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldGVudigKQEAgLTI0MCw4ICsyNDIsOSBAQAogCQkJCQkJTG9uZy52YWx1ZU9mKHJlcG9zaXRvcnlGb3JtYXRWZXJzaW9uKSkpOwogCQl9CiAKLQkJaWYgKCFpc0JhcmUoKSkKKwkJaWYgKCFpc0JhcmUoKSkgewogCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgbG9hZFN5c3RlbUNvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MzEsMzQgKzUzNCw0MyBAQAogCSAqICAgICAgICAgICAgIGluZGV4IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCwgcmVhZCwgb3IgaXMgbm90IHJlY29nbml6ZWQgYXMKIAkgKiAgICAgICAgICAgICBhIEdpdCBwYWNrIGZpbGUgaW5kZXguCiAJICovCi0JcHVibGljIHZvaWQgb3BlblBhY2soZmluYWwgRmlsZSBwYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIG9wZW5QYWNrKEZpbGUgcGFjaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb2JqZWN0RGF0YWJhc2Uub3BlblBhY2socGFjayk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzY2FuRm9yUmVwb0NoYW5nZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsgLy8gVGhpcyB3aWxsIGxvb2sgZm9yIGNoYW5nZXMgdG8gcmVmcworCQlnZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsgLy8gVGhpcyB3aWxsIGxvb2sgZm9yIGNoYW5nZXMgdG8gcmVmcwogCQlkZXRlY3RJbmRleENoYW5nZXMoKTsKIAl9CiAKIAkvKiogRGV0ZWN0IGluZGV4IGNoYW5nZXMuICovCiAJcHJpdmF0ZSB2b2lkIGRldGVjdEluZGV4Q2hhbmdlcygpIHsKLQkJaWYgKGlzQmFyZSgpKQorCQlpZiAoaXNCYXJlKCkpIHsKIAkJCXJldHVybjsKKwkJfQogCiAJCUZpbGUgaW5kZXhGaWxlID0gZ2V0SW5kZXhGaWxlKCk7Ci0JCWlmIChzbmFwc2hvdCA9PSBudWxsKQotCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShpbmRleEZpbGUpOwotCQllbHNlIGlmIChzbmFwc2hvdC5pc01vZGlmaWVkKGluZGV4RmlsZSkpCi0JCQlub3RpZnlJbmRleENoYW5nZWQoKTsKKwkJc3luY2hyb25pemVkIChzbmFwc2hvdExvY2spIHsKKwkJCWlmIChzbmFwc2hvdCA9PSBudWxsKSB7CisJCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShpbmRleEZpbGUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICghc25hcHNob3QuaXNNb2RpZmllZChpbmRleEZpbGUpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCW5vdGlmeUluZGV4Q2hhbmdlZChmYWxzZSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoKSB7Ci0JCXNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUoZ2V0SW5kZXhGaWxlKCkpOwotCQlmaXJlRXZlbnQobmV3IEluZGV4Q2hhbmdlZEV2ZW50KCkpOworCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZChib29sZWFuIGludGVybmFsKSB7CisJCXN5bmNocm9uaXplZCAoc25hcHNob3RMb2NrKSB7CisJCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGdldEluZGV4RmlsZSgpKTsKKwkJfQorCQlmaXJlRXZlbnQobmV3IEluZGV4Q2hhbmdlZEV2ZW50KGludGVybmFsKSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVTbmFwc2hvdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEKaW5kZXggYjU0ODVjNC4uZjI2ZWJhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEKQEAgLTI2OCw3ICsyNjgsNyBAQAogCQkJCSsgIiwgcmVhZDogIiArIGYuZm9ybWF0KG5ldyBEYXRlKGxhc3RSZWFkKSkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBub3RSYWN5Q2xlYW4oZmluYWwgbG9uZyByZWFkKSB7CisJcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihsb25nIHJlYWQpIHsKIAkJLy8gVGhlIGxhc3QgbW9kaWZpZWQgdGltZSBncmFudWxhcml0eSBvZiBGQVQgZmlsZXN5c3RlbXMgaXMgMiBzZWNvbmRzLgogCQkvLyBVc2luZyAyLjUgc2Vjb25kcyBoZXJlIHByb3ZpZGVzIGEgcmVhc29uYWJseSBoaWdoIGFzc3VyYW5jZSB0aGF0CiAJCS8vIGEgbW9kaWZpY2F0aW9uIHdhcyBub3QgbWlzc2VkLgpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCXJldHVybiByZWFkIC0gbGFzdE1vZGlmaWVkID4gMjUwMDsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZChmaW5hbCBsb25nIGN1cnJMYXN0TW9kaWZpZWQpIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZChsb25nIGN1cnJMYXN0TW9kaWZpZWQpIHsKIAkJLy8gQW55IGRpZmZlcmVuY2UgaW5kaWNhdGVzIHRoZSBwYXRoIHdhcyBtb2RpZmllZC4KIAkJLy8KIAkJaWYgKGxhc3RNb2RpZmllZCAhPSBjdXJyTGFzdE1vZGlmaWVkKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0dDLmphdmEKaW5kZXggMDU5OGRkZC4uODU5ZGI0OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhCkBAIC03NjksNyArNzY5LDggQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgdm9pZCBwYWNrUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfUkVGUykudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpCisJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9SRUZTKTsKIAkJTGlzdDxTdHJpbmc+IHJlZnNUb0JlUGFja2VkID0gbmV3IEFycmF5TGlzdDw+KHJlZnMuc2l6ZSgpKTsKIAkJcG0uYmVnaW5UYXNrKEpHaXRUZXh0LmdldCgpLnBhY2tSZWZzLCByZWZzLnNpemUoKSk7CiAJCXRyeSB7CkBAIC04MzUsNyArODM2LDcgQEAKIAkJfQogCiAJCUxpc3Q8T2JqZWN0SWRTZXQ+IGV4Y2x1ZGVkID0gbmV3IExpbmtlZExpc3Q8PigpOwotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgeworCQlmb3IgKFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgewogCQkJY2hlY2tDYW5jZWxsZWQoKTsKIAkJCWlmIChmLnNob3VsZEJlS2VwdCgpKQogCQkJCWV4Y2x1ZGVkLmFkZChmLmdldEluZGV4KCkpOwpAQCAtOTk4LDYgKzk5OSw5IEBACiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZVRlbXBQYWNrc0lkeCgpIHsKIAkJUGF0aCBwYWNrRGlyID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKS50b1BhdGgoKTsKIAkJSW5zdGFudCB0aHJlc2hvbGQgPSBJbnN0YW50Lm5vdygpLm1pbnVzKDEsIENocm9ub1VuaXQuREFZUyk7CisJCWlmICghRmlsZXMuZXhpc3RzKHBhY2tEaXIpKSB7CisJCQlyZXR1cm47CisJCX0KIAkJdHJ5IChEaXJlY3RvcnlTdHJlYW08UGF0aD4gc3RyZWFtID0KIAkJCQlGaWxlcy5uZXdEaXJlY3RvcnlTdHJlYW0ocGFja0RpciwgImdjXypfdG1wIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJc3RyZWFtLmZvckVhY2godCAtPiB7CkBAIC0xMDU5LDcgKzEwNjMsNyBAQAogCSAqLwogCXByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGdldEFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZEYXRhYmFzZSByZWZkYiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVmZGIuZ2V0UmVmcygpOwogCQlMaXN0PFJlZj4gYWRkbCA9IHJlZmRiLmdldEFkZGl0aW9uYWxSZWZzKCk7CiAJCWlmICghYWRkbC5pc0VtcHR5KCkpIHsKIAkJCUxpc3Q8UmVmPiBhbGwgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkgKyBhZGRsLnNpemUoKSk7CkBAIC0xMzY3LDcgKzEzNzEsNyBAQAogCQl9CiAKIAkJUmVmRGF0YWJhc2UgcmVmRGIgPSByZXBvLmdldFJlZkRhdGFiYXNlKCk7Ci0JCWZvciAoUmVmIHIgOiByZWZEYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgciA6IHJlZkRiLmdldFJlZnMoKSkgewogCQkJU3RvcmFnZSBzdG9yYWdlID0gci5nZXRTdG9yYWdlKCk7CiAJCQlpZiAoc3RvcmFnZSA9PSBTdG9yYWdlLkxPT1NFIHx8IHN0b3JhZ2UgPT0gU3RvcmFnZS5MT09TRV9QQUNLRUQpCiAJCQkJcmV0Lm51bWJlck9mTG9vc2VSZWZzKys7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NMb2cuamF2YQppbmRleCA4MjQ1OGMxLi4wZTU4N2NlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xNzEsNiArMTcxLDYgQEAKIAkJaWYgKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7CiAJCQlub25FbXB0eSA9IHRydWU7CiAJCX0KLQkJbG9jay53cml0ZShjb250ZW50LmdldEJ5dGVzKFVURl84KSk7CisJCWxvY2sud3JpdGUoY29udGVudC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhCmluZGV4IDNkMGU5YzcuLmM4MmQ1MmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xhenlPYmplY3RJZFNldEZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC04Niw3ICs4Niw3IEBACiAJcHJpdmF0ZSBPYmplY3RJZE93bmVyTWFwPEVudHJ5PiBsb2FkKCkgewogCQlPYmplY3RJZE93bmVyTWFwPEVudHJ5PiByID0gbmV3IE9iamVjdElkT3duZXJNYXA8PigpOwogCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCQkJUmVhZGVyIHJpbiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaW4sIFVURl84KTsKKwkJCQlSZWFkZXIgcmluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpbiwgQ0hBUlNFVCk7CiAJCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmluKSkgewogCQkJTXV0YWJsZU9iamVjdElkIGlkID0gbmV3IE11dGFibGVPYmplY3RJZCgpOwogCQkJZm9yIChTdHJpbmcgbGluZTsgKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsOykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2FsT2JqZWN0VG9QYWNrLmphdmEKaW5kZXggNTVlZWI5NS4uZWQ1Y2JmYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJLyoqIExlbmd0aCBvZiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBvYmplY3QuICovCiAJbG9uZyBsZW5ndGg7CiAKLQlMb2NhbE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGZpbmFsIGludCB0eXBlKSB7CisJTG9jYWxPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSkgewogCQlzdXBlcihzcmMsIHR5cGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEKaW5kZXggOWJlZmUyYS4uYjgwYzU4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhCkBAIC05Myw3ICs5Myw3IEBACiAJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdW5sb2NrZWQsIGZhbHNlIGlmIHVubG9ja2luZyBmYWlsZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5sb2NrKGZpbmFsIEZpbGUgZmlsZSkgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1bmxvY2soRmlsZSBmaWxlKSB7CiAJCWZpbmFsIEZpbGUgbG9ja0ZpbGUgPSBnZXRMb2NrRmlsZShmaWxlKTsKIAkJZmluYWwgaW50IGZsYWdzID0gRmlsZVV0aWxzLlJFVFJZIHwgRmlsZVV0aWxzLlNLSVBfTUlTU0lORzsKIAkJdHJ5IHsKQEAgLTE0NCwyNiArMTQ0LDggQEAKIAkgKgogCSAqIEBwYXJhbSBmCiAJICogICAgICAgICAgICB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgbG9ja2VkLgotCSAqIEBwYXJhbSBmcwotCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KLQkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGUjTG9ja0ZpbGUoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAogCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIExvY2tGaWxlKGZpbmFsIEZpbGUgZiwgZmluYWwgRlMgZnMpIHsKLQkJcmVmID0gZjsKLQkJbGNrID0gZ2V0TG9ja0ZpbGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbG9jayBmb3IgYW55IGZpbGUuCi0JICoKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgTG9ja0ZpbGUoZmluYWwgRmlsZSBmKSB7CisJcHVibGljIExvY2tGaWxlKEZpbGUgZikgewogCQlyZWYgPSBmOwogCQlsY2sgPSBnZXRMb2NrRmlsZShyZWYpOwogCX0KQEAgLTI4Miw3ICsyNjQsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4gVGhlIGxvY2sgaXMgcmVsZWFzZWQKIAkgKiAgICAgICAgICAgICBiZWZvcmUgdGhyb3dpbmcgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggKyAxXTsKIAkJaWQuY29weVRvKGJ1ZiwgMCk7CiAJCWJ1ZltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdID0gJ1xuJzsKQEAgLTMwMyw3ICsyODUsNyBAQAogCSAqICAgICAgICAgICAgIHRoZSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4gVGhlIGxvY2sgaXMgcmVsZWFzZWQKIAkgKiAgICAgICAgICAgICBiZWZvcmUgdGhyb3dpbmcgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlcXVpcmVMb2NrKCk7CiAJCXRyeSB7CiAJCQlpZiAoZnN5bmMpIHsKQEAgLTM0OSwxOCArMzMxLDE4IEBACiAKIAkJcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbywgZmluYWwgaW50IG4pCisJCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG8sIGludCBuKQogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiLCBvLCBuKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiKTsKIAkJCX0KIApAQCAtNDAwLDcgKzM4Miw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb21taXQgbWV0aG9kIG11c3QgcmVtZW1iZXIgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oYm9vbGVhbiBvbikgewogCQlzZXROZWVkU25hcHNob3Qob24pOwogCX0KIApAQCAtNDExLDcgKzM5Myw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb21taXQgbWV0aG9kIG11c3QgcmVtZW1iZXIgdGhlIEZpbGVTbmFwc2hvdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZWVkU25hcHNob3QoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE5lZWRTbmFwc2hvdChib29sZWFuIG9uKSB7CiAJCW5lZWRTbmFwc2hvdCA9IG9uOwogCX0KIApAQCAtNDIxLDcgKzQwMyw3IEBACiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIGRpcnR5IGRhdGEgc2hvdWxkIGJlIGZvcmNlZCB0byB0aGUgZHJpdmUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RlN5bmMoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldEZTeW5jKGJvb2xlYW4gb24pIHsKIAkJZnN5bmMgPSBvbjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggODgxZTM4Zi4uMmI2ZDIzMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkvLyBGdWxseSBjbG9zZSBhbGwgbG9hZGVkIGFsdGVybmF0ZXMgYW5kIGNsZWFyIHRoZSBhbHRlcm5hdGUgbGlzdC4KIAkJQWx0ZXJuYXRlSGFuZGxlW10gYWx0ID0gYWx0ZXJuYXRlcy5nZXQoKTsKIAkJaWYgKGFsdCAhPSBudWxsICYmIGFsdGVybmF0ZXMuY29tcGFyZUFuZFNldChhbHQsIG51bGwpKSB7Ci0JCQlmb3IoZmluYWwgQWx0ZXJuYXRlSGFuZGxlIG9kIDogYWx0KQorCQkJZm9yKEFsdGVybmF0ZUhhbmRsZSBvZCA6IGFsdCkKIAkJCQlvZC5jbG9zZSgpOwogCQl9CiAJfQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJICogQWRkIGEgc2luZ2xlIGV4aXN0aW5nIHBhY2sgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2sgZmlsZXMuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFBhY2tGaWxlIG9wZW5QYWNrKGZpbmFsIEZpbGUgcGFjaykKKwlwdWJsaWMgUGFja0ZpbGUgb3BlblBhY2soRmlsZSBwYWNrKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHAgPSBwYWNrLmdldE5hbWUoKTsKIAkJaWYgKHAubGVuZ3RoKCkgIT0gNTAgfHwgIXAuc3RhcnRzV2l0aCgicGFjay0iKSB8fCAhcC5lbmRzV2l0aCgiLnBhY2siKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC02MjIsNyArNjIyLDcgQEAKIAkJCVdpbmRvd0N1cnNvciBjdXJzLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUGFja0xpc3QgcExpc3QgPSBwYWNrTGlzdC5nZXQoKTsKIAkJU0VBUkNIOiBmb3IgKDs7KSB7Ci0JCQlmb3IgKGZpbmFsIFBhY2tGaWxlIHAgOiBwTGlzdC5wYWNrcykgeworCQkJZm9yIChQYWNrRmlsZSBwIDogcExpc3QucGFja3MpIHsKIAkJCQl0cnkgewogCQkJCQlMb2NhbE9iamVjdFJlcHJlc2VudGF0aW9uIHJlcCA9IHAucmVwcmVzZW50YXRpb24oY3Vycywgb3RwKTsKIAkJCQkJcC5yZXNldFRyYW5zaWVudEVycm9yQ291bnQoKTsKQEAgLTgxOSw3ICs4MTksNyBAQAogCQlyZXR1cm4gc2hhbGxvd0NvbW1pdHNJZHM7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBhY2soZmluYWwgUGFja0ZpbGUgcGYpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0UGFjayhQYWNrRmlsZSBwZikgewogCQlQYWNrTGlzdCBvLCBuOwogCQlkbyB7CiAJCQlvID0gcGFja0xpc3QuZ2V0KCk7CkBAIC04NDIsNyArODQyLDcgQEAKIAkJfSB3aGlsZSAoIXBhY2tMaXN0LmNvbXBhcmVBbmRTZXQobywgbikpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVQYWNrKGZpbmFsIFBhY2tGaWxlIGRlYWRQYWNrKSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZVBhY2soUGFja0ZpbGUgZGVhZFBhY2spIHsKIAkJUGFja0xpc3QgbywgbjsKIAkJZG8gewogCQkJbyA9IHBhY2tMaXN0LmdldCgpOwpAQCAtODYwLDcgKzg2MCw3IEBACiAJCWRlYWRQYWNrLmNsb3NlKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoZmluYWwgUGFja0ZpbGVbXSBsaXN0LCBmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoUGFja0ZpbGVbXSBsaXN0LCBQYWNrRmlsZSBwYWNrKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogCQkJaWYgKGxpc3RbaV0gPT0gcGFjaykKIAkJCQlyZXR1cm4gaTsKQEAgLTg2OCw3ICs4NjgsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3MoZmluYWwgUGFja0xpc3Qgb3JpZ2luYWwpIHsKKwlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrcyhQYWNrTGlzdCBvcmlnaW5hbCkgewogCQlzeW5jaHJvbml6ZWQgKHBhY2tMaXN0KSB7CiAJCQlQYWNrTGlzdCBvLCBuOwogCQkJZG8gewpAQCAtODg3LDEzICs4ODcsMTMgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzSW1wbChmaW5hbCBQYWNrTGlzdCBvbGQpIHsKKwlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrc0ltcGwoUGFja0xpc3Qgb2xkKSB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFBhY2tGaWxlPiBmb3JSZXVzZSA9IHJldXNlTWFwKG9sZCk7CiAJCWZpbmFsIEZpbGVTbmFwc2hvdCBzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKHBhY2tEaXJlY3RvcnkpOwogCQlmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lcyA9IGxpc3RQYWNrRGlyZWN0b3J5KCk7CiAJCWZpbmFsIExpc3Q8UGFja0ZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4obmFtZXMuc2l6ZSgpID4+IDIpOwogCQlib29sZWFuIGZvdW5kTmV3ID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgU3RyaW5nIGluZGV4TmFtZSA6IG5hbWVzKSB7CisJCWZvciAoU3RyaW5nIGluZGV4TmFtZSA6IG5hbWVzKSB7CiAJCQkvLyBNdXN0IG1hdGNoICJwYWNrLVswLTlhLWZdezQwfS5pZHgiIHRvIGJlIGFuIGluZGV4LgogCQkJLy8KIAkJCWlmIChpbmRleE5hbWUubGVuZ3RoKCkgIT0gNDkgfHwgIWluZGV4TmFtZS5lbmRzV2l0aCgiLmlkeCIpKSAvLyROT04tTkxTLTEkCkBAIC05MzYsNyArOTM2LDcgQEAKIAkJCXJldHVybiBvbGQ7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIHAgOiBmb3JSZXVzZS52YWx1ZXMoKSkgeworCQlmb3IgKFBhY2tGaWxlIHAgOiBmb3JSZXVzZS52YWx1ZXMoKSkgewogCQkJcC5jbG9zZSgpOwogCQl9CiAKQEAgLTk0OCw5ICs5NDgsOSBAQAogCQlyZXR1cm4gbmV3IFBhY2tMaXN0KHNuYXBzaG90LCByKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gcmV1c2VNYXAoZmluYWwgUGFja0xpc3Qgb2xkKSB7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUGFja0ZpbGU+IHJldXNlTWFwKFBhY2tMaXN0IG9sZCkgewogCQlmaW5hbCBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gZm9yUmV1c2UgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoZmluYWwgUGFja0ZpbGUgcCA6IG9sZC5wYWNrcykgeworCQlmb3IgKFBhY2tGaWxlIHAgOiBvbGQucGFja3MpIHsKIAkJCWlmIChwLmludmFsaWQoKSkgewogCQkJCS8vIFRoZSBwYWNrIGluc3RhbmNlIGlzIGNvcnJ1cHRlZCwgYW5kIGNhbm5vdCBiZSBzYWZlbHkgdXNlZAogCQkJCS8vIGFnYWluLiBEbyBub3QgaW5jbHVkZSBpdCBpbiBvdXIgcmV1c2UgbWFwLgpAQCAtOTc5LDcgKzk3OSw3IEBACiAJCWlmIChuYW1lTGlzdCA9PSBudWxsKQogCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAJCWZpbmFsIFNldDxTdHJpbmc+IG5hbWVTZXQgPSBuZXcgSGFzaFNldDw+KG5hbWVMaXN0Lmxlbmd0aCA8PCAxKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbmFtZSA6IG5hbWVMaXN0KSB7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lTGlzdCkgewogCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgicGFjay0iKSkgLy8kTk9OLU5MUy0xJAogCQkJCW5hbWVTZXQuYWRkKG5hbWUpOwogCQl9CkBAIC0xMDM4LDEyICsxMDM4LDEyIEBACiAJCXJldHVybiBsLnRvQXJyYXkobmV3IEFsdGVybmF0ZUhhbmRsZVtsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG9wZW4oZmluYWwgRmlsZSBmKQorCXByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG9wZW4oRmlsZSBmKQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZikpOwogCX0KIAotCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBvYmpkaXIgPSBmcy5yZXNvbHZlKG9iamVjdHMsIGxvY2F0aW9uKTsKIAkJcmV0dXJuIG9wZW5BbHRlcm5hdGUob2JqZGlyKTsKQEAgLTEwODEsNyArMTA4MSw3IEBACiAJCS8qKiBBbGwga25vd24gcGFja3MsIHNvcnRlZCBieSB7QGxpbmsgUGFja0ZpbGUjU09SVH0uICovCiAJCWZpbmFsIFBhY2tGaWxlW10gcGFja3M7CiAKLQkJUGFja0xpc3QoZmluYWwgRmlsZVNuYXBzaG90IG1vbml0b3IsIGZpbmFsIFBhY2tGaWxlW10gcGFja3MpIHsKKwkJUGFja0xpc3QoRmlsZVNuYXBzaG90IG1vbml0b3IsIFBhY2tGaWxlW10gcGFja3MpIHsKIAkJCXRoaXMuc25hcHNob3QgPSBtb25pdG9yOwogCQkJdGhpcy5wYWNrcyA9IHBhY2tzOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIuamF2YQppbmRleCBlMDZmNzIxLi5lNWE1NGUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAogCXByaXZhdGUgRGVmbGF0ZXIgZGVmbGF0ZTsKIAotCU9iamVjdERpcmVjdG9yeUluc2VydGVyKGZpbmFsIEZpbGVPYmplY3REYXRhYmFzZSBkZXN0LCBmaW5hbCBDb25maWcgY2ZnKSB7CisJT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIoRmlsZU9iamVjdERhdGFiYXNlIGRlc3QsIENvbmZpZyBjZmcpIHsKIAkJZGIgPSBkZXN0OwogCQljb25maWcgPSBjZmcuZ2V0KFdyaXRlQ29uZmlnLktFWSk7CiAJfQpAQCAtMTE3LDcgKzExNyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RJZCBpbnNlcnQoZmluYWwgaW50IHR5cGUsIGxvbmcgbGVuLCBmaW5hbCBJbnB1dFN0cmVhbSBpcykKKwlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGludCB0eXBlLCBsb25nIGxlbiwgSW5wdXRTdHJlYW0gaXMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaW5zZXJ0KHR5cGUsIGxlbiwgaXMsIGZhbHNlKTsKIAl9CkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJfQogCX0KIAotCXZvaWQgd3JpdGVIZWFkZXIoT3V0cHV0U3RyZWFtIG91dCwgZmluYWwgaW50IHR5cGUsIGxvbmcgbGVuKQorCXZvaWQgd3JpdGVIZWFkZXIoT3V0cHV0U3RyZWFtIG91dCwgaW50IHR5cGUsIGxvbmcgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0LndyaXRlKENvbnN0YW50cy5lbmNvZGVkVHlwZVN0cmluZyh0eXBlKSk7CiAJCW91dC53cml0ZSgoYnl0ZSkgJyAnKTsKQEAgLTI3OSw3ICsyNzksNyBAQAogCQlyZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgibm96IiwgbnVsbCwgZGIuZ2V0RGlyZWN0b3J5KCkpOyAvLyROT04tTkxTLTEkCiAJfQogCi0JRGVmbGF0ZXJPdXRwdXRTdHJlYW0gY29tcHJlc3MoZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgeworCURlZmxhdGVyT3V0cHV0U3RyZWFtIGNvbXByZXNzKE91dHB1dFN0cmVhbSBvdXQpIHsKIAkJaWYgKGRlZmxhdGUgPT0gbnVsbCkKIAkJCWRlZmxhdGUgPSBuZXcgRGVmbGF0ZXIoY29uZmlnLmdldENvbXByZXNzaW9uKCkpOwogCQllbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEKaW5kZXggNWRjYmE2MC4uMGNlYzJkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YQpAQCAtMTUzLDcgKzE1Myw3IEBACiAJICogQHBhcmFtIGVtcHR5CiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBrZWVwaW5nIGFuIGVtcHR5IHBhY2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0S2VlcEVtcHR5KGZpbmFsIGJvb2xlYW4gZW1wdHkpIHsKKwlwdWJsaWMgdm9pZCBzZXRLZWVwRW1wdHkoYm9vbGVhbiBlbXB0eSkgewogCQlrZWVwRW1wdHkgPSBlbXB0eTsKIAl9CiAKQEAgLTQyOSw4ICs0MjksNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlSWR4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0ID0gZ2V0U29ydGVkT2JqZWN0TGlzdChudWxsIC8qIGJ5IE9iamVjdElkICovKTsKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCkpIHsKIAkJCWZpbmFsIFBhY2tJbmRleFdyaXRlciBpdzsKIAkJCWlmIChpbmRleFZlcnNpb24gPD0gMCkKIAkJCQlpdyA9IFBhY2tJbmRleFdyaXRlci5jcmVhdGVPbGRlc3RQb3NzaWJsZShvcywgbGlzdCk7CkBAIC00MzgsMTIgKzQzNywxMCBAQAogCQkJCWl3ID0gUGFja0luZGV4V3JpdGVyLmNyZWF0ZVZlcnNpb24ob3MsIGluZGV4VmVyc2lvbik7CiAJCQlpdy53cml0ZShsaXN0LCBwYWNrSGFzaCk7CiAJCQlvcy5nZXRDaGFubmVsKCkuZm9yY2UodHJ1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcy5jbG9zZSgpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYWNrTG9jayByZW5hbWVBbmRPcGVuUGFjayhmaW5hbCBTdHJpbmcgbG9ja01lc3NhZ2UpCisJcHJpdmF0ZSBQYWNrTG9jayByZW5hbWVBbmRPcGVuUGFjayhTdHJpbmcgbG9ja01lc3NhZ2UpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWtlZXBFbXB0eSAmJiBnZXRPYmplY3RDb3VudCgpID09IDApIHsKIAkJCWNsZWFudXBUZW1wb3JhcnlGaWxlcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQppbmRleCAyMWExYzdmLi42NzcyZTJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQpAQCAtNDQsNyArNDQsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC01Myw2ICs1Miw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZWNvZGUuamF2YWV3YWguRVdBSENvbXByZXNzZWRCaXRtYXA7CiAKQEAgLTkzLDE5ICs5MywxNSBAQAogCXB1YmxpYyBzdGF0aWMgUGFja0JpdG1hcEluZGV4IG9wZW4oCiAJCQlGaWxlIGlkeEZpbGUsIFBhY2tJbmRleCBwYWNrSW5kZXgsIFBhY2tSZXZlcnNlSW5kZXggcmV2ZXJzZUluZGV4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpZHhGaWxlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiByZWFkKGZkLCBwYWNrSW5kZXgsIHJldmVyc2VJbmRleCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnJlYWRhYmxlUGFja0luZGV4LAotCQkJCQkJCWlkeEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAotCQkJCQlpb2UpOwotCQl9IGZpbmFsbHkgeworCQl0cnkgKFNpbGVudEZpbGVJbnB1dFN0cmVhbSBmZCA9IG5ldyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0oCisJCQkJaWR4RmlsZSkpIHsKIAkJCXRyeSB7Ci0JCQkJZmQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKLQkJCQkvLyBpZ25vcmUKKwkJCQlyZXR1cm4gcmVhZChmZCwgcGFja0luZGV4LCByZXZlcnNlSW5kZXgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKKwkJCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCisJCQkJCQlpb2UpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlLmphdmEKaW5kZXggMzQxMTU3Zi4uZWUzYzBhOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkvKiogU29ydHMgUGFja0ZpbGVzIHRvIGJlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0byBsZWFzdCByZWNlbnRseSBjcmVhdGVkLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQYWNrRmlsZT4gU09SVCA9IG5ldyBDb21wYXJhdG9yPFBhY2tGaWxlPigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYWNrRmlsZSBhLCBmaW5hbCBQYWNrRmlsZSBiKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShQYWNrRmlsZSBhLCBQYWNrRmlsZSBiKSB7CiAJCQlyZXR1cm4gYi5wYWNrTGFzdE1vZGlmaWVkIC0gYS5wYWNrTGFzdE1vZGlmaWVkOwogCQl9CiAJfTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCSAqIEBwYXJhbSBleHRlbnNpb25zCiAJICogICAgICAgICAgICBhZGRpdGlvbmFsIHBhY2sgZmlsZSBleHRlbnNpb25zIHdpdGggdGhlIHNhbWUgYmFzZSBhcyB0aGUgcGFjawogCSAqLwotCXB1YmxpYyBQYWNrRmlsZShmaW5hbCBGaWxlIHBhY2tGaWxlLCBpbnQgZXh0ZW5zaW9ucykgeworCXB1YmxpYyBQYWNrRmlsZShGaWxlIHBhY2tGaWxlLCBpbnQgZXh0ZW5zaW9ucykgewogCQl0aGlzLnBhY2tGaWxlID0gcGFja0ZpbGU7CiAJCXRoaXMuZmlsZVNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUocGFja0ZpbGUpOwogCQl0aGlzLnBhY2tMYXN0TW9kaWZpZWQgPSAoaW50KSAoZmlsZVNuYXBzaG90Lmxhc3RNb2RpZmllZCgpID4+IDEwKTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0KGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBvZmZzZXQgPSBpZHgoKS5maW5kT2Zmc2V0KGlkKTsKIAkJcmV0dXJuIDAgPCBvZmZzZXQgJiYgIWlzQ29ycnVwdChvZmZzZXQpOwogCX0KQEAgLTI5Myw3ICsyOTMsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgcGFjayBmaWxlIG9yIHRoZSBpbmRleCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlPYmplY3RMb2FkZXIgZ2V0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlPYmplY3RMb2FkZXIgZ2V0KFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgb2Zmc2V0ID0gaWR4KCkuZmluZE9mZnNldChpZCk7CiAJCXJldHVybiAwIDwgb2Zmc2V0ICYmICFpc0NvcnJ1cHQob2Zmc2V0KSA/IGxvYWQoY3Vycywgb2Zmc2V0KSA6IG51bGw7CkBAIC0zNTgsNyArMzU4LDcgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgY2Fubm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlPYmplY3RJZCBmaW5kT2JqZWN0Rm9yT2Zmc2V0KGZpbmFsIGxvbmcgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCU9iamVjdElkIGZpbmRPYmplY3RGb3JPZmZzZXQobG9uZyBvZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZXZlcnNlSWR4KCkuZmluZE9iamVjdChvZmZzZXQpOwogCX0KIApAQCAtNzE3LDcgKzcxNyw3IEBACiAJCX0KIAl9CiAKLQlCeXRlQXJyYXlXaW5kb3cgcmVhZChmaW5hbCBsb25nIHBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQnl0ZUFycmF5V2luZG93IHJlYWQobG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzeW5jaHJvbml6ZWQgKHJlYWRMb2NrKSB7CiAJCQlpZiAoaW52YWxpZCB8fCBmZCA9PSBudWxsKSB7CiAJCQkJLy8gRHVlIHRvIGNvbmN1cnJlbmN5IGJldHdlZW4gYSByZWFkIGFuZCBhbm90aGVyIHBhY2tmaWxlIGludmFsaWRhdGlvbiB0aHJlYWQKQEAgLTczNiw3ICs3MzYsNyBAQAogCQl9CiAJfQogCi0JQnl0ZVdpbmRvdyBtbWFwKGZpbmFsIGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlCeXRlV2luZG93IG1tYXAobG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzeW5jaHJvbml6ZWQgKHJlYWRMb2NrKSB7CiAJCQlpZiAobGVuZ3RoIDwgcG9zICsgc2l6ZSkKIAkJCQlzaXplID0gKGludCkgKGxlbmd0aCAtIHBvcyk7CkBAIC03OTMsNyArNzkzLDcgQEAKIAkJfQogCX0KIAotCU9iamVjdExvYWRlciBsb2FkKGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKKwlPYmplY3RMb2FkZXIgbG9hZChXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIExhcmdlT2JqZWN0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwpAQCAtOTgyLDcgKzk4Miw3IEBACiAJCXJldHVybiBoZHI7CiAJfQogCi0JaW50IGdldE9iamVjdFR5cGUoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWludCBnZXRPYmplY3RUeXBlKFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGliID0gY3Vycy50ZW1wSWQ7CiAJCWZvciAoOzspIHsKIAkJCXJlYWRGdWxseShwb3MsIGliLCAwLCAyMCwgY3Vycyk7CkBAIC0xMDI5LDEzICsxMDI5LDEzIEBACiAJCX0KIAl9CiAKLQlsb25nIGdldE9iamVjdFNpemUoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGZpbmFsIEFueU9iamVjdElkIGlkKQorCWxvbmcgZ2V0T2JqZWN0U2l6ZShXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBsb25nIG9mZnNldCA9IGlkeCgpLmZpbmRPZmZzZXQoaWQpOwogCQlyZXR1cm4gMCA8IG9mZnNldCA/IGdldE9iamVjdFNpemUoY3Vycywgb2Zmc2V0KSA6IC0xOwogCX0KIAotCWxvbmcgZ2V0T2JqZWN0U2l6ZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgZmluYWwgbG9uZyBwb3MpCisJbG9uZyBnZXRPYmplY3RTaXplKFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwogCQlyZWFkRnVsbHkocG9zLCBpYiwgMCwgMjAsIGN1cnMpOwpAQCAtMTEzMyw3ICsxMTMzLDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgbG9uZyBmaW5kRW5kT2Zmc2V0KGZpbmFsIGxvbmcgc3RhcnRPZmZzZXQpCisJcHJpdmF0ZSBsb25nIGZpbmRFbmRPZmZzZXQobG9uZyBzdGFydE9mZnNldCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgbWF4T2Zmc2V0ID0gbGVuZ3RoIC0gMjA7CiAJCXJldHVybiBnZXRSZXZlcnNlSWR4KCkuZmluZE5leHRPZmZzZXQoc3RhcnRPZmZzZXQsIG1heE9mZnNldCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCmluZGV4IGFjZmQ5YzQuLjcyNjk5YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCkBAIC00NSw3ICs0NSw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTY0LDYgKzYzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZFNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk5COworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogQWNjZXNzIHBhdGggdG8gbG9jYXRlIG9iamVjdHMgYnkge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkfSBpbiBhCkBAIC05NCwyMSArOTQsMTUgQEAKIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMgYnV0IGNvdWxkIG5vdCBiZSByZWFkIGR1ZSB0byBzZWN1cml0eSBlcnJvcnMsCiAJICogICAgICAgICAgICAgdW5yZWNvZ25pemVkIGRhdGEgdmVyc2lvbiwgb3IgdW5leHBlY3RlZCBkYXRhIGNvcnJ1cHRpb24uCiAJICovCi0JcHVibGljIHN0YXRpYyBQYWNrSW5kZXggb3BlbihmaW5hbCBGaWxlIGlkeEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmZCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaWR4RmlsZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVhZChmZCk7CisJcHVibGljIHN0YXRpYyBQYWNrSW5kZXggb3BlbihGaWxlIGlkeEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQlpZHhGaWxlKSkgeworCQkJCXJldHVybiByZWFkKGZkKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCiAJCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCiAJCQkJCWlvZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWZkLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIyKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9CiAJCX0KIAl9CiAKQEAgLTE0NSw3ICsxMzksNyBAQAogCQlyZXR1cm4gbmV3IFBhY2tJbmRleFYxKGZkLCBoZHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUT0MoZmluYWwgYnl0ZVtdIGgpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVE9DKGJ5dGVbXSBoKSB7CiAJCWZpbmFsIGJ5dGVbXSB0b2MgPSBQYWNrSW5kZXhXcml0ZXIuVE9DOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHRvYy5sZW5ndGg7IGkrKykKIAkJCWlmIChoW2ldICE9IHRvY1tpXSkKQEAgLTE2Myw3ICsxNTcsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBsb29rIGZvci4gTXVzdCBub3QgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBsaXN0ZWQgaW4gdGhpcyBpbmRleDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBpZCkgewogCQlyZXR1cm4gZmluZE9mZnNldChpZCkgIT0gLTE7CiAJfQogCkBAIC0yNDcsNyArMjQxLDcgQEAKIAkgKiAgICAgICAgICAgIG5lZ2F0aXZlLCBidXQgc3RpbGwgdmFsaWQuCiAJICogQHJldHVybiB0aGUgT2JqZWN0SWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LgogCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBpbnQgbnRoUG9zaXRpb24pIHsKKwlwdWJsaWMgZmluYWwgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoaW50IG50aFBvc2l0aW9uKSB7CiAJCWlmIChudGhQb3NpdGlvbiA+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+IHBhdGhzID0gZmlsZU1vZGVzLmdldChtb2RlKTsKIAkJaWYgKHBhdGhzID09IG51bGwpCiAJCQlwYXRocyA9IG5ldyBIYXNoU2V0PD4oKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YQppbmRleCBhOTc3MjFjLi5kZDBmMThlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmZsYXRlckNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhCkBAIC04OSw3ICs4OSw3IEBACiAJICogICAgICAgICAgICB0aGUgaW5mbGF0ZXIgdG8gcmV0dXJuLiBNYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGlzIG1ldGhvZAogCSAqICAgICAgICAgICAgZG9lcyBub3RoaW5nLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKGZpbmFsIEluZmxhdGVyIGkpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZShJbmZsYXRlciBpKSB7CiAJCWlmIChpICE9IG51bGwpIHsKIAkJCWkucmVzZXQoKTsKIAkJCWlmIChyZWxlYXNlSW1wbChpKSkKQEAgLTk3LDcgKzk3LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbGVhc2VJbXBsKGZpbmFsIEluZmxhdGVyIGkpIHsKKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxlYXNlSW1wbChJbmZsYXRlciBpKSB7CiAJCWlmIChvcGVuSW5mbGF0ZXJDb3VudCA8IFNaKSB7CiAJCQlpbmZsYXRlckNhY2hlW29wZW5JbmZsYXRlckNvdW50KytdID0gaTsKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL011dGFibGVPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKaW5kZXggZTQ5MmFmOS4uOGNmMGZkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKQEAgLTE2Miw3ICsxNjIsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJhdyBieXRlIGJ1ZmZlciB0byByZWFkIGZyb20uIEF0IGxlYXN0IDIwIGJ5dGVzIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBieXRlIGFycmF5LgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMpIHsKIAkJZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCXcxID0gTkIuZGVjb2RlSW50MzIoYnMsIHApOwogCQl3MiA9IE5CLmRlY29kZUludDMyKGJzLCBwICsgNCk7CiAJCXczID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA4KTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogCSAqICAgICAgICAgICAgdGhlIHJhdyBpbnQgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNSBpbnRlZ2VycyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgaW50ZWdlcnMgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhpbnRbXSBpbnRzKSB7CiAJCWZyb21SYXcoaW50cywgMCk7CiAJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgaW50ZWdlciBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoaW50W10gaW50cywgaW50IHApIHsKIAkJdzEgPSBpbnRzW3BdOwogCQl3MiA9IGludHNbcCArIDFdOwogCQl3MyA9IGludHNbcCArIDJdOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCWZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjUzLDE0ICsyNTMsMTQgQEAKIAkgKiBAcGFyYW0gc3RyCiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA0MCBjaGFyYWN0ZXJzIGxvbmcuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZElkLCBzdHIpKTsKIAkJZnJvbUhleFN0cmluZyhDb25zdGFudHMuZW5jb2RlQVNDSUkoc3RyKSwgMCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCXcxID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwKTsKIAkJCXcyID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwICsgOCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEKaW5kZXggNWMxNDc1NC4uZDM3ZmIyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXIuamF2YQpAQCAtMTIzMCw3ICsxMjMwLDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkgZXJyb3Igd2FzIGRldGVjdGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQmxvYihmaW5hbCBieXRlW10gcmF3KSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY2hlY2tCbG9iKGJ5dGVbXSByYXcpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gV2UgY2FuIGFsd2F5cyBhc3N1bWUgdGhlIGJsb2IgaXMgdmFsaWQuCiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQppbmRleCBiYmVmNTFkLi45M2FkZDVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKQEAgLTEyMSw4ICsxMjEsOCBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RvcmUgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgeworCXB1YmxpYyBib29sZWFuIGhhcyhBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgewogCQkJcmV0dXJuIG9yLmhhcyhvYmplY3RJZCk7CiAJCX0KIAl9CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IHN0b3JlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpCisJcHVibGljIE9iamVjdExvYWRlciBvcGVuKEFueU9iamVjdElkIG9iamVjdElkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG9wZW4ob2JqZWN0SWQsIE9iamVjdFJlYWRlci5PQkpfQU5ZKTsKIAl9CkBAIC0xNzIsNyArMTcyLDcgQEAKIAlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlSGludCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CisJCXRyeSAoT2JqZWN0UmVhZGVyIG9yID0gbmV3UmVhZGVyKCkpIHsKIAkJCXJldHVybiBvci5vcGVuKG9iamVjdElkLCB0eXBlSGludCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWQuamF2YQppbmRleCAwZTg1NTQ1Li43NjRmODkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSAhPSBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXRyeSB7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBpZCB0byBjb252ZXJ0LiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRoZSBoZXggc3RyaW5nIGNvbnZlcnNpb24gb2YgdGhpcyBpZCdzIGNvbnRlbnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoZmluYWwgT2JqZWN0SWQgaSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKE9iamVjdElkIGkpIHsKIAkJcmV0dXJuIGkgIT0gbnVsbCA/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+IHJlZlVwZGF0ZXMpCisJcHJpdmF0ZSB2b2lkIHJlYWRTdGF0dXNSZXBvcnQoTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWZVcGRhdGVzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHVucGFja0xpbmUgPSByZWFkU3RyaW5nTG9uZ1RpbWVvdXQoKTsKIAkJaWYgKCF1bnBhY2tMaW5lLnN0YXJ0c1dpdGgoInVucGFjayAiKSkgLy8kTk9OLU5MUy0xJApAQCAtNDExLDcgKzQxMSw3IEBACiAJCQkJcnJ1LnNldE1lc3NhZ2UobWVzc2FnZSk7CiAJCQl9CiAJCX0KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5BV0FJVElOR19SRVBPUlQpCiAJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmV4cGVjdGVkUmVwb3J0Rm9yUmVmTm90UmVjZWl2ZWQgLCB1cmksIHJydS5nZXRSZW1vdGVOYW1lKCkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VSZWNlaXZlUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKaW5kZXggOGYzNjVmYy4uZDM0MTliYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKQEAgLTMxMiw3ICszMTIsNyBAQAogCSAqIEBwYXJhbSBpbnRvCiAJICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeS4KIAkgKi8KLQlwcm90ZWN0ZWQgQmFzZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgaW50bykgeworCXByb3RlY3RlZCBCYXNlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBpbnRvKSB7CiAJCWRiID0gaW50bzsKIAkJd2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKIApAQCAtMzQ2LDcgKzM0Niw3IEBACiAJCWZpbmFsIGxvbmcgbWF4RGlzY2FyZEJ5dGVzOwogCQlmaW5hbCBTaWduZWRQdXNoQ29uZmlnIHNpZ25lZFB1c2g7CiAKLQkJUmVjZWl2ZUNvbmZpZyhmaW5hbCBDb25maWcgY29uZmlnKSB7CisJCVJlY2VpdmVDb25maWcoQ29uZmlnIGNvbmZpZykgewogCQkJYWxsb3dDcmVhdGVzID0gdHJ1ZTsKIAkJCWFsbG93RGVsZXRlcyA9ICFjb25maWcuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsICJkZW55ZGVsZXRlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQlhbGxvd05vbkZhc3RGb3J3YXJkcyA9ICFjb25maWcuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsIC8vJE5PTi1OTFMtMSQKQEAgLTU1NCw3ICs1NTQsNyBAQAogCSAqICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHdyaXRpbmcgb3V0cHV0IGFuZCBkb2VzIG5vdCBwZXJmb3JtIHRoZQogCSAqICAgICAgICAgICAgaW5pdGlhbCBhZHZlcnRpc2luZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShmaW5hbCBib29sZWFuIHR3b1dheSkgeworCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGJvb2xlYW4gdHdvV2F5KSB7CiAJCWJpRGlyZWN0aW9uYWxQaXBlID0gdHdvV2F5OwogCX0KIApAQCAtNTk4LDcgKzU5OCw3IEBACiAJICogICAgICAgICAgICBhc3N1bWUgYWxsIHJlY2VpdmVkIG9iamVjdHMgYXJlIHZhbGlkLgogCSAqIEBzZWUgI3NldE9iamVjdENoZWNrZXIoT2JqZWN0Q2hlY2tlcikKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja1JlY2VpdmVkT2JqZWN0cyhmaW5hbCBib29sZWFuIGNoZWNrKSB7CisJcHVibGljIHZvaWQgc2V0Q2hlY2tSZWNlaXZlZE9iamVjdHMoYm9vbGVhbiBjaGVjaykgewogCQlpZiAoY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciA9PSBudWxsKQogCQkJc2V0T2JqZWN0Q2hlY2tlcihuZXcgT2JqZWN0Q2hlY2tlcigpKTsKIAkJZWxzZSBpZiAoIWNoZWNrICYmIG9iamVjdENoZWNrZXIgIT0gbnVsbCkKQEAgLTYzMiw3ICs2MzIsNyBAQAogCSAqIEBwYXJhbSBjYW5DcmVhdGUKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBwZXJtaXQgY3JlYXRlIHJlZiBjb21tYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dDcmVhdGVzKGZpbmFsIGJvb2xlYW4gY2FuQ3JlYXRlKSB7CisJcHVibGljIHZvaWQgc2V0QWxsb3dDcmVhdGVzKGJvb2xlYW4gY2FuQ3JlYXRlKSB7CiAJCWFsbG93Q3JlYXRlcyA9IGNhbkNyZWF0ZTsKIAl9CiAKQEAgLTY1MSw3ICs2NTEsNyBAQAogCSAqIEBwYXJhbSBjYW5EZWxldGUKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBwZXJtaXQgZGVsZXRlIHJlZiBjb21tYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGVzKGZpbmFsIGJvb2xlYW4gY2FuRGVsZXRlKSB7CisJcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGVzKGJvb2xlYW4gY2FuRGVsZXRlKSB7CiAJCWFsbG93QW55RGVsZXRlcyA9IGNhbkRlbGV0ZTsKIAl9CiAKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCB0aGUgY2xpZW50IHRvIGFzayBmb3Igbm9uLWZhc3QtZm9yd2FyZAogCSAqICAgICAgICAgICAgdXBkYXRlcyBvZiBhbiBleGlzdGluZyByZWYuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dOb25GYXN0Rm9yd2FyZHMoZmluYWwgYm9vbGVhbiBjYW5SZXdpbmQpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd05vbkZhc3RGb3J3YXJkcyhib29sZWFuIGNhblJld2luZCkgewogCQlhbGxvd05vbkZhc3RGb3J3YXJkcyA9IGNhblJld2luZDsKIAl9CiAKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSByZXBvc2l0b3J5CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJcmVmTG9nSWRlbnQgPSBwaTsKIAl9CiAKQEAgLTc4NCw3ICs3ODQsNyBAQAogCSAqIEBwYXJhbSBhZHZlcnRpc2VSZWZzSG9vawogCSAqICAgICAgICAgICAgdGhlIGhvb2s7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soZmluYWwgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKKwlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgewogCQlpZiAoYWR2ZXJ0aXNlUmVmc0hvb2sgIT0gbnVsbCkKIAkJCXRoaXMuYWR2ZXJ0aXNlUmVmc0hvb2sgPSBhZHZlcnRpc2VSZWZzSG9vazsKIAkJZWxzZQpAQCAtODAxLDcgKzgwMSw3IEBACiAJICogQHBhcmFtIHJlZkZpbHRlcgogCSAqICAgICAgICAgICAgdGhlIGZpbHRlcjsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoZmluYWwgUmVmRmlsdGVyIHJlZkZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CiAJCXRoaXMucmVmRmlsdGVyID0gcmVmRmlsdGVyICE9IG51bGwgPyByZWZGaWx0ZXIgOiBSZWZGaWx0ZXIuREVGQVVMVDsKIAl9CiAKQEAgLTgyMiw3ICs4MjIsNyBAQAogCSAqICAgICAgICAgICAgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpdGggdGhlCiAJICogICAgICAgICAgICBjb25uZWN0ZWQgY2xpZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIApAQCAtODY3LDcgKzg2Nyw3IEBACiAJICogQHBhcmFtIGxpbWl0CiAJICogICAgICAgICAgICB0aGUgR2l0IG9iamVjdCBzaXplIGxpbWl0LiBJZiB6ZXJvIHRoZW4gdGhlcmUgaXMgbm90IGxpbWl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heE9iamVjdFNpemVMaW1pdChmaW5hbCBsb25nIGxpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0TWF4T2JqZWN0U2l6ZUxpbWl0KGxvbmcgbGltaXQpIHsKIAkJbWF4T2JqZWN0U2l6ZUxpbWl0ID0gbGltaXQ7CiAJfQogCkBAIC04ODAsNyArODgwLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwYWNrIHNpemUgbGltaXQsIGluIGJ5dGVzCiAJICogQHNpbmNlIDMuMwogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFBhY2tTaXplTGltaXQoZmluYWwgbG9uZyBsaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldE1heFBhY2tTaXplTGltaXQobG9uZyBsaW1pdCkgewogCQlpZiAobGltaXQgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkucmVjZWl2ZVBhY2tJbnZhbGlkTGltaXQsIExvbmcudmFsdWVPZihsaW1pdCkpKTsKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAJICogICAgICAgICAgICBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoZSBob29rLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtdXN0IG5vdCBlbmQgd2l0aCBhbiBMRiwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW4gTEYuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEVycm9yKGZpbmFsIFN0cmluZyB3aGF0KSB7CisJcHVibGljIHZvaWQgc2VuZEVycm9yKFN0cmluZyB3aGF0KSB7CiAJCWlmIChyZWZzID09IG51bGwpIHsKIAkJCWlmIChhZHZlcnRpc2VFcnJvciA9PSBudWxsKQogCQkJCWFkdmVydGlzZUVycm9yID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTEwNzAsNyArMTA3MCw3IEBACiAJICogICAgICAgICAgICBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoZSBob29rLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtdXN0IG5vdCBlbmQgd2l0aCBhbiBMRiwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW4gTEYuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoZmluYWwgU3RyaW5nIHdoYXQpIHsKKwlwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShTdHJpbmcgd2hhdCkgewogCQltc2dPdXRXcmFwcGVyLndyaXRlKENvbnN0YW50cy5lbmNvZGUod2hhdCArICJcbiIpKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtMTIyMSw3ICsxMjIxLDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhmaW5hbCBSZWZBZHZlcnRpc2VyIGFkdikKKwlwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoUmVmQWR2ZXJ0aXNlciBhZHYpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiB7CiAJCWlmIChhZHZlcnRpc2VFcnJvciAhPSBudWxsKSB7CiAJCQlhZHYud3JpdGVPbmUoIkVSUiAiICsgYWR2ZXJ0aXNlRXJyb3IpOyAvLyROT04tTkxTLTEkCkBAIC0xNDQ4LDcgKzE0NDgsNyBAQAogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgcGFjayBpcyBleHBlY3RlZCBiYXNlZCBvbiB0aGUgbGlzdCBvZiBjb21tYW5kcy4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkUGFjaygpIHsKLQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQlpZiAoY21kLmdldFR5cGUoKSAhPSBSZWNlaXZlQ29tbWFuZC5UeXBlLkRFTEVURSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTU0OSwyMSArMTU0OSwyMSBAQAogCQl9CiAJCXBhcnNlciA9IG51bGw7CiAKLQkJdHJ5IChmaW5hbCBPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsoZGIpKSB7CisJCXRyeSAoT2JqZWN0V2FsayBvdyA9IG5ldyBPYmplY3RXYWxrKGRiKSkgewogCQkJaWYgKGJhc2VPYmplY3RzICE9IG51bGwpIHsKIAkJCQlvdy5zb3J0KFJldlNvcnQuVE9QTyk7CiAJCQkJaWYgKCFiYXNlT2JqZWN0cy5pc0VtcHR5KCkpCiAJCQkJCW93LnNvcnQoUmV2U29ydC5CT1VOREFSWSwgdHJ1ZSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlc3VsdC5OT1RfQVRURU1QVEVEKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoY21kLmdldFR5cGUoKSA9PSBSZWNlaXZlQ29tbWFuZC5UeXBlLkRFTEVURSkKIAkJCQkJY29udGludWU7CiAJCQkJb3cubWFya1N0YXJ0KG93LnBhcnNlQW55KGNtZC5nZXROZXdJZCgpKSk7CiAJCQl9Ci0JCQlmb3IgKGZpbmFsIE9iamVjdElkIGhhdmUgOiBhZHZlcnRpc2VkSGF2ZXMpIHsKKwkJCWZvciAoT2JqZWN0SWQgaGF2ZSA6IGFkdmVydGlzZWRIYXZlcykgewogCQkJCVJldk9iamVjdCBvID0gb3cucGFyc2VBbnkoaGF2ZSk7CiAJCQkJb3cubWFya1VuaW50ZXJlc3Rpbmcobyk7CiAKQEAgLTE2MTksNyArMTYxOSw3IEBACiAJICogVmFsaWRhdGUgdGhlIGNvbW1hbmQgbGlzdC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbW1hbmRzKCkgewotCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCWZpbmFsIFJlZiByZWYgPSBjbWQuZ2V0UmVmKCk7CiAJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlc3VsdC5OT1RfQVRURU1QVEVEKQogCQkJCWNvbnRpbnVlOwpAQCAtMTc4NCw3ICsxNzg0LDcgQEAKIAkgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgY29tbWFuZCBsaXN0IGNvbnRhaW5pbmcgb25seSB0aG9zZSBjb21tYW5kcyB3aXRoIHRoZQogCSAqICAgICAgICAgZGVzaXJlZCBzdGF0dXMuCiAJICovCi0JcHJvdGVjdGVkIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGZpbHRlckNvbW1hbmRzKGZpbmFsIFJlc3VsdCB3YW50KSB7CisJcHJvdGVjdGVkIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGZpbHRlckNvbW1hbmRzKFJlc3VsdCB3YW50KSB7CiAJCXJldHVybiBSZWNlaXZlQ29tbWFuZC5maWx0ZXIoY29tbWFuZHMsIHdhbnQpOwogCX0KIApAQCAtMTgzOCw3ICsxODM4LDcgQEAKIAkJaWYgKHVucGFja0Vycm9yICE9IG51bGwpIHsKIAkJCW91dC5zZW5kU3RyaW5nKCJ1bnBhY2sgZXJyb3IgIiArIHVucGFja0Vycm9yLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCWlmIChmb3JDbGllbnQpIHsKLQkJCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJCQlvdXQuc2VuZFN0cmluZygibmcgIiArIGNtZC5nZXRSZWZOYW1lKCkgLy8kTk9OLU5MUy0xJAogCQkJCQkJCSsgIiBuL2EgKHVucGFja2VyIGVycm9yKSIpOyAvLyROT04tTkxTLTEkCiAJCQkJfQpAQCAtMTg0OCw3ICsxODQ4LDcgQEAKIAogCQlpZiAoZm9yQ2xpZW50KQogCQkJb3V0LnNlbmRTdHJpbmcoInVucGFjayBvayIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJaWYgKGNtZC5nZXRSZXN1bHQoKSA9PSBSZXN1bHQuT0spIHsKIAkJCQlpZiAoZm9yQ2xpZW50KQogCQkJCQlvdXQuc2VuZFN0cmluZygib2sgIiArIGNtZC5nZXRSZWZOYW1lKCkpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IDM5ZWZhYmYuLjQ0OWY1MjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00Nyw4ICs0Nyw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTk4LDcgKzk2LDcgQEAKIAogCXByaXZhdGUgUGFja0xvY2sgcGFja0xvY2s7CiAKLQlCdW5kbGVGZXRjaENvbm5lY3Rpb24oVHJhbnNwb3J0IHRyYW5zcG9ydEJ1bmRsZSwgZmluYWwgSW5wdXRTdHJlYW0gc3JjKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlCdW5kbGVGZXRjaENvbm5lY3Rpb24oVHJhbnNwb3J0IHRyYW5zcG9ydEJ1bmRsZSwgSW5wdXRTdHJlYW0gc3JjKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJhbnNwb3J0ID0gdHJhbnNwb3J0QnVuZGxlOwogCQliaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzcmMpOwogCQl0cnkgewpAQCAtMTU1LDEyICsxNTMsMTIgQEAKIAkJYXZhaWxhYmxlKGF2YWlsKTsKIAl9CiAKLQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih0cmFuc3BvcnQudXJpLAogCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZUFkdmVydGlzZW1lbnRzT2YsIG5hbWUpKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyByZWFkTGluZShmaW5hbCBieXRlW10gaGRyYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIHJlYWRMaW5lKGJ5dGVbXSBoZHJidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVN0cmluZ0J1aWxkZXIgbGluZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwogCQl3aGlsZSAoIWRvbmUpIHsKQEAgLTIxMiw3ICsyMTAsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtMjI4LDEzICsyMjYsMTMgQEAKIAkJaWYgKHByZXJlcXMuaXNFbXB0eSgpKQogCQkJcmV0dXJuOwogCi0JCXRyeSAoZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgewogCQkJZmluYWwgUmV2RmxhZyBQUkVSRVEgPSBydy5uZXdGbGFnKCJQUkVSRVEiKTsgLy8kTk9OLU5MUy0xJAogCQkJZmluYWwgUmV2RmxhZyBTRUVOID0gcncubmV3RmxhZygiU0VFTiIpOyAvLyROT04tTkxTLTEkCiAKIAkJCWZpbmFsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nID0gbmV3IEhhc2hNYXA8PigpOwogCQkJZmluYWwgTGlzdDxSZXZPYmplY3Q+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+KHRvRmV0Y2gpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHJlcXVlc3RlZCA6IHRvRmV0Y2gpIHsKKwkJCWZvciAoUmVmU3BlYyByZXF1ZXN0ZWQgOiB0b0ZldGNoKSB7CiAJCQkJZmluYWwgU3RyaW5nIHJlcVNyYyA9IHJlcXVlc3RlZC5nZXRTb3VyY2UoKTsKLQkJCQlmb3IgKGZpbmFsIFJlZlNwZWMgY29uZmlndXJlZCA6IGZldGNoKSB7CisJCQkJZm9yIChSZWZTcGVjIGNvbmZpZ3VyZWQgOiBmZXRjaCkgewogCQkJCQlmaW5hbCBTdHJpbmcgY2ZnU3JjID0gY29uZmlndXJlZC5nZXRTb3VyY2UoKTsKIAkJCQkJZmluYWwgU3RyaW5nIGNmZ0RzdCA9IGNvbmZpZ3VyZWQuZ2V0RGVzdGluYXRpb24oKTsKIAkJCQkJaWYgKGNmZ1NyYy5lcXVhbHMocmVxU3JjKSAmJiBjZmdEc3QgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKaW5kZXggYzYxOTFlYy4uNjExOGNiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRBbWF6b25TMy5qYXZhCkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKFN0cmluZyBsb2NhdGlvbikKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG5ldyBEYXRhYmFzZVMzKGJ1Y2tldE5hbWUsIHJlc29sdmVLZXkobG9jYXRpb24pKTsKIAkJfQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJCQloYXZlLmFkZEFsbChzMy5saXN0KGJ1Y2tldCwgcmVzb2x2ZUtleSgicGFjayIpKSk7IC8vJE5PTi1OTFMtMSQKIAogCQkJZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogaGF2ZSkgeworCQkJZm9yIChTdHJpbmcgbiA6IGhhdmUpIHsKIAkJCQlpZiAoIW4uc3RhcnRzV2l0aCgicGFjay0iKSB8fCAhbi5lbmRzV2l0aCgiLnBhY2siKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWNvbnRpbnVlOwogCkBAIC0yOTAsNyArMjkwLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlGaWxlU3RyZWFtIG9wZW4oZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVTdHJlYW0gb3BlbihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFVSTENvbm5lY3Rpb24gYyA9IHMzLmdldChidWNrZXQsIHJlc29sdmVLZXkocGF0aCkpOwogCQkJZmluYWwgSW5wdXRTdHJlYW0gcmF3ID0gYy5nZXRJbnB1dFN0cmVhbSgpOwogCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBzMy5kZWNyeXB0KGMpOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBkZWxldGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzMy5kZWxldGUoYnVja2V0LCByZXNvbHZlS2V5KHBhdGgpKTsKIAkJfQogCkBAIC0zMTEsNyArMzExLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgd3JpdGVGaWxlKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXMzLnB1dChidWNrZXQsIHJlc29sdmVLZXkocGF0aCksIGRhdGEpOwogCQl9CiAKQEAgLTMyMyw3ICszMjMsNyBAQAogCQkJcmV0dXJuIGF2YWlsOwogCQl9CiAKLQkJcHJpdmF0ZSB2b2lkIHJlYWRMb29zZVJlZnMoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCisJCXByaXZhdGUgdm9pZCByZWFkTG9vc2VSZWZzKFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogczMubGlzdChidWNrZXQsIHJlc29sdmVLZXkoUk9PVF9ESVIKQEAgLTMzNCwxNiArMzM0LDEzIEBACiAJCQl9CiAJCX0KIAotCQlwcml2YXRlIFJlZiByZWFkUmVmKGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsLCBmaW5hbCBTdHJpbmcgcm4pCisJCXByaXZhdGUgUmVmIHJlYWRSZWYoVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsIFN0cmluZyBybikKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZyBzOwogCQkJU3RyaW5nIHJlZiA9IFJPT1RfRElSICsgcm47CiAJCQl0cnkgewotCQkJCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gb3BlblJlYWRlcihyZWYpOwotCQkJCXRyeSB7CisJCQkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG9wZW5SZWFkZXIocmVmKSkgewogCQkJCQlzID0gYnIucmVhZExpbmUoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlici5jbG9zZSgpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub1JlZikgewogCQkJCXJldHVybiBudWxsOwpAQCAtMzc3LDcgKzM3NCw3IEBACiAJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGdldFVSSSgpLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS50cmFuc3BvcnRFeGNlcHRpb25CYWRSZWYsIHJuLCBzKSk7CiAJCX0KIAotCQlwcml2YXRlIFN0b3JhZ2UgbG9vc2UoZmluYWwgUmVmIHIpIHsKKwkJcHJpdmF0ZSBTdG9yYWdlIGxvb3NlKFJlZiByKSB7CiAJCQlpZiAociAhPSBudWxsICYmIHIuZ2V0U3RvcmFnZSgpID09IFN0b3JhZ2UuUEFDS0VEKQogCQkJCXJldHVybiBTdG9yYWdlLkxPT1NFX1BBQ0tFRDsKIAkJCXJldHVybiBTdG9yYWdlLkxPT1NFOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0QW5vbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0QW5vbi5qYXZhCmluZGV4IDgxNjE4N2UuLjExMzI1MDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEKQEAgLTExMywxMSArMTEzLDExIEBACiAJCX0KIAl9OwogCi0JVHJhbnNwb3J0R2l0QW5vbihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0QW5vbihSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKSB7CiAJCXN1cGVyKGxvY2FsLCB1cmkpOwogCX0KIAotCVRyYW5zcG9ydEdpdEFub24oZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdEFub24oVVJJaXNoIHVyaSkgewogCQlzdXBlcih1cmkpOwogCX0KIApAQCAtMTQyLDYgKzE0Miw3IEBACiAJU29ja2V0IG9wZW5Db25uZWN0aW9uKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCB0bXMgPSBnZXRUaW1lb3V0KCkgPiAwID8gZ2V0VGltZW91dCgpICogMTAwMCA6IDA7CiAJCWZpbmFsIGludCBwb3J0ID0gdXJpLmdldFBvcnQoKSA+IDAgPyB1cmkuZ2V0UG9ydCgpIDogR0lUX1BPUlQ7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBieSB0aGUgY2FsbGVyCiAJCWZpbmFsIFNvY2tldCBzID0gbmV3IFNvY2tldCgpOwogCQl0cnkgewogCQkJZmluYWwgSW5ldEFkZHJlc3MgaG9zdCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSh1cmkuZ2V0SG9zdCgpKTsKQEAgLTE2Miw3ICsxNjMsNyBAQAogCQlyZXR1cm4gczsKIAl9CiAKLQl2b2lkIHNlcnZpY2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFBhY2tldExpbmVPdXQgcGNrT3V0KQorCXZvaWQgc2VydmljZShTdHJpbmcgbmFtZSwgUGFja2V0TGluZU91dCBwY2tPdXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGNtZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWNtZC5hcHBlbmQobmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhCmluZGV4IGJjODVlNmYuLmQ1OWZlMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhCkBAIC0xNDEsMTIgKzE0MSwxMiBAQAogCQl9CiAJfTsKIAotCVRyYW5zcG9ydEdpdFNzaChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0U3NoKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJCWluaXRTc2hTZXNzaW9uRmFjdG9yeSgpOwogCX0KIAotCVRyYW5zcG9ydEdpdFNzaChmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0U3NoKFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIodXJpKTsKIAkJaW5pdFNzaFNlc3Npb25GYWN0b3J5KCk7CiAJfQpAQCAtMTc2LDcgKzE3Niw3IEBACiAJCXJldHVybiBuZXcgU3NoUHVzaENvbm5lY3Rpb24oKTsKIAl9CiAKLQlTdHJpbmcgY29tbWFuZEZvcihmaW5hbCBTdHJpbmcgZXhlKSB7CisJU3RyaW5nIGNvbW1hbmRGb3IoU3RyaW5nIGV4ZSkgewogCQlTdHJpbmcgcGF0aCA9IHVyaS5nZXRQYXRoKCk7CiAJCWlmICh1cmkuZ2V0U2NoZW1lKCkgIT0gbnVsbCAmJiB1cmkuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi9+IikpIC8vJE5PTi1OTFMtMSQKIAkJCXBhdGggPSAodXJpLmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpOwpAQCAtMzExLDYgKzMxMSw5IEBACiAJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJZW5kT3V0KCk7CiAKKwkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKKwkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKKwkJCX0KIAkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKIAkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOwpAQCAtMzIyLDggKzMyNSw2IEBACiAJCQl9CiAKIAkJCXN1cGVyLmNsb3NlKCk7Ci0JCQlpZiAocHJvY2VzcyAhPSBudWxsKQotCQkJCXByb2Nlc3MuZGVzdHJveSgpOwogCQl9CiAJfQogCkBAIC0zNzcsNiArMzc4LDkgQEAKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCQllbmRPdXQoKTsKIAorCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgeworCQkJCXByb2Nlc3MuZGVzdHJveSgpOworCQkJfQogCQkJaWYgKGVycm9yVGhyZWFkICE9IG51bGwpIHsKIAkJCQl0cnkgewogCQkJCQllcnJvclRocmVhZC5oYWx0KCk7CkBAIC0zODgsOCArMzkyLDYgQEAKIAkJCX0KIAogCQkJc3VwZXIuY2xvc2UoKTsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpCi0JCQkJcHJvY2Vzcy5kZXN0cm95KCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEKaW5kZXggYTE4MjYyMy4uYzA4ZjQwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YQpAQCAtMjczLDcgKzI3Myw3IEBACiAKIAlwcml2YXRlIGJvb2xlYW4gc3NsRmFpbHVyZSA9IGZhbHNlOwogCi0JVHJhbnNwb3J0SHR0cChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKQorCVRyYW5zcG9ydEh0dHAoUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQlzdXBlcihsb2NhbCwgdXJpKTsKIAkJc2V0VVJJKHVyaSk7CkBAIC0yOTgsNyArMjk4LDcgQEAKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbgogCSAqIEBzaW5jZSA0LjkKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVUkkoZmluYWwgVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2V0VVJJKFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQl0cnkgewogCQkJY3VycmVudFVyaSA9IHVyaTsKIAkJCWJhc2VVcmwgPSB0b1VSTCh1cmkpOwpAQCAtMzE0LDcgKzMxNCw3IEBACiAJICogQHBhcmFtIHVyaQogCSAqIEB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAJICovCi0JVHJhbnNwb3J0SHR0cChmaW5hbCBVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwlUcmFuc3BvcnRIdHRwKFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQlzdXBlcih1cmkpOwogCQlzZXRVUkkodXJpKTsKIAkJaHR0cCA9IG5ldyBIdHRwQ29uZmlnKHVyaSk7CkBAIC0zMzIsMTAgKzMzMiwyNiBAQAogCSAqIEBwYXJhbSBvbgogCSAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9IChkZWZhdWx0KSwgc21hcnQgSFRUUCBpcyBlbmFibGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZVNtYXJ0SHR0cChmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0VXNlU21hcnRIdHRwKGJvb2xlYW4gb24pIHsKIAkJdXNlU21hcnRIdHRwID0gb247CiAJfQogCisJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQ2xvc2VkIGJ5IGNhbGxlcgorCXByaXZhdGUgRmV0Y2hDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oSHR0cENvbm5lY3Rpb24gYywgSW5wdXRTdHJlYW0gaW4sCisJCQlTdHJpbmcgc2VydmljZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQmFzZUNvbm5lY3Rpb24gZjsKKwkJaWYgKGlzU21hcnRIdHRwKGMsIHNlcnZpY2UpKSB7CisJCQlyZWFkU21hcnRIZWFkZXJzKGluLCBzZXJ2aWNlKTsKKwkJCWYgPSBuZXcgU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKGluKTsKKwkJfSBlbHNlIHsKKwkJCS8vIEFzc3VtZSB0aGlzIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc21hcnQgSFRUUCBmZXRjaAorCQkJLy8gYW5kIGZhbGwgYmFjayBvbiBkdW1iIG9iamVjdCB3YWxraW5nLgorCQkJZiA9IG5ld0R1bWJDb25uZWN0aW9uKGluKTsKKwkJfQorCQlmLnNldFBlZXJVc2VyQWdlbnQoYy5nZXRIZWFkZXJGaWVsZChIdHRwU3VwcG9ydC5IRFJfU0VSVkVSKSk7CisJCXJldHVybiAoRmV0Y2hDb25uZWN0aW9uKSBmOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIEZldGNoQ29ubmVjdGlvbiBvcGVuRmV0Y2goKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLApAQCAtMzQzLDIxICszNTksOCBAQAogCQlmaW5hbCBTdHJpbmcgc2VydmljZSA9IFNWQ19VUExPQURfUEFDSzsKIAkJdHJ5IHsKIAkJCWZpbmFsIEh0dHBDb25uZWN0aW9uIGMgPSBjb25uZWN0KHNlcnZpY2UpOwotCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBvcGVuSW5wdXRTdHJlYW0oYyk7Ci0JCQl0cnkgewotCQkJCUJhc2VDb25uZWN0aW9uIGY7Ci0JCQkJaWYgKGlzU21hcnRIdHRwKGMsIHNlcnZpY2UpKSB7Ci0JCQkJCXJlYWRTbWFydEhlYWRlcnMoaW4sIHNlcnZpY2UpOwotCQkJCQlmID0gbmV3IFNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbihpbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQXNzdW1lIHRoaXMgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBzbWFydCBIVFRQIGZldGNoCi0JCQkJCS8vIGFuZCBmYWxsIGJhY2sgb24gZHVtYiBvYmplY3Qgd2Fsa2luZy4KLQkJCQkJZiA9IG5ld0R1bWJDb25uZWN0aW9uKGluKTsKLQkJCQl9Ci0JCQkJZi5zZXRQZWVyVXNlckFnZW50KGMuZ2V0SGVhZGVyRmllbGQoSHR0cFN1cHBvcnQuSERSX1NFUlZFUikpOwotCQkJCXJldHVybiAoRmV0Y2hDb25uZWN0aW9uKSBmOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG9wZW5JbnB1dFN0cmVhbShjKSkgeworCQkJCXJldHVybiBnZXRDb25uZWN0aW9uKGMsIGluLCBzZXJ2aWNlKTsKIAkJCX0KIAkJfSBjYXRjaCAoTm90U3VwcG9ydGVkRXhjZXB0aW9uIGVycikgewogCQkJdGhyb3cgZXJyOwpAQCAtNDgwLDcgKzQ4Myw3IEBACiAJCXRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CiAJfQogCi0JcHJpdmF0ZSBIdHRwQ29ubmVjdGlvbiBjb25uZWN0KGZpbmFsIFN0cmluZyBzZXJ2aWNlKQorCXByaXZhdGUgSHR0cENvbm5lY3Rpb24gY29ubmVjdChTdHJpbmcgc2VydmljZSkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCVVSTCB1ID0gZ2V0U2VydmljZVVSTChzZXJ2aWNlKTsKIAkJaW50IGF1dGhBdHRlbXB0cyA9IDE7CkBAIC03NzIsNyArNzc1LDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBVUkwgZ2V0U2VydmljZVVSTChmaW5hbCBTdHJpbmcgc2VydmljZSkKKwlwcml2YXRlIFVSTCBnZXRTZXJ2aWNlVVJMKFN0cmluZyBzZXJ2aWNlKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtNzk2LDIxICs3OTksNiBAQAogCX0KIAogCS8qKgotCSAqIE9wZW4gYW4gSFRUUCBjb25uZWN0aW9uLCBzZXR0aW5nIHRoZSBhY2NlcHQtZW5jb2RpbmcgcmVxdWVzdCBoZWFkZXIgdG8gZ3ppcC4KLQkgKgotCSAqIEBwYXJhbSBtZXRob2QgSFRUUCByZXF1ZXN0IG1ldGhvZAotCSAqIEBwYXJhbSB1IHVybCBvZiB0aGUgSFRUUCBjb25uZWN0aW9uCi0JICogQHJldHVybiB0aGUgSFRUUCBjb25uZWN0aW9uCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQHNpbmNlIDMuMwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2h0dHBPcGVuKFN0cmluZywgVVJMLCBBY2NlcHRFbmNvZGluZyl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwcm90ZWN0ZWQgSHR0cENvbm5lY3Rpb24gaHR0cE9wZW4oU3RyaW5nIG1ldGhvZCwgVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBodHRwT3BlbihtZXRob2QsIHUsIEFjY2VwdEVuY29kaW5nLkdaSVApOwotCX0KLQotCS8qKgogCSAqIE9wZW4gYW4gSFRUUCBjb25uZWN0aW9uLgogCSAqCiAJICogQHBhcmFtIG1ldGhvZCBIVFRQIHJlcXVlc3QgbWV0aG9kCkBAIC04NzMsMTggKzg2MSwxOCBAQAogCQlyZXR1cm4gbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbih1cmksIHdoeSk7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGlzU21hcnRIdHRwKGZpbmFsIEh0dHBDb25uZWN0aW9uIGMsIGZpbmFsIFN0cmluZyBzZXJ2aWNlKSB7CisJcHJpdmF0ZSBib29sZWFuIGlzU21hcnRIdHRwKEh0dHBDb25uZWN0aW9uIGMsIFN0cmluZyBzZXJ2aWNlKSB7CiAJCWZpbmFsIFN0cmluZyBleHBUeXBlID0gImFwcGxpY2F0aW9uL3gtIiArIHNlcnZpY2UgKyAiLWFkdmVydGlzZW1lbnQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJZmluYWwgU3RyaW5nIGFjdFR5cGUgPSBjLmdldENvbnRlbnRUeXBlKCk7CiAJCXJldHVybiBleHBUeXBlLmVxdWFscyhhY3RUeXBlKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNHemlwQ29udGVudChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjKSB7CisJcHJpdmF0ZSBib29sZWFuIGlzR3ppcENvbnRlbnQoSHR0cENvbm5lY3Rpb24gYykgewogCQlyZXR1cm4gRU5DT0RJTkdfR1pJUC5lcXVhbHMoYy5nZXRIZWFkZXJGaWVsZChIRFJfQ09OVEVOVF9FTkNPRElORykpCiAJCQkJfHwgRU5DT0RJTkdfWF9HWklQLmVxdWFscyhjLmdldEhlYWRlckZpZWxkKEhEUl9DT05URU5UX0VOQ09ESU5HKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRTbWFydEhlYWRlcnMoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIFN0cmluZyBzZXJ2aWNlKQorCXByaXZhdGUgdm9pZCByZWFkU21hcnRIZWFkZXJzKElucHV0U3RyZWFtIGluLCBTdHJpbmcgc2VydmljZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIEEgc21hcnQgcmVwbHkgd2lsbCBoYXZlIGEgJyMnIGFmdGVyIHRoZSBmaXJzdCA0IGJ5dGVzLCBidXQKIAkJLy8gYSBkdW1iIHJlcGx5IGNhbm5vdCBjb250YWluIGEgJyMnIHVudGlsIGFmdGVyIGJ5dGUgNDEuIERvIGEKQEAgLTkxNSw3ICs5MDMsNyBAQAogCWNsYXNzIEh0dHBPYmplY3REQiBleHRlbmRzIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSB7CiAJCXByaXZhdGUgZmluYWwgVVJMIGh0dHBPYmplY3RzVXJsOwogCi0JCUh0dHBPYmplY3REQihmaW5hbCBVUkwgYikgeworCQlIdHRwT2JqZWN0REIoVVJMIGIpIHsKIAkJCWh0dHBPYmplY3RzVXJsID0gYjsKIAkJfQogCkBAIC05NDIsNyArOTMwLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKFN0cmluZyBsb2NhdGlvbikKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG5ldyBIdHRwT2JqZWN0REIobmV3IFVSTChodHRwT2JqZWN0c1VybCwgbG9jYXRpb24pKTsKIAkJfQpAQCAtOTc0LDcgKzk2Miw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlU3RyZWFtIG9wZW4oU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gb3BlbihwYXRoLCBBY2NlcHRFbmNvZGluZy5VTlNQRUNJRklFRCk7CiAJCX0KIApAQCAtMTA0MiwxNSArMTAzMCwxNSBAQAogCQkJcmV0dXJuIGF2YWlsOwogCQl9CiAKLQkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gb3V0T2ZPcmRlckFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG4pIHsKKwkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gb3V0T2ZPcmRlckFkdmVydGlzZW1lbnQoU3RyaW5nIG4pIHsKIAkJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmFkdmVydGlzZW1lbnRPZkNhbWVCZWZvcmUsIG4sIG4pKTsKIAkJfQogCi0JCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGludmFsaWRBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuKSB7CisJCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGludmFsaWRBZHZlcnRpc2VtZW50KFN0cmluZyBuKSB7CiAJCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkQWR2ZXJ0aXNlbWVudE9mLCBuKSk7CiAJCX0KIAotCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuKSB7CisJCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoU3RyaW5nIG4pIHsKIAkJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZUFkdmVydGlzZW1lbnRzT2YsIG4pKTsKIAkJfQogCkBAIC0xMDYzLDcgKzEwNTEsNyBAQAogCWNsYXNzIFNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrRmV0Y2hDb25uZWN0aW9uIHsKIAkJcHJpdmF0ZSBNdWx0aVJlcXVlc3RTZXJ2aWNlIHN2YzsKIAotCQlTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oZmluYWwgSW5wdXRTdHJlYW0gYWR2ZXJ0aXNlbWVudCkKKwkJU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQlzdXBlcihUcmFuc3BvcnRIdHRwLnRoaXMpOwogCQkJc3RhdGVsZXNzUlBDID0gdHJ1ZTsKQEAgLTEwOTMsNyArMTA4MSw3IEBACiAJfQogCiAJY2xhc3MgU21hcnRIdHRwUHVzaENvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlUGFja1B1c2hDb25uZWN0aW9uIHsKLQkJU21hcnRIdHRwUHVzaENvbm5lY3Rpb24oZmluYWwgSW5wdXRTdHJlYW0gYWR2ZXJ0aXNlbWVudCkKKwkJU21hcnRIdHRwUHVzaENvbm5lY3Rpb24oSW5wdXRTdHJlYW0gYWR2ZXJ0aXNlbWVudCkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXN1cGVyKFRyYW5zcG9ydEh0dHAudGhpcyk7CiAJCQlzdGF0ZWxlc3NSUEMgPSB0cnVlOwpAQCAtMTM5Niw3ICsxMzg0LDcgQEAKIAljbGFzcyBNdWx0aVJlcXVlc3RTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CiAJCWJvb2xlYW4gZmluYWxSZXF1ZXN0OwogCi0JCU11bHRpUmVxdWVzdFNlcnZpY2UoZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisJCU11bHRpUmVxdWVzdFNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CiAJCQlzdXBlcihzZXJ2aWNlTmFtZSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydExvY2FsLmphdmEKaW5kZXggNGYxODgwYi4uZmJiMmM0NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhCkBAIC0xNjIsMTEgKzE2MiwxMSBAQAogCQlyZW1vdGVHaXREaXIgPSBnaXREaXI7CiAJfQogCi0JVXBsb2FkUGFjayBjcmVhdGVVcGxvYWRQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZHN0KSB7CisJVXBsb2FkUGFjayBjcmVhdGVVcGxvYWRQYWNrKFJlcG9zaXRvcnkgZHN0KSB7CiAJCXJldHVybiBuZXcgVXBsb2FkUGFjayhkc3QpOwogCX0KIAotCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZHN0KSB7CisJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkc3QpIHsKIAkJcmV0dXJuIG5ldyBSZWNlaXZlUGFjayhkc3QpOwogCX0KIApAQCAtMjI5LDcgKzIyOSw3IEBACiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkuCiAJICovCi0JcHJvdGVjdGVkIFByb2Nlc3Mgc3Bhd24oZmluYWwgU3RyaW5nIGNtZCkKKwlwcm90ZWN0ZWQgUHJvY2VzcyBzcGF3bihTdHJpbmcgY21kKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlTdHJpbmdbXSBhcmdzID0geyAiLiIgfTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0U2Z0cC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0U2Z0cC5qYXZhCmluZGV4IDM5Zjk4OTcuLmYxMjliYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQl9CiAJfTsKIAotCVRyYW5zcG9ydFNmdHAoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydFNmdHAoUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkgewogCQlzdXBlcihsb2NhbCwgdXJpKTsKIAl9CiAKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJfQogCQl9CiAKLQkJU2Z0cE9iamVjdERCKGZpbmFsIFNmdHBPYmplY3REQiBwYXJlbnQsIGZpbmFsIFN0cmluZyBwKQorCQlTZnRwT2JqZWN0REIoU2Z0cE9iamVjdERCIHBhcmVudCwgU3RyaW5nIHApCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZ0cCA9IG5ld1NmdHAoKTsKQEAgLTIyOSw3ICsyMjksNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikKKwkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbmV3IFNmdHBPYmplY3REQih0aGlzLCBsb2NhdGlvbik7CiAJCX0KQEAgLTI0Niw5ICsyNDYsOSBAQAogCQkJCWZpbGVzID0gbmV3IEhhc2hNYXA8PigpOwogCQkJCW10aW1lcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAotCQkJCWZvciAoZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KQorCQkJCWZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KQogCQkJCQlmaWxlcy5wdXQoZW50LmdldEZpbGVuYW1lKCksIGVudCk7Ci0JCQkJZm9yIChmaW5hbCBDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKKwkJCQlmb3IgKENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkgewogCQkJCQlmaW5hbCBTdHJpbmcgbiA9IGVudC5nZXRGaWxlbmFtZSgpOwogCQkJCQlpZiAoIW4uc3RhcnRzV2l0aCgicGFjay0iKSB8fCAhbi5lbmRzV2l0aCgiLnBhY2siKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQljb250aW51ZTsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiAJCQkJQ29sbGVjdGlvbnMuc29ydChwYWNrcywgbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKIAkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBTdHJpbmcgbzEsIGZpbmFsIFN0cmluZyBvMikgeworCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIG8xLCBTdHJpbmcgbzIpIHsKIAkJCQkJCXJldHVybiBtdGltZXMuZ2V0KG8yKS5pbnRWYWx1ZSgpCiAJCQkJCQkJCS0gbXRpbWVzLmdldChvMSkuaW50VmFsdWUoKTsKIAkJCQkJfQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlU3RyZWFtIG9wZW4oU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZpbmFsIFNmdHBBVFRSUyBhID0gZnRwLmxzdGF0KHBhdGgpOwogCQkJCXJldHVybiBuZXcgRmlsZVN0cmVhbShmdHAuZ2V0KHBhdGgpLCBhLmdldFNpemUoKSk7CkBAIC0yOTIsNyArMjkyLDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGRlbGV0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgZGVsZXRlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZnRwLnJtKHBhdGgpOwogCQkJfSBjYXRjaCAoU2Z0cEV4Y2VwdGlvbiBqZSkgewpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIHdyaXRlRmlsZShTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlmaW5hbCBTdHJpbmcgbG9jayA9IHBhdGggKyBMT0NLX1NVRkZJWDsKIAkJCXRyeSB7CiAJCQkJc3VwZXIud3JpdGVGaWxlKGxvY2ssIGRhdGEpOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAJCQkJCQlqZS5nZXRNZXNzYWdlKCkpLCBqZSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CisJCQlmb3IgKENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkgewogCQkJCWZpbmFsIFN0cmluZyBuID0gZW50LmdldEZpbGVuYW1lKCk7CiAJCQkJaWYgKCIuIi5lcXVhbHMobikgfHwgIi4uIi5lcXVhbHMobikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQljb250aW51ZTsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5iYWRSZWYsIG5hbWUsIGxpbmUpKTsKIAkJfQogCi0JCXByaXZhdGUgU3RvcmFnZSBsb29zZShmaW5hbCBSZWYgcikgeworCQlwcml2YXRlIFN0b3JhZ2UgbG9vc2UoUmVmIHIpIHsKIAkJCWlmIChyICE9IG51bGwgJiYgci5nZXRTdG9yYWdlKCkgPT0gU3RvcmFnZS5QQUNLRUQpCiAJCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0VfUEFDS0VEOwogCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VUklpc2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhCmluZGV4IGEwNDhmZTMuLjAyNmZkODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhCkBAIC0zODcsNyArMzg3LDcgQEAKIAkgKiBAcGFyYW0gdQogCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkwgdG8gY29udmVydCBmcm9tLgogCSAqLwotCXB1YmxpYyBVUklpc2goZmluYWwgVVJMIHUpIHsKKwlwdWJsaWMgVVJJaXNoKFVSTCB1KSB7CiAJCXNjaGVtZSA9IHUuZ2V0UHJvdG9jb2woKTsKIAkJcGF0aCA9IHUuZ2V0UGF0aCgpOwogCQlwYXRoID0gY2xlYW5MZWFkaW5nU2xhc2hlcyhwYXRoLCBzY2hlbWUpOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAJCS8vIENvbmZpZ3VyZSBub3RoaW5nLgogCX0KIAotCXByaXZhdGUgVVJJaXNoKGZpbmFsIFVSSWlzaCB1KSB7CisJcHJpdmF0ZSBVUklpc2goVVJJaXNoIHUpIHsKIAkJdGhpcy5zY2hlbWUgPSB1LnNjaGVtZTsKIAkJdGhpcy5yYXdQYXRoID0gdS5yYXdQYXRoOwogCQl0aGlzLnBhdGggPSB1LnBhdGg7CkBAIC00NTEsNyArNDUxLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIGhvc3QuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldEhvc3QoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldEhvc3QoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLmhvc3QgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3Igc2NoZW1lLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRTY2hlbWUoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFNjaGVtZShTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIuc2NoZW1lID0gbjsKIAkJcmV0dXJuIHI7CkBAIC01MDQsNyArNTA0LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHBhdGguCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFBhdGgoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFBhdGgoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBhdGggPSBuOwogCQlyLnJhd1BhdGggPSBuOwpAQCAtNTE5LDcgKzUxOSw3IEBACiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKiBAdGhyb3dzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UmF3UGF0aChmaW5hbCBTdHJpbmcgbikgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisJcHVibGljIFVSSWlzaCBzZXRSYXdQYXRoKFN0cmluZyBuKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBhdGggPSB1bmVzY2FwZShuKTsKIAkJci5yYXdQYXRoID0gbjsKQEAgLTU0Miw3ICs1NDIsNyBAQAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdXNlci4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0VXNlcihmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0VXNlcihTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIudXNlciA9IG47CiAJCXJldHVybiByOwpAQCAtNTY0LDcgKzU2NCw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBwYXNzd29yZC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UGFzcyhmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0UGFzcyhTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucGFzcyA9IG47CiAJCXJldHVybiByOwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBwb3J0LgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRQb3J0KGZpbmFsIGludCBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRQb3J0KGludCBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5wb3J0ID0gbiA+IDAgPyBuIDogLTE7CiAJCXJldHVybiByOwpAQCAtNjEzLDcgKzYxMyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJJaXNoKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJZmluYWwgVVJJaXNoIGIgPSAoVVJJaXNoKSBvYmo7CkBAIC02MzIsNyArNjMyLDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBiKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGEpICYmIFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYikpCkBAIC02NTcsNyArNjU3LDcgQEAKIAkJcmV0dXJuIGZvcm1hdChmYWxzZSwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGZvcm1hdChmaW5hbCBib29sZWFuIGluY2x1ZGVQYXNzd29yZCwgYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSkgeworCXByaXZhdGUgU3RyaW5nIGZvcm1hdChib29sZWFuIGluY2x1ZGVQYXNzd29yZCwgYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlpZiAoZ2V0U2NoZW1lKCkgIT0gbnVsbCkgewogCQkJci5hcHBlbmQoZ2V0U2NoZW1lKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCmluZGV4IDhmNzViYmEuLjZhM2Q5YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKQEAgLTQzLDEwICs0MywxNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uLmlkZW50aXR5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9NYXA7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1RBR1M7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLkNPTU1BTkRfRkVUQ0g7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLkNPTU1BTkRfTFNfUkVGUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FHRU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FMTE9XX1RJUF9TSEExX0lOX1dBTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9ERUVQRU5fUkVMQVRJVkU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9GSUxURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9JTkNMVURFX1RBRzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX01VTFRJX0FDSzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRDsKQEAgLTY3LDEwICs3MywxMyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CkBAIC0xMDEsNiArMTEwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjay5QYWNrU3RhdGlzdGljczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5NdWx0aUFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZBZHZlcnRpc2VyLlBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlRyYW5zZmVyQ29uZmlnLlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uSW50ZXJydXB0VGltZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlRpbWVvdXRJbnB1dFN0cmVhbTsKQEAgLTIzNiw2ICsyNDYsMTIgQEAKIAkvKiogVGltZXIgdG8gbWFuYWdlIHtAbGluayAjdGltZW91dH0uICovCiAJcHJpdmF0ZSBJbnRlcnJ1cHRUaW1lciB0aW1lcjsKIAorCS8qKgorCSAqIFdoZXRoZXIgdGhlIGNsaWVudCByZXF1ZXN0ZWQgdG8gdXNlIHByb3RvY29sIFYyIHRocm91Z2ggYSBzaWRlCisJICogY2hhbm5lbCAoc3VjaCBhcyB0aGUgR2l0LVByb3RvY29sIEhUVFAgaGVhZGVyKS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2xpZW50UmVxdWVzdGVkVjI7CisKIAlwcml2YXRlIElucHV0U3RyZWFtIHJhd0luOwogCiAJcHJpdmF0ZSBSZXNwb25zZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHJhd091dDsKQEAgLTI0NiwxMiArMjYyLDE4IEBACiAKIAlwcml2YXRlIE91dHB1dFN0cmVhbSBtc2dPdXQgPSBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFOwogCi0JLyoqIFRoZSByZWZzIHdlIGFkdmVydGlzZWQgYXMgZXhpc3RpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb25uZWN0aW9uLiAqLworCS8qKgorCSAqIFJlZnMgZWxpZ2libGUgZm9yIGFkdmVydGlzaW5nIHRvIHRoZSBjbGllbnQsIHNldCB1c2luZworCSAqIHtAbGluayAjc2V0QWR2ZXJ0aXNlZFJlZnN9LgorCSAqLwogCXByaXZhdGUgTWFwPFN0cmluZywgUmVmPiByZWZzOwogCiAJLyoqIEhvb2sgdXNlZCB3aGlsZSBhZHZlcnRpc2luZyB0aGUgcmVmcyB0byB0aGUgY2xpZW50LiAqLwogCXByaXZhdGUgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2sgPSBBZHZlcnRpc2VSZWZzSG9vay5ERUZBVUxUOwogCisJLyoqIFdoZXRoZXIgdGhlIHtAbGluayAjYWR2ZXJ0aXNlUmVmc0hvb2t9IGhhcyBiZWVuIGludm9rZWQuICovCisJcHJpdmF0ZSBib29sZWFuIGFkdmVydGlzZVJlZnNIb29rQ2FsbGVkOworCiAJLyoqIEZpbHRlciB1c2VkIHdoaWxlIGFkdmVydGlzaW5nIHRoZSByZWZzIHRvIHRoZSBjbGllbnQuICovCiAJcHJpdmF0ZSBSZWZGaWx0ZXIgcmVmRmlsdGVyID0gUmVmRmlsdGVyLkRFRkFVTFQ7CiAKQEAgLTI3NywxMiArMjk5LDIyIEBACiAJLyoqIFNoYWxsb3cgY29tbWl0cyB0aGUgY2xpZW50IGFscmVhZHkgaGFzLiAqLwogCXByaXZhdGUgZmluYWwgU2V0PE9iamVjdElkPiBjbGllbnRTaGFsbG93Q29tbWl0cyA9IG5ldyBIYXNoU2V0PD4oKTsKIAotCS8qKiBTaGFsbG93IGNvbW1pdHMgb24gdGhlIGNsaWVudCB3aGljaCBhcmUgbm93IGJlY29taW5nIHVuc2hhbGxvdyAqLwotCXByaXZhdGUgZmluYWwgTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAJLyoqIERlc2lyZWQgZGVwdGggZnJvbSB0aGUgY2xpZW50IG9uIGEgc2hhbGxvdyByZXF1ZXN0LiAqLwogCXByaXZhdGUgaW50IGRlcHRoOwogCisJLyoqCisJICogQ29tbWl0IHRpbWUgb2YgdGhlIG5ld2VzdCBvYmplY3RzIHRoZSBjbGllbnQgaGFzIGFza2VkIHVzIHVzaW5nCisJICogLS1zaGFsbG93LXNpbmNlIG5vdCB0byBzZW5kLiBDYW5ub3QgYmUgbm9uemVybyBpZiBkZXB0aCBpcyBub256ZXJvLgorCSAqLworCXByaXZhdGUgaW50IHNoYWxsb3dTaW5jZTsKKworCS8qKgorCSAqIChQb3NzaWJseSBzaG9ydCkgcmVmIG5hbWVzLCBhbmNlc3RvcnMgb2Ygd2hpY2ggdGhlIGNsaWVudCBoYXMgYXNrZWQgdXMKKwkgKiBub3QgdG8gc2VuZCB1c2luZyAtLXNoYWxsb3ctZXhjbHVkZS4gQ2Fubm90IGJlIG5vbi1udWxsIGlmIGRlcHRoIGlzCisJICogbm9uemVyby4KKwkgKi8KKwlwcml2YXRlIEBOdWxsYWJsZSBMaXN0PFN0cmluZz4gc2hhbGxvd0V4Y2x1ZGVSZWZzOworCiAJLyoqIENvbW1pdCB0aW1lIG9mIHRoZSBvbGRlc3QgY29tbW9uIGNvbW1pdCwgaW4gc2Vjb25kcy4gKi8KIAlwcml2YXRlIGludCBvbGRlc3RUaW1lOwogCkBAIC0zMTYsOCArMzQ4LDcgQEAKIAogCXByaXZhdGUgUGFja1N0YXRpc3RpY3Mgc3RhdGlzdGljczsKIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSBVcGxvYWRQYWNrTG9nZ2VyIGxvZ2dlciA9IFVwbG9hZFBhY2tMb2dnZXIuTlVMTDsKKwlwcml2YXRlIGxvbmcgZmlsdGVyQmxvYkxpbWl0ID0gLTE7CiAKIAkvKioKIAkgKiBDcmVhdGUgYSBuZXcgcGFjayB1cGxvYWQgZm9yIGFuIG9wZW4gcmVwb3NpdG9yeS4KQEAgLTMyNSw3ICszNTYsNyBAQAogCSAqIEBwYXJhbSBjb3B5RnJvbQogCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSByZXBvc2l0b3J5LgogCSAqLwotCXB1YmxpYyBVcGxvYWRQYWNrKGZpbmFsIFJlcG9zaXRvcnkgY29weUZyb20pIHsKKwlwdWJsaWMgVXBsb2FkUGFjayhSZXBvc2l0b3J5IGNvcHlGcm9tKSB7CiAJCWRiID0gY29weUZyb207CiAJCXdhbGsgPSBuZXcgUmV2V2FsayhkYik7CiAJCXdhbGsuc2V0UmV0YWluQm9keShmYWxzZSk7CkBAIC00MTQsNyArNDQ1LDcgQEAKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoZQogCSAqICAgICAgICAgICAgY29ubmVjdGVkIGNsaWVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiAKQEAgLTQ0MSw3ICs0NzIsNyBAQAogCSAqICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHdyaXRpbmcgb3V0cHV0IGFuZCBkb2VzIG5vdCBwZXJmb3JtIHRoZQogCSAqICAgICAgICAgICAgaW5pdGlhbCBhZHZlcnRpc2luZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShmaW5hbCBib29sZWFuIHR3b1dheSkgeworCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGJvb2xlYW4gdHdvV2F5KSB7CiAJCWJpRGlyZWN0aW9uYWxQaXBlID0gdHdvV2F5OwogCX0KIApAQCAtNTQ0LDcgKzU3NSw3IEBACiAJICogQHBhcmFtIGFkdmVydGlzZVJlZnNIb29rCiAJICogICAgICAgICAgICB0aGUgaG9vazsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhmaW5hbCBBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgeworCXB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CiAJCWlmIChhZHZlcnRpc2VSZWZzSG9vayAhPSBudWxsKQogCQkJdGhpcy5hZHZlcnRpc2VSZWZzSG9vayA9IGFkdmVydGlzZVJlZnNIb29rOwogCQllbHNlCkBAIC01NjMsNyArNTk0LDcgQEAKIAkgKiBAcGFyYW0gcmVmRmlsdGVyCiAJICogICAgICAgICAgICB0aGUgZmlsdGVyOyBtYXkgYmUgbnVsbCB0byBzaG93IGFsbCByZWZzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihmaW5hbCBSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0UmVmRmlsdGVyKFJlZkZpbHRlciByZWZGaWx0ZXIpIHsKIAkJdGhpcy5yZWZGaWx0ZXIgPSByZWZGaWx0ZXIgIT0gbnVsbCA/IHJlZkZpbHRlciA6IFJlZkZpbHRlci5ERUZBVUxUOwogCX0KIApAQCAtNjM4LDI5ICs2NjksNiBAQAogCX0KIAogCS8qKgotCSAqIEdldCB0aGUgY29uZmlndXJlZCBsb2dnZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIGxvZ2dlci4KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRQcmVVcGxvYWRIb29rKCl9LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIFVwbG9hZFBhY2tMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbG9nZ2VyLgotCSAqCi0JICogQHBhcmFtIGxvZ2dlcgotCSAqICAgICAgICAgICAgdGhlIGxvZ2dlciBpbnN0YW5jZS4gSWYgbnVsbCwgbm8gbG9nZ2luZyBvY2N1cnMuCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0UHJlVXBsb2FkSG9vayhQcmVVcGxvYWRIb29rKX0uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgdm9pZCBzZXRMb2dnZXIoVXBsb2FkUGFja0xvZ2dlciBsb2dnZXIpIHsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JfQotCi0JLyoqCiAJICogQ2hlY2sgd2hldGhlciB0aGUgY2xpZW50IGV4cGVjdHMgYSBzaWRlLWJhbmQgc3RyZWFtLgogCSAqCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGllbnQgaGFzIGFkdmVydGlzZWQgYSBzaWRlLWJhbmQgY2FwYWJpbGl0eSwgZmFsc2UKQEAgLTY3OSw4ICs2ODcsMzQgQEAKIAl9CiAKIAkvKioKKwkgKiBTZXQgdGhlIEV4dHJhIFBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudC4KKwkgKgorCSAqIDxwPlRoZXNlIGFyZSBwYXJhbWV0ZXJzIHBhc3NlZCBieSB0aGUgY2xpZW50IHRocm91Z2ggYSBzaWRlIGNoYW5uZWwKKwkgKiBzdWNoIGFzIHRoZSBHaXQtUHJvdG9jb2wgSFRUUCBoZWFkZXIsIHRvIGFsbG93IGEgY2xpZW50IHRvIHJlcXVlc3QKKwkgKiBhIG5ld2VyIHJlc3BvbnNlIGZvcm1hdCB3aGlsZSByZW1haW5pbmcgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHNlcnZlcnMKKwkgKiB0aGF0IGRvIG5vdCB1bmRlcnN0YW5kIGRpZmZlcmVudCByZXF1ZXN0IGZvcm1hdHMuCisJICoKKwkgKiBAcGFyYW0gcGFyYW1zCisJICogICAgICAgICAgICBwYXJhbWV0ZXJzIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHNwbGl0IGF0IGNvbG9ucyBvciBOVUwKKwkgKiAgICAgICAgICAgIGJ5dGVzLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHRyYVBhcmFtZXRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IHBhcmFtcykgeworCQl0aGlzLmNsaWVudFJlcXVlc3RlZFYyID0gcGFyYW1zLmNvbnRhaW5zKCJ2ZXJzaW9uPTIiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgYm9vbGVhbiB1c2VQcm90b2NvbFYyKCkgeworCQlyZXR1cm4gUHJvdG9jb2xWZXJzaW9uLlYyLmVxdWFscyh0cmFuc2ZlckNvbmZpZy5wcm90b2NvbFZlcnNpb24pCisJCQkJJiYgY2xpZW50UmVxdWVzdGVkVjI7CisJfQorCisJLyoqCiAJICogRXhlY3V0ZSB0aGUgdXBsb2FkIHRhc2sgb24gdGhlIHNvY2tldC4KIAkgKgorCSAqIDxwPklmIHRoZSBjbGllbnQgcGFzc2VkIGV4dHJhIHBhcmFtZXRlcnMgKGUuZy4sICJ2ZXJzaW9uPTIiKSB0aHJvdWdoIGEKKwkgKiBzaWRlIGNoYW5uZWwsIHRoZSBjYWxsZXIgbXVzdCBjYWxsIHNldEV4dHJhUGFyYW1ldGVycyBmaXJzdCB0byBzdXBwbHkKKwkgKiB0aGVtLgorCSAqCiAJICogQHBhcmFtIGlucHV0CiAJICogICAgICAgICAgICByYXcgaW5wdXQgdG8gcmVhZCBjbGllbnQgY29tbWFuZHMgZnJvbS4gQ2FsbGVyIG11c3QgZW5zdXJlIHRoZQogCSAqICAgICAgICAgICAgaW5wdXQgaXMgYnVmZmVyZWQsIG90aGVyd2lzZSByZWFkIHBlcmZvcm1hbmNlIG1heSBzdWZmZXIuCkBAIC03MjEsNyArNzU1LDExIEBACiAKIAkJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyYXdJbik7CiAJCQlwY2tPdXQgPSBuZXcgUGFja2V0TGluZU91dChyYXdPdXQpOwotCQkJc2VydmljZSgpOworCQkJaWYgKHVzZVByb3RvY29sVjIoKSkgeworCQkJCXNlcnZpY2VWMigpOworCQkJfSBlbHNlIHsKKwkJCQlzZXJ2aWNlKCk7CisJCQl9CiAJCX0gZmluYWxseSB7CiAJCQltc2dPdXQgPSBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFOwogCQkJd2Fsay5jbG9zZSgpOwpAQCAtNzQxLDIxICs3NzksNiBAQAogCSAqIEByZXR1cm4gc3RhdGlzdGljcyBhYm91dCBwYWNrIG91dHB1dCwgaWYgYSBwYWNrIHdhcyBzZW50LiBOdWxsIGlmIG5vIHBhY2sKIAkgKiAgICAgICAgIHdhcyBzZW50LCBzdWNoIGFzIGR1cmluZyB0aGUgbmVnb3RpYXRpb24gcGhhc2Ugb2YgYSBzbWFydCBIVFRQCiAJICogICAgICAgICBjb25uZWN0aW9uLCBvciBpZiB0aGUgY2xpZW50IHdhcyBhbHJlYWR5IHVwLXRvLWRhdGUuCi0JICogQHNpbmNlIDMuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFN0YXRpc3RpY3MoKX0uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgUGFja1dyaXRlci5TdGF0aXN0aWNzIGdldFBhY2tTdGF0aXN0aWNzKCkgewotCQlyZXR1cm4gc3RhdGlzdGljcyA9PSBudWxsID8gbnVsbAotCQkJCTogbmV3IFBhY2tXcml0ZXIuU3RhdGlzdGljcyhzdGF0aXN0aWNzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFBhY2tXcml0ZXIncyBzdGF0aXN0aWNzIGlmIGEgcGFjayB3YXMgc2VudCB0byB0aGUgY2xpZW50LgotCSAqCi0JICogQHJldHVybiBzdGF0aXN0aWNzIGFib3V0IHBhY2sgb3V0cHV0LCBpZiBhIHBhY2sgd2FzIHNlbnQuIE51bGwgaWYgbm8gcGFjawotCSAqICAgICAgICAgd2FzIHNlbnQsIHN1Y2ggYXMgZHVyaW5nIHRoZSBuZWdvdGlhdGlvbiBwaGFzZSBvZiBhIHNtYXJ0IEhUVFAKLQkgKiAgICAgICAgIGNvbm5lY3Rpb24sIG9yIGlmIHRoZSBjbGllbnQgd2FzIGFscmVhZHkgdXAtdG8tZGF0ZS4KIAkgKiBAc2luY2UgNC4xCiAJICovCiAJcHVibGljIFBhY2tTdGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKSB7CkBAIC03NjcsMTggKzc5MCw1NiBAQAogCQkJcmV0dXJuIHJlZnM7CiAJCX0KIAotCQlhZHZlcnRpc2VSZWZzSG9vay5hZHZlcnRpc2VSZWZzKHRoaXMpOworCQlpZiAoIWFkdmVydGlzZVJlZnNIb29rQ2FsbGVkKSB7CisJCQlhZHZlcnRpc2VSZWZzSG9vay5hZHZlcnRpc2VSZWZzKHRoaXMpOworCQkJYWR2ZXJ0aXNlUmVmc0hvb2tDYWxsZWQgPSB0cnVlOworCQl9CiAJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCXNldEFkdmVydGlzZWRSZWZzKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpKTsKKwkJCS8vIEZhbGwgYmFjayB0byBhbGwgcmVmcy4KKwkJCXNldEFkdmVydGlzZWRSZWZzKAorCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKS5zdHJlYW0oKQorCQkJCQkJLmNvbGxlY3QodG9NYXAoUmVmOjpnZXROYW1lLCBpZGVudGl0eSgpKSkpOwogCQl9CiAJCXJldHVybiByZWZzOwogCX0KIAorCXByaXZhdGUgTWFwPFN0cmluZywgUmVmPiBnZXRGaWx0ZXJlZFJlZnMoQ29sbGVjdGlvbjxTdHJpbmc+IHJlZlByZWZpeGVzKQorCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAocmVmUHJlZml4ZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKTsKKwkJfQorCQlpZiAocmVmcyA9PSBudWxsICYmICFhZHZlcnRpc2VSZWZzSG9va0NhbGxlZCkgeworCQkJYWR2ZXJ0aXNlUmVmc0hvb2suYWR2ZXJ0aXNlUmVmcyh0aGlzKTsKKwkJCWFkdmVydGlzZVJlZnNIb29rQ2FsbGVkID0gdHJ1ZTsKKwkJfQorCQlpZiAocmVmcyA9PSBudWxsKSB7CisJCQkvLyBGYXN0IHBhdGg6IHRoZSBhZHZlcnRpc2VkIHJlZnMgaG9vayBkaWQgbm90IHNldCBhZHZlcnRpc2VkIHJlZnMuCisJCQlNYXA8U3RyaW5nLCBSZWY+IHJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJZm9yIChTdHJpbmcgcCA6IHJlZlByZWZpeGVzKSB7CisJCQkJZm9yIChSZWYgciA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KHApKSB7CisJCQkJCXJzLnB1dChyLmdldE5hbWUoKSwgcik7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlZkZpbHRlciAhPSBSZWZGaWx0ZXIuREVGQVVMVCkgeworCQkJCXJldHVybiByZWZGaWx0ZXIuZmlsdGVyKHJzKTsKKwkJCX0KKwkJCXJldHVybiB0cmFuc2ZlckNvbmZpZy5nZXRSZWZGaWx0ZXIoKS5maWx0ZXIocnMpOworCQl9CisKKwkJLy8gU2xvdyBwYXRoOiBmaWx0ZXIgdGhlIHJlZnMgcHJvdmlkZWQgYnkgdGhlIGFkdmVydGlzZWQgcmVmcyBob29rLgorCQkvLyByZWZGaWx0ZXIgaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHJlZnMuCisJCXJldHVybiByZWZzLnZhbHVlcygpLnN0cmVhbSgpCisJCQkJLmZpbHRlcihyZWYgLT4gcmVmUHJlZml4ZXMuc3RyZWFtKCkKKwkJCQkJCS5hbnlNYXRjaChyZWYuZ2V0TmFtZSgpOjpzdGFydHNXaXRoKSkKKwkJCQkuY29sbGVjdCh0b01hcChSZWY6OmdldE5hbWUsIGlkZW50aXR5KCkpKTsKKwl9CisKIAlwcml2YXRlIHZvaWQgc2VydmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gc2VuZFBhY2sgPSBmYWxzZTsKIAkJLy8gSWYgaXQncyBhIG5vbi1iaWRpIHJlcXVlc3QsIHdlIG5lZWQgdG8gcmVhZCB0aGUgZW50aXJlIHJlcXVlc3QgYmVmb3JlCiAJCS8vIHdyaXRpbmcgYSByZXNwb25zZS4gQnVmZmVyIHRoZSByZXNwb25zZSB1bnRpbCB0aGVuLgogCQlQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvciA9IG5ldyBQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvcigpOworCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSB7CiAJCQlpZiAoYmlEaXJlY3Rpb25hbFBpcGUpCiAJCQkJc2VuZEFkdmVydGlzZWRSZWZzKG5ldyBQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcihwY2tPdXQpKTsKQEAgLTgwOCw3ICs4NjksNyBAQAogCQkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCiAJCQkJdmVyaWZ5Q2xpZW50U2hhbGxvdygpOwogCQkJaWYgKGRlcHRoICE9IDApCi0JCQkJcHJvY2Vzc1NoYWxsb3coKTsKKwkJCQlwcm9jZXNzU2hhbGxvdyhudWxsLCB1bnNoYWxsb3dDb21taXRzLCB0cnVlKTsKIAkJCWlmICghY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKQogCQkJCXdhbGsuYXNzdW1lU2hhbGxvdyhjbGllbnRTaGFsbG93Q29tbWl0cyk7CiAJCQlzZW5kUGFjayA9IG5lZ290aWF0ZShhY2N1bXVsYXRvcik7CkBAIC04NjAsOCArOTIxLDI3OCBAQAogCQkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKIAkJfQogCi0JCWlmIChzZW5kUGFjaykKLQkJCXNlbmRQYWNrKGFjY3VtdWxhdG9yKTsKKwkJaWYgKHNlbmRQYWNrKSB7CisJCQlzZW5kUGFjayhhY2N1bXVsYXRvciwgcmVmcyA9PSBudWxsID8gbnVsbCA6IHJlZnMudmFsdWVzKCksIHVuc2hhbGxvd0NvbW1pdHMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxzUmVmc1YyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIgYWR2ID0gbmV3IFBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyKHBja091dCk7CisJCVN0cmluZyBsaW5lOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZWZQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlib29sZWFuIG5lZWRUb0ZpbmRTeW1yZWZzID0gZmFsc2U7CisKKwkJYWR2LnNldFVzZVByb3RvY29sVjIodHJ1ZSk7CisKKwkJbGluZSA9IHBja0luLnJlYWRTdHJpbmcoKTsKKworCQkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IGFueSBjYXBhYmlsaXRpZXMsIHNvIHRoZSBuZXh0CisJCS8vIGxpbmUgaXMgREVMSU0gaWYgdGhlcmUgYXJlIGFyZ3VtZW50cyBvciBFTkQgaWYgbm90LgorCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uREVMSU0pIHsKKwkJCXdoaWxlICgobGluZSA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJCWlmIChsaW5lLmVxdWFscygicGVlbCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKKwkJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJzeW1yZWZzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQluZWVkVG9GaW5kU3ltcmVmcyA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoInJlZi1wcmVmaXggIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZWZQcmVmaXhlcy5hZGQobGluZS5zdWJzdHJpbmcoInJlZi1wcmVmaXggIi5sZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChsaW5lICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCX0KKwkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKKworCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnNUb1NlbmQgPSBnZXRGaWx0ZXJlZFJlZnMocmVmUHJlZml4ZXMpOworCisJCWlmIChuZWVkVG9GaW5kU3ltcmVmcykgeworCQkJZmluZFN5bXJlZnMoYWR2LCByZWZzVG9TZW5kKTsKKwkJfQorCisJCWFkdi5zZW5kKHJlZnNUb1NlbmQpOworCQlhZHYuZW5kKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZldGNoVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvcHRpb25zID0gbmV3IEhhc2hTZXQ8PigpOworCisJCS8vIFBhY2tzIGFyZSBhbHdheXMgc2VudCBtdWx0aXBsZXhlZCBhbmQgdXNpbmcgZnVsbCA2NEsKKwkJLy8gbGVuZ3Rocy4KKwkJb3B0aW9ucy5hZGQoT1BUSU9OX1NJREVfQkFORF82NEspOworCisJCS8vIERlcGVuZGluZyBvbiB0aGUgcmVxdWVzdFZhbGlkYXRvciwgI3Byb2Nlc3NIYXZlTGluZXMgbWF5CisJCS8vIHJlcXVpcmUgdGhhdCBhZHZlcnRpc2VkIGJlIHNldC4gU2V0IGl0IG9ubHkgaW4gdGhlIHJlcXVpcmVkCisJCS8vIGNpcmN1bXN0YW5jZXMgKHRvIGF2b2lkIGEgZnVsbCByZWYgbG9va3VwIGluIHRoZSBjYXNlIHRoYXQKKwkJLy8gd2UgZG9uJ3QgbmVlZCBpdCkuCisJCWlmIChyZXF1ZXN0VmFsaWRhdG9yIGluc3RhbmNlb2YgVGlwUmVxdWVzdFZhbGlkYXRvciB8fAorCQkJCXJlcXVlc3RWYWxpZGF0b3IgaW5zdGFuY2VvZiBSZWFjaGFibGVDb21taXRUaXBSZXF1ZXN0VmFsaWRhdG9yIHx8CisJCQkJcmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIEFueVJlcXVlc3RWYWxpZGF0b3IpIHsKKwkJCWFkdmVydGlzZWQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCQl9IGVsc2UgeworCQkJYWR2ZXJ0aXNlZCA9IHJlZklkU2V0KGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCkudmFsdWVzKCkpOworCQl9CisKKwkJU3RyaW5nIGxpbmU7CisJCUxpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJYm9vbGVhbiBkb25lUmVjZWl2ZWQgPSBmYWxzZTsKKworCQkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IGFueSBjYXBhYmlsaXRpZXMsIHNvIHRoZSBuZXh0CisJCS8vIGxpbmUgaXMgREVMSU0uCisJCWlmICgobGluZSA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkRFTElNKSB7CisJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQl9CisKKwkJYm9vbGVhbiBpbmNsdWRlVGFnID0gZmFsc2U7CisJCWJvb2xlYW4gZmlsdGVyUmVjZWl2ZWQgPSBmYWxzZTsKKwkJd2hpbGUgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlpZiAobGluZS5zdGFydHNXaXRoKCJ3YW50ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3YW50SWRzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiaGF2ZSAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcGVlckhhcy5hZGQoT2JqZWN0SWQuZnJvbVN0cmluZyhsaW5lLnN1YnN0cmluZyg1KSkpOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscygiZG9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlkb25lUmVjZWl2ZWQgPSB0cnVlOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fVEhJTl9QQUNLKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9USElOX1BBQ0spOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fTk9fUFJPR1JFU1MpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX05PX1BST0dSRVNTKTsKKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX0lOQ0xVREVfVEFHKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9JTkNMVURFX1RBRyk7CisJCQkJaW5jbHVkZVRhZyA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9PRlNfREVMVEEpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX09GU19ERUxUQSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgic2hhbGxvdyAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJY2xpZW50U2hhbGxvd0NvbW1pdHMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoOCkpKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4gIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRlcHRoID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZyg3KSk7CisJCQkJaWYgKGRlcHRoIDw9IDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRGVwdGgsCisJCQkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpKSk7CisJCQkJfQorCQkJCWlmIChzaGFsbG93U2luY2UgIT0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlblNpbmNlV2l0aERlZXBlbik7CisJCQkJfQorCQkJCWlmIChzaGFsbG93RXhjbHVkZVJlZnMgIT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlbk5vdFdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4tbm90ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlMaXN0PFN0cmluZz4gZXhjbHVkZSA9IHNoYWxsb3dFeGNsdWRlUmVmczsKKwkJCQlpZiAoZXhjbHVkZSA9PSBudWxsKSB7CisJCQkJCWV4Y2x1ZGUgPSBzaGFsbG93RXhjbHVkZVJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQl9CisJCQkJZXhjbHVkZS5hZGQobGluZS5zdWJzdHJpbmcoMTEpKTsKKwkJCQlpZiAoZGVwdGggIT0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlbk5vdFdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX0RFRVBFTl9SRUxBVElWRSkpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fREVFUEVOX1JFTEFUSVZFKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4tc2luY2UgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNoYWxsb3dTaW5jZSA9IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMTMpKTsKKwkJCQlpZiAoc2hhbGxvd1NpbmNlIDw9IDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lc3RhbXAsIGxpbmUpKTsKKwkJCQl9CisJCQkJaWYgKGRlcHRoICE9ICAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuU2luY2VXaXRoRGVlcGVuKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKQorCQkJCQkmJiBsaW5lLnN0YXJ0c1dpdGgoT1BUSU9OX0ZJTFRFUiArICcgJykpIHsKKwkJCQlpZiAoZmlsdGVyUmVjZWl2ZWQpIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b29NYW55RmlsdGVycyk7CisJCQkJfQorCQkJCWZpbHRlclJlY2VpdmVkID0gdHJ1ZTsKKwkJCQlwYXJzZUZpbHRlcihsaW5lLnN1YnN0cmluZyhPUFRJT05fRklMVEVSLmxlbmd0aCgpICsgMSkpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5leHBlY3RlZFBhY2tldExpbmUsIGxpbmUpKTsKKwkJCX0KKwkJfQorCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCisJCWJvb2xlYW4gc2VjdGlvblNlbnQgPSBmYWxzZTsKKwkJQE51bGxhYmxlIExpc3Q8T2JqZWN0SWQ+IHNoYWxsb3dDb21taXRzID0gbnVsbDsKKwkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCWlmICghY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKSB7CisJCQl2ZXJpZnlDbGllbnRTaGFsbG93KCk7CisJCX0KKwkJaWYgKGRlcHRoICE9IDAgfHwgc2hhbGxvd1NpbmNlICE9IDAgfHwgc2hhbGxvd0V4Y2x1ZGVSZWZzICE9IG51bGwpIHsKKwkJCXNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDxPYmplY3RJZD4oKTsKKwkJCXByb2Nlc3NTaGFsbG93KHNoYWxsb3dDb21taXRzLCB1bnNoYWxsb3dDb21taXRzLCBmYWxzZSk7CisJCX0KKwkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCisJCQl3YWxrLmFzc3VtZVNoYWxsb3coY2xpZW50U2hhbGxvd0NvbW1pdHMpOworCisJCWlmIChkb25lUmVjZWl2ZWQpIHsKKwkJCXByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgT2JqZWN0SWQuemVyb0lkKCksIG5ldyBQYWNrZXRMaW5lT3V0KE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKTsKKwkJfSBlbHNlIHsKKwkJCXBja091dC53cml0ZVN0cmluZygiYWNrbm93bGVkZ21lbnRzXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChPYmplY3RJZCBpZCA6IHBlZXJIYXMpIHsKKwkJCQlpZiAod2Fsay5nZXRPYmplY3RSZWFkZXIoKS5oYXMoaWQpKSB7CisJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJfQorCQkJcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBPYmplY3RJZC56ZXJvSWQoKSwgbmV3IFBhY2tldExpbmVPdXQoTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpOworCQkJaWYgKG9rVG9HaXZlVXAoKSkgeworCQkJCXBja091dC53cml0ZVN0cmluZygicmVhZHlcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJOQUtcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlzZWN0aW9uU2VudCA9IHRydWU7CisJCX0KKworCQlpZiAoZG9uZVJlY2VpdmVkIHx8IG9rVG9HaXZlVXAoKSkgeworCQkJaWYgKHNoYWxsb3dDb21taXRzICE9IG51bGwpIHsKKwkJCQlpZiAoc2VjdGlvblNlbnQpCisJCQkJCXBja091dC53cml0ZURlbGltKCk7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93LWluZm9cbiIpOyAvLyROT04tTkxTLTEkCisJCQkJZm9yIChPYmplY3RJZCBvIDogc2hhbGxvd0NvbW1pdHMpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLmdldE5hbWUoKSArICdcbicpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWZvciAoT2JqZWN0SWQgbyA6IHVuc2hhbGxvd0NvbW1pdHMpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIG8uZ2V0TmFtZSgpICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJc2VjdGlvblNlbnQgPSB0cnVlOworCQkJfQorCisJCQlpZiAoc2VjdGlvblNlbnQpCisJCQkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJCXBja091dC53cml0ZVN0cmluZygicGFja2ZpbGVcbiIpOyAvLyROT04tTkxTLTEkCisJCQlzZW5kUGFjayhuZXcgUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IoKSwKKwkJCQkJaW5jbHVkZVRhZworCQkJCQkJPyBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChSX1RBR1MpCisJCQkJCQk6IG51bGwsCisJCQkJCXVuc2hhbGxvd0NvbW1pdHMpOworCQl9CisJCXBja091dC5lbmQoKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNvbW1hbmQgYW5kIHdlIHNob3VsZCB0ZWFyIGRvd24gdGhlCisJICogY29ubmVjdGlvbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gc2VydmVPbmVDb21tYW5kVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgY29tbWFuZDsKKwkJdHJ5IHsKKwkJCWNvbW1hbmQgPSBwY2tJbi5yZWFkU3RyaW5nKCk7CisJCX0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlb2YpIHsKKwkJCS8qIEVPRiB3aGVuIGF3YWl0aW5nIGNvbW1hbmQgaXMgZmluZSAqLworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGNvbW1hbmQgPT0gUGFja2V0TGluZUluLkVORCkgeworCQkJLy8gQSBibGFuayByZXF1ZXN0IGlzIHZhbGlkIGFjY29yZGluZworCQkJLy8gdG8gdGhlIHByb3RvY29sOyBkbyBub3RoaW5nIGluIHRoaXMKKwkJCS8vIGNhc2UuCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29tbWFuZC5lcXVhbHMoImNvbW1hbmQ9IiArIENPTU1BTkRfTFNfUkVGUykpIHsgLy8kTk9OLU5MUy0xJAorCQkJbHNSZWZzVjIoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY29tbWFuZC5lcXVhbHMoImNvbW1hbmQ9IiArIENPTU1BTkRfRkVUQ0gpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZldGNoVjIoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVua25vd25UcmFuc3BvcnRDb21tYW5kLCBjb21tYW5kKSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gY2FwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXBzLmFkZCgidmVyc2lvbiAyIik7IC8vJE5PTi1OTFMtMSQKKwkJY2Fwcy5hZGQoQ09NTUFORF9MU19SRUZTKTsKKwkJY2Fwcy5hZGQoCisJCQkJQ09NTUFORF9GRVRDSCArICc9JyArCisJCQkJKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKSA/IE9QVElPTl9GSUxURVIgKyAnICcgOiAiIikgKyAvLyROT04tTkxTLTEkCisJCQkJT1BUSU9OX1NIQUxMT1cpOworCQlyZXR1cm4gY2FwczsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VydmljZVYyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJpRGlyZWN0aW9uYWxQaXBlKSB7CisJCQkvLyBKdXN0IGxpa2UgaW4gc2VydmljZSgpLCB0aGUgY2FwYWJpbGl0eSBhZHZlcnRpc2VtZW50CisJCQkvLyBpcyBzZW50IG9ubHkgaWYgdGhpcyBpcyBhIGJpZGlyZWN0aW9uYWwgcGlwZS4gKElmCisJCQkvLyBub3QsIHRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gY2FsbAorCQkJLy8gc2VuZEFkdmVydGlzZWRSZWZzKCkgb24gaXRzIG93bi4pCisJCQlmb3IgKFN0cmluZyBzIDogZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKHMgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJcGNrT3V0LmVuZCgpOworCisJCQl3aGlsZSAoIXNlcnZlT25lQ29tbWFuZFYyKCkpIHsKKwkJCQkvLyBSZXBlYXQgdW50aWwgYW4gZW1wdHkgY29tbWFuZCBvciBFT0YuCisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJc2VydmVPbmVDb21tYW5kVjIoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXdoaWxlICgwIDwgcmF3SW4uc2tpcCgyMDQ4KSB8fCAwIDw9IHJhd0luLnJlYWQoKSkgeworCQkJCS8vIERpc2NhcmQgdW50aWwgRU9GLgorCQkJfQorCQkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKKwkJfQogCX0KIAogCXByaXZhdGUgc3RhdGljIFNldDxPYmplY3RJZD4gcmVmSWRTZXQoQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHsKQEAgLTg3OSw3ICsxMjEwLDIzIEBACiAJCXJldHVybiBpZHM7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaGFsbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvKgorCSAqIERldGVybWluZXMgd2hhdCAic2hhbGxvdyIgYW5kICJ1bnNoYWxsb3ciIGxpbmVzIHRvIHNlbmQgdG8gdGhlIHVzZXIuCisJICogVGhlIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gdG8gc2hhbGxvd0NvbW1pdHMgKGlmIG5vdCBudWxsKSBhbmQKKwkgKiB1bnNoYWxsb3dDb21taXRzLCBhbmQgYWxzbyB3cml0dGVuIHRvICNwY2tPdXQgKGlmIHdyaXRlVG9QY2tPdXQgaXMKKwkgKiB0cnVlKS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1NoYWxsb3coQE51bGxhYmxlIExpc3Q8T2JqZWN0SWQ+IHNoYWxsb3dDb21taXRzLAorCQkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cywKKwkJCWJvb2xlYW4gd3JpdGVUb1Bja091dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX0RFRVBFTl9SRUxBVElWRSkgfHwKKwkJCQlzaGFsbG93U2luY2UgIT0gMCB8fAorCQkJCXNoYWxsb3dFeGNsdWRlUmVmcyAhPSBudWxsKSB7CisJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBJbXBsZW1lbnQgZGVlcGVuLXJlbGF0aXZlLCBkZWVwZW4tc2luY2UsCisJCQkvLyBhbmQgZGVlcGVuLW5vdC4KKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisKIAkJaW50IHdhbGtEZXB0aCA9IGRlcHRoIC0gMTsKIAkJdHJ5IChEZXB0aFdhbGsuUmV2V2FsayBkZXB0aFdhbGsgPSBuZXcgRGVwdGhXYWxrLlJldldhbGsoCiAJCQkJd2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgd2Fsa0RlcHRoKSkgewpAQCAtOTAwLDE5ICsxMjQ3LDI5IEBACiAJCQkJLy8gQ29tbWl0cyBhdCB0aGUgYm91bmRhcnkgd2hpY2ggYXJlbid0IGFscmVhZHkgc2hhbGxvdyBpbgogCQkJCS8vIHRoZSBjbGllbnQgbmVlZCB0byBiZSBtYXJrZWQgYXMgc3VjaAogCQkJCWlmIChjLmdldERlcHRoKCkgPT0gd2Fsa0RlcHRoCi0JCQkJCQkmJiAhY2xpZW50U2hhbGxvd0NvbW1pdHMuY29udGFpbnMoYykpCi0JCQkJCXBja091dC53cml0ZVN0cmluZygic2hhbGxvdyAiICsgby5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCQkmJiAhY2xpZW50U2hhbGxvd0NvbW1pdHMuY29udGFpbnMoYykpIHsKKwkJCQkJaWYgKHNoYWxsb3dDb21taXRzICE9IG51bGwpIHsKKwkJCQkJCXNoYWxsb3dDb21taXRzLmFkZChjLmNvcHkoKSk7CisJCQkJCX0KKwkJCQkJaWYgKHdyaXRlVG9QY2tPdXQpIHsKKwkJCQkJCXBja091dC53cml0ZVN0cmluZygic2hhbGxvdyAiICsgby5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQl9CiAKIAkJCQkvLyBDb21taXRzIG5vdCBvbiB0aGUgYm91bmRhcnkgd2hpY2ggYXJlIHNoYWxsb3cgaW4gdGhlIGNsaWVudAogCQkJCS8vIG5lZWQgdG8gYmVjb21lIHVuc2hhbGxvd2VkCiAJCQkJaWYgKGMuZ2V0RGVwdGgoKSA8IHdhbGtEZXB0aAogCQkJCQkJJiYgY2xpZW50U2hhbGxvd0NvbW1pdHMucmVtb3ZlKGMpKSB7CiAJCQkJCXVuc2hhbGxvd0NvbW1pdHMuYWRkKGMuY29weSgpKTsKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIGMubmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAod3JpdGVUb1Bja091dCkgeworCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIGMubmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JCXBja091dC5lbmQoKTsKKwkJaWYgKHdyaXRlVG9QY2tPdXQpIHsKKwkJCXBja091dC5lbmQoKTsKKwkJfQogCX0KIAogCXByaXZhdGUgdm9pZCB2ZXJpZnlDbGllbnRTaGFsbG93KCkKQEAgLTk1MCwxNCArMTMwNyw1MCBAQAogCSAqIEBwYXJhbSBhZHYKIAkgKiAgICAgICAgICAgIHRoZSBhZHZlcnRpc2VtZW50IGZvcm1hdHRlci4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgorCSAqICAgICAgICAgICAgdGhlIGZvcm1hdHRlciBmYWlsZWQgdG8gd3JpdGUgYW4gYWR2ZXJ0aXNlbWVudC4KIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgorCSAqICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKGZpbmFsIFJlZkFkdmVydGlzZXIgYWR2KSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2KSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24geworCQlzZW5kQWR2ZXJ0aXNlZFJlZnMoYWR2LCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSBhbiBhZHZlcnRpc2VtZW50IG9mIGF2YWlsYWJsZSByZWZzIGFuZCBjYXBhYmlsaXRpZXMuCisJICoKKwkgKiBAcGFyYW0gYWR2CisJICogICAgICAgICAgICB0aGUgYWR2ZXJ0aXNlbWVudCBmb3JtYXR0ZXIuCisJICogQHBhcmFtIHNlcnZpY2VOYW1lCisJICogICAgICAgICAgICBpZiBub3QgbnVsbCwgYWxzbyBvdXRwdXQgIiMgc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYQorCSAqICAgICAgICAgICAgZmx1c2ggcGFja2V0IGJlZm9yZSB0aGUgYWR2ZXJ0aXNlbWVudC4gVGhpcyBpcyByZXF1aXJlZAorCSAqICAgICAgICAgICAgaW4gdjAgb2YgdGhlIEhUVFAgcHJvdG9jb2wsIGRlc2NyaWJlZCBpbiBHaXQncworCSAqICAgICAgICAgICAgRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvaHR0cC1wcm90b2NvbC50eHQuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgorCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgaG9vayBkZW5pZWQgYWR2ZXJ0aXNlbWVudC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2LAorCQkJQE51bGxhYmxlIFN0cmluZyBzZXJ2aWNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorCQkJU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKKwkJaWYgKHVzZVByb3RvY29sVjIoKSkgeworCQkJLy8gVGhlIGVxdWl2YWxlbnQgaW4gdjIgaXMgb25seSB0aGUgY2FwYWJpbGl0aWVzCisJCQkvLyBhZHZlcnRpc2VtZW50LgorCQkJZm9yIChTdHJpbmcgcyA6IGdldFYyQ2FwYWJpbGl0eUFkdmVydGlzZW1lbnQoKSkgeworCQkJCWFkdi53cml0ZU9uZShzKTsKKwkJCX0KKwkJCWFkdi5lbmQoKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCU1hcDxTdHJpbmcsIFJlZj4gYWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMgPSBnZXRBZHZlcnRpc2VkT3JEZWZhdWx0UmVmcygpOwogCisJCWlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisJCQlhZHYud3JpdGVPbmUoIiMgc2VydmljZT0iICsgc2VydmljZU5hbWUgKyAnXG4nKTsgLy8kTk9OLU5MUy0xJAorCQkJYWR2LmVuZCgpOworCQl9CiAJCWFkdi5pbml0KGRiKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0lOQ0xVREVfVEFHKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRCk7CkBAIC05ODAsNiArMTM3Myw5IEBACiAJCQkJfHwgcG9saWN5ID09IG51bGwpCiAJCQlhZHYuYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVCk7CiAJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9BR0VOVCwgVXNlckFnZW50LmdldCgpKTsKKwkJaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKSkgeworCQkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0ZJTFRFUik7CisJCX0KIAkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKIAkJZmluZFN5bXJlZnMoYWR2LCBhZHZlcnRpc2VkT3JEZWZhdWx0UmVmcyk7CiAJCWFkdmVydGlzZWQgPSBhZHYuc2VuZChhZHZlcnRpc2VkT3JEZWZhdWx0UmVmcyk7CkBAIC0xMDE3LDggKzE0MTMsMzYgQEAKIAkJcmV0dXJuIG1zZ091dDsKIAl9CiAKKwlwcml2YXRlIHZvaWQgcGFyc2VGaWx0ZXIoU3RyaW5nIGFyZykgdGhyb3dzIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiB7CisJCWlmIChhcmcuZXF1YWxzKCJibG9iOm5vbmUiKSkgeyAvLyROT04tTkxTLTEkCisJCQlmaWx0ZXJCbG9iTGltaXQgPSAwOworCQl9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCJibG9iOmxpbWl0PSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRyeSB7CisJCQkJZmlsdGVyQmxvYkxpbWl0ID0gTG9uZy5wYXJzZUxvbmcoCisJCQkJCQlhcmcuc3Vic3RyaW5nKCJibG9iOmxpbWl0PSIubGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZEZpbHRlciwKKwkJCQkJCQkJYXJnKSk7CisJCQl9CisJCX0KKwkJLyoKKwkJICogV2UgbXVzdCBoYXZlICgxKSBlaXRoZXIgImJsb2I6bm9uZSIgb3IKKwkJICogImJsb2I6bGltaXQ9IiBzZXQgKGJlY2F1c2Ugd2Ugb25seSBzdXBwb3J0CisJCSAqIGJsb2Igc2l6ZSBsaW1pdHMgZm9yIG5vdyksIGFuZCAoMikgaWYgdGhlCisJCSAqIGxhdHRlciwgdGhlbiBpdCBtdXN0IGJlIG5vbm5lZ2F0aXZlLiBUaHJvdworCQkgKiBpZiAoMSkgb3IgKDIpIGlzIG5vdCBtZXQuCisJCSAqLworCQlpZiAoZmlsdGVyQmxvYkxpbWl0IDwgMCkgeworCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZEZpbHRlciwKKwkJCQkJCQlhcmcpKTsKKwkJfQorCX0KKwogCXByaXZhdGUgdm9pZCByZWN2V2FudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlib29sZWFuIGlzRmlyc3QgPSB0cnVlOworCQlib29sZWFuIGZpbHRlclJlY2VpdmVkID0gZmFsc2U7CiAJCWZvciAoOzspIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJdHJ5IHsKQEAgLTEwNDcsNiArMTQ3MSwxOSBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCisJCQlpZiAodHJhbnNmZXJDb25maWcuaXNBbGxvd0ZpbHRlcigpCisJCQkJCSYmIGxpbmUuc3RhcnRzV2l0aChPUFRJT05fRklMVEVSICsgIiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIGFyZyA9IGxpbmUuc3Vic3RyaW5nKE9QVElPTl9GSUxURVIubGVuZ3RoKCkgKyAxKTsKKworCQkJCWlmIChmaWx0ZXJSZWNlaXZlZCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRvb01hbnlGaWx0ZXJzKTsKKwkJCQl9CisJCQkJZmlsdGVyUmVjZWl2ZWQgPSB0cnVlOworCisJCQkJcGFyc2VGaWx0ZXIoYXJnKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwogCQkJaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIndhbnQgIikgfHwgbGluZS5sZW5ndGgoKSA8IDQ1KSAvLyROT04tTkxTLTEkCiAJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5leHBlY3RlZEdvdCwgIndhbnQiLCBsaW5lKSk7IC8vJE5PTi1OTFMtMSQKIApAQCAtMTExOCw3ICsxNTU1LDcgQEAKIAkJCX0KIAogCQkJaWYgKGxpbmUgPT0gUGFja2V0TGluZUluLkVORCkgewotCQkJCWxhc3QgPSBwcm9jZXNzSGF2ZUxpbmVzKHBlZXJIYXMsIGxhc3QpOworCQkJCWxhc3QgPSBwcm9jZXNzSGF2ZUxpbmVzKHBlZXJIYXMsIGxhc3QsIHBja091dCk7CiAJCQkJaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpIHx8IG11bHRpQWNrICE9IE11bHRpQWNrLk9GRikKIAkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJOQUtcbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJaWYgKG5vRG9uZSAmJiBzZW50UmVhZHkpIHsKQEAgLTExMzMsNyArMTU3MCw3IEBACiAJCQkJcGVlckhhcy5hZGQoT2JqZWN0SWQuZnJvbVN0cmluZyhsaW5lLnN1YnN0cmluZyg1KSkpOwogCQkJCWFjY3VtdWxhdG9yLmhhdmVzKys7CiAJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJkb25lIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWxhc3QgPSBwcm9jZXNzSGF2ZUxpbmVzKHBlZXJIYXMsIGxhc3QpOworCQkJCWxhc3QgPSBwcm9jZXNzSGF2ZUxpbmVzKHBlZXJIYXMsIGxhc3QsIHBja091dCk7CiAKIAkJCQlpZiAoY29tbW9uQmFzZS5pc0VtcHR5KCkpCiAJCQkJCXBja091dC53cml0ZVN0cmluZygiTkFLXG4iKTsgLy8kTk9OLU5MUy0xJApAQCAtMTE0OSw3ICsxNTg2LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0KQorCXByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0LCBQYWNrZXRMaW5lT3V0IG91dCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByZVVwbG9hZEhvb2sub25CZWdpbk5lZ290aWF0ZVJvdW5kKHRoaXMsIHdhbnRJZHMsIHBlZXJIYXMuc2l6ZSgpKTsKIAkJaWYgKHdhbnRBbGwuaXNFbXB0eSgpICYmICF3YW50SWRzLmlzRW1wdHkoKSkKQEAgLTExOTQsMTMgKzE2MzEsMTMgQEAKIAkJCQlzd2l0Y2ggKG11bHRpQWNrKSB7CiAJCQkJY2FzZSBPRkY6CiAJCQkJCWlmIChjb21tb25CYXNlLnNpemUoKSA9PSAxKQotCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBDT05USU5VRToKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbnRpbnVlXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIiBjb250aW51ZVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlicmVhazsKIAkJCQljYXNlIERFVEFJTEVEOgotCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29tbW9uXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIiBjb21tb25cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMTIyNiwxMCArMTY2MywxMCBAQAogCQkJCQkJY2FzZSBPRkY6CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIENPTlRJTlVFOgotCQkJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIGNvbnRpbnVlXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCQlicmVhazsKIAkJCQkJCWNhc2UgREVUQUlMRUQ6Ci0JCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgcmVhZHlcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJCXNlbnRSZWFkeSA9IHRydWU7CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CkBAIC0xMjQxLDcgKzE2NzgsNyBAQAogCiAJCWlmIChtdWx0aUFjayA9PSBNdWx0aUFjay5ERVRBSUxFRCAmJiAhZGlkT2tUb0dpdmVVcCAmJiBva1RvR2l2ZVVwKCkpIHsKIAkJCU9iamVjdElkIGlkID0gcGVlckhhcy5nZXQocGVlckhhcy5zaXplKCkgLSAxKTsKLQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIHJlYWR5XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJc2VudFJlYWR5ID0gdHJ1ZTsKIAkJfQogCkBAIC0xMzM2LDcgKzE3NzMsNyBAQAogCQkJCW5ldyBSZWFjaGFibGVDb21taXRUaXBSZXF1ZXN0VmFsaWRhdG9yKCkuY2hlY2tXYW50cyh1cCwgd2FudHMpOwogCQkJZWxzZSBpZiAoIXdhbnRzLmlzRW1wdHkoKSkgewogCQkJCVNldDxPYmplY3RJZD4gcmVmSWRzID0KLQkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpLnZhbHVlcygpKTsKKwkJCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSk7CiAJCQkJZm9yIChPYmplY3RJZCBvYmogOiB3YW50cykgewogCQkJCQlpZiAoIXJlZklkcy5jb250YWlucyhvYmopKQogCQkJCQkJdGhyb3cgbmV3IFdhbnROb3RWYWxpZEV4Y2VwdGlvbihvYmopOwpAQCAtMTM1Niw3ICsxNzkzLDcgQEAKIAkJcHVibGljIHZvaWQgY2hlY2tXYW50cyhVcGxvYWRQYWNrIHVwLCBMaXN0PE9iamVjdElkPiB3YW50cykKIAkJCQl0aHJvd3MgUGFja1Byb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQljaGVja05vdEFkdmVydGlzZWRXYW50cyh1cCwgd2FudHMsCi0JCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKS52YWx1ZXMoKSkpOworCQkJCQlyZWZJZFNldCh1cC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpKTsKIAkJfQogCX0KIApAQCAtMTQzOSw3ICsxODc2LDcgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRDb21tb25CYXNlKGZpbmFsIFJldk9iamVjdCBvKSB7CisJcHJpdmF0ZSB2b2lkIGFkZENvbW1vbkJhc2UoUmV2T2JqZWN0IG8pIHsKIAkJaWYgKCFvLmhhcyhDT01NT04pKSB7CiAJCQlvLmFkZChDT01NT04pOwogCQkJY29tbW9uQmFzZS5hZGQobyk7CkBAIC0xNDY4LDcgKzE5MDUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIHdhbnRTYXRpc2ZpZWQoZmluYWwgUmV2T2JqZWN0IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBib29sZWFuIHdhbnRTYXRpc2ZpZWQoUmV2T2JqZWN0IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh3YW50LmhhcyhTQVRJU0ZJRUQpKQogCQkJcmV0dXJuIHRydWU7CiAKQEAgLTE0ODksMTMgKzE5MjYsMjkgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgdm9pZCBzZW5kUGFjayhQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJLyoqCisJICogU2VuZCB0aGUgcmVxdWVzdGVkIG9iamVjdHMgdG8gdGhlIGNsaWVudC4KKwkgKgorCSAqIEBwYXJhbSBhY2N1bXVsYXRvcgorCSAqICAgICAgICAgICAgICAgIHdoZXJlIHRvIHdyaXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhY2suCisJICogQHBhcmFtIGFsbFRhZ3MKKwkgKiAgICAgICAgICAgICAgICByZWZzIHRvIHNlYXJjaCBmb3IgYW5ub3RhdGVkIHRhZ3MgdG8gaW5jbHVkZSBpbiB0aGUgcGFjaworCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgI09QVElPTl9JTkNMVURFX1RBR30gY2FwYWJpbGl0eSB3YXMKKwkgKiAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHBhcmFtIHVuc2hhbGxvd0NvbW1pdHMKKwkgKiAgICAgICAgICAgICAgICBzaGFsbG93IGNvbW1pdHMgb24gdGhlIGNsaWVudCB0aGF0IGFyZSBub3cgYmVjb21pbmcKKwkgKiAgICAgICAgICAgICAgICB1bnNoYWxsb3cKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBnZW5lcmF0aW5nIG9yIHdyaXRpbmcgdGhlIHBhY2suCisJICovCisJcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248UmVmPiBhbGxUYWdzLAorCQkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYm9vbGVhbiBzaWRlYmFuZCA9IG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX1NJREVfQkFORCkKIAkJCQl8fCBvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9TSURFX0JBTkRfNjRLKTsKIAkJaWYgKHNpZGViYW5kKSB7CiAJCQl0cnkgewotCQkJCXNlbmRQYWNrKHRydWUsIGFjY3VtdWxhdG9yKTsKKwkJCQlzZW5kUGFjayh0cnVlLCBhY2N1bXVsYXRvciwgYWxsVGFncywgdW5zaGFsbG93Q29tbWl0cyk7CiAJCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gbm9QYWNrKSB7CiAJCQkJLy8gVGhpcyB3YXMgYWxyZWFkeSByZXBvcnRlZCBvbiAoYmVsb3cpLgogCQkJCXRocm93IG5vUGFjazsKQEAgLTE1MTYsNyArMTk2OSw3IEBACiAJCQkJCXRocm93IGVycjsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXNlbmRQYWNrKGZhbHNlLCBhY2N1bXVsYXRvcik7CisJCQlzZW5kUGFjayhmYWxzZSwgYWNjdW11bGF0b3IsIGFsbFRhZ3MsIHVuc2hhbGxvd0NvbW1pdHMpOwogCQl9CiAJfQogCkBAIC0xNTM2LDkgKzE5ODksMjggQEAKIAkJfQogCX0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisJLyoqCisJICogU2VuZCB0aGUgcmVxdWVzdGVkIG9iamVjdHMgdG8gdGhlIGNsaWVudC4KKwkgKgorCSAqIEBwYXJhbSBzaWRlYmFuZAorCSAqICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gd3JhcCB0aGUgcGFjayBpbiBzaWRlLWJhbmQgcGt0LWxpbmVzLAorCSAqICAgICAgICAgICAgICAgIGludGVybGVhdmVkIHdpdGggcHJvZ3Jlc3MgbWVzc2FnZXMgYW5kIGVycm9ycy4KKwkgKiBAcGFyYW0gYWNjdW11bGF0b3IKKwkgKiAgICAgICAgICAgICAgICB3aGVyZSB0byB3cml0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb250ZW50IG9mIHRoZSBwYWNrLgorCSAqIEBwYXJhbSBhbGxUYWdzCisJICogICAgICAgICAgICAgICAgcmVmcyB0byBzZWFyY2ggZm9yIGFubm90YXRlZCB0YWdzIHRvIGluY2x1ZGUgaW4gdGhlIHBhY2sKKwkgKiAgICAgICAgICAgICAgICBpZiB0aGUge0BsaW5rICNPUFRJT05fSU5DTFVERV9UQUd9IGNhcGFiaWxpdHkgd2FzCisJICogICAgICAgICAgICAgICAgcmVxdWVzdGVkLgorCSAqIEBwYXJhbSB1bnNoYWxsb3dDb21taXRzCisJICogICAgICAgICAgICAgICAgc2hhbGxvdyBjb21taXRzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbm93IGJlY29taW5nCisJICogICAgICAgICAgICAgICAgdW5zaGFsbG93CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2VuZXJhdGluZyBvciB3cml0aW5nIHRoZSBwYWNrLgorCSAqLwogCXByaXZhdGUgdm9pZCBzZW5kUGFjayhmaW5hbCBib29sZWFuIHNpZGViYW5kLAotCQkJUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvciwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFJlZj4gYWxsVGFncywKKwkJCUxpc3Q8T2JqZWN0SWQ+IHVuc2hhbGxvd0NvbW1pdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVByb2dyZXNzTW9uaXRvciBwbSA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CiAJCU91dHB1dFN0cmVhbSBwYWNrT3V0ID0gcmF3T3V0OwogCkBAIC0xNTc5LDExICsyMDUxLDE4IEBACiAJCVBhY2tDb25maWcgY2ZnID0gcGFja0NvbmZpZzsKIAkJaWYgKGNmZyA9PSBudWxsKQogCQkJY2ZnID0gbmV3IFBhY2tDb25maWcoZGIpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBQYWNrV3JpdGVyIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGZpbmFsbHkKKwkJCQkJCQkJCQkvLyBibG9jaywgYW5kIGlzIGNsb3NlZCB0aGVyZQogCQlmaW5hbCBQYWNrV3JpdGVyIHB3ID0gbmV3IFBhY2tXcml0ZXIoY2ZnLCB3YWxrLmdldE9iamVjdFJlYWRlcigpLAogCQkJCWFjY3VtdWxhdG9yKTsKIAkJdHJ5IHsKIAkJCXB3LnNldEluZGV4RGlzYWJsZWQodHJ1ZSk7Ci0JCQlwdy5zZXRVc2VDYWNoZWRQYWNrcyh0cnVlKTsKKwkJCWlmIChmaWx0ZXJCbG9iTGltaXQgPj0gMCkgeworCQkJCXB3LnNldEZpbHRlckJsb2JMaW1pdChmaWx0ZXJCbG9iTGltaXQpOworCQkJCXB3LnNldFVzZUNhY2hlZFBhY2tzKGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJcHcuc2V0VXNlQ2FjaGVkUGFja3ModHJ1ZSk7CisJCQl9CiAJCQlwdy5zZXRVc2VCaXRtYXBzKGRlcHRoID09IDAgJiYgY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKTsKIAkJCXB3LnNldENsaWVudFNoYWxsb3dDb21taXRzKGNsaWVudFNoYWxsb3dDb21taXRzKTsKIAkJCXB3LnNldFJldXNlRGVsdGFDb21taXRzKHRydWUpOwpAQCAtMTU5MSw2ICsyMDcwLDggQEAKIAkJCXB3LnNldFRoaW4ob3B0aW9ucy5jb250YWlucyhPUFRJT05fVEhJTl9QQUNLKSk7CiAJCQlwdy5zZXRSZXVzZVZhbGlkYXRpbmdPYmplY3RzKGZhbHNlKTsKIAorCQkJLy8gT2JqZWN0cyBuYW1lZCBkaXJlY3RseSBieSByZWZlcmVuY2VzIGdvIGF0IHRoZSBiZWdpbm5pbmcKKwkJCS8vIG9mIHRoZSBwYWNrLgogCQkJaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpICYmIHJlZnMgIT0gbnVsbCkgewogCQkJCVNldDxPYmplY3RJZD4gdGFnVGFyZ2V0cyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCQlmb3IgKFJlZiByZWYgOiByZWZzLnZhbHVlcygpKSB7CkBAIC0xNjIxLDggKzIxMDIsOCBAQAogCQkJCXJ3ID0gb3c7CiAJCQl9CiAKLQkJCWlmIChvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9JTkNMVURFX1RBRykgJiYgcmVmcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChSZWYgcmVmIDogcmVmcy52YWx1ZXMoKSkgeworCQkJaWYgKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX0lOQ0xVREVfVEFHKSAmJiBhbGxUYWdzICE9IG51bGwpIHsKKwkJCQlmb3IgKFJlZiByZWYgOiBhbGxUYWdzKSB7CiAJCQkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldE9iamVjdElkKCk7CiAJCQkJCWlmIChvYmplY3RJZCA9PSBudWxsKSB7CiAJCQkJCQkvLyBza2lwIHVuYm9ybiBicmFuY2gKQEAgLTE2NDAsNyArMjEyMSw3IEBACiAJCQkJCX0KIAogCQkJCQlpZiAoIXJlZi5pc1BlZWxlZCgpKQotCQkJCQkJcmVmID0gZGIucGVlbChyZWYpOworCQkJCQkJcmVmID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAKIAkJCQkJT2JqZWN0SWQgcGVlbGVkSWQgPSByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCQkJb2JqZWN0SWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKQEAgLTE2NjUsNyArMjE0Niw2IEBACiAJCQlzdGF0aXN0aWNzID0gcHcuZ2V0U3RhdGlzdGljcygpOwogCQkJaWYgKHN0YXRpc3RpY3MgIT0gbnVsbCkgewogCQkJCXBvc3RVcGxvYWRIb29rLm9uUG9zdFVwbG9hZChzdGF0aXN0aWNzKTsKLQkJCQlsb2dnZXIub25QYWNrU3RhdGlzdGljcyhuZXcgUGFja1dyaXRlci5TdGF0aXN0aWNzKHN0YXRpc3RpY3MpKTsKIAkJCX0KIAkJCXB3LmNsb3NlKCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExNDE4ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExLCBHb29nbGUgSW5jLgotICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjay5QYWNrV3JpdGVyOwotCi0vKioKLSAqIExvZ3MgYWN0aXZpdHkgdGhhdCBvY2N1cnJlZCB3aXRoaW4KLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrfS4KLSAqIDxwPgotICogSW1wbGVtZW50b3JzIG9mIHRoZSBpbnRlcmZhY2UgYXJlIHJlc3BvbnNpYmxlIGZvciBhc3NvY2lhdGluZyB0aGUgY3VycmVudAotICogdGhyZWFkIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uLCBpZiB0aGV5IG5lZWQgdG8gYWxzbyBpbmNsdWRlIGNvbm5lY3Rpb24KLSAqIGluZm9ybWF0aW9uLiBPbmUgbWV0aG9kIGlzIHRvIHVzZSBhIHtAbGluayBqYXZhLmxhbmcuVGhyZWFkTG9jYWx9IHRvIHJlbWVtYmVyCi0gKiB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBiZWZvcmUgaW52b2tpbmcgVXBsb2FkUGFjay4KLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBvc3RVcGxvYWRIb29rfSBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgaW50ZXJmYWNlIFVwbG9hZFBhY2tMb2dnZXIgeyAvLyBUT0RPIHJlbW92ZSBpbiBKR2l0IDUuMAotCS8qKiBBIHNpbXBsZSBuby1vcCBsb2dnZXIuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVcGxvYWRQYWNrTG9nZ2VyIE5VTEwgPSBuZXcgVXBsb2FkUGFja0xvZ2dlcigpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG9uUGFja1N0YXRpc3RpY3MoUGFja1dyaXRlci5TdGF0aXN0aWNzIHN0YXRzKSB7Ci0JCQkvLyBEbyBub3RoaW5nLgotCQl9Ci0JfTsKLQotCS8qKgotCSAqIE5vdGljZSB0byB0aGUgbG9nZ2VyIGFmdGVyIGEgcGFjayBoYXMgYmVlbiBzZW50LgotCSAqCi0JICogQHBhcmFtIHN0YXRzCi0JICogICAgICAgICAgICB0aGUgc3RhdGlzdGljcyBhZnRlciBzZW5kaW5nIGEgcGFjayB0byB0aGUgY2xpZW50LgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBvblBhY2tTdGF0aXN0aWNzKFBhY2tXcml0ZXIuU3RhdGlzdGljcyBzdGF0cyk7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyQ2hhaW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXJDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE0NjcyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgR29vZ2xlIEluYy4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjay5QYWNrV3JpdGVyOwotCi0vKioKLSAqIFVwbG9hZFBhY2tMb2dnZXIgdGhhdCBkZWxlZ2F0ZXMgdG8gYSBsaXN0IG9mIG90aGVyIGxvZ2dlcnMuCi0gKiA8cD4KLSAqIGxvZ2dlcnMgYXJlIHJ1biBpbiB0aGUgb3JkZXIgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBvc3RVcGxvYWRIb29rQ2hhaW59Ci0gKiAgICAgICAgICAgICBpbnN0ZWFkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFVwbG9hZFBhY2tMb2dnZXJDaGFpbiBpbXBsZW1lbnRzIFVwbG9hZFBhY2tMb2dnZXIgewotCXByaXZhdGUgZmluYWwgVXBsb2FkUGFja0xvZ2dlcltdIGxvZ2dlcnM7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgY291bnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbG9nZ2VyIGNoYWluaW5nIHRoZSBnaXZlbiBsb2dnZXJzIHRvZ2V0aGVyLgotCSAqCi0JICogQHBhcmFtIGxvZ2dlcnMKLQkgKiAgICAgICAgICAgIGxvZ2dlcnMgdG8gZXhlY3V0ZSwgaW4gb3JkZXIuCi0JICogQHJldHVybiBhIG5ldyBsb2dnZXIgY2hhaW4gb2YgdGhlIGdpdmVuIGxvZ2dlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGxvYWRQYWNrTG9nZ2VyIG5ld0NoYWluKAotCQkJTGlzdDw/IGV4dGVuZHMgVXBsb2FkUGFja0xvZ2dlcj4gbG9nZ2VycykgewotCQlVcGxvYWRQYWNrTG9nZ2VyW10gbmV3TG9nZ2VycyA9IG5ldyBVcGxvYWRQYWNrTG9nZ2VyW2xvZ2dlcnMuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFVwbG9hZFBhY2tMb2dnZXIgbG9nZ2VyIDogbG9nZ2VycykKLQkJCWlmIChsb2dnZXIgIT0gVXBsb2FkUGFja0xvZ2dlci5OVUxMKQotCQkJCW5ld0xvZ2dlcnNbaSsrXSA9IGxvZ2dlcjsKLQkJaWYgKGkgPT0gMCkKLQkJCXJldHVybiBVcGxvYWRQYWNrTG9nZ2VyLk5VTEw7Ci0JCWVsc2UgaWYgKGkgPT0gMSkKLQkJCXJldHVybiBuZXdMb2dnZXJzWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFVwbG9hZFBhY2tMb2dnZXJDaGFpbihuZXdMb2dnZXJzLCBpKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG9uUGFja1N0YXRpc3RpY3MoUGFja1dyaXRlci5TdGF0aXN0aWNzIHN0YXRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCWxvZ2dlcnNbaV0ub25QYWNrU3RhdGlzdGljcyhzdGF0cyk7Ci0JfQotCi0JcHJpdmF0ZSBVcGxvYWRQYWNrTG9nZ2VyQ2hhaW4oVXBsb2FkUGFja0xvZ2dlcltdIGxvZ2dlcnMsIGludCBjb3VudCkgewotCQl0aGlzLmxvZ2dlcnMgPSBsb2dnZXJzOwotCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEKaW5kZXggNjE1ZTQ2Yi4uYjQyNDhlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvbi5qYXZhCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnN1cHBvcnRlZEVuY3J5cHRpb25BbGdvcml0aG0sIHYpKTsKIAl9CiAKLQlJT0V4Y2VwdGlvbiBlcnJvcihmaW5hbCBUaHJvd2FibGUgd2h5KSB7CisJSU9FeGNlcHRpb24gZXJyb3IoVGhyb3dhYmxlIHdoeSkgewogCQlyZXR1cm4gbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKIAkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmVuY3J5cHRpb25FcnJvciwKIAkJCQl3aHkuZ2V0TWVzc2FnZSgpKSwgd2h5KTsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgdmFsaWRhdGUoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gdSwgZmluYWwgU3RyaW5nIHByZWZpeCkKKwkJdm9pZCB2YWxpZGF0ZShIdHRwVVJMQ29ubmVjdGlvbiB1LCBTdHJpbmcgcHJlZml4KQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl2YWxpZGF0ZUltcGwodSwgcHJlZml4LCAiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQpAQCAtMjQwLDE5ICsyNDAsMTkgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHJlcXVlc3QoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gdSwgZmluYWwgU3RyaW5nIHByZWZpeCkgeworCQl2b2lkIHJlcXVlc3QoSHR0cFVSTENvbm5lY3Rpb24gdSwgU3RyaW5nIHByZWZpeCkgewogCQkJdS5zZXRSZXF1ZXN0UHJvcGVydHkocHJlZml4ICsgSkVUUzNUX0NSWVBUT19WRVIsIENSWVBUT19WRVIpOwogCQkJdS5zZXRSZXF1ZXN0UHJvcGVydHkocHJlZml4ICsgSkVUUzNUX0NSWVBUT19BTEcsIGNyeXB0b0FsZyk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB2YWxpZGF0ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1LCBmaW5hbCBTdHJpbmcgcHJlZml4KQorCQl2b2lkIHZhbGlkYXRlKEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXZhbGlkYXRlSW1wbCh1LCBwcmVmaXgsIENSWVBUT19WRVIsIGNyeXB0b0FsZyk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJT3V0cHV0U3RyZWFtIGVuY3J5cHQoZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlPdXRwdXRTdHJlYW0gZW5jcnlwdChPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZpbmFsIENpcGhlciBjaXBoZXIgPSBJbnNlY3VyZUNpcGhlckZhY3RvcnkuY3JlYXRlKGNyeXB0b0FsZyk7CiAJCQkJY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgc2VjcmV0S2V5LCBwYXJhbVNwZWMpOwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJSW5wdXRTdHJlYW0gZGVjcnlwdChmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gZGVjcnlwdChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgQ2lwaGVyIGNpcGhlciA9IEluc2VjdXJlQ2lwaGVyRmFjdG9yeS5jcmVhdGUoY3J5cHRvQWxnKTsKIAkJCQljaXBoZXIuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBzZWNyZXRLZXksIHBhcmFtU3BlYyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEKaW5kZXggNjcwODk2NC4uOTMwNzkxNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0ZldGNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YQpAQCAtNDQsOCArNDQsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC01OCw3ICs1Niw2IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbXBvdW5kRXhjZXB0aW9uOwpAQCAtMTkwLDcgKzE4Nyw3IEBACiAJLyoqIEluc2VydGVyIHRvIHJlYWQgb2JqZWN0cyBmcm9tIHtAbGluayAjbG9jYWx9LiAqLwogCXByaXZhdGUgZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcjsKIAotCVdhbGtGZXRjaENvbm5lY3Rpb24oZmluYWwgV2Fsa1RyYW5zcG9ydCB0LCBmaW5hbCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgdykgeworCVdhbGtGZXRjaENvbm5lY3Rpb24oV2Fsa1RyYW5zcG9ydCB0LCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgdykgewogCQlUcmFuc3BvcnQgd3QgPSAoVHJhbnNwb3J0KXQ7CiAJCWxvY2FsID0gd3QubG9jYWw7CiAJCW9iakNoZWNrID0gd3QuZ2V0T2JqZWN0Q2hlY2tlcigpOwpAQCAtMjU5LDcgKzI1Niw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCQlsb2NrTWVzc2FnZSA9IG1lc3NhZ2U7CiAJfQogCkBAIC0yNjgsMTggKzI2NSwxOCBAQAogCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQlpbnNlcnRlci5jbG9zZSgpOwogCQlyZWFkZXIuY2xvc2UoKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVQYWNrIHAgOiB1bmZldGNoZWRQYWNrcykgeworCQlmb3IgKFJlbW90ZVBhY2sgcCA6IHVuZmV0Y2hlZFBhY2tzKSB7CiAJCQlpZiAocC50bXBJZHggIT0gbnVsbCkKIAkJCQlwLnRtcElkeC5kZWxldGUoKTsKIAkJfQotCQlmb3IgKGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSByIDogcmVtb3RlcykKKwkJZm9yIChXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgciA6IHJlbW90ZXMpCiAJCQlyLmNsb3NlKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHF1ZXVlV2FudHMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnQpCisJcHJpdmF0ZSB2b2lkIHF1ZXVlV2FudHMoQ29sbGVjdGlvbjxSZWY+IHdhbnQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgSGFzaFNldDxPYmplY3RJZD4gaW5Xb3JrUXVldWUgPSBuZXcgSGFzaFNldDw+KCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiB3YW50KSB7CisJCWZvciAoUmVmIHIgOiB3YW50KSB7CiAJCQlmaW5hbCBPYmplY3RJZCBpZCA9IHIuZ2V0T2JqZWN0SWQoKTsKIAkJCWlmIChpZCA9PSBudWxsKSB7CiAJCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KApAQCAtMzAyLDcgKzI5OSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2VzcyhmaW5hbCBPYmplY3RJZCBpZCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3MoT2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBSZXZPYmplY3Qgb2JqOwogCQl0cnkgewogCQkJaWYgKGlkIGluc3RhbmNlb2YgUmV2T2JqZWN0KSB7CkBAIC0zNDIsNyArMzM5LDcgQEAKIAkJZmV0Y2hFcnJvcnMucmVtb3ZlKGlkKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0Jsb2IoZmluYWwgUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NCbG9iKFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJaWYgKHJlYWRlci5oYXMob2JqLCBDb25zdGFudHMuT0JKX0JMT0IpKQogCQkJCW9iai5hZGQoQ09NUExFVEUpOwpAQCAtMzU2LDcgKzM1Myw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1RyZWUoZmluYWwgUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NUcmVlKFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJdHJlZVdhbGsucmVzZXQob2JqKTsKIAkJCXdoaWxlICh0cmVlV2Fsay5uZXh0KCkpIHsKQEAgLTM4NCwyMiArMzgxLDIyIEBACiAJCW9iai5hZGQoQ09NUExFVEUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWl0KGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWl0KFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBSZXZDb21taXQgY29tbWl0ID0gKFJldkNvbW1pdCkgb2JqOwogCQltYXJrTG9jYWxDb21taXRzQ29tcGxldGUoY29tbWl0LmdldENvbW1pdFRpbWUoKSk7CiAJCW5lZWRzKGNvbW1pdC5nZXRUcmVlKCkpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogY29tbWl0LmdldFBhcmVudHMoKSkKKwkJZm9yIChSZXZDb21taXQgcCA6IGNvbW1pdC5nZXRQYXJlbnRzKCkpCiAJCQluZWVkcyhwKTsKIAkJb2JqLmFkZChDT01QTEVURSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYWcoZmluYWwgUmV2T2JqZWN0IG9iaikgeworCXByaXZhdGUgdm9pZCBwcm9jZXNzVGFnKFJldk9iamVjdCBvYmopIHsKIAkJZmluYWwgUmV2VGFnIHRhZyA9IChSZXZUYWcpIG9iajsKIAkJbmVlZHModGFnLmdldE9iamVjdCgpKTsKIAkJb2JqLmFkZChDT01QTEVURSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG5lZWRzKGZpbmFsIFJldk9iamVjdCBvYmopIHsKKwlwcml2YXRlIHZvaWQgbmVlZHMoUmV2T2JqZWN0IG9iaikgewogCQlpZiAob2JqLmhhcyhDT01QTEVURSkpCiAJCQlyZXR1cm47CiAJCWlmICghb2JqLmhhcyhJTl9XT1JLX1FVRVVFKSkgewpAQCAtNDA4LDcgKzQwNSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZG93bmxvYWRPYmplY3QoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHBtLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwcml2YXRlIHZvaWQgZG93bmxvYWRPYmplY3QoUHJvZ3Jlc3NNb25pdG9yIHBtLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlpZiAoYWxyZWFkeUhhdmUoaWQpKQogCQkJcmV0dXJuOwpAQCAtNDYyLDcgKzQ1OSw3IEBACiAKIAkJCQlpZiAocGFja05hbWVMaXN0ID09IG51bGwgfHwgcGFja05hbWVMaXN0LmlzRW1wdHkoKSkKIAkJCQkJY29udGludWU7Ci0JCQkJZm9yIChmaW5hbCBTdHJpbmcgcGFja05hbWUgOiBwYWNrTmFtZUxpc3QpIHsKKwkJCQlmb3IgKFN0cmluZyBwYWNrTmFtZSA6IHBhY2tOYW1lTGlzdCkgewogCQkJCQlpZiAocGFja3NDb25zaWRlcmVkLmFkZChwYWNrTmFtZSkpCiAJCQkJCQl1bmZldGNoZWRQYWNrcy5hZGQobmV3IFJlbW90ZVBhY2sod3JyLCBwYWNrTmFtZSkpOwogCQkJCX0KQEAgLTQ3NCw3ICs0NzEsNyBAQAogCQkJLy8KIAkJCUNvbGxlY3Rpb248V2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlPiBhbCA9IGV4cGFuZE9uZUFsdGVybmF0ZShpZCwgcG0pOwogCQkJaWYgKGFsICE9IG51bGwgJiYgIWFsLmlzRW1wdHkoKSkgewotCQkJCWZvciAoZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIGFsdCA6IGFsKSB7CisJCQkJZm9yIChXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYWx0IDogYWwpIHsKIAkJCQkJcmVtb3Rlcy5hZGQoYWx0KTsKIAkJCQkJbm9QYWNrc1lldC5hZGQoYWx0KTsKIAkJCQkJbm9BbHRlcm5hdGVzWWV0LmFkZChhbHQpOwpAQCAtNDk4LDcgKzQ5NSw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUhhdmUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5SGF2ZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gcmVhZGVyLmhhcyhpZCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycm9yKSB7CkBAIC02ODksMjEgKzY4NiwyMSBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya0xvY2FsUmVmc0NvbXBsZXRlKGZpbmFsIFNldDxPYmplY3RJZD4gaGF2ZSkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmczsKKwlwcml2YXRlIHZvaWQgbWFya0xvY2FsUmVmc0NvbXBsZXRlKFNldDxPYmplY3RJZD4gaGF2ZSkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCUxpc3Q8UmVmPiByZWZzOwogCQl0cnkgewotCQkJcmVmcyA9IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOworCQkJcmVmcyA9IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJfQotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJdHJ5IHsKIAkJCQltYXJrTG9jYWxPYmpDb21wbGV0ZShyZXZXYWxrLnBhcnNlQW55KHIuZ2V0T2JqZWN0SWQoKSkpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVhZEVycm9yKSB7CiAJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5sb2NhbFJlZklzTWlzc2luZ09iamVjdHMsIHIuZ2V0TmFtZSgpKSwgcmVhZEVycm9yKTsKIAkJCX0KIAkJfQotCQlmb3IgKGZpbmFsIE9iamVjdElkIGlkIDogaGF2ZSkgeworCQlmb3IgKE9iamVjdElkIGlkIDogaGF2ZSkgewogCQkJdHJ5IHsKIAkJCQltYXJrTG9jYWxPYmpDb21wbGV0ZShyZXZXYWxrLnBhcnNlQW55KGlkKSk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKQEAgLTczMiw3ICs3MjksNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShmaW5hbCBpbnQgdW50aWwpCisJcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShpbnQgdW50aWwpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZvciAoOzspIHsKQEAgLTc0Miw3ICs3MzksNyBAQAogCQkJCWxvY2FsQ29tbWl0UXVldWUubmV4dCgpOwogCiAJCQkJbWFya1RyZWVDb21wbGV0ZShjLmdldFRyZWUoKSk7Ci0JCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMuZ2V0UGFyZW50cygpKQorCQkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLmdldFBhcmVudHMoKSkKIAkJCQkJcHVzaExvY2FsQ29tbWl0KHApOwogCQkJfQogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKQEAgLTc1MCw3ICs3NDcsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHB1c2hMb2NhbENvbW1pdChmaW5hbCBSZXZDb21taXQgcCkKKwlwcml2YXRlIHZvaWQgcHVzaExvY2FsQ29tbWl0KFJldkNvbW1pdCBwKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKHAuaGFzKExPQ0FMTFlfU0VFTikpCiAJCQlyZXR1cm47CkBAIC03NjEsNyArNzU4LDcgQEAKIAkJbG9jYWxDb21taXRRdWV1ZS5hZGQocCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtUcmVlQ29tcGxldGUoZmluYWwgUmV2VHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBtYXJrVHJlZUNvbXBsZXRlKFJldlRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHRyZWUuaGFzKENPTVBMRVRFKSkKIAkJCXJldHVybjsKIAkJdHJlZS5hZGQoQ09NUExFVEUpOwpAQCAtNzk1LDcgKzc5Miw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVjb3JkRXJyb3IoZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFRocm93YWJsZSB3aGF0KSB7CisJcHJpdmF0ZSB2b2lkIHJlY29yZEVycm9yKEFueU9iamVjdElkIGlkLCBUaHJvd2FibGUgd2hhdCkgewogCQlmaW5hbCBPYmplY3RJZCBvYmpJZCA9IGlkLmNvcHkoKTsKIAkJTGlzdDxUaHJvd2FibGU+IGVycm9ycyA9IGZldGNoRXJyb3JzLmdldChvYmpJZCk7CiAJCWlmIChlcnJvcnMgPT0gbnVsbCkgewpAQCAtODE2LDcgKzgxMyw3IEBACiAKIAkJUGFja0luZGV4IGluZGV4OwogCi0JCVJlbW90ZVBhY2soZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIGMsIGZpbmFsIFN0cmluZyBwbikgeworCQlSZW1vdGVQYWNrKFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBjLCBTdHJpbmcgcG4pIHsKIAkJCWNvbm5lY3Rpb24gPSBjOwogCQkJcGFja05hbWUgPSBwbjsKIAkJCWlkeE5hbWUgPSBwYWNrTmFtZS5zdWJzdHJpbmcoMCwgcGFja05hbWUubGVuZ3RoKCkgLSA1KSArICIuaWR4IjsgLy8kTk9OLU5MUy0xJApAQCAtODM0LDcgKzgzMSw3IEBACiAJCQl9CiAJCX0KIAotCQl2b2lkIG9wZW5JbmRleChmaW5hbCBQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgb3BlbkluZGV4KFByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWlmIChpbmRleCAhPSBudWxsKQogCQkJCXJldHVybjsKIAkJCWlmICh0bXBJZHggPT0gbnVsbCkKQEAgLTg1MywxNyArODUwLDEyIEBACiAJCQlwbS5iZWdpblRhc2soIkdldCAiICsgaWR4TmFtZS5zdWJzdHJpbmcoMCwgMTIpICsgIi4uaWR4IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCXMubGVuZ3RoIDwgMCA/IFByb2dyZXNzTW9uaXRvci5VTktOT1dOCiAJCQkJCQkJOiAoaW50KSAocy5sZW5ndGggLyAxMDI0KSk7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wSWR4KTsKLQkJCQl0cnkgewotCQkJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJCWludCBjbnQ7Ci0JCQkJCXdoaWxlICghcG0uaXNDYW5jZWxsZWQoKSAmJiAoY250ID0gcy5pbi5yZWFkKGJ1ZikpID49IDApIHsKLQkJCQkJCWZvcy53cml0ZShidWYsIDAsIGNudCk7Ci0JCQkJCQlwbS51cGRhdGUoY250IC8gMTAyNCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlmb3MuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBJZHgpKSB7CisJCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOworCQkJCWludCBjbnQ7CisJCQkJd2hpbGUgKCFwbS5pc0NhbmNlbGxlZCgpICYmIChjbnQgPSBzLmluLnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCQlmb3Mud3JpdGUoYnVmLCAwLCBjbnQpOworCQkJCQlwbS51cGRhdGUoY250IC8gMTAyNCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CiAJCQkJRmlsZVV0aWxzLmRlbGV0ZSh0bXBJZHgpOwpAQCAtODg2LDcgKzg3OCw3IEBACiAJCQl9CiAJCX0KIAotCQl2b2lkIGRvd25sb2FkUGFjayhmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBkb3dubG9hZFBhY2soUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlTdHJpbmcgbmFtZSA9ICJwYWNrLyIgKyBwYWNrTmFtZTsgLy8kTk9OLU5MUy0xJAogCQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLkZpbGVTdHJlYW0gcyA9IGNvbm5lY3Rpb24ub3BlbihuYW1lKTsKIAkJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IGNmNTBjNTEuLjRjNzU0MjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhCkBAIC0xNTcsNyArMTU3LDcgQEAKIAkJLy8gcmVmIHVzaW5nIHRoZSBkaXJlY3RvcnkgbmFtZSBiZWluZyBjcmVhdGVkLgogCQkvLwogCQlmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgewogCQkJZmluYWwgU3RyaW5nIG4gPSB1LmdldFJlbW90ZU5hbWUoKTsKIAkJCWlmICghbi5zdGFydHNXaXRoKCJyZWZzLyIpIHx8ICFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKG4pKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQl1LnNldFN0YXR1cyhTdGF0dXMuUkVKRUNURURfT1RIRVJfUkVBU09OKTsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQkvLwogCQlpZiAoIXVwZGF0ZXMuaXNFbXB0eSgpKQogCQkJc2VuZHBhY2sodXBkYXRlcywgbW9uaXRvcik7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKQorCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykKIAkJCXVwZGF0ZUNvbW1hbmQodSk7CiAKIAkJLy8gSXMgdGhpcyBhIG5ldyByZXBvc2l0b3J5PyBJZiBzbyB3ZSBzaG91bGQgY3JlYXRlIGFkZGl0aW9uYWwKQEAgLTE5NiwxMCArMTk2LDEwIEBACiAJCWlmICghcGFja2VkUmVmVXBkYXRlcy5pc0VtcHR5KCkpIHsKIAkJCXRyeSB7CiAJCQkJcmVmV3JpdGVyLndyaXRlUGFja2VkUmVmcygpOwotCQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKQorCQkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKQogCQkJCQl1LnNldFN0YXR1cyhTdGF0dXMuT0spOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0JCQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHBhY2tlZFJlZlVwZGF0ZXMpIHsKKwkJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykgewogCQkJCQl1LnNldFN0YXR1cyhTdGF0dXMuUkVKRUNURURfT1RIRVJfUkVBU09OKTsKIAkJCQkJdS5zZXRNZXNzYWdlKGVyci5nZXRNZXNzYWdlKCkpOwogCQkJCX0KQEAgLTIyNSwxNCArMjI1LDE0IEBACiAJCVN0cmluZyBwYXRoUGFjayA9IG51bGw7CiAJCVN0cmluZyBwYXRoSWR4ID0gbnVsbDsKIAotCQl0cnkgKGZpbmFsIFBhY2tXcml0ZXIgd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIodHJhbnNwb3J0LmdldFBhY2tDb25maWcoKSwKKwkJdHJ5IChQYWNrV3JpdGVyIHdyaXRlciA9IG5ldyBQYWNrV3JpdGVyKHRyYW5zcG9ydC5nZXRQYWNrQ29uZmlnKCksCiAJCQkJbG9jYWwubmV3T2JqZWN0UmVhZGVyKCkpKSB7CiAKIAkJCWZpbmFsIFNldDxPYmplY3RJZD4gbmVlZCA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCWZpbmFsIFNldDxPYmplY3RJZD4gaGF2ZSA9IG5ldyBIYXNoU2V0PD4oKTsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHIgOiB1cGRhdGVzKQorCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgciA6IHVwZGF0ZXMpCiAJCQkJbmVlZC5hZGQoci5nZXROZXdPYmplY3RJZCgpKTsKLQkJCWZvciAoZmluYWwgUmVmIHIgOiBnZXRSZWZzKCkpIHsKKwkJCWZvciAoUmVmIHIgOiBnZXRSZWZzKCkpIHsKIAkJCQloYXZlLmFkZChyLmdldE9iamVjdElkKCkpOwogCQkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQkJaGF2ZS5hZGQoci5nZXRQZWVsZWRPYmplY3RJZCgpKTsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCQkJCXJldHVybjsKIAogCQkJcGFja05hbWVzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwotCQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGRlc3QuZ2V0UGFja05hbWVzKCkpCisJCQlmb3IgKFN0cmluZyBuIDogZGVzdC5nZXRQYWNrTmFtZXMoKSkKIAkJCQlwYWNrTmFtZXMucHV0KG4sIG4pOwogCiAJCQlmaW5hbCBTdHJpbmcgYmFzZSA9ICJwYWNrLSIgKyB3cml0ZXIuY29tcHV0ZU5hbWUoKS5uYW1lKCk7IC8vJE5PTi1OTFMtMSQKQEAgLTI5NSw3ICsyOTUsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNhZmVEZWxldGUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHZvaWQgc2FmZURlbGV0ZShTdHJpbmcgcGF0aCkgewogCQlpZiAocGF0aCAhPSBudWxsKSB7CiAJCQl0cnkgewogCQkJCWRlc3QuZGVsZXRlRmlsZShwYXRoKTsKQEAgLTMwNyw3ICszMDcsNyBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbW1hbmQoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUpIHsKKwlwcml2YXRlIHZvaWQgZGVsZXRlQ29tbWFuZChSZW1vdGVSZWZVcGRhdGUgdSkgewogCQlmaW5hbCBSZWYgciA9IG5ld1JlZnMucmVtb3ZlKHUuZ2V0UmVtb3RlTmFtZSgpKTsKIAkJaWYgKHIgPT0gbnVsbCkgewogCQkJLy8gQWxyZWFkeSBnb25lLgpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29tbWFuZChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSkgeworCXByaXZhdGUgdm9pZCB1cGRhdGVDb21tYW5kKFJlbW90ZVJlZlVwZGF0ZSB1KSB7CiAJCXRyeSB7CiAJCQlkZXN0LndyaXRlUmVmKHUuZ2V0UmVtb3RlTmFtZSgpLCB1LmdldE5ld09iamVjdElkKCkpOwogCQkJbmV3UmVmcy5wdXQodS5nZXRSZW1vdGVOYW1lKCksIG5ldyBPYmplY3RJZFJlZi5VbnBlZWxlZCgKQEAgLTM1NCw3ICszNTQsNyBAQAogCQkJCSYmIHBhY2tOYW1lcy5pc0VtcHR5KCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1JlcG9zaXRvcnkoZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1JlcG9zaXRvcnkoTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFN0cmluZyByZWYgPSAicmVmOiAiICsgcGlja0hFQUQodXBkYXRlcykgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTM3NCwxMiArMzc0LDEyIEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGlja0hFQUQoZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGlja0hFQUQoTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpIHsKIAkJLy8gVHJ5IHRvIHVzZSBtYXN0ZXIgaWYgdGhlIHVzZXIgaXMgcHVzaGluZyB0aGF0LCBpdCBpcyB0aGUKIAkJLy8gZGVmYXVsdCBicmFuY2ggYW5kIGlzIGxpa2VseSB3aGF0IHRoZXkgd2FudCB0byByZW1haW4gYXMKIAkJLy8gdGhlIGRlZmF1bHQgb24gdGhlIG5ldyByZW1vdGUuCiAJCS8vCi0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CiAJCQlmaW5hbCBTdHJpbmcgbiA9IHUuZ2V0UmVtb3RlTmFtZSgpOwogCQkJaWYgKG4uZXF1YWxzKENvbnN0YW50cy5SX0hFQURTICsgQ29uc3RhbnRzLk1BU1RFUikpCiAJCQkJcmV0dXJuIG47CkBAIC0zODgsNyArMzg4LDcgQEAKIAkJLy8gUGljayBhbnkgYnJhbmNoLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGUgdXNlciBwdXNoZWQgb25seQogCQkvLyBvbmUgdG8gdGhlIHJlbW90ZSBzaWRlLgogCQkvLwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgewogCQkJZmluYWwgU3RyaW5nIG4gPSB1LmdldFJlbW90ZU5hbWUoKTsKIAkJCWlmIChuLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCXJldHVybiBuOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YQppbmRleCA5NjViZTUwLi5hYTcxYzk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YQpAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGRlbGV0aW9uIGZhaWxlZC4KIAkgKi8KLQl2b2lkIGRlbGV0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBkZWxldGVGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZGVsZXRpbmdOb3RTdXBwb3J0ZWQsIHBhdGgpKTsKIAl9CiAKQEAgLTI2Myw3ICsyNjMsNyBAQAogCSAqICAgICAgICAgICAgIHdyaXRpbmcgaXMgbm90IHN1cHBvcnRlZCwgb3IgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZmlsZQogCSAqICAgICAgICAgICAgIGZhaWxlZCwgcG9zc2libHkgZHVlIHRvIHBlcm1pc3Npb25zIG9yIHJlbW90ZSBkaXNrIGZ1bGwsIGV0Yy4KIAkgKi8KLQl2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHBhdGgsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHdyaXRlRmlsZShwYXRoLCBudWxsLCBudWxsKSkgewogCQkJb3Mud3JpdGUoZGF0YSk7CiAJCX0KQEAgLTI3OCw3ICsyNzgsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBvciBkZWxldGlvbiBmYWlsZWQuCiAJICovCi0Jdm9pZCBkZWxldGVSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBkZWxldGVSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZUZpbGUoUk9PVF9ESVIgKyBuYW1lKTsKIAl9CiAKQEAgLTI5MSw3ICsyOTEsNyBAQAogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBvciBkZWxldGlvbiBmYWlsZWQuCiAJICovCi0Jdm9pZCBkZWxldGVSZWZMb2coZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBkZWxldGVSZWZMb2coU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZUZpbGUoUk9PVF9ESVIgKyBDb25zdGFudHMuTE9HUyArICIvIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC0zMDksNyArMzA5LDcgQEAKIAkgKiAgICAgICAgICAgICB3cml0aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGZpbGUKIAkgKiAgICAgICAgICAgICBmYWlsZWQsIHBvc3NpYmx5IGR1ZSB0byBwZXJtaXNzaW9ucyBvciByZW1vdGUgZGlzayBmdWxsLCBldGMuCiAJICovCi0Jdm9pZCB3cml0ZVJlZihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0SWQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZVJlZihTdHJpbmcgbmFtZSwgT2JqZWN0SWQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiOwogCiAJCWIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCArIDEpOwpAQCAtMzMzLDkgKzMzMyw5IEBACiAJICogICAgICAgICAgICAgd3JpdGluZyBpcyBub3Qgc3VwcG9ydGVkLCBvciBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBmaWxlCiAJICogICAgICAgICAgICAgZmFpbGVkLCBwb3NzaWJseSBkdWUgdG8gcGVybWlzc2lvbnMgb3IgcmVtb3RlIGRpc2sgZnVsbCwgZXRjLgogCSAqLwotCXZvaWQgd3JpdGVJbmZvUGFja3MoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2tOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlSW5mb1BhY2tzKENvbGxlY3Rpb248U3RyaW5nPiBwYWNrTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgdyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIG4gOiBwYWNrTmFtZXMpIHsKKwkJZm9yIChTdHJpbmcgbiA6IHBhY2tOYW1lcykgewogCQkJdy5hcHBlbmQoIlAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCXcuYXBwZW5kKG4pOwogCQkJdy5hcHBlbmQoJ1xuJyk7CkBAIC0zNjEsNyArMzYxLDcgQEAKIAkgKiAgICAgICAgICAgICBleGlzdHMsIG9yIGFmdGVyIGl0IHdhcyBkZXRlcm1pbmVkIHRvIGV4aXN0IGJ1dCBiZWZvcmUgdGhlCiAJICogICAgICAgICAgICAgc3RyZWFtIGNvdWxkIGJlIGNyZWF0ZWQuCiAJICovCi0JQnVmZmVyZWRSZWFkZXIgb3BlblJlYWRlcihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlCdWZmZXJlZFJlYWRlciBvcGVuUmVhZGVyKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG9wZW4ocGF0aCkuaW47CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBDb25zdGFudHMuQ0hBUlNFVCkpOwogCX0KQEAgLTQxNCw3ICs0MTQsNyBAQAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyBmcm9tIHRoZSBwYWNrZWQgcmVmcyBmaWxlLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRQYWNrZWRSZWZzKGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCisJcHJvdGVjdGVkIHZvaWQgcmVhZFBhY2tlZFJlZnMoTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gb3BlblJlYWRlcihST09UX0RJUiArIENvbnN0YW50cy5QQUNLRURfUkVGUykpIHsKIAkJCXJlYWRQYWNrZWRSZWZzSW1wbChhdmFpbCwgYnIpOwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAJCSAqICAgICAgICAgICAgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGZpbGUgZGF0YS4gVGhpcyBzdHJlYW0gd2lsbCBiZQogCQkgKiAgICAgICAgICAgIGNsb3NlZCBieSB0aGUgY2FsbGVyIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZS4KIAkJICovCi0JCUZpbGVTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gaSkgeworCQlGaWxlU3RyZWFtKElucHV0U3RyZWFtIGkpIHsKIAkJCWluID0gaTsKIAkJCWxlbmd0aCA9IC0xOwogCQl9CkBAIC00OTAsNyArNDkwLDcgQEAKIAkJICogICAgICAgICAgICB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nIHRocm91Z2gKIAkJICogICAgICAgICAgICA8Y29kZT5pPC9jb2RlPi4KIAkJICovCi0JCUZpbGVTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gaSwgZmluYWwgbG9uZyBuKSB7CisJCUZpbGVTdHJlYW0oSW5wdXRTdHJlYW0gaSwgbG9uZyBuKSB7CiAJCQlpbiA9IGk7CiAJCQlsZW5ndGggPSBuOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhCmluZGV4IDE2YTZmNGEuLjYwYWNkMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhCkBAIC04Nyw3ICs4Nyw3IEBACiAJICogICAgICAgICAgICBpZiB0cnVlLCBleHBvcnRzIGFsbCByZXBvc2l0b3JpZXMsIGlnbm9yaW5nIHRoZSBjaGVjayBmb3IgdGhlCiAJICogICAgICAgICAgICB7QGNvZGUgZ2l0LWRhZW1vbi1leHBvcnQtb2t9IGZpbGVzLgogCSAqLwotCXB1YmxpYyBGaWxlUmVzb2x2ZXIoZmluYWwgRmlsZSBiYXNlUGF0aCwgZmluYWwgYm9vbGVhbiBleHBvcnRBbGwpIHsKKwlwdWJsaWMgRmlsZVJlc29sdmVyKEZpbGUgYmFzZVBhdGgsIGJvb2xlYW4gZXhwb3J0QWxsKSB7CiAJCXRoaXMoKTsKIAkJZXhwb3J0RGlyZWN0b3J5KGJhc2VQYXRoKTsKIAkJc2V0RXhwb3J0QWxsKGV4cG9ydEFsbCk7CkBAIC05NSw3ICs5NSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgQyByZXEsIGZpbmFsIFN0cmluZyBuYW1lKQorCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oQyByZXEsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24gewogCQlpZiAoaXNVbnJlYXNvbmFibGVOYW1lKG5hbWUpKQogCQkJdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKQEAgLTE3NSw3ICsxNzUsNyBAQAogCSAqCiAJICogQHBhcmFtIGV4cG9ydCBhIGJvb2xlYW4uCiAJICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0QWxsKGZpbmFsIGJvb2xlYW4gZXhwb3J0KSB7CisJcHVibGljIHZvaWQgc2V0RXhwb3J0QWxsKGJvb2xlYW4gZXhwb3J0KSB7CiAJCWV4cG9ydEFsbCA9IGV4cG9ydDsKIAl9CiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogCSAqICAgICAgICAgICAgZ2l0IHJlcG9zaXRvcnksIGJ1dCBhbnkgZGlyZWN0b3J5IGJlbG93IGl0IHdoaWNoIGhhcyBhIGZpbGUKIAkgKiAgICAgICAgICAgIG5hbWVkIDxjb2RlPmdpdC1kYWVtb24tZXhwb3J0LW9rPC9jb2RlPiB3aWxsIGJlIHB1Ymxpc2hlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBleHBvcnREaXJlY3RvcnkoZmluYWwgRmlsZSBkaXIpIHsKKwlwdWJsaWMgdm9pZCBleHBvcnREaXJlY3RvcnkoRmlsZSBkaXIpIHsKIAkJZXhwb3J0QmFzZS5hZGQoZGlyKTsKIAl9CiAKQEAgLTI0MCw3ICsyNDAsNyBAQAogCQlyZXR1cm4gbmFtZSArIENvbnN0YW50cy5ET1RfR0lUX0VYVDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5yZWFzb25hYmxlTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbnJlYXNvbmFibGVOYW1lKFN0cmluZyBuYW1lKSB7CiAJCWlmIChuYW1lLmxlbmd0aCgpID09IDApCiAJCQlyZXR1cm4gdHJ1ZTsgLy8gbm8gZW1wdHkgcGF0aHMKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9BYnN0cmFjdFRyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9BYnN0cmFjdFRyZWVJdGVyYXRvci5qYXZhCmluZGV4IGE3OTAwZjAuLjQ3MGVkMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEKQEAgLTE3Niw3ICsxNzYsNyBAQAogCSAqICAgICAgICAgICAgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeS4gQSB0cmFpbGluZyBzbGFzaCAoJy8nKSBpcwogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiB0aGUgcHJlZml4IGRvZXMgbm90IGVuZCBpbiAnLycuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoU3RyaW5nIHByZWZpeCkgewogCQlwYXJlbnQgPSBudWxsOwogCiAJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CkBAIC0yMTAsNyArMjEwLDcgQEAKIAkgKiAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuIEEgdHJhaWxpbmcgc2xhc2ggKCcvJykgaXMKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgdGhlIHByZWZpeCBkb2VzIG5vdCBlbmQgaW4gJy8nLgogCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBieXRlW10gcHJlZml4KSB7CisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJ5dGVbXSBwcmVmaXgpIHsKIAkJcGFyZW50ID0gbnVsbDsKIAogCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCA+IDApIHsKQEAgLTIzMiw3ICsyMzIsNyBAQAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwYXJlbnQgdHJlZSBpdGVyYXRvci4KIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXBhcmVudCA9IHA7CiAJCXBhdGggPSBwLnBhdGg7CiAJCXBhdGhPZmZzZXQgPSBwLnBhdGhMZW4gKyAxOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJICogICAgICAgICAgICBudW1iZXIgb2YgbGl2ZSBieXRlcyBpbiB0aGUgcGF0aCBidWZmZXIuIFRoaXMgbWFueSBieXRlcyB3aWxsCiAJICogICAgICAgICAgICBiZSBtb3ZlZCBpbnRvIHRoZSBsYXJnZXIgYnVmZmVyLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGdyb3dQYXRoKGZpbmFsIGludCBsZW4pIHsKKwlwcm90ZWN0ZWQgdm9pZCBncm93UGF0aChpbnQgbGVuKSB7CiAJCXNldFBhdGhDYXBhY2l0eShwYXRoLmxlbmd0aCA8PCAxLCBsZW4pOwogCX0KIApAQCAtMjg3LDcgKzI4Nyw3IEBACiAJICogQHBhcmFtIGxlbgogCSAqICAgICAgICAgICAgdGhlIGFtb3VudCBvZiBsaXZlIGJ5dGVzIGluIHBhdGggYnVmZmVyCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlUGF0aENhcGFjaXR5KGZpbmFsIGludCBjYXBhY2l0eSwgZmluYWwgaW50IGxlbikgeworCXByb3RlY3RlZCB2b2lkIGVuc3VyZVBhdGhDYXBhY2l0eShpbnQgY2FwYWNpdHksIGludCBsZW4pIHsKIAkJaWYgKHBhdGgubGVuZ3RoID49IGNhcGFjaXR5KQogCQkJcmV0dXJuOwogCQlmaW5hbCBieXRlW10gbyA9IHBhdGg7CkBAIC0zMjIsMTEgKzMyMiwxMSBAQAogCSAqIEByZXR1cm4gLTEgaWYgdGhpcyBlbnRyeSBzb3J0cyBmaXJzdDsgMCBpZiB0aGUgZW50cmllcyBhcmUgZXF1YWw7IDEgaWYKIAkgKiAgICAgICAgIHAncyBlbnRyeSBzb3J0cyBmaXJzdC4KIAkgKi8KLQlwdWJsaWMgaW50IHBhdGhDb21wYXJlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlwdWJsaWMgaW50IHBhdGhDb21wYXJlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcmV0dXJuIHBhdGhDb21wYXJlKHAsIHAubW9kZSk7CiAJfQogCi0JaW50IHBhdGhDb21wYXJlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHAsIGZpbmFsIGludCBwTW9kZSkgeworCWludCBwYXRoQ29tcGFyZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwLCBpbnQgcE1vZGUpIHsKIAkJLy8gSXRzIGNvbW1vbiB3aGVuIHdlIGFyZSBhIHN1YnRyZWUgZm9yIGJvdGggcGFyZW50cyB0byBtYXRjaDsKIAkJLy8gd2hlbiB0aGlzIGhhcHBlbnMgZXZlcnl0aGluZyBpbiBwYXRoWzAuLmNQb3NdIGlzIGtub3duIHRvCiAJCS8vIGJlIGVxdWFsIGFuZCBkb2VzIG5vdCByZXF1aXJlIGV2YWx1YXRpb24gYWdhaW4uCkBAIC00MjAsNyArNDIwLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBvdGhlciBpdGVyYXRvciB0byB0ZXN0IGFnYWluc3QuCiAJICogQHJldHVybiB0cnVlIGlmIGJvdGggaXRlcmF0b3JzIGhhdmUgdGhlIHNhbWUgb2JqZWN0IGlkOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaWRFcXVhbChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBvdGhlckl0ZXJhdG9yKSB7CisJcHVibGljIGJvb2xlYW4gaWRFcXVhbChBYnN0cmFjdFRyZWVJdGVyYXRvciBvdGhlckl0ZXJhdG9yKSB7CiAJCXJldHVybiBPYmplY3RJZC5lcXVhbHMoaWRCdWZmZXIoKSwgaWRPZmZzZXQoKSwKIAkJCQlvdGhlckl0ZXJhdG9yLmlkQnVmZmVyKCksIG90aGVySXRlcmF0b3IuaWRPZmZzZXQoKSk7CiAJfQpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiAJICogQHBhcmFtIG91dAogCSAqICAgICAgICAgICAgYnVmZmVyIHRvIGNvcHkgdGhlIG9iamVjdCBpZCBpbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIGdldEVudHJ5T2JqZWN0SWQoZmluYWwgTXV0YWJsZU9iamVjdElkIG91dCkgeworCXB1YmxpYyB2b2lkIGdldEVudHJ5T2JqZWN0SWQoTXV0YWJsZU9iamVjdElkIG91dCkgewogCQlvdXQuZnJvbVJhdyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEKaW5kZXggNzExMTNhNi4uMDE5OTY4OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQAogCQlyZXNldChyZWFkZXIsIHRyZWVJZCk7CiAJfQogCi0JcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyKGZpbmFsIENhbm9uaWNhbFRyZWVQYXJzZXIgcCkgeworCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlcihDYW5vbmljYWxUcmVlUGFyc2VyIHApIHsKIAkJc3VwZXIocCk7CiAJfQogCkBAIC0xNDAsNyArMTQwLDcgQEAKIAkgKiBAcGFyYW0gdHJlZURhdGEKIAkgKiAgICAgICAgICAgIHRoZSByYXcgdHJlZSBjb250ZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIGJ5dGVbXSB0cmVlRGF0YSkgeworCXB1YmxpYyB2b2lkIHJlc2V0KGJ5dGVbXSB0cmVlRGF0YSkgewogCQlhdHRyaWJ1dGVzTm9kZSA9IG51bGw7CiAJCXJhdyA9IHRyZWVEYXRhOwogCQlwcmV2UHRyID0gLTE7CkBAIC0yMTksNyArMjE5LDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwgZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIHZvaWQgcmVzZXQoT2JqZWN0UmVhZGVyIHJlYWRlciwgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXNldChyZWFkZXIub3BlbihpZCwgT0JKX1RSRUUpLmdldENhY2hlZEJ5dGVzKCkpOwogCX0KQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2Fub25pY2FsVHJlZVBhcnNlciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQ2Fub25pY2FsVHJlZVBhcnNlciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IocmVhZGVyLCBuZXcgTXV0YWJsZU9iamVjdElkKCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YQppbmRleCA1OTZkM2QwLi5mNWQ0NWM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0VtcHR5VHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAJCS8vIENyZWF0ZSBhIHJvb3QgZW1wdHkgdHJlZS4KIAl9CiAKLQlFbXB0eVRyZWVJdGVyYXRvcihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CisJRW1wdHlUcmVlSXRlcmF0b3IoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgewogCQlzdXBlcihwKTsKIAkJcGF0aExlbiA9IHBhdGhPZmZzZXQ7CiAJfQpAQCAtOTIsNyArOTIsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBFbXB0eVRyZWVJdGVyYXRvcih0aGlzKTsKIAl9CkBAIC0xNDEsMTMgKzE0MSwxMyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBuZXh0KGZpbmFsIGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIG5leHQoaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCS8vIERvIG5vdGhpbmcuCiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBiYWNrKGZpbmFsIGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGJhY2soaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCS8vIERvIG5vdGhpbmcuCiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvci5qYXZhCmluZGV4IDhkZjc2NGQuLjI0YjlhYzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvci5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOwpAQCAtNjcsNiArNjgsNyBAQAogICoge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9LgogICovCiBwdWJsaWMgY2xhc3MgRmlsZVRyZWVJdGVyYXRvciBleHRlbmRzIFdvcmtpbmdUcmVlSXRlcmF0b3IgeworCiAJLyoqCiAJICogdGhlIHN0YXJ0aW5nIGRpcmVjdG9yeSBvZiB0aGlzIEl0ZXJhdG9yLiBBbGwgZW50cmllcyBhcmUgbG9jYXRlZCBkaXJlY3RseQogCSAqIGluIHRoaXMgZGlyZWN0b3J5LgpAQCAtMTMwLDcgKzEzMiw3IEBACiAJICogQHBhcmFtIG9wdGlvbnMKIAkgKiAgICAgICAgICAgIHdvcmtpbmcgdHJlZSBvcHRpb25zIHRvIGJlIHVzZWQKIAkgKi8KLQlwdWJsaWMgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBGaWxlIHJvb3QsIEZTIGZzLCBXb3JraW5nVHJlZU9wdGlvbnMgb3B0aW9ucykgeworCXB1YmxpYyBGaWxlVHJlZUl0ZXJhdG9yKEZpbGUgcm9vdCwgRlMgZnMsIFdvcmtpbmdUcmVlT3B0aW9ucyBvcHRpb25zKSB7CiAJCXRoaXMocm9vdCwgZnMsIG9wdGlvbnMsIERlZmF1bHRGaWxlTW9kZVN0cmF0ZWd5LklOU1RBTkNFKTsKIAl9CiAKQEAgLTE3MSwyNyArMTczLDYgQEAKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCiAJICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCiAJICogQHNpbmNlIDQuMwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI0ZpbGVUcmVlSXRlcmF0b3IoRmlsZVRyZWVJdGVyYXRvciwgRmlsZSwgRlMpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwcm90ZWN0ZWQgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBXb3JraW5nVHJlZUl0ZXJhdG9yIHAsIGZpbmFsIEZpbGUgcm9vdCwKLQkJCUZTIGZzKSB7Ci0JCXRoaXMocCwgcm9vdCwgZnMsIERlZmF1bHRGaWxlTW9kZVN0cmF0ZWd5LklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaXRlcmF0b3IgdG8gdHJhdmVyc2UgYSBzdWJkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBpdGVyYXRvciB3ZSB3ZXJlIGNyZWF0ZWQgZnJvbS4KLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yeS4gVGhpcyBzaG91bGQgYmUgYSBkaXJlY3RvcnkgY29udGFpbmVkIHdpdGhpbgotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0JICogQHBhcmFtIGZzCi0JICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQotCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgotCSAqIEBzaW5jZSA0LjMKIAkgKi8KIAlwcm90ZWN0ZWQgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBGaWxlVHJlZUl0ZXJhdG9yIHAsIGZpbmFsIEZpbGUgcm9vdCwKIAkJCUZTIGZzKSB7CkBAIC0yMjYsMTkgKzIwNywzOSBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWxlVHJlZUl0ZXJhdG9yKHRoaXMsICgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsIGZpbGVNb2RlU3RyYXRlZ3kpOworCQlpZiAoIXdhbGtzSWdub3JlZERpcmVjdG9yaWVzKCkgJiYgaXNFbnRyeUlnbm9yZWQoKSkgeworCQkJRGlyQ2FjaGVJdGVyYXRvciBpdGVyYXRvciA9IGdldERpckNhY2hlSXRlcmF0b3IoKTsKKwkJCWlmIChpdGVyYXRvciA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBFbXB0eVRyZWVJdGVyYXRvcih0aGlzKTsKKwkJCX0KKwkJCS8vIE9ubHkgZW50ZXIgaWYgd2UgaGF2ZSBhbiBhc3NvY2lhdGVkIERpckNhY2hlSXRlcmF0b3IgdGhhdCBpcworCQkJLy8gYXQgdGhlIHNhbWUgZW50cnkgKHdoaWNoIGluZGljYXRlcyB0aGVyZSBpcyBzb21lIGFscmVhZHkKKwkJCS8vIHRyYWNrZWQgZmlsZSB1bmRlcm5lYXRoIHRoaXMgZGlyZWN0b3J5KS4gT3RoZXJ3aXNlIHRoZQorCQkJLy8gZGlyZWN0b3J5IGlzIGluZGVlZCBpZ25vcmVkIGFuZCBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS4KKwkJfQorCQlyZXR1cm4gZW50ZXJTdWJ0cmVlKCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaXRlcmF0b3IgZm9yIHRoZSBjdXJyZW50IGVudHJ5J3Mgc3VidHJlZS4KKwkgKiA8cD4KKwkgKiBUaGUgcGFyZW50IHJlZmVyZW5jZSBvZiB0aGUgaXRlcmF0b3IgbXVzdCBiZSA8Y29kZT50aGlzPC9jb2RlPiwgb3RoZXJ3aXNlCisJICogdGhlIGNhbGxlciB3b3VsZCBub3QgYmUgYWJsZSB0byBleGl0IG91dCBvZiB0aGUgc3VidHJlZSBpdGVyYXRvcgorCSAqIGNvcnJlY3RseSBhbmQgcmV0dXJuIHRvIGNvbnRpbnVlIHdhbGtpbmcgPGNvZGU+dGhpczwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIHRoYXQgd2Fsa3Mgb3ZlciB0aGUgY3VycmVudCBzdWJ0cmVlLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZW50ZXJTdWJ0cmVlKCkgeworCQlyZXR1cm4gbmV3IEZpbGVUcmVlSXRlcmF0b3IodGhpcywgKChGaWxlRW50cnkpIGN1cnJlbnQoKSkuZ2V0RmlsZSgpLCBmcywKKwkJCQlmaWxlTW9kZVN0cmF0ZWd5KTsKIAl9CiAKIAlwcml2YXRlIEVudHJ5W10gZW50cmllcygpIHsKLQkJZmluYWwgRmlsZVtdIGFsbCA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJaWYgKGFsbCA9PSBudWxsKQotCQkJcmV0dXJuIEVPRjsKLQkJZmluYWwgRW50cnlbXSByID0gbmV3IEVudHJ5W2FsbC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspCi0JCQlyW2ldID0gbmV3IEZpbGVFbnRyeShhbGxbaV0sIGZzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKLQkJcmV0dXJuIHI7CisJCXJldHVybiBmcy5saXN0KGRpcmVjdG9yeSwgZmlsZU1vZGVTdHJhdGVneSk7CiAJfQogCiAJLyoqCkBAIC0yNjcsNyArMjY4LDcgQEAKIAkgKgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIERlZmF1bHRGaWxlTW9kZVN0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgewogCQkvKioKIAkJICogYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgRmlsZU1vZGVTdHJhdGVneQogCQkgKi8KQEAgLTMwMCw3ICszMDEsNyBAQAogCSAqCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXN0YXRpYyBwdWJsaWMgY2xhc3MgTm9HaXRsaW5rc1N0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBOb0dpdGxpbmtzU3RyYXRlZ3kgaW1wbGVtZW50cyBGaWxlTW9kZVN0cmF0ZWd5IHsKIAogCQkvKioKIAkJICogYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgRmlsZU1vZGVTdHJhdGVneQpAQCAtMzI1LDcgKzMyNiw3IEBACiAJLyoqCiAJICogV3JhcHBlciBmb3IgYSBzdGFuZGFyZCBKYXZhIElPIGZpbGUKIAkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIEZpbGVFbnRyeSBleHRlbmRzIEVudHJ5IHsKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVFbnRyeSBleHRlbmRzIEVudHJ5IHsKIAkJcHJpdmF0ZSBmaW5hbCBGaWxlTW9kZSBtb2RlOwogCiAJCXByaXZhdGUgRlMuQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwpAQCAtMzY0LDYgKzM2NSwyOSBAQAogCQkJbW9kZSA9IGZpbGVNb2RlU3RyYXRlZ3kuZ2V0TW9kZShmLCBhdHRyaWJ1dGVzKTsKIAkJfQogCisJCS8qKgorCQkgKiBDcmVhdGUgYSBuZXcgZmlsZSBlbnRyeSBnaXZlbiB0aGUgc3BlY2lmaWVkIEZpbGVNb2RlU3RyYXRlZ3kKKwkJICoKKwkJICogQHBhcmFtIGYKKwkJICogICAgICAgICAgICBmaWxlCisJCSAqIEBwYXJhbSBmcworCQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtCisJCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCisJCSAqICAgICAgICAgICAgb2YgdGhlIGZpbGUKKwkJICogQHBhcmFtIGZpbGVNb2RlU3RyYXRlZ3kKKwkJICogICAgICAgICAgICB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIEZpbGVNb2RlIG9mIGEKKwkJICogICAgICAgICAgICBmaWxlOyBjb250cm9scyBnaXRsaW5rcyBldGMuCisJCSAqCisJCSAqIEBzaW5jZSA1LjAKKwkJICovCisJCXB1YmxpYyBGaWxlRW50cnkoRmlsZSBmLCBGUyBmcywgRlMuQXR0cmlidXRlcyBhdHRyaWJ1dGVzLAorCQkJCUZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQkJdGhpcy5mcyA9IGZzOworCQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKwkJCWYgPSBmcy5ub3JtYWxpemUoZik7CisJCQltb2RlID0gZmlsZU1vZGVTdHJhdGVneS5nZXRNb2RlKGYsIGF0dHJpYnV0ZXMpOworCQl9CisKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBGaWxlTW9kZSBnZXRNb2RlKCkgewogCQkJcmV0dXJuIG1vZGU7CkBAIC0zODYsMTIgKzQxMCwxMiBAQAogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWlmIChmcy5pc1N5bUxpbmsoZ2V0RmlsZSgpKSkKKwkJCWlmIChhdHRyaWJ1dGVzLmlzU3ltYm9saWNMaW5rKCkpIHsKIAkJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZzLnJlYWRTeW1MaW5rKGdldEZpbGUoKSkKLQkJCQkJCS5nZXRCeXRlcygKLQkJCQkJCUNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKLQkJCWVsc2UKKwkJCQkJCS5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CisJCQl9IGVsc2UgewogCQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZpbGUoKSk7CisJCQl9CiAJCX0KIAogCQkvKioKQEAgLTQyNiw3ICs0NTAsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYnl0ZVtdIGlkU3VibW9kdWxlKGZpbmFsIEVudHJ5IGUpIHsKKwlwcm90ZWN0ZWQgYnl0ZVtdIGlkU3VibW9kdWxlKEVudHJ5IGUpIHsKIAkJcmV0dXJuIGlkU3VibW9kdWxlKGdldERpcmVjdG9yeSgpLCBlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvTmFtZUNvbmZsaWN0VHJlZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvTmFtZUNvbmZsaWN0VHJlZVdhbGsuamF2YQppbmRleCA1NTYwZjc3Li42MWIxMzBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhCkBAIC05OSw3ICs5OSw3IEBACiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtMTEyLDcgKzExMiw3IEBACiAJICogICAgICAgICAgICB0aGUgcmVhZGVyIHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gdHJlZSBkYXRhIGZyb20uCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKKwlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXN1cGVyKHJlcG8sIG9yKTsKIAl9CiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCSAqIEBwYXJhbSBvcgogCSAqICAgICAgICAgICAgdGhlIHJlYWRlciB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIHRyZWUgZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKKwlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXN1cGVyKG9yKTsKIAl9CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJCQlpZiAoaXNUcmVlKG1pblJlZikpIHsKIAkJCQlpZiAoc2tpcEVudHJ5KG1pblJlZikpIHsKLQkJCQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJCQkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCQkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmKSB7CiAJCQkJCQkJdC5uZXh0KDEpOwogCQkJCQkJCXQubWF0Y2hlcyA9IG51bGw7CkBAIC0yMjIsMTYgKzIyMiwxNiBAQAogCQlyZXR1cm4gRmlsZU1vZGUuR0lUTElOSy5lcXVhbHMocC5tb2RlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHJlZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RyZWUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgewogCQlyZXR1cm4gRmlsZU1vZGUuVFJFRS5lcXVhbHMocC5tb2RlKTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gc2tpcEVudHJ5KGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZikKKwlwcml2YXRlIGJvb2xlYW4gc2tpcEVudHJ5KEFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZikKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gQSB0cmVlIEQvRiBtYXkgaGF2ZSBiZWVuIGhhbmRsZWQgZWFybGllci4gV2UgbmVlZCB0bwogCQkvLyBub3QgcmVwb3J0IHRoaXMgcGF0aCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLgogCQkvLwotCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgeworCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgewogCQkJaWYgKHQubWF0Y2hlcyA9PSBtaW5SZWYgfHwgdC5maXJzdCgpKQogCQkJCWNvbnRpbnVlOwogCkBAIC0yNjAsMTQgKzI2MCwxNCBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBjb21iaW5lREYoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQorCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY29tYmluZURGKEFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZikKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gTG9vayBmb3IgYSBwb3NzaWJsZSBEL0YgY29uZmxpY3QgZm9yd2FyZCBpbiB0aGUgdHJlZShzKQogCQkvLyBhcyB0aGVyZSBtYXkgYmUgYSAiJHBhdGgvIiB3aGljaCBtYXRjaGVzICIkcGF0aCIuIE1ha2UKIAkJLy8gc3VjaCBlbnRyaWVzIG1hdGNoIHRoaXMgZW50cnkuCiAJCS8vCiAJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIHRyZWVNYXRjaCA9IG51bGw7Ci0JCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZiB8fCB0LmVvZigpKQogCQkJCWNvbnRpbnVlOwogCkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJCS8vIG1hdGNoaW5nIGl0ZXJhdG9ycyBpbnN0ZWFkIG9mIHRoZSBmaWxlIGl0ZXJhdG9yLgogCQkJLy8gVGhpcyB3YXkgaXNTdWJ0cmVlIGlzIHRydWUgYW5kIGlzUmVjdXJzaXZlIHdvcmtzLgogCQkJLy8KLQkJCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKQorCQkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpCiAJCQkJaWYgKHQubWF0Y2hlcyA9PSBtaW5SZWYpCiAJCQkJCXQubWF0Y2hlcyA9IHRyZWVNYXRjaDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCmluZGV4IDg4NzI2ODkuLmQ1MDBhYWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKQEAgLTMzMiw3ICszMzIsNyBAQAogCSAqICAgICAgICAgICAgT2JqZWN0UmVhZGVyIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgd2Fsa2VyLCBhbmQgd2lsbCBiZSBjbG9zZWQKIAkgKiAgICAgICAgICAgIHdoZW4gdGhlIHdhbGtlciBpcyBjbG9zZWQuCiAJICovCi0JcHVibGljIFRyZWVXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBUcmVlV2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLCByZXBvLm5ld09iamVjdFJlYWRlcigpLCB0cnVlKTsKIAl9CiAKQEAgLTM0OCw3ICszNDgsNyBAQAogCSAqICAgICAgICAgICAgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlwdWJsaWMgVHJlZVdhbGsoZmluYWwgQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIFRyZWVXYWxrKEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIE9iamVjdFJlYWRlciBvcikgewogCQl0aGlzKHJlcG8sIG9yLCBmYWxzZSk7CiAJfQogCkBAIC0zNTksNyArMzU5LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdGhlIHdhbGtlciB3aWxsIG9idGFpbiB0cmVlIGRhdGEgZnJvbS4gVGhlIHJlYWRlcgogCSAqICAgICAgICAgICAgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqLwotCXB1YmxpYyBUcmVlV2FsayhmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKKwlwdWJsaWMgVHJlZVdhbGsoT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXRoaXMobnVsbCwgb3IsIGZhbHNlKTsKIAl9CiAKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuQW5kVHJlZUZpbHRlcgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuT3JUcmVlRmlsdGVyCiAJICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKGZpbmFsIFRyZWVGaWx0ZXIgbmV3RmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0RmlsdGVyKFRyZWVGaWx0ZXIgbmV3RmlsdGVyKSB7CiAJCWZpbHRlciA9IG5ld0ZpbHRlciAhPSBudWxsID8gbmV3RmlsdGVyIDogVHJlZUZpbHRlci5BTEw7CiAJfQogCkBAIC00NzUsNyArNDc1LDcgQEAKIAkgKiBAcGFyYW0gYgogCSAqICAgICAgICAgICAgdHJ1ZSB0byBza2lwIHN1YnRyZWUgbm9kZXMgYW5kIG9ubHkgb2J0YWluIGZpbGVzIG5vZGVzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShmaW5hbCBib29sZWFuIGIpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWN1cnNpdmUoYm9vbGVhbiBiKSB7CiAJCXJlY3Vyc2l2ZSA9IGI7CiAJfQogCkBAIC01MDUsNyArNTA1LDcgQEAKIAkgKiAgICAgICAgICAgIHRydWUgdG8gZ2V0IHRyZWVzIGFmdGVyIHRoZWlyIGNoaWxkcmVuLgogCSAqIEBzZWUgI2lzUG9zdE9yZGVyVHJhdmVyc2FsKCkKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0T3JkZXJUcmF2ZXJzYWwoZmluYWwgYm9vbGVhbiBiKSB7CisJcHVibGljIHZvaWQgc2V0UG9zdE9yZGVyVHJhdmVyc2FsKGJvb2xlYW4gYikgewogCQlwb3N0T3JkZXJUcmF2ZXJzYWwgPSBiOwogCX0KIApAQCAtNjMzLDIyICs2MzMsNiBAQAogCX0KIAogCS8qKgotCSAqIEdldCB0aGUgRU9MIHN0cmVhbSB0eXBlIG9mIHRoZSBjdXJyZW50IGVudHJ5IHVzaW5nIHRoZSBjb25maWcgYW5kCi0JICoge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LgotCSAqCi0JICogQHJldHVybiB0aGUgRU9MIHN0cmVhbSB0eXBlIG9mIHRoZSBjdXJyZW50IGVudHJ5IHVzaW5nIHRoZSBjb25maWcgYW5kCi0JICogICAgICAgICB7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKX0uIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwKLQkgKiAgICAgICAgIGlmIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30gaXMgbm90IGJhc2VkIG9uCi0JICogICAgICAgICBhIHdvcmtpbmcgdHJlZQotCSAqIEBzaW5jZSA0LjMKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRFb2xTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUpfSBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIEBOdWxsYWJsZSBFb2xTdHJlYW1UeXBlIGdldEVvbFN0cmVhbVR5cGUoKSB7Ci0JCXJldHVybiAoZ2V0RW9sU3RyZWFtVHlwZShvcGVyYXRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCiAJICogUmVzZXQgdGhpcyB3YWxrZXIgc28gbmV3IHRyZWUgaXRlcmF0b3JzIGNhbiBiZSBhZGRlZCB0byBpdC4KIAkgKi8KIAlwdWJsaWMgdm9pZCByZXNldCgpIHsKQEAgLTY3Nyw3ICs2NjEsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgcmVzZXQoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAodHJlZXMubGVuZ3RoID09IDEpIHsKIAkJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIG8gPSB0cmVlc1swXTsKQEAgLTcxOCw3ICs3MDIsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChmaW5hbCBBbnlPYmplY3RJZC4uLiBpZHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIHJlc2V0KEFueU9iamVjdElkLi4uIGlkcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBvbGRMZW4gPSB0cmVlcy5sZW5ndGg7CiAJCWZpbmFsIGludCBuZXdMZW4gPSBpZHMubGVuZ3RoOwpAQCAtNzczLDcgKzc1Nyw3IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBsb29zZSBvYmplY3Qgb3IgcGFjayBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBpbnQgYWRkVHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIGludCBhZGRUcmVlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGFkZFRyZWUocGFyc2VyRm9yKGlkKSk7CiAJfQpAQCAtOTM2LDcgKzkyMCw3IEBACiAJICogQHJldHVybiBtb2RlIGJpdHMgZm9yIHRoZSBjdXJyZW50IGVudHJ5IG9mIHRoZSBudGggdHJlZS4KIAkgKiBAc2VlIEZpbGVNb2RlI2Zyb21CaXRzKGludCkKIAkgKi8KLQlwdWJsaWMgaW50IGdldFJhd01vZGUoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBpbnQgZ2V0UmF3TW9kZShpbnQgbnRoKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSB0cmVlc1tudGhdOwogCQlyZXR1cm4gdC5tYXRjaGVzID09IGN1cnJlbnRIZWFkID8gdC5tb2RlIDogMDsKIAl9CkBAIC05NTIsNyArOTM2LDcgQEAKIAkgKiAgICAgICAgICAgIHRyZWUgdG8gb2J0YWluIHRoZSBtb2RlIGZyb20uCiAJICogQHJldHVybiBtb2RlIGZvciB0aGUgY3VycmVudCBlbnRyeSBvZiB0aGUgbnRoIHRyZWUuCiAJICovCi0JcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgRmlsZU1vZGUgZ2V0RmlsZU1vZGUoaW50IG50aCkgewogCQlyZXR1cm4gRmlsZU1vZGUuZnJvbUJpdHMoZ2V0UmF3TW9kZShudGgpKTsKIAl9CiAKQEAgLTk4Nyw3ICs5NzEsNyBAQAogCSAqIEBzZWUgI2dldE9iamVjdElkKE11dGFibGVPYmplY3RJZCwgaW50KQogCSAqIEBzZWUgI2lkRXF1YWwoaW50LCBpbnQpCiAJICovCi0JcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoaW50IG50aCkgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gdHJlZXNbbnRoXTsKIAkJcmV0dXJuIHQubWF0Y2hlcyA9PSBjdXJyZW50SGVhZCA/IHQuZ2V0RW50cnlPYmplY3RJZCgpIDogT2JqZWN0SWQKIAkJCQkuemVyb0lkKCk7CkBAIC0xMDA5LDcgKzk5Myw3IEBACiAJICogICAgICAgICAgICB0cmVlIHRvIG9idGFpbiB0aGUgb2JqZWN0IGlkZW50aWZpZXIgZnJvbS4KIAkgKiBAc2VlICNpZEVxdWFsKGludCwgaW50KQogCSAqLwotCXB1YmxpYyB2b2lkIGdldE9iamVjdElkKGZpbmFsIE11dGFibGVPYmplY3RJZCBvdXQsIGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgdm9pZCBnZXRPYmplY3RJZChNdXRhYmxlT2JqZWN0SWQgb3V0LCBpbnQgbnRoKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSB0cmVlc1tudGhdOwogCQlpZiAodC5tYXRjaGVzID09IGN1cnJlbnRIZWFkKQogCQkJdC5nZXRFbnRyeU9iamVjdElkKG91dCk7CkBAIC0xMDI4LDcgKzEwMTIsNyBAQAogCSAqICAgICAgICAgPGNvZGU+Z2V0T2JqZWN0SWQobnRoQSkuZXF1YWxzKGdldE9iamVjdElkKG50aEIpKTwvY29kZT4uCiAJICogQHNlZSAjZ2V0T2JqZWN0SWQoaW50KQogCSAqLwotCXB1YmxpYyBib29sZWFuIGlkRXF1YWwoZmluYWwgaW50IG50aEEsIGZpbmFsIGludCBudGhCKSB7CisJcHVibGljIGJvb2xlYW4gaWRFcXVhbChpbnQgbnRoQSwgaW50IG50aEIpIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY2ggPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgYSA9IHRyZWVzW250aEFdOwogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBiID0gdHJlZXNbbnRoQl07CkBAIC0xMTI2LDcgKzExMTAsNyBAQAogCSAqICAgICAgICAgYWdhaW4gb24gdGhpcyB0cmVlIHdhbGsuCiAJICogQHNpbmNlIDQuNwogCSAqLwotCXB1YmxpYyBpbnQgaXNQYXRoTWF0Y2goZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CisJcHVibGljIGludCBpc1BhdGhNYXRjaChieXRlW10gcCwgaW50IHBMZW4pIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBieXRlW10gYyA9IHQucGF0aDsKIAkJZmluYWwgaW50IGNMZW4gPSB0LnBhdGhMZW47CkBAIC0xMTc5LDcgKzExNjMsNyBAQAogCSAqICAgICAgICAgcGF0aDsgMSBpZiB0aGUgY3VycmVudCBwYXRoIGlzIHBhc3QgcCBhbmQgcCB3aWxsIG5ldmVyIG1hdGNoCiAJICogICAgICAgICBhZ2FpbiBvbiB0aGlzIHRyZWUgd2Fsay4KIAkgKi8KLQlwdWJsaWMgaW50IGlzUGF0aFByZWZpeChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKKwlwdWJsaWMgaW50IGlzUGF0aFByZWZpeChieXRlW10gcCwgaW50IHBMZW4pIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBieXRlW10gYyA9IHQucGF0aDsKIAkJZmluYWwgaW50IGNMZW4gPSB0LnBhdGhMZW47CkBAIC0xMjI5LDcgKzEyMTMsNyBAQAogCSAqIEByZXR1cm4gdHJ1ZSBpZiBwIGlzIHN1ZmZpeCBvZiB0aGUgY3VycmVudCBwYXRoOwogCSAqICAgICAgICAgZmFsc2UgaWYgb3RoZXJ3aXNlCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXRoU3VmZml4KGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbikgeworCXB1YmxpYyBib29sZWFuIGlzUGF0aFN1ZmZpeChieXRlW10gcCwgaW50IHBMZW4pIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBieXRlW10gYyA9IHQucGF0aDsKIAkJZmluYWwgaW50IGNMZW4gPSB0LnBhdGhMZW47CkBAIC0xMzc3LDcgKzEzNjEsNyBAQAogCQkJdHJlZXNbaV0gPSB0cmVlc1tpXS5wYXJlbnQ7CiAKIAkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmID0gbnVsbDsKLQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCWlmICh0Lm1hdGNoZXMgIT0gdCkKIAkJCQljb250aW51ZTsKIAkJCWlmIChtaW5SZWYgPT0gbnVsbCB8fCB0LnBhdGhDb21wYXJlKG1pblJlZikgPCAwKQpAQCAtMTM4NiwxOCArMTM3MCwxOCBAQAogCQljdXJyZW50SGVhZCA9IG1pblJlZjsKIAl9CiAKLQlwcml2YXRlIENhbm9uaWNhbFRyZWVQYXJzZXIgcGFyc2VyRm9yKGZpbmFsIEFueU9iamVjdElkIGlkKQorCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlciBwYXJzZXJGb3IoQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBDYW5vbmljYWxUcmVlUGFyc2VyIHAgPSBuZXcgQ2Fub25pY2FsVHJlZVBhcnNlcigpOwogCQlwLnJlc2V0KHJlYWRlciwgaWQpOwogCQlyZXR1cm4gcDsKIAl9CiAKLQlzdGF0aWMgU3RyaW5nIHBhdGhPZihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0KSB7CisJc3RhdGljIFN0cmluZyBwYXRoT2YoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCkgewogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIHQucGF0aCwgMCwgdC5wYXRoTGVuKTsKIAl9CiAKLQlzdGF0aWMgU3RyaW5nIHBhdGhPZihmaW5hbCBieXRlW10gYnVmLCBpbnQgcG9zLCBpbnQgZW5kKSB7CisJc3RhdGljIFN0cmluZyBwYXRoT2YoYnl0ZVtdIGJ1ZiwgaW50IHBvcywgaW50IGVuZCkgewogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIGJ1ZiwgcG9zLCBlbmQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQppbmRleCA2OGNjN2NiLi4xNzlmZDQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQpAQCAtMjExLDcgKzIxMSw3IEBACiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBhcmVudCB0cmVlIGl0ZXJhdG9yLgogCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVHJlZUl0ZXJhdG9yKGZpbmFsIFdvcmtpbmdUcmVlSXRlcmF0b3IgcCkgeworCXByb3RlY3RlZCBXb3JraW5nVHJlZUl0ZXJhdG9yKFdvcmtpbmdUcmVlSXRlcmF0b3IgcCkgewogCQlzdXBlcihwKTsKIAkJc3RhdGUgPSBwLnN0YXRlOwogCQlyZXBvc2l0b3J5ID0gcC5yZXBvc2l0b3J5OwpAQCAtMjU2LDYgKzI1Niw0NSBAQAogCQlzdGF0ZS5kaXJDYWNoZVRyZWUgPSB0cmVlSWQ7CiAJfQogCisJLyoqCisJICogUmV0cmlldmVzIHRoZSB7QGxpbmsgRGlyQ2FjaGVJdGVyYXRvcn0gYXQgdGhlIGN1cnJlbnQgZW50cnkgaWYKKwkgKiB7QGxpbmsgI3NldERpckNhY2hlSXRlcmF0b3IoVHJlZVdhbGssIGludCl9IHdhcyBjYWxsZWQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBEaXJDYWNoZUl0ZXJhdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldCBvciBub3QgYXQgdGhlCisJICogICAgICAgICBjdXJyZW50IGVudHJ5CisJICogQHNpbmNlIDUuMAorCSAqLworCXByb3RlY3RlZCBEaXJDYWNoZUl0ZXJhdG9yIGdldERpckNhY2hlSXRlcmF0b3IoKSB7CisJCWlmIChzdGF0ZS5kaXJDYWNoZVRyZWUgPj0gMCAmJiBzdGF0ZS53YWxrICE9IG51bGwpIHsKKwkJCXJldHVybiBzdGF0ZS53YWxrLmdldFRyZWUoc3RhdGUuZGlyQ2FjaGVUcmVlLAorCQkJCQlEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyB7QGxpbmsgV29ya2luZ1RyZWVJdGVyYXRvcn0gd2Fsa3MgaWdub3JlZAorCSAqIGRpcmVjdG9yaWVzLgorCSAqCisJICogQHBhcmFtIGluY2x1ZGVJZ25vcmVkCisJICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IHRvIHNraXAgaWdub3JlZCBkaXJlY3RvcmllcywgaWYgcG9zc2libGU7CisJICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gYWx3YXlzIGluY2x1ZGUgdGhlbSBpbiB0aGUgd2FsaworCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRXYWxrSWdub3JlZERpcmVjdG9yaWVzKGJvb2xlYW4gaW5jbHVkZUlnbm9yZWQpIHsKKwkJc3RhdGUud2Fsa0lnbm9yZWQgPSBpbmNsdWRlSWdub3JlZDsKKwl9CisKKwkvKioKKwkgKiBUZWxscyB3aGV0aGVyIHRoaXMge0BsaW5rIFdvcmtpbmdUcmVlSXRlcmF0b3J9IHdhbGtzIGlnbm9yZWQgZGlyZWN0b3JpZXMuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBpdCBkb2VzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB3YWxrc0lnbm9yZWREaXJlY3RvcmllcygpIHsKKwkJcmV0dXJuIHN0YXRlLndhbGtJZ25vcmVkOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzSWQoKSB7CkBAIC0zNDAsMzAgKzM3OSwyMiBAQAogCSAqIEByZXR1cm4gbm9uLW51bGwgc3VibW9kdWxlIGlkCiAJICovCiAJcHJvdGVjdGVkIGJ5dGVbXSBpZFN1Ym1vZHVsZShGaWxlIGRpcmVjdG9yeSwgRW50cnkgZSkgewotCQlmaW5hbCBSZXBvc2l0b3J5IHN1Ym1vZHVsZVJlcG87Ci0JCXRyeSB7Ci0JCQlzdWJtb2R1bGVSZXBvID0gU3VibW9kdWxlV2Fsay5nZXRTdWJtb2R1bGVSZXBvc2l0b3J5KGRpcmVjdG9yeSwKLQkJCQkJZS5nZXROYW1lKCksCi0JCQkJCXJlcG9zaXRvcnkgIT0gbnVsbCA/IHJlcG9zaXRvcnkuZ2V0RlMoKSA6IEZTLkRFVEVDVEVEKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1Ym1vZHVsZVJlcG8gPSBTdWJtb2R1bGVXYWxrLmdldFN1Ym1vZHVsZVJlcG9zaXRvcnkoCisJCQkJZGlyZWN0b3J5LCBlLmdldE5hbWUoKSwKKwkJCQlyZXBvc2l0b3J5ICE9IG51bGwgPyByZXBvc2l0b3J5LmdldEZTKCkgOiBGUy5ERVRFQ1RFRCkpIHsKKwkJCWlmIChzdWJtb2R1bGVSZXBvID09IG51bGwpIHsKKwkJCQlyZXR1cm4gemVyb2lkOworCQkJfQorCQkJT2JqZWN0SWQgaGVhZCA9IHN1Ym1vZHVsZVJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7CisJCQlpZiAoaGVhZCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHplcm9pZDsKKwkJCX0KKwkJCWJ5dGVbXSBpZCA9IG5ldyBieXRlW0NvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIXTsKKwkJCWhlYWQuY29weVJhd1RvKGlkLCAwKTsKKwkJCXJldHVybiBpZDsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CiAJCQlyZXR1cm4gemVyb2lkOwogCQl9Ci0JCWlmIChzdWJtb2R1bGVSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gemVyb2lkOwotCi0JCWZpbmFsIE9iamVjdElkIGhlYWQ7Ci0JCXRyeSB7Ci0JCQloZWFkID0gc3VibW9kdWxlUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gemVyb2lkOwotCQl9IGZpbmFsbHkgewotCQkJc3VibW9kdWxlUmVwby5jbG9zZSgpOwotCQl9Ci0JCWlmIChoZWFkID09IG51bGwpCi0JCQlyZXR1cm4gemVyb2lkOwotCQlmaW5hbCBieXRlW10gaWQgPSBuZXcgYnl0ZVtDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSF07Ci0JCWhlYWQuY29weVJhd1RvKGlkLCAwKTsKLQkJcmV0dXJuIGlkOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkaWdpdHMgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKQEAgLTM3Miw3ICs0MDMsNyBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoYmxvYiA9IENvbnN0YW50cwogCQkJLmVuY29kZWRUeXBlU3RyaW5nKENvbnN0YW50cy5PQkpfQkxPQik7CiAKLQlwcml2YXRlIGJ5dGVbXSBpZEJ1ZmZlckJsb2IoZmluYWwgRW50cnkgZSkgeworCXByaXZhdGUgYnl0ZVtdIGlkQnVmZmVyQmxvYihFbnRyeSBlKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IGUub3BlbklucHV0U3RyZWFtKCk7CiAJCQlpZiAoaXMgPT0gbnVsbCkKQEAgLTQzMCw3ICs0NjEsNyBAQAogCQlyZXR1cm4gZmlsdGVyQ2xlYW4oaXMsIG9wVHlwZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNhZmVDbG9zZShJbnB1dFN0cmVhbSBpbikgewogCQl0cnkgewogCQkJaW4uY2xvc2UoKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewpAQCAtNTQ4LDcgKzU3OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5leHQoZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgbmV4dChpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJcHRyICs9IGRlbHRhOwogCQlpZiAoIWVvZigpKSB7CiAJCQlwYXJzZUVudHJ5KCk7CkBAIC01NTcsNyArNTg4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYmFjayhmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBiYWNrKGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlwdHIgLT0gZGVsdGE7CiAJCXBhcnNlRW50cnkoKTsKIAl9CkBAIC02NjIsNyArNjkzLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHJlbGV2YW50IGlnbm9yZSBydWxlIGZpbGUgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChmaW5hbCBpbnQgcExlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChpbnQgcExlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGlzRW50cnlJZ25vcmVkKHBMZW4sIG1vZGUpOwogCX0KIApAQCAtNjc3LDcgKzcwOCw3IEBACiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcmVsZXZhbnQgaWdub3JlIHJ1bGUgZmlsZSBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChmaW5hbCBpbnQgcExlbiwgaW50IGZpbGVNb2RlKQorCXByaXZhdGUgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChpbnQgcExlbiwgaW50IGZpbGVNb2RlKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gVGhlIGlnbm9yZSBjb2RlIHdhbnRzIHBhdGggdG8gc3RhcnQgd2l0aCBhICcvJyBpZiBwb3NzaWJsZS4KIAkJLy8gSWYgd2UgaGF2ZSB0aGUgJy8nIGluIG91ciBwYXRoIGJ1ZmZlciBiZWNhdXNlIHdlIGFyZSBpbnNpZGUKQEAgLTc1Niw3ICs3ODcsNyBAQAogCSAqICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHN1YnRyZWUgb2YgdGhlIHdvcmsgdHJlZSB0aGlzIGl0ZXJhdG9yIG9wZXJhdGVzCiAJICogICAgICAgICAgICBvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgRW50cnlbXSBsaXN0KSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChFbnRyeVtdIGxpc3QpIHsKIAkJLy8gRmlsdGVyIG91dCBudWxscywgLiBhbmQgLi4gYXMgdGhlc2UgYXJlIG5vdCB2YWxpZCB0cmVlIGVudHJpZXMsCiAJCS8vIGFsc28gY2FjaGUgdGhlIGVuY29kZWQgZm9ybXMgb2YgdGhlIHBhdGggbmFtZXMgZm9yIGVmZmljaWVudCB1c2UKIAkJLy8gbGF0ZXIgb24gZHVyaW5nIHNvcnRpbmcgYW5kIGl0ZXJhdGlvbi4KQEAgLTgzOCw3ICs4NjksNyBAQAogCSAqICAgICAgICAgICAgYW4gaW50LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBkaWZmZXJlbnQsIGZhbHNlIG90aGVyd2lzZQogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZURpZmZlcmVudChmaW5hbCBpbnQgcmF3TW9kZSkgeworCXB1YmxpYyBib29sZWFuIGlzTW9kZURpZmZlcmVudChpbnQgcmF3TW9kZSkgewogCQkvLyBEZXRlcm1pbmUgZGlmZmVyZW5jZSBpbiBtb2RlLWJpdHMgb2YgZmlsZSBhbmQgaW5kZXgtZW50cnkuIEluIHRoZQogCQkvLyBiaXR3aXNlIHByZXNlbnRhdGlvbiBvZiBtb2RlRGlmZiB3ZSdsbCBoYXZlIGEgJzEnIHdoZW4gdGhlIHR3byBtb2RlcwogCQkvLyBkaWZmZXIgYXQgdGhpcyBwb3NpdGlvbi4KQEAgLTk5Miw3ICsxMDIzLDcgQEAKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhdCB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudCBlbnRyeQogCSAqIEByZXR1cm4gaW5kZXggZmlsZSBtb2RlCiAJICovCi0JcHVibGljIEZpbGVNb2RlIGdldEluZGV4RmlsZU1vZGUoZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpbmRleEl0ZXIpIHsKKwlwdWJsaWMgRmlsZU1vZGUgZ2V0SW5kZXhGaWxlTW9kZShEaXJDYWNoZUl0ZXJhdG9yIGluZGV4SXRlcikgewogCQlmaW5hbCBGaWxlTW9kZSB3dE1vZGUgPSBnZXRFbnRyeUZpbGVNb2RlKCk7CiAJCWlmIChpbmRleEl0ZXIgPT0gbnVsbCkgewogCQkJcmV0dXJuIHd0TW9kZTsKQEAgLTExNzMsMTMgKzEyMDQsMTcgQEAKIAkJcmV0dXJuIGNvbnRlbnREaWdlc3QuZGlnZXN0KCk7CiAJfQogCi0JLyoqIEEgc2luZ2xlIGVudHJ5IHdpdGhpbiBhIHdvcmtpbmcgZGlyZWN0b3J5IHRyZWUuICovCi0JcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbnRyeSB7CisJLyoqCisJICogQSBzaW5nbGUgZW50cnkgd2l0aGluIGEgd29ya2luZyBkaXJlY3RvcnkgdHJlZS4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVudHJ5IHsKIAkJYnl0ZVtdIGVuY29kZWROYW1lOwogCiAJCWludCBlbmNvZGVkTmFtZUxlbjsKIAotCQl2b2lkIGVuY29kZU5hbWUoZmluYWwgQ2hhcnNldEVuY29kZXIgZW5jKSB7CisJCXZvaWQgZW5jb2RlTmFtZShDaGFyc2V0RW5jb2RlciBlbmMpIHsKIAkJCWZpbmFsIEJ5dGVCdWZmZXIgYjsKIAkJCXRyeSB7CiAJCQkJYiA9IGVuYy5lbmNvZGUoQ2hhckJ1ZmZlci53cmFwKGdldE5hbWUoKSkpOwpAQCAtMTI4MCwxMSArMTMxNSw4IEBACiAKIAkJSWdub3JlTm9kZSBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUlnbm9yZU5vZGUgciA9IG5ldyBJZ25vcmVOb2RlKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBlbnRyeS5vcGVuSW5wdXRTdHJlYW0oKSkgewogCQkJCXIucGFyc2UoaW4pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQkJcmV0dXJuIHIuZ2V0UnVsZXMoKS5pc0VtcHR5KCkgPyBudWxsIDogcjsKIAkJfQpAQCAtMTMzMiwxMSArMTM2NCw4IEBACiAJCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFJ1bGVzRnJvbUZpbGUoSWdub3JlTm9kZSByLCBGaWxlIGV4Y2x1ZGUpCiAJCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJaWYgKEZTLkRFVEVDVEVELmV4aXN0cyhleGNsdWRlKSkgewotCQkJCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZXhjbHVkZSk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZXhjbHVkZSkpIHsKIAkJCQkJci5wYXJzZShpbik7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaW4uY2xvc2UoKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTEzNTMsMTEgKzEzODIsOCBAQAogCiAJCUF0dHJpYnV0ZXNOb2RlIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJQXR0cmlidXRlc05vZGUgciA9IG5ldyBBdHRyaWJ1dGVzTm9kZSgpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBlbnRyeS5vcGVuSW5wdXRTdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCkpIHsKIAkJCQlyLnBhcnNlKGluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJCXJldHVybiByLmdldFJ1bGVzKCkuaXNFbXB0eSgpID8gbnVsbCA6IHI7CiAJCX0KQEAgLTEzNzgsNyArMTQwNCwxMCBAQAogCQlUcmVlV2FsayB3YWxrOwogCiAJCS8qKiBQb3NpdGlvbiBvZiB0aGUgbWF0Y2hpbmcge0BsaW5rIERpckNhY2hlSXRlcmF0b3J9LiAqLwotCQlpbnQgZGlyQ2FjaGVUcmVlOworCQlpbnQgZGlyQ2FjaGVUcmVlID0gLTE7CisKKwkJLyoqIFdoZXRoZXIgdGhlIGl0ZXJhdG9yIHNoYWxsIHdhbGsgaWdub3JlZCBkaXJlY3Rvcmllcy4gKi8KKwkJYm9vbGVhbiB3YWxrSWdub3JlZCA9IGZhbHNlOwogCiAJCWZpbmFsIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGRpcmVjdG9yeVRvSWdub3JlZCA9IG5ldyBIYXNoTWFwPD4oKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZU9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEKaW5kZXggMmRmYjIwMy4uODQ2ZmI2ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZU9wdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhCkBAIC03NCw3ICs3NCw3IEBACiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGlyTm9HaXRMaW5rczsKIAotCXByaXZhdGUgV29ya2luZ1RyZWVPcHRpb25zKGZpbmFsIENvbmZpZyByYykgeworCXByaXZhdGUgV29ya2luZ1RyZWVPcHRpb25zKENvbmZpZyByYykgewogCQlmaWxlTW9kZSA9IHJjLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfRklMRU1PREUsIHRydWUpOwogCQlhdXRvQ1JMRiA9IHJjLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEKaW5kZXggNmQ0MGE0ZS4uYTk2MGJkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQW5kVHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YQpAQCAtNzEsNyArNzEsNyBAQAogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGJvdGggaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXIgYSwgZmluYWwgVHJlZUZpbHRlciBiKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyIGEsIFRyZWVGaWx0ZXIgYikgewogCQlpZiAoYSA9PSBBTEwpCiAJCQlyZXR1cm4gYjsKIAkJaWYgKGIgPT0gQUxMKQpAQCAtODcsNyArODcsNyBAQAogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhbGwgaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyW10gbGlzdCkgewogCQlpZiAobGlzdC5sZW5ndGggPT0gMikKIAkJCXJldHVybiBjcmVhdGUobGlzdFswXSwgbGlzdFsxXSk7CiAJCWlmIChsaXN0Lmxlbmd0aCA8IDIpCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248VHJlZUZpbHRlcj4gbGlzdCkgewogCQlpZiAobGlzdC5zaXplKCkgPCAyKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5hdExlYXN0VHdvRmlsdGVyc05lZWRlZCk7CiAJCWZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFRyZWVGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTIwLDEzICsxMjAsMTMgQEAKIAogCQlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXIgYjsKIAotCQlCaW5hcnkoZmluYWwgVHJlZUZpbHRlciBvbmUsIGZpbmFsIFRyZWVGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShUcmVlRmlsdGVyIG9uZSwgVHJlZUZpbHRlciB0d28pIHsKIAkJCWEgPSBvbmU7CiAJCQliID0gdHdvOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTcwLDEyICsxNzAsMTIgQEAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0IGV4dGVuZHMgQW5kVHJlZUZpbHRlciB7CiAJCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlcltdIHN1YmZpbHRlcnM7CiAKLQkJTGlzdChmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgeworCQlMaXN0KFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCQlzdWJmaWx0ZXJzID0gbGlzdDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE4Niw3ICsxODYsNyBAQAogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCWludCBtID0gMDsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgeworCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaW50IHIgPSBmLm1hdGNoRmlsdGVyKHdhbGtlcik7CiAJCQkJaWYgKHIgPT0gMSkgewogCQkJCQlyZXR1cm4gMTsKQEAgLTIwMCw3ICsyMDAsNyBAQAogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRCZVJlY3Vyc2l2ZSgpIHsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykKKwkJCWZvciAoVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykKIAkJCQlpZiAoZi5zaG91bGRCZVJlY3Vyc2l2ZSgpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEKaW5kZXggNjUzNzg2Yi4uOTk1NTYxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEKQEAgLTc3LDcgKzc3LDcgQEAKIAkJaW5pdFRhYmxlKDEgPDwgSW50ZWdlci5oaWdoZXN0T25lQml0KChjYXBhY2l0eSAqIDIpIC0gMSkpOwogCX0KIAotCXByaXZhdGUgYnl0ZVtdIGdldChmaW5hbCBieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgeworCXByaXZhdGUgYnl0ZVtdIGdldChieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGkgPSBoYXNoICYgbXNrOwogCQlmaW5hbCBieXRlW11bXSB0YmwgPSB0YWJsZTsKQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqICAgICAgICAgICAgcHJlLWNvbXB1dGVkIGhhc2ggb2YgdG9GaW5kCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXBwaW5nIGV4aXN0cyBmb3IgdGhpcyBieXRlIGFycmF5OyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JYm9vbGVhbiBjb250YWlucyhmaW5hbCBieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgeworCWJvb2xlYW4gY29udGFpbnMoYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKIAkJcmV0dXJuIGdldCh0b0ZpbmQsIGxlbmd0aCwgaGFzaCkgIT0gbnVsbDsKIAl9CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogCQlyZXR1cm4gc2l6ZSA9PSAwOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbnNlcnQoZmluYWwgYnl0ZVtdIG5ld1ZhbHVlLCBpbnQgaGFzaCkgeworCXByaXZhdGUgdm9pZCBpbnNlcnQoYnl0ZVtdIG5ld1ZhbHVlLCBpbnQgaGFzaCkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGogPSBoYXNoICYgbXNrOwogCQlmaW5hbCBieXRlW11bXSB0YmwgPSB0YWJsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0ludGVySW5kZXhEaWZmRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhCmluZGV4IDgxYjhlNmQuLjMzOGVlMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0ludGVySW5kZXhEaWZmRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCWZpbmFsIGludCBuID0gd2Fsa2VyLmdldFRyZWVDb3VudCgpOwogCQlpZiAobiA9PSAxKSAvLyBBc3N1bWUgdGhleSBtZWFudCBkaWZmZXJlbmNlIHRvIGVtcHR5IHRyZWUuCiAJCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YQppbmRleCAzNDAzYzc4Li42MDkwNTA4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RJZ25vcmVkRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQHBhcmFtIHdvcmtkaXJUcmVlSW5kZXgKIAkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSB3b3JrZGlyIHRyZWUgaW4gdGhlIHRyZWUgd2FsawogCSAqLwotCXB1YmxpYyBOb3RJZ25vcmVkRmlsdGVyKGZpbmFsIGludCB3b3JrZGlyVHJlZUluZGV4KSB7CisJcHVibGljIE5vdElnbm9yZWRGaWx0ZXIoaW50IHdvcmtkaXJUcmVlSW5kZXgpIHsKIAkJdGhpcy5pbmRleCA9IHdvcmtkaXJUcmVlSW5kZXg7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEKaW5kZXggMmUwMjNkMC4uZDMxNTUyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YQpAQCAtNjEsMTMgKzYxLDEzIEBACiAJICogICAgICAgICAgICBmaWx0ZXIgdG8gbmVnYXRlLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBkb2VzIHRoZSByZXZlcnNlIG9mIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyIGEpIHsKIAkJcmV0dXJuIG5ldyBOb3RUcmVlRmlsdGVyKGEpOwogCX0KIAogCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlciBhOwogCi0JcHJpdmF0ZSBOb3RUcmVlRmlsdGVyKGZpbmFsIFRyZWVGaWx0ZXIgb25lKSB7CisJcHJpdmF0ZSBOb3RUcmVlRmlsdGVyKFRyZWVGaWx0ZXIgb25lKSB7CiAJCWEgPSBvbmU7CiAJfQogCkBAIC03OSw3ICs3OSw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpID09IDA7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL09yVHJlZUZpbHRlci5qYXZhCmluZGV4IGRiYjA2MmIuLjMwOGZmMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL09yVHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL09yVHJlZUZpbHRlci5qYXZhCkBAIC03MSw3ICs3MSw3IEBACiAJICogICAgICAgICAgICBzZWNvbmQgZmlsdGVyIHRvIHRlc3QuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXIgYSwgZmluYWwgVHJlZUZpbHRlciBiKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyIGEsIFRyZWVGaWx0ZXIgYikgewogCQlpZiAoYSA9PSBBTEwgfHwgYiA9PSBBTEwpCiAJCQlyZXR1cm4gQUxMOwogCQlyZXR1cm4gbmV3IEJpbmFyeShhLCBiKTsKQEAgLTg1LDcgKzg1LDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyW10gbGlzdCkgewogCQlpZiAobGlzdC5sZW5ndGggPT0gMikKIAkJCXJldHVybiBjcmVhdGUobGlzdFswXSwgbGlzdFsxXSk7CiAJCWlmIChsaXN0Lmxlbmd0aCA8IDIpCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248VHJlZUZpbHRlcj4gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxUcmVlRmlsdGVyPiBsaXN0KSB7CiAJCWlmIChsaXN0LnNpemUoKSA8IDIpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmF0TGVhc3RUd29GaWx0ZXJzTmVlZGVkKTsKIAkJZmluYWwgVHJlZUZpbHRlcltdIHN1YmZpbHRlcnMgPSBuZXcgVHJlZUZpbHRlcltsaXN0LnNpemUoKV07CkBAIC0xMTgsMTMgKzExOCwxMyBAQAogCiAJCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlciBiOwogCi0JCUJpbmFyeShmaW5hbCBUcmVlRmlsdGVyIG9uZSwgZmluYWwgVHJlZUZpbHRlciB0d28pIHsKKwkJQmluYXJ5KFRyZWVGaWx0ZXIgb25lLCBUcmVlRmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CkBAIC0xNjgsMTIgKzE2OCwxMiBAQAogCXByaXZhdGUgc3RhdGljIGNsYXNzIExpc3QgZXh0ZW5kcyBPclRyZWVGaWx0ZXIgewogCQlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzOwogCi0JCUxpc3QoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwkJTGlzdChUcmVlRmlsdGVyW10gbGlzdCkgewogCQkJc3ViZmlsdGVycyA9IGxpc3Q7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CkBAIC0xODQsNyArMTg0LDcgQEAKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlpbnQgbSA9IDE7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgewogCQkJCWludCByID0gZi5tYXRjaEZpbHRlcih3YWxrZXIpOwogCQkJCWlmIChyID09IDApIHsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gc2hvdWxkQmVSZWN1cnNpdmUoKSB7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCiAJCQkJaWYgKGYuc2hvdWxkQmVSZWN1cnNpdmUoKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEKaW5kZXggMmY3ZjVjZC4uOTI2N2ZiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXIuamF2YQpAQCAtODYsNyArODYsNyBAQAogCiAJZmluYWwgYnl0ZVtdIHBhdGhSYXc7CiAKLQlwcml2YXRlIFBhdGhGaWx0ZXIoZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIFBhdGhGaWx0ZXIoU3RyaW5nIHMpIHsKIAkJcGF0aFN0ciA9IHM7CiAJCXBhdGhSYXcgPSBDb25zdGFudHMuZW5jb2RlKHBhdGhTdHIpOwogCX0KQEAgLTEwMiwyMCArMTAyLDIwIEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGludCBtYXRjaEZpbHRlcihUcmVlV2FsayB3YWxrZXIpIHsKIAkJcmV0dXJuIHdhbGtlci5pc1BhdGhNYXRjaChwYXRoUmF3LCBwYXRoUmF3Lmxlbmd0aCk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBzaG91bGRCZVJlY3Vyc2l2ZSgpIHsKLQkJZm9yIChmaW5hbCBieXRlIGIgOiBwYXRoUmF3KQorCQlmb3IgKGJ5dGUgYiA6IHBhdGhSYXcpCiAJCQlpZiAoYiA9PSAnLycpCiAJCQkJcmV0dXJuIHRydWU7CiAJCXJldHVybiBmYWxzZTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwYXRoIGxlbmd0aCBvZiB0aGlzIGZpbHRlciBtYXRjaGVzIHRoZSBsZW5ndGgKIAkgKiAgICAgICAgIG9mIHRoZSBjdXJyZW50IHBhdGggb2YgdGhlIHN1cHBsaWVkIFRyZWVXYWxrLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRG9uZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpc0RvbmUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiBwYXRoUmF3Lmxlbmd0aCA9PSB3YWxrZXIuZ2V0UGF0aExlbmd0aCgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwLmphdmEKaW5kZXggMDY1MjI4OC4uNWNmNTc1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwLmphdmEKQEAgLTgyLDEzICs4MiwxMyBAQAogCSAqICAgICAgICAgICAgdGhlIHBhdGhzIHRvIHRlc3QgYWdhaW5zdC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbnRyeS4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBmb3IgdGhlIGxpc3Qgb2YgcGF0aHMgc3VwcGxpZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYXRocykgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9uPFN0cmluZz4gcGF0aHMpIHsKIAkJaWYgKHBhdGhzLmlzRW1wdHkoKSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmF0TGVhc3RPbmVQYXRoSXNSZXF1aXJlZCk7CiAJCWZpbmFsIFBhdGhGaWx0ZXJbXSBwID0gbmV3IFBhdGhGaWx0ZXJbcGF0aHMuc2l6ZSgpXTsKIAkJaW50IGkgPSAwOwotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogcGF0aHMpCisJCWZvciAoU3RyaW5nIHMgOiBwYXRocykKIAkJCXBbaSsrXSA9IFBhdGhGaWx0ZXIuY3JlYXRlKHMpOwogCQlyZXR1cm4gY3JlYXRlKHApOwogCX0KQEAgLTEwOSw3ICsxMDksNyBAQAogCSAqICAgICAgICAgICAgdGhlIHBhdGhzIHRvIHRlc3QgYWdhaW5zdC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbnRyeS4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBmb3IgdGhlIHBhdGhzIHN1cHBsaWVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhmaW5hbCBTdHJpbmcuLi4gcGF0aHMpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoU3RyaW5nLi4uIHBhdGhzKSB7CiAJCWlmIChwYXRocy5sZW5ndGggPT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmF0TGVhc3RPbmVQYXRoSXNSZXF1aXJlZCk7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB0byB0ZXN0IGFnYWluc3QuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgZm9yIHRoZSBsaXN0IG9mIHBhdGhzIHN1cHBsaWVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxQYXRoRmlsdGVyPiBwYXRocykgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxQYXRoRmlsdGVyPiBwYXRocykgewogCQlpZiAocGF0aHMuaXNFbXB0eSgpKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYXRMZWFzdE9uZVBhdGhJc1JlcXVpcmVkKTsKQEAgLTE0MCw3ICsxNDAsNyBAQAogCQlyZXR1cm4gY3JlYXRlKHApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFBhdGhGaWx0ZXJbXSBwKSB7CisJcHJpdmF0ZSBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoUGF0aEZpbHRlcltdIHApIHsKIAkJaWYgKHAubGVuZ3RoID09IDEpCiAJCQlyZXR1cm4gbmV3IFNpbmdsZShwWzBdKTsKIAkJcmV0dXJuIG5ldyBHcm91cChwKTsKQEAgLTE1MSwxMyArMTUxLDEzIEBACiAKIAkJcHJpdmF0ZSBmaW5hbCBieXRlW10gcmF3OwogCi0JCXByaXZhdGUgU2luZ2xlKGZpbmFsIFBhdGhGaWx0ZXIgcCkgeworCQlwcml2YXRlIFNpbmdsZShQYXRoRmlsdGVyIHApIHsKIAkJCXBhdGggPSBwOwogCQkJcmF3ID0gcGF0aC5wYXRoUmF3OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCQlmaW5hbCBpbnQgY21wID0gd2Fsa2VyLmlzUGF0aFByZWZpeChyYXcsIHJhdy5sZW5ndGgpOwogCQkJaWYgKGNtcCA+IDApCiAJCQkJdGhyb3cgU3RvcFdhbGtFeGNlcHRpb24uSU5TVEFOQ0U7CkBAIC0xODgsNyArMTg4LDcgQEAKIAogCQlwcml2YXRlIGJ5dGVbXSBtYXg7CiAKLQkJcHJpdmF0ZSBHcm91cChmaW5hbCBQYXRoRmlsdGVyW10gcGF0aEZpbHRlcnMpIHsKKwkJcHJpdmF0ZSBHcm91cChQYXRoRmlsdGVyW10gcGF0aEZpbHRlcnMpIHsKIAkJCWZ1bGxwYXRocyA9IG5ldyBCeXRlQXJyYXlTZXQocGF0aEZpbHRlcnMubGVuZ3RoKTsKIAkJCXByZWZpeGVzID0gbmV3IEJ5dGVBcnJheVNldChwYXRoRmlsdGVycy5sZW5ndGggLyA1KTsKIAkJCS8vIDUgaXMgYW4gZW1waXJpY2FsbHkgZGVyaXZlZCByYXRpbyBvZiAjcGF0aHMvI3ByZWZpeGVzIGZyb206CkBAIC0yMzksNyArMjM5LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCiAJCQlieXRlW10gcnAgPSB3YWxrZXIuZ2V0UmF3UGF0aCgpOwogCQkJSGFzaGVyIGhhc2hlciA9IG5ldyBIYXNoZXIocnAsIHdhbGtlci5nZXRQYXRoTGVuZ3RoKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhCmluZGV4IDU1M2U2YmQuLjNkOWY4NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAlmaW5hbCBTdHJpbmcgcGF0aFN0cjsKIAlmaW5hbCBieXRlW10gcGF0aFJhdzsKIAotCXByaXZhdGUgUGF0aFN1ZmZpeEZpbHRlcihmaW5hbCBTdHJpbmcgcykgeworCXByaXZhdGUgUGF0aFN1ZmZpeEZpbHRlcihTdHJpbmcgcykgewogCQlwYXRoU3RyID0gczsKIAkJcGF0aFJhdyA9IENvbnN0YW50cy5lbmNvZGUocGF0aFN0cik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlci5qYXZhCmluZGV4IGYwYTc2MzIuLjExYWQ0NjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEFsbEZpbHRlciBleHRlbmRzIFRyZWVGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYmFzZVRyZWUgPSAwOwogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQkJZmluYWwgaW50IG4gPSB3YWxrZXIuZ2V0VHJlZUNvdW50KCk7CiAJCQlpZiAobiA9PSAxKSAvLyBBc3N1bWUgdGhleSBtZWFudCBkaWZmZXJlbmNlIHRvIGVtcHR5IHRyZWUuCiAJCQkJcmV0dXJuIHRydWU7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAkgKiAgICAgICAgICAgICBhcyB0aHJvd24gYnkge0BsaW5rICNpbmNsdWRlKFRyZWVXYWxrKX0KIAkgKiBAc2luY2UgNC43CiAJICovCi0JcHVibGljIGludCBtYXRjaEZpbHRlcihmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJcHVibGljIGludCBtYXRjaEZpbHRlcihUcmVlV2FsayB3YWxrZXIpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uCiAJewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhCmluZGV4IDBjMjdjZWQuLjQ0MmYwNzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTY0LmphdmEKQEAgLTYsOSArNiw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtNTUsNyArNTQsNyBAQAogCQkJCSsgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAvLyAvLyROT04tTkxTLTEkCiAJCQkJKyAiMDEyMzQ1Njc4OSIgLy8gLy8kTk9OLU5MUy0xJAogCQkJCSsgIisvIiAvLyAvLyROT04tTkxTLTEkCi0JCSkuZ2V0Qnl0ZXMoVVRGXzgpOworCQkpLmdldEJ5dGVzKENIQVJTRVQpOwogCiAJCURFQyA9IG5ldyBieXRlWzEyOF07CiAJCUFycmF5cy5maWxsKERFQywgSU5WQUxJRF9ERUMpOwpAQCAtMTc4LDcgKzE3Nyw3IEBACiAJCQllICs9IDQ7CiAJCX0KIAotCQlyZXR1cm4gbmV3IFN0cmluZyhvdXRCdWZmLCAwLCBlLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcob3V0QnVmZiwgMCwgZSwgQ0hBUlNFVCk7CiAJfQogCiAJLyoqCkBAIC0yOTQsNyArMjkzLDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGRhdGEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJYnl0ZVtdIGJ5dGVzID0gcy5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBieXRlcyA9IHMuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCXJldHVybiBkZWNvZGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NhY2hlZEF1dGhlbnRpY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEKaW5kZXggOTkxNWJkZi4uNmI1ODc5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NhY2hlZEF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiAJICogQHBhcmFtIGNhCiAJICogICAgICAgICAgICB0aGUgaW5mb3JtYXRpb24gd2Ugc2hvdWxkIHJlbWVtYmVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoZmluYWwgQ2FjaGVkQXV0aGVudGljYXRpb24gY2EpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkKENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhKSB7CiAJCWNhY2hlZC5hZGQoY2EpOwogCX0KIApAQCAtNzAsNyArNzAsNyBAQAogCXByb3RlY3RlZCBmaW5hbCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7CiAJCWZpbmFsIFN0cmluZyBob3N0ID0gZ2V0UmVxdWVzdGluZ0hvc3QoKTsKIAkJZmluYWwgaW50IHBvcnQgPSBnZXRSZXF1ZXN0aW5nUG9ydCgpOwotCQlmb3IgKGZpbmFsIENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhIDogY2FjaGVkKSB7CisJCWZvciAoQ2FjaGVkQXV0aGVudGljYXRpb24gY2EgOiBjYWNoZWQpIHsKIAkJCWlmIChjYS5ob3N0LmVxdWFscyhob3N0KSAmJiBjYS5wb3J0ID09IHBvcnQpCiAJCQkJcmV0dXJuIGNhLnRvUGFzc3dvcmRBdXRoZW50aWNhdGlvbigpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhCmluZGV4IGNmZmNiNTUuLmQwOTM4MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhCkBAIC03Niw2ICs3Niw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlTW9kZVN0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuV29ya2luZ1RyZWVJdGVyYXRvci5FbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUHJvY2Vzc1Jlc3VsdC5TdGF0dXM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTg3LDYgKzkwLDE0IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZTLmNsYXNzKTsKIAogCS8qKgorCSAqIEFuIGVtcHR5IGFycmF5IG9mIGVudHJpZXMsIHN1aXRhYmxlIGFzIGEgcmV0dXJuIHZhbHVlIGZvcgorCSAqIHtAbGluayAjbGlzdChGaWxlLCBGaWxlTW9kZVN0cmF0ZWd5KX0uCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnRyeVtdIE5PX0VOVFJJRVMgPSB7fTsKKworCS8qKgogCSAqIFRoaXMgY2xhc3MgY3JlYXRlcyBGUyBpbnN0YW5jZXMuIEl0IHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBhIEphdmE3IHZhcmlhbnQKIAkgKiBpZiBzdWNoIGNhbiBiZSBkZXRlY3RlZCBpbiB7QGxpbmsgI2RldGVjdChCb29sZWFuKX0uCiAJICoKQEAgLTM4NCw3ICszOTUsNyBAQAogCSAqIEByZXR1cm4gdGhlIHRyYW5zbGF0ZWQgcGF0aC4gPGNvZGU+bmV3IEZpbGUoZGlyLG5hbWUpPC9jb2RlPiBpZiB0aGlzCiAJICogICAgICAgICBwbGF0Zm9ybSBkb2VzIG5vdCByZXF1aXJlIHBhdGggbmFtZSB0cmFuc2xhdGlvbi4KIAkgKi8KLQlwdWJsaWMgRmlsZSByZXNvbHZlKGZpbmFsIEZpbGUgZGlyLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBGaWxlIHJlc29sdmUoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CiAJCWZpbmFsIEZpbGUgYWJzcG4gPSBuZXcgRmlsZShuYW1lKTsKIAkJaWYgKGFic3BuLmlzQWJzb2x1dGUoKSkKIAkJCXJldHVybiBhYnNwbjsKQEAgLTQ3MywxMSArNDg0LDExIEBACiAJICogQHJldHVybiB0aGUgZmlyc3QgbWF0Y2ggZm91bmQsIG9yIG51bGwKIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBGaWxlIHNlYXJjaFBhdGgoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZy4uLiBsb29rRm9yKSB7CisJcHJvdGVjdGVkIHN0YXRpYyBGaWxlIHNlYXJjaFBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZy4uLiBsb29rRm9yKSB7CiAJCWlmIChwYXRoID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKIAotCQlmb3IgKGZpbmFsIFN0cmluZyBwIDogcGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpKSB7CisJCWZvciAoU3RyaW5nIHAgOiBwYXRoLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcikpIHsKIAkJCWZvciAoU3RyaW5nIGNvbW1hbmQgOiBsb29rRm9yKSB7CiAJCQkJZmluYWwgRmlsZSBlID0gbmV3IEZpbGUocCwgY29tbWFuZCk7CiAJCQkJaWYgKGUuaXNGaWxlKCkpCkBAIC05NzUsNiArOTg2LDI5IEBACiAJfQogCiAJLyoqCisJICogRW51bWVyYXRlcyBjaGlsZHJlbiBvZiBhIGRpcmVjdG9yeS4KKwkgKgorCSAqIEBwYXJhbSBkaXJlY3RvcnkKKwkgKiAgICAgICAgICAgIHRvIGdldCB0aGUgY2hpbGRyZW4gb2YKKwkgKiBAcGFyYW0gZmlsZU1vZGVTdHJhdGVneQorCSAqICAgICAgICAgICAgdG8gdXNlIHRvIGNhbGN1bGF0ZSB0aGUgZ2l0IG1vZGUgb2YgYSBjaGlsZAorCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZW50cmllcyBmb3IgdGhlIGNoaWxkcmVuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIEVudHJ5W10gbGlzdChGaWxlIGRpcmVjdG9yeSwgRmlsZU1vZGVTdHJhdGVneSBmaWxlTW9kZVN0cmF0ZWd5KSB7CisJCWZpbmFsIEZpbGVbXSBhbGwgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7CisJCWlmIChhbGwgPT0gbnVsbCkgeworCQkJcmV0dXJuIE5PX0VOVFJJRVM7CisJCX0KKwkJZmluYWwgRW50cnlbXSByZXN1bHQgPSBuZXcgRW50cnlbYWxsLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSBuZXcgRmlsZUVudHJ5KGFsbFtpXSwgdGhpcywgZmlsZU1vZGVTdHJhdGVneSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKIAkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gaG9vayBpcyBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSwgdGhlbgogCSAqIHJ1bnMgaXQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgogCSAqIDxwPgpAQCAtMTExMSw3ICsxMTQ1LDcgQEAKIAkgKiAgICAgICAgIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgogCSAqIEBzaW5jZSA0LjAKIAkgKi8KLQlwdWJsaWMgRmlsZSBmaW5kSG9vayhSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGZpbmFsIFN0cmluZyBob29rTmFtZSkgeworCXB1YmxpYyBGaWxlIGZpbmRIb29rKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGhvb2tOYW1lKSB7CiAJCUZpbGUgZ2l0RGlyID0gcmVwb3NpdG9yeS5nZXREaXJlY3RvcnkoKTsKIAkJaWYgKGdpdERpciA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7CkBAIC0xMTk2LDE5ICsxMjMwLDIzIEBACiAJCQkJCW5ldyBTdHJlYW1Hb2JibGVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwgZXJyUmVkaXJlY3QpKTsKIAkJCWV4ZWN1dG9yLmV4ZWN1dGUoCiAJCQkJCW5ldyBTdHJlYW1Hb2JibGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0UmVkaXJlY3QpKTsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBpbiB0aGUgZmluYWxseSBibG9jawogCQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHByb2Nlc3MuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCQlpZiAoaW5SZWRpcmVjdCAhPSBudWxsKSB7Ci0JCQkJbmV3IFN0cmVhbUdvYmJsZXIoaW5SZWRpcmVjdCwgb3V0cHV0U3RyZWFtKS5jb3B5KCk7Ci0JCQl9CiAJCQl0cnkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFdoZW4gdGhlIHByb2Nlc3MgZXhpdHMgYmVmb3JlIGNvbnN1bWluZyB0aGUgaW5wdXQsIHRoZSBPdXRwdXRTdHJlYW0KLQkJCQkvLyBpcyByZXBsYWNlZCB3aXRoIHRoZSBudWxsIG91dHB1dCBzdHJlYW0uIFRoaXMgbnVsbCBvdXRwdXQgc3RyZWFtCi0JCQkJLy8gdGhyb3dzIElPRXhjZXB0aW9uIGZvciBhbGwgd3JpdGUgY2FsbHMuIFdoZW4gU3RyZWFtR29iYmxlciBmYWlscyB0bwotCQkJCS8vIGZsdXNoIHRoZSBidWZmZXIgYmVjYXVzZSBvZiB0aGlzLCB0aGlzIGNsb3NlIGNhbGwgdHJpZXMgdG8gZmx1c2ggaXQKLQkJCQkvLyBhZ2Fpbi4gVGhpcyBjYXVzZXMgYW5vdGhlciBJT0V4Y2VwdGlvbi4gU2luY2Ugd2UgaWdub3JlIHRoZQotCQkJCS8vIElPRXhjZXB0aW9uIGluIFN0cmVhbUdvYmJsZXIsIHdlIGFsc28gaWdub3JlIHRoZSBleGNlcHRpb24gaGVyZS4KKwkJCQlpZiAoaW5SZWRpcmVjdCAhPSBudWxsKSB7CisJCQkJCW5ldyBTdHJlYW1Hb2JibGVyKGluUmVkaXJlY3QsIG91dHB1dFN0cmVhbSkuY29weSgpOworCQkJCX0KKwkJCX0gZmluYWxseSB7CisJCQkJdHJ5IHsKKwkJCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBXaGVuIHRoZSBwcm9jZXNzIGV4aXRzIGJlZm9yZSBjb25zdW1pbmcgdGhlIGlucHV0LCB0aGUgT3V0cHV0U3RyZWFtCisJCQkJCS8vIGlzIHJlcGxhY2VkIHdpdGggdGhlIG51bGwgb3V0cHV0IHN0cmVhbS4gVGhpcyBudWxsIG91dHB1dCBzdHJlYW0KKwkJCQkJLy8gdGhyb3dzIElPRXhjZXB0aW9uIGZvciBhbGwgd3JpdGUgY2FsbHMuIFdoZW4gU3RyZWFtR29iYmxlciBmYWlscyB0bworCQkJCQkvLyBmbHVzaCB0aGUgYnVmZmVyIGJlY2F1c2Ugb2YgdGhpcywgdGhpcyBjbG9zZSBjYWxsIHRyaWVzIHRvIGZsdXNoIGl0CisJCQkJCS8vIGFnYWluLiBUaGlzIGNhdXNlcyBhbm90aGVyIElPRXhjZXB0aW9uLiBTaW5jZSB3ZSBpZ25vcmUgdGhlCisJCQkJCS8vIElPRXhjZXB0aW9uIGluIFN0cmVhbUdvYmJsZXIsIHdlIGFsc28gaWdub3JlIHRoZSBleGNlcHRpb24gaGVyZS4KKwkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEKaW5kZXggNDUyMzdjNC4uODc5NTMyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEKQEAgLTM5OSw3ICszOTksNyBAQAogCQkJSW50ZWdlciBubGluayA9IChJbnRlZ2VyKSAoRmlsZXMuZ2V0QXR0cmlidXRlKGxvY2tQYXRoLAogCQkJCQkidW5peDpubGluayIpKTsgLy8kTk9OLU5MUy0xJAogCQkJaWYgKG5saW5rID4gMikgewotCQkJCUxPRy53YXJuKCJubGluayBvZiBsaW5rIHRvIGxvY2sgZmlsZSB7MH0gd2FzIG5vdCAyIGJ1dCB7MX0iLCAvLyROT04tTkxTLTEkCisJCQkJTE9HLndhcm4oIm5saW5rIG9mIGxpbmsgdG8gbG9jayBmaWxlIHt9IHdhcyBub3QgMiBidXQge30iLCAvLyROT04tTkxTLTEkCiAJCQkJCQlsb2NrLmdldFBhdGgoKSwgbmxpbmspOwogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0gZWxzZSBpZiAobmxpbmsgPCAyKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCmluZGV4IDI5ZmU1ZGMuLjlmOTllMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCkBAIC00NywxMSArNDcsMjEgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRSZXN1bHQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TaW1wbGVGaWxlVmlzaXRvcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbW1hbmRGYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yLkZpbGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZU1vZGVTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLldvcmtpbmdUcmVlSXRlcmF0b3IuRW50cnk7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtOTcsMTMgKzEwNywxMyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKGZpbmFsIEZpbGUgZikgeworCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoRmlsZSBmKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNldEV4ZWN1dGUoZmluYWwgRmlsZSBmLCBmaW5hbCBib29sZWFuIGNhbkV4ZWMpIHsKKwlwdWJsaWMgYm9vbGVhbiBzZXRFeGVjdXRlKEZpbGUgZiwgYm9vbGVhbiBjYW5FeGVjKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEyMSw2ICsxMzEsNDkgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCisJcHVibGljIEVudHJ5W10gbGlzdChGaWxlIGRpcmVjdG9yeSwgRmlsZU1vZGVTdHJhdGVneSBmaWxlTW9kZVN0cmF0ZWd5KSB7CisJCUxpc3Q8RW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlGUyBmcyA9IHRoaXM7CisJCWJvb2xlYW4gY2hlY2tFeGVjdXRhYmxlID0gZnMuc3VwcG9ydHNFeGVjdXRlKCk7CisJCXRyeSB7CisJCQlGaWxlcy53YWxrRmlsZVRyZWUoZGlyZWN0b3J5LnRvUGF0aCgpLAorCQkJCQlFbnVtU2V0Lm5vbmVPZihGaWxlVmlzaXRPcHRpb24uY2xhc3MpLCAxLAorCQkJCQluZXcgU2ltcGxlRmlsZVZpc2l0b3I8UGF0aD4oKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKFBhdGggZmlsZSwKKwkJCQkJCQkJQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCQlGaWxlIGYgPSBmaWxlLnRvRmlsZSgpOworCQkJCQkJCUZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBGUy5BdHRyaWJ1dGVzKGZzLCBmLAorCQkJCQkJCQkJdHJ1ZSwgYXR0cnMuaXNEaXJlY3RvcnkoKSwKKwkJCQkJCQkJCWNoZWNrRXhlY3V0YWJsZSAmJiBmLmNhbkV4ZWN1dGUoKSwKKwkJCQkJCQkJCWF0dHJzLmlzU3ltYm9saWNMaW5rKCksCisJCQkJCQkJCQlhdHRycy5pc1JlZ3VsYXJGaWxlKCksCisJCQkJCQkJCQlhdHRycy5jcmVhdGlvblRpbWUoKS50b01pbGxpcygpLAorCQkJCQkJCQkJYXR0cnMubGFzdE1vZGlmaWVkVGltZSgpLnRvTWlsbGlzKCksCisJCQkJCQkJCQlhdHRycy5zaXplKCkpOworCQkJCQkJCXJlc3VsdC5hZGQobmV3IEZpbGVFbnRyeShmLCBmcywgYXR0cmlidXRlcywKKwkJCQkJCQkJCWZpbGVNb2RlU3RyYXRlZ3kpKTsKKwkJCQkJCQlyZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworCQkJCQkJfQorCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlRmFpbGVkKFBhdGggZmlsZSwKKwkJCQkJCQkJSU9FeGNlcHRpb24gZXhjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQkJCS8vIEp1c3QgaWdub3JlIGl0CisJCQkJCQkJcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCWlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gTk9fRU5UUklFUzsKKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IEVudHJ5W3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBGaWxlIGRpc2NvdmVyR2l0RXhlKCkgewogCQlTdHJpbmcgcGF0aCA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldGVudigiUEFUSCIpOyAvLyROT04tTkxTLTEkCiAJCUZpbGUgZ2l0RXhlID0gc2VhcmNoUGF0aChwYXRoLCAiZ2l0LmV4ZSIsICJnaXQuY21kIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhCmluZGV4IDY0Y2RjYzMuLjMzOTNmYmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzJfQ3lnd2luLmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwpAQCAtMTE3LDE0ICsxMTksMTQgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBGaWxlIGRpciwgZmluYWwgU3RyaW5nIHBuKSB7CisJcHVibGljIEZpbGUgcmVzb2x2ZShGaWxlIGRpciwgU3RyaW5nIHBuKSB7CiAJCVN0cmluZyB1c2VDeWdQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqZ2l0LnVzZWN5Z3BhdGgiKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAodXNlQ3lnUGF0aCAhPSBudWxsICYmIHVzZUN5Z1BhdGguZXF1YWxzKCJ0cnVlIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJU3RyaW5nIHc7CiAJCQl0cnkgewogCQkJCXcgPSByZWFkUGlwZShkaXIsIC8vCiAJCQkJCW5ldyBTdHJpbmdbXSB7IGN5Z3BhdGgsICItLXdpbmRvd3MiLCAiLS1hYnNvbHV0ZSIsIHBuIH0sIC8vIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlDSEFSU0VULm5hbWUoKSk7CiAJCQl9IGNhdGNoIChDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGUpIHsKIAkJCQlMT0cud2FybihlLmdldE1lc3NhZ2UoKSk7CiAJCQkJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYyMTc1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUy5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIEZpbGUgdXRpbGl0aWVzIHVzaW5nIEphdmEgNyBOSU8yCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JLyoqCi0JICogUmVhZCB0YXJnZXQgcGF0aCBvZiBhIHN5bWxpbmsuCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIHRhcmdldCBwYXRoIG9mIHRoZSBzeW1saW5rLgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWFkU3ltTGluayhGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3ltbGluayhGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMucmVhZFN5bUxpbmsocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3ltbGluawotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIHN5bWxpbmsgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRhcmdldCBvZiB0aGUgc3ltbGluayB0byBiZSBjcmVhdGVkCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjY3JlYXRlU3ltTGluayhGaWxlLCBTdHJpbmcpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTeW1MaW5rKEZpbGUgcGF0aCwgU3RyaW5nIHRhcmdldCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVVdGlscy5jcmVhdGVTeW1MaW5rKHBhdGgsIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgcGFzc2VkIGZpbGUgaXMgYSBzeW1saW5rCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhc3NlZCBwYXRoIGlzIGEgc3ltbGluawotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzU3ltYm9saWNMaW5rKGphdmEubmlvLmZpbGUuUGF0aCl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ltbGluayhGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc1N5bWxpbmsocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxhc3RNb2RpZmllZCBhdHRyaWJ1dGUgZm9yIGdpdmVuIHBhdGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSBmb3IgZ2l2ZW4gcGF0aAotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2dldExhc3RNb2RpZmllZFRpbWUoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb24uLi4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgbG9uZyBsYXN0TW9kaWZpZWQoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLmxhc3RNb2RpZmllZChwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSBmb3IgZ2l2ZW4gcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHBhcmFtIHRpbWUKLQkgKiAgICAgICAgICAgIGEgbG9uZy4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNzZXRMYXN0TW9kaWZpZWRUaW1lKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRmlsZVRpbWUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQoRmlsZSBwYXRoLCBsb25nIHRpbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVVdGlscy5zZXRMYXN0TW9kaWZpZWQocGF0aCwgdGltZSk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIGZpbGUgZXhpc3RzCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gcGF0aCBleGlzdHMKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNleGlzdHMoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb24uLi4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuZXhpc3RzKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhpcyBmaWxlIGlzIGhpZGRlbgotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIHBhdGggaXMgaGlkZGVuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzSGlkZGVuKGphdmEubmlvLmZpbGUuUGF0aCl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGlkZGVuKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc0hpZGRlbihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhpcyBmaWxlIGhpZGRlbgotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHBhcmFtIGhpZGRlbgotCSAqICAgICAgICAgICAgYSBib29sZWFuLgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3NldEhpZGRlbihGaWxlLGJvb2xlYW4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIaWRkZW4oRmlsZSBwYXRoLCBib29sZWFuIGhpZGRlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLnNldEhpZGRlbihwYXRoLCBoaWRkZW4pOwotCX0KLQotCS8qKgotCSAqIEdldCBmaWxlIGxlbmd0aAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiBsZW5ndGggb2YgdGhlIGdpdmVuIGZpbGUKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjZ2V0TGVuZ3RoKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMZW5ndGgoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLmdldExlbmd0aChwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBnaXZlbiBGaWxlIGlzIGEgZGlyZWN0b3J5Ci0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBkaXJlY3RvcnkKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNpc0RpcmVjdG9yeShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0b3J5KEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzRGlyZWN0b3J5KHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIGdpdmVuIEZpbGUgaXMgYSBmaWxlCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBmaWxlCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNSZWd1bGFyRmlsZShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZShGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc0ZpbGUocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBjYW4gYmUgZXhlY3V0ZWQKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsZSBjYW4gYmUgZXhlY3V0ZWQKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjY2FuRXhlY3V0ZShGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhlY3V0ZShGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5jYW5FeGVjdXRlKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgZ2l2ZW4gZmlsZQotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNkZWxldGUoRmlsZSl9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZmlsZSBzeXN0ZW0gYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGZpbGUKLQkgKgotCSAqIEBwYXJhbSBmcwotCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTfSBvYmplY3QuCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4gZmlsZSBzeXN0ZW0gYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGZpbGUKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNnZXRGaWxlQXR0cmlidXRlc1Bvc2l4KEZTLEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlcyBnZXRGaWxlQXR0cmlidXRlc1Bvc2l4KEZTIGZzLCBGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5nZXRGaWxlQXR0cmlidXRlc1Bvc2l4KGZzLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBORkMgbm9ybWFsaXplIEZpbGUgKG9uIE1hYyksIG90aGVyd2lzZSBkbyBub3RoaW5nCi0JICoKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIG9uIE1hYzogTkZDIG5vcm1hbGl6ZWQge0BsaW5rIGphdmEuaW8uRmlsZX0sIG90aGVyd2lzZSB0aGUgcGFzc2VkCi0JICogICAgICAgICBmaWxlCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI25vcm1hbGl6ZShGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEZpbGUgbm9ybWFsaXplKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gRmlsZVV0aWxzLm5vcm1hbGl6ZShmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBORkMgbm9ybWFsaXplIGZpbGUgbmFtZSAob24gTWFjKSwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcKLQkgKgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCi0JICogQHJldHVybiBvbiBNYWM6IE5GQyBub3JtYWxpemVkIGZvcm0gb2YgZ2l2ZW4gbmFtZQotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNub3JtYWxpemUoU3RyaW5nKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5ub3JtYWxpemUobmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEKaW5kZXggNzZhN2ViNi4uZjFlMDVlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YQpAQCAtMTIyLDcgKzEyMiw3IEBACiAJICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuSW52YWxpZFBhdGhFeGNlcHRpb259KQogCSAqIEBzaW5jZSA0LjEwCiAJICovCi0JcHVibGljIHN0YXRpYyBQYXRoIHRvUGF0aChmaW5hbCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBQYXRoIHRvUGF0aChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gZi50b1BhdGgoKTsKIAkJfSBjYXRjaCAoSW52YWxpZFBhdGhFeGNlcHRpb24gZXgpIHsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCSAqICAgICAgICAgICAgIGNhdXNlIGphdmEuaW8uSU9FeGNlcHRpb25zIGR1cmluZyByYWNlIGNvbmRpdGlvbnMgd2hlbgogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGRlbGV0ZSB0aGUgc2FtZSBmaWxlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlkZWxldGUoZiwgTk9ORSk7CiAJfQogCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBkZWxldGUgdGhlIHNhbWUgZmlsZS4KIAkgKiAgICAgICAgICAgICBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgdGhyb3duIHdoZW4gSUdOT1JFX0VSUk9SUyBpcyBzZXQuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGYsIGludCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmLCBpbnQgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRlMgZnMgPSBGUy5ERVRFQ1RFRDsKIAkJaWYgKChvcHRpb25zICYgU0tJUF9NSVNTSU5HKSAhPSAwICYmICFmcy5leGlzdHMoZikpCiAJCQlyZXR1cm47CkBAIC0yNDEsNyArMjQxLDcgQEAKIAkgKiAgICAgICAgICAgICBpZiB0aGUgcmVuYW1lIGhhcyBmYWlsZWQKIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbmFtZShmaW5hbCBGaWxlIHNyYywgZmluYWwgRmlsZSBkc3QpCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbmFtZShGaWxlIHNyYywgRmlsZSBkc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZW5hbWUoc3JjLCBkc3QsIFN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTsKIAl9CkBAIC0zMjEsNyArMzIxLDcgQEAKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlyKGZpbmFsIEZpbGUgZCkKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoRmlsZSBkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbWtkaXIoZCwgZmFsc2UpOwogCX0KQEAgLTM0MSw3ICszNDEsNyBAQAogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoZmluYWwgRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghZC5ta2RpcigpKSB7CiAJCQlpZiAoc2tpcEV4aXN0aW5nICYmIGQuaXNEaXJlY3RvcnkoKSkKQEAgLTM2Niw3ICszNjYsNyBAQAogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKGZpbmFsIEZpbGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbWtkaXJzKGQsIGZhbHNlKTsKIAl9CiAKQEAgLTM4OCw3ICszODgsNyBAQAogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKGZpbmFsIEZpbGUgZCwgYm9vbGVhbiBza2lwRXhpc3RpbmcpCisJcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFkLm1rZGlycygpKSB7CiAJCQlpZiAoc2tpcEV4aXN0aW5nICYmIGQuaXNEaXJlY3RvcnkoKSkKQEAgLTQ5OCwzMyArNDk4LDYgQEAKIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhbm5vdENyZWF0ZVRlbXBEaXIpOwogCX0KIAotCi0JLyoqCi0JICogUmVsYXRpdml6ZSBhIHBhdGgKLQkgKgotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbW9yZS1jbGVhcmx5LW5hbWVkCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjcmVsYXRpdml6ZU5hdGl2ZVBhdGgoU3RyaW5nLCBTdHJpbmcpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQsIG9yIGRpcmVjdGx5IGNhbGwKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWxhdGl2aXplUGF0aChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBib29sZWFuKX0KLQkgKgotCSAqICAgICAgICAgICAgIEV4cHJlc3NlcyA8Y29kZT5vdGhlcjwvY29kZT4gYXMgYSByZWxhdGl2ZSBmaWxlIHBhdGggZnJvbQotCSAqICAgICAgICAgICAgIDxjb2RlPmJhc2U8L2NvZGU+LiBGaWxlLXNlcGFyYXRvciBhbmQgY2FzZSBzZW5zaXRpdml0eSBhcmUKLQkgKiAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgY3VycmVudCBmaWxlIHN5c3RlbS4KLQkgKgotCSAqICAgICAgICAgICAgIFNlZSBhbHNvCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjcmVsYXRpdml6ZVBhdGgoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgYm9vbGVhbil9LgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICBCYXNlIHBhdGgKLQkgKiBAcGFyYW0gb3RoZXIKLQkgKiAgICAgICAgICAgIERlc3RpbmF0aW9uIHBhdGgKLQkgKiBAcmV0dXJuIFJlbGF0aXZlIHBhdGggZnJvbSA8Y29kZT5iYXNlPC9jb2RlPiB0byA8Y29kZT5vdGhlcjwvY29kZT4KLQkgKiBAc2luY2UgMy43Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyBiYXNlLCBTdHJpbmcgb3RoZXIpIHsKLQkJcmV0dXJuIHJlbGF0aXZpemVOYXRpdmVQYXRoKGJhc2UsIG90aGVyKTsKLQl9Ci0KIAkvKioKIAkgKiBFeHByZXNzZXMgPGNvZGU+b3RoZXI8L2NvZGU+IGFzIGEgcmVsYXRpdmUgZmlsZSBwYXRoIGZyb20KIAkgKiA8Y29kZT5iYXNlPC9jb2RlPi4gRmlsZS1zZXBhcmF0b3IgYW5kIGNhc2Ugc2Vuc2l0aXZpdHkgYXJlIGJhc2VkIG9uIHRoZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQppbmRleCBhNWE4NThmLi42ZjkyYjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQpAQCAtNDQsNiArNDQsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKQEAgLTE3NSwxMSArMTc3LDExIEBACiAJICogQHBhcmFtIGtleQogCSAqICAgICAgICAgICAgdmFsdWUgd2hpY2ggbXVzdCBiZSBlbmNvZGVkIHRvIHByb3RlY3RlZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZShmaW5hbCBTdHJpbmdCdWlsZGVyIHVybHN0ciwgZmluYWwgU3RyaW5nIGtleSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGUoU3RyaW5nQnVpbGRlciB1cmxzdHIsIFN0cmluZyBrZXkpIHsKIAkJaWYgKGtleSA9PSBudWxsIHx8IGtleS5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuOwogCQl0cnkgewotCQkJdXJsc3RyLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShrZXksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJdXJsc3RyLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShrZXksIENIQVJBQ1RFUl9FTkNPRElORykpOwogCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNvdWxkTm90VVJMRW5jb2RlVG9VVEY4LCBlKTsKIAkJfQpAQCAtMjAwLDcgKzIwMiw3IEBACiAJICogICAgICAgICAgICAgY29tbXVuaWNhdGlvbnMgZXJyb3IgcHJldmVudGVkIG9idGFpbmluZyB0aGUgcmVzcG9uc2UgY29kZS4KIAkgKiBAc2luY2UgMy4zCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoZmluYWwgSHR0cENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIGludCByZXNwb25zZShIdHRwQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIGMuZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCX0gY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gY2UpIHsKQEAgLTIyOCw3ICsyMzAsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGNvbW11bmljYXRpb25zIGVycm9yIHByZXZlbnRlZCBvYnRhaW5pbmcgdGhlIHJlc3BvbnNlIGNvZGUuCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoZmluYWwgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24gYykKKwlwdWJsaWMgc3RhdGljIGludCByZXNwb25zZShqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbiBjKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBjLmdldFJlc3BvbnNlQ29kZSgpOwpAQCAtMjczLDcgKzI3NSw3IEBACiAJICogICAgICAgICAgICAgdGhlIHByb3h5IGNvdWxkIG5vdCBiZSBjb21wdXRlZCBhcyB0aGUgc3VwcGxpZWQgVVJMIGNvdWxkIG5vdAogCSAqICAgICAgICAgICAgIGJlIHJlYWQuIFRoaXMgZmFpbHVyZSBzaG91bGQgbmV2ZXIgb2NjdXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBQcm94eSBwcm94eUZvcihmaW5hbCBQcm94eVNlbGVjdG9yIHByb3h5U2VsZWN0b3IsIGZpbmFsIFVSTCB1KQorCXB1YmxpYyBzdGF0aWMgUHJveHkgcHJveHlGb3IoUHJveHlTZWxlY3RvciBwcm94eVNlbGVjdG9yLCBVUkwgdSkKIAkJCXRocm93cyBDb25uZWN0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBwcm94eVNlbGVjdG9yLnNlbGVjdCh1LnRvVVJJKCkpLmdldCgwKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0lPLmphdmEKaW5kZXggZjM5ZDIxNy4uZTg4ZTdhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0lPLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0lPLmphdmEKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC01OSw2ICs1OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogSW5wdXQvT3V0cHV0IHV0aWxpdGllcwpAQCAtNzYsNyArNzYsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cywgYnV0IGl0cyBjb250ZW50cyBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoZmluYWwgRmlsZSBwYXRoKQorCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRGdWxseShGaWxlIHBhdGgpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBJTy5yZWFkRnVsbHkocGF0aCwgSW50ZWdlci5NQVhfVkFMVUUpOwogCX0KQEAgLTk2LDEwICs5Niw5IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGZpbGUgZXhpc3RzLCBidXQgaXRzIGNvbnRlbnRzIGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRTb21lKGZpbmFsIEZpbGUgcGF0aCwgZmluYWwgaW50IGxpbWl0KQorCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRTb21lKEZpbGUgcGF0aCwgaW50IGxpbWl0KQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotCQl0cnkgeworCQl0cnkgKFNpbGVudEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0ocGF0aCkpIHsKIAkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsaW1pdF07CiAJCQlpbnQgY250ID0gMDsKIAkJCWZvciAoOzspIHsKQEAgLTExMywxMiArMTEyLDYgQEAKIAkJCWJ5dGVbXSByZXMgPSBuZXcgYnl0ZVtjbnRdOwogCQkJU3lzdGVtLmFycmF5Y29weShidWYsIDAsIHJlcywgMCwgY250KTsKIAkJCXJldHVybiByZXM7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQogCQl9CiAJfQogCkBAIC0xMzYsMTAgKzEyOSw5IEBACiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGZpbGUgZXhpc3RzLCBidXQgaXRzIGNvbnRlbnRzIGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRGdWxseShmaW5hbCBGaWxlIHBhdGgsIGZpbmFsIGludCBtYXgpCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KEZpbGUgcGF0aCwgaW50IG1heCkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKTsKLQkJdHJ5IHsKKwkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKHBhdGgpKSB7CiAJCQlsb25nIHN6ID0gTWF0aC5tYXgocGF0aC5sZW5ndGgoKSwgMSk7CiAJCQlpZiAoc3ogPiBtYXgpCiAJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KApAQCAtMTczLDEyICsxNjUsNiBAQAogCQkJCWJ1ZiA9IG5iOwogCQkJfQogCQkJcmV0dXJuIGJ1ZjsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkvLyBpZ25vcmUgYW55IGNsb3NlIGVycm9ycywgdGhpcyB3YXMgYSByZWFkIG9ubHkgc3RyZWFtCi0JCQl9CiAJCX0KIAl9CiAKQEAgLTMyNSw3ICszMTEsNyBAQAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2tpcEZ1bGx5KGZpbmFsIElucHV0U3RyZWFtIGZkLCBsb25nIHRvU2tpcCkKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2tpcEZ1bGx5KElucHV0U3RyZWFtIGZkLCBsb25nIHRvU2tpcCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlICh0b1NraXAgPiAwKSB7CiAJCQlmaW5hbCBsb25nIHIgPSBmZC5za2lwKHRvU2tpcCk7CkBAIC0zNDMsNyArMzI5LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZGl2aWRlZCBpbnRvIGxpbmVzCiAJICogQHNpbmNlIDIuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHJlYWRMaW5lcyhmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHJlYWRMaW5lcyhTdHJpbmcgcykgewogCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JbnRMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhCmluZGV4IDI0MDM4ZjAuLjc0NDFkNTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JbnRMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCSAqIEBwYXJhbSBjYXBhY2l0eQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGxpc3QgY2FuIGluaXRpYWxseSBob2xkLgogCSAqLwotCXB1YmxpYyBJbnRMaXN0KGZpbmFsIGludCBjYXBhY2l0eSkgeworCXB1YmxpYyBJbnRMaXN0KGludCBjYXBhY2l0eSkgewogCQllbnRyaWVzID0gbmV3IGludFtjYXBhY2l0eV07CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UKIAkgKi8KLQlwdWJsaWMgaW50IGdldChmaW5hbCBpbnQgaSkgeworCXB1YmxpYyBpbnQgZ2V0KGludCBpKSB7CiAJCWlmIChjb3VudCA8PSBpKQogCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpKTsKIAkJcmV0dXJuIGVudHJpZXNbaV07CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBhZGQuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIGludCBuKSB7CisJcHVibGljIHZvaWQgYWRkKGludCBuKSB7CiAJCWlmIChjb3VudCA9PSBlbnRyaWVzLmxlbmd0aCkKIAkJCWdyb3coKTsKIAkJZW50cmllc1tjb3VudCsrXSA9IG47CkBAIC0xMzUsNyArMTM1LDcgQEAKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgdmFsdWUgdG8gc3RvcmUgYXQgdGhlIHBvc2l0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGludCBuKSB7CisJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgaW50IG4pIHsKIAkJaWYgKGNvdW50IDwgaW5kZXgpCiAJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4KTsKIAkJZWxzZSBpZiAoY291bnQgPT0gaW5kZXgpCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkgKiBAcGFyYW0gdmFsCiAJICogICAgICAgICAgICB2YWx1ZSB0byBpbnNlcnQgaW50byBwYWRkZWQgcG9zaXRpb25zLgogCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgZmluYWwgaW50IHZhbCkgeworCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgaW50IHZhbCkgewogCQl3aGlsZSAoY291bnQgPCB0b0luZGV4KQogCQkJYWRkKHZhbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YQppbmRleCA0MDQ1OTRjLi4zYmQ2ZTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YQpAQCAtNjcsNyArNjcsNyBAQAogCSAqIEBwYXJhbSBjYXBhY2l0eQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGxpc3QgY2FuIGluaXRpYWxseSBob2xkLgogCSAqLwotCXB1YmxpYyBMb25nTGlzdChmaW5hbCBpbnQgY2FwYWNpdHkpIHsKKwlwdWJsaWMgTG9uZ0xpc3QoaW50IGNhcGFjaXR5KSB7CiAJCWVudHJpZXMgPSBuZXcgbG9uZ1tjYXBhY2l0eV07CiAJfQogCkBAIC04OSw3ICs4OSw3IEBACiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlCiAJICovCi0JcHVibGljIGxvbmcgZ2V0KGZpbmFsIGludCBpKSB7CisJcHVibGljIGxvbmcgZ2V0KGludCBpKSB7CiAJCWlmIChjb3VudCA8PSBpKQogCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpKTsKIAkJcmV0dXJuIGVudHJpZXNbaV07CkBAIC0xMDIsNyArMTAyLDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogCSAqIEByZXR1cm4gdHJ1ZSBvZiB7QGNvZGUgdmFsdWV9IGFwcGVhcnMgaW4gdGhpcyBsaXN0LgogCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIGxvbmcgdmFsdWUpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhsb25nIHZhbHVlKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAkJCWlmIChlbnRyaWVzW2ldID09IHZhbHVlKQogCQkJCXJldHVybiB0cnVlOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYWRkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBsb25nIG4pIHsKKwlwdWJsaWMgdm9pZCBhZGQobG9uZyBuKSB7CiAJCWlmIChjb3VudCA9PSBlbnRyaWVzLmxlbmd0aCkKIAkJCWdyb3coKTsKIAkJZW50cmllc1tjb3VudCsrXSA9IG47CkBAIC0xMzYsNyArMTM2LDcgQEAKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgdmFsdWUgdG8gc3RvcmUgYXQgdGhlIHBvc2l0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGxvbmcgbikgeworCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIGxvbmcgbikgewogCQlpZiAoY291bnQgPCBpbmRleCkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwogCQllbHNlIGlmIChjb3VudCA9PSBpbmRleCkKQEAgLTE1NSw3ICsxNTUsNyBAQAogCSAqIEBwYXJhbSB2YWwKIAkgKiAgICAgICAgICAgIHZhbHVlIHRvIGluc2VydCBpbnRvIHBhZGRlZCBwb3NpdGlvbnMuCiAJICovCi0JcHVibGljIHZvaWQgZmlsbFRvKGludCB0b0luZGV4LCBmaW5hbCBsb25nIHZhbCkgeworCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgbG9uZyB2YWwpIHsKIAkJd2hpbGUgKGNvdW50IDwgdG9JbmRleCkKIAkJCWFkZCh2YWwpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhCmluZGV4IDA5ZWVlNDIuLjhjN2Y2NzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdNYXAuamF2YQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbnNlcnQoZmluYWwgTm9kZTxWPiBuKSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydChOb2RlPFY+IG4pIHsKIAkJZmluYWwgaW50IGlkeCA9IGluZGV4KG4ua2V5KTsKIAkJbi5uZXh0ID0gdGFibGVbaWR4XTsKIAkJdGFibGVbaWR4XSA9IG47CkBAIC0xNjYsMTQgKzE2NiwxNCBAQAogCQl9CiAJfQogCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXgoZmluYWwgbG9uZyBrZXkpIHsKKwlwcml2YXRlIGZpbmFsIGludCBpbmRleChsb25nIGtleSkgewogCQlpbnQgaCA9ICgoaW50KSBrZXkpID4+PiAxOwogCQloIF49IChoID4+PiAyMCkgXiAoaCA+Pj4gMTIpOwogCQlyZXR1cm4gaCAmICh0YWJsZS5sZW5ndGggLSAxKTsKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCA8Vj4gTm9kZTxWPltdIGNyZWF0ZUFycmF5KGZpbmFsIGludCBzeikgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIDxWPiBOb2RlPFY+W10gY3JlYXRlQXJyYXkoaW50IHN6KSB7CiAJCXJldHVybiBuZXcgTm9kZVtzel07CiAJfQogCkBAIC0xODIsNyArMTgyLDcgQEAKIAkJViB2YWx1ZTsKIAkJTm9kZTxWPiBuZXh0OwogCi0JCU5vZGUoZmluYWwgbG9uZyBrLCBmaW5hbCBWIHYpIHsKKwkJTm9kZShsb25nIGssIFYgdikgewogCQkJa2V5ID0gazsKIAkJCXZhbHVlID0gdjsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhCmluZGV4IDc3YmMyNDkuLjRkNThkMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nLmphdmEKQEAgLTk5LDcgKzk5LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBjbGVhbmVkIHN0cmluZy4KIAkgKiBAc2VlICNkZXF1b3RlKGJ5dGVbXSwgaW50LCBpbnQpCiAJICovCi0JcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIFN0cmluZyBpbikgeworCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKGluKTsKIAkJcmV0dXJuIGRlcXVvdGUoYiwgMCwgYi5sZW5ndGgpOwogCX0KQEAgLTEzNyw3ICsxMzcsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgQm91cm5lU3R5bGUgZXh0ZW5kcyBRdW90ZWRTdHJpbmcgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKKwkJcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgaW4pIHsKIAkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCQlyLmFwcGVuZCgnXCcnKTsKIAkJCWludCBzdGFydCA9IDAsIGkgPSAwOwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIGJ5dGVbXSBpbiwgaW50IGlwLCBmaW5hbCBpbnQgaWUpIHsKKwkJcHVibGljIFN0cmluZyBkZXF1b3RlKGJ5dGVbXSBpbiwgaW50IGlwLCBpbnQgaWUpIHsKIAkJCWJvb2xlYW4gaW5xdW90ZSA9IGZhbHNlOwogCQkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtpZSAtIGlwXTsKIAkJCWludCByUHRyID0gMDsKQEAgLTE4OCw3ICsxODgsNyBAQAogCS8qKiBCb3VybmUgc3R5bGUsIGJ1dCBwZXJtaXRzIDxjb2RlPn51c2VyPC9jb2RlPiBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4gKi8KIAlwdWJsaWMgc3RhdGljIGNsYXNzIEJvdXJuZVVzZXJQYXRoU3R5bGUgZXh0ZW5kcyBCb3VybmVTdHlsZSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbikgeworCQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBpbikgewogCQkJaWYgKGluLm1hdGNoZXMoIl5+W0EtWmEtejAtOV8tXSskIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCS8vIElmIHRoZSBzdHJpbmcgaXMganVzdCAifnVzZXIiIHdlIGNhbiBhc3N1bWUgdGhleQogCQkJCS8vIG1lYW4gIn51c2VyLyIuCkBAIC0yNTUsNyArMjU1LDcgQEAKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbnN0cikgeworCQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBpbnN0cikgewogCQkJaWYgKGluc3RyLmxlbmd0aCgpID09IDApCiAJCQkJcmV0dXJuICJcIlwiIjsgLy8kTk9OLU5MUy0xJAogCQkJYm9vbGVhbiByZXVzZSA9IHRydWU7CkBAIC0yOTEsMTMgKzI5MSwxMyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBieXRlW10gaW4sIGZpbmFsIGludCBpblB0ciwgZmluYWwgaW50IGluRW5kKSB7CisJCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShieXRlW10gaW4sIGludCBpblB0ciwgaW50IGluRW5kKSB7CiAJCQlpZiAoMiA8PSBpbkVuZCAtIGluUHRyICYmIGluW2luUHRyXSA9PSAnIicgJiYgaW5baW5FbmQgLSAxXSA9PSAnIicpCiAJCQkJcmV0dXJuIGRxKGluLCBpblB0ciArIDEsIGluRW5kIC0gMSk7CiAJCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIGluLCBpblB0ciwgaW5FbmQpOwogCQl9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRxKGZpbmFsIGJ5dGVbXSBpbiwgaW50IGluUHRyLCBmaW5hbCBpbnQgaW5FbmQpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRxKGJ5dGVbXSBpbiwgaW50IGluUHRyLCBpbnQgaW5FbmQpIHsKIAkJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbaW5FbmQgLSBpblB0cl07CiAJCQlpbnQgclB0ciA9IDA7CiAJCQl3aGlsZSAoaW5QdHIgPCBpbkVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhCmluZGV4IDIzZWU5ZDAuLjQyMDYwYzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdDaGFyU2VxdWVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiBAcGFyYW0gZW5kCiAJICogICAgICAgICAgICBlbmRpbmcgcG9zaXRpb24gZm9yIHRoZSBzZXF1ZW5jZS4KIAkgKi8KLQlwdWJsaWMgUmF3Q2hhclNlcXVlbmNlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgeworCXB1YmxpYyBSYXdDaGFyU2VxdWVuY2UoYnl0ZVtdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCWJ1ZmZlciA9IGJ1ZjsKIAkJc3RhcnRQdHIgPSBzdGFydDsKIAkJZW5kUHRyID0gZW5kOwpAQCAtNzYsNyArNzYsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgY2hhciBjaGFyQXQoZmluYWwgaW50IGluZGV4KSB7CisJcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewogCQlyZXR1cm4gKGNoYXIpIChidWZmZXJbc3RhcnRQdHIgKyBpbmRleF0gJiAweGZmKTsKIAl9CiAKQEAgLTg4LDcgKzg4LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKwlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogCQlyZXR1cm4gbmV3IFJhd0NoYXJTZXF1ZW5jZShidWZmZXIsIHN0YXJ0UHRyICsgc3RhcnQsIHN0YXJ0UHRyICsgZW5kKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhCmluZGV4IDAxNGM3NzIuLmMyMmM4ZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YQpAQCAtNjMsNiArNjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkJpbmFyeUJsb2JFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OwogCkBAIC0xMjUsNyArMTI2LDcgQEAKIAkgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCBiLgogCSAqIEByZXR1cm4gcHRyICsgc3JjLmxlbmd0aCBpZiBiW3B0ci4uc3JjLmxlbmd0aF0gPT0gc3JjOyBlbHNlIC0xLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hdGNoKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBieXRlW10gc3JjKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF0Y2goYnl0ZVtdIGIsIGludCBwdHIsIGJ5dGVbXSBzcmMpIHsKIAkJaWYgKHB0ciArIHNyYy5sZW5ndGggPiBiLmxlbmd0aCkKIAkJCXJldHVybiAtMTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyssIHB0cisrKQpAQCAtNDYxLDcgKzQ2Miw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYnVmZmVyIHRvIHN0YXJ0IHBhcnNpbmcgZGlnaXRzIGF0LgogCSAqIEByZXR1cm4gdGhlIHRpbWV6b25lIGF0IHRoaXMgbG9jYXRpb24sIGV4cHJlc3NlZCBpbiBtaW51dGVzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcnNlVGltZVpvbmVPZmZzZXQoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZVRpbWVab25lT2Zmc2V0KGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCXJldHVybiBwYXJzZVRpbWVab25lT2Zmc2V0KGIsIHB0ciwgbnVsbCk7CiAJfQogCkBAIC01MDAsNyArNTAxLDcgQEAKIAkgKiAgICAgICAgICAgIGNoYXJhY3RlciB0byBmaW5kLgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYWZ0ZXIgY2hyQS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0KGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBjaGFyIGNockEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0KGJ5dGVbXSBiLCBpbnQgcHRyLCBjaGFyIGNockEpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCXdoaWxlIChwdHIgPCBzeikgewogCQkJaWYgKGJbcHRyKytdID09IGNockEpCkBAIC01MjAsNyArNTIxLDcgQEAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiBidWZmZXIgdG8gc3RhcnQgbG9va2luZyBmb3IgTEYgYXQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgZmlyc3QgTEYgZm91bmQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dExGKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dExGKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCXJldHVybiBuZXh0KGIsIHB0ciwgJ1xuJyk7CiAJfQogCkBAIC01MzcsNyArNTM4LDcgQEAKIAkgKiAgICAgICAgICAgIGNoYXJhY3RlciB0byBmaW5kLgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IGNockEgb3IgTEYgdG8gYmUgZm91bmQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dExGKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBjaGFyIGNockEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoYnl0ZVtdIGIsIGludCBwdHIsIGNoYXIgY2hyQSkgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6KSB7CiAJCQlmaW5hbCBieXRlIGMgPSBiW3B0cisrXTsKQEAgLTU1OCw3ICs1NTksNyBAQAogCSAqICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGZpbmQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBiZWZvcmUgY2hyQSwgLTEgZm9yIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXYoYnl0ZVtdIGIsIGludCBwdHIsIGNoYXIgY2hyQSkgewogCQlpZiAocHRyID09IGIubGVuZ3RoKQogCQkJLS1wdHI7CiAJCXdoaWxlIChwdHIgPj0gMCkgewpAQCAtNTc5LDcgKzU4MCw3IEBACiAJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYnVmZmVyIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIExGIGF0LgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBMRiBmb3VuZCwgLTEgZm9yIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihieXRlW10gYiwgaW50IHB0cikgewogCQlyZXR1cm4gcHJldihiLCBwdHIsICdcbicpOwogCX0KIApAQCAtNTk3LDcgKzU5OCw3IEBACiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGNockEgb3IgTEYgdG8gYmUgZm91bmQsIC0xIGZvcgogCSAqICAgICAgICAgbm90IGZvdW5kCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldkxGKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBjaGFyIGNockEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoYnl0ZVtdIGIsIGludCBwdHIsIGNoYXIgY2hyQSkgewogCQlpZiAocHRyID09IGIubGVuZ3RoKQogCQkJLS1wdHI7CiAJCXdoaWxlIChwdHIgPj0gMCkgewpAQCAtNjMyLDExICs2MzMsNDcgQEAKIAkgKiAgICAgICAgICAgIGxpbmUgMS4KIAkgKiBAcGFyYW0gZW5kCiAJICogICAgICAgICAgICAxIHBhc3QgdGhlIGVuZCBvZiB0aGUgY29udGVudCB3aXRoaW4gPGNvZGU+YnVmPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGEgbGluZSBtYXAgaW5kZXhpbmcgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIGVhY2ggbGluZS4KKwkgKiBAcmV0dXJuIGEgbGluZSBtYXAgaW5kaWNhdGluZyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgZWFjaCBsaW5lLCBvciBhCisJICogICAgICAgICBtYXAgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgYnVmZmVyIGFzIGEgc2luZ2xlIGxpbmUgaWYKKwkgKiAgICAgICAgIDxjb2RlPmJ1ZjwvY29kZT4gY29udGFpbnMgYSBOVUwgYnl0ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludExpc3QgbGluZU1hcChmaW5hbCBieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKSB7Ci0JCWludCBzdGFydCA9IHB0cjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludExpc3QgbGluZU1hcChieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKSB7CisJCUludExpc3QgbWFwID0gbGluZU1hcE9yTnVsbChidWYsIHB0ciwgZW5kKTsKKwkJaWYgKG1hcCA9PSBudWxsKSB7CisJCQltYXAgPSBuZXcgSW50TGlzdCgzKTsKKwkJCW1hcC5hZGQoSW50ZWdlci5NSU5fVkFMVUUpOworCQkJbWFwLmFkZChwdHIpOworCQkJbWFwLmFkZChlbmQpOworCQl9CisJCXJldHVybiBtYXA7CisJfQogCisJLyoqCisJICogTGlrZSB7QGxpbmsgI2xpbmVNYXAoYnl0ZVtdLCBpbnQsIGludCl9IGJ1dCB0aHJvdworCSAqIHtAbGluayBCaW5hcnlCbG9iRXhjZXB0aW9ufSBpZiBhIE5VTCBieXRlIGlzIGVuY291bnRlcmVkLgorCSAqCisJICogQHBhcmFtIGJ1ZgorCSAqICAgICAgICAgICAgYnVmZmVyIHRvIHNjYW4uCisJICogQHBhcmFtIHB0cgorCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYnl0ZSBvZgorCSAqICAgICAgICAgICAgbGluZSAxLgorCSAqIEBwYXJhbSBlbmQKKwkgKiAgICAgICAgICAgIDEgcGFzdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IHdpdGhpbiA8Y29kZT5idWY8L2NvZGU+LgorCSAqIEByZXR1cm4gYSBsaW5lIG1hcCBpbmRpY2F0aW5nIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBlYWNoIGxpbmUuCisJICogQHRocm93cyBCaW5hcnlCbG9iRXhjZXB0aW9uCisJICogICAgICAgICAgICBpZiBhIE5VTCBieXRlIGlzIGZvdW5kLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludExpc3QgbGluZU1hcE9yQmluYXJ5KGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpCisJCQl0aHJvd3MgQmluYXJ5QmxvYkV4Y2VwdGlvbiB7CisJCUludExpc3QgbWFwID0gbGluZU1hcE9yTnVsbChidWYsIHB0ciwgZW5kKTsKKwkJaWYgKG1hcCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgQmluYXJ5QmxvYkV4Y2VwdGlvbigpOworCQl9CisJCXJldHVybiBtYXA7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQE51bGxhYmxlIEludExpc3QgbGluZU1hcE9yTnVsbChieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCS8vIEV4cGVyaW1lbnRhbGx5IGRlcml2ZWQgZnJvbSBtdWx0aXBsZSBzb3VyY2UgcmVwb3NpdG9yaWVzCiAJCS8vIHRoZSBhdmVyYWdlIG51bWJlciBvZiBieXRlcy9saW5lIGlzIDM2LiBJdHMgYSByb3VnaCBndWVzcwogCQkvLyB0byBpbml0aWFsbHkgc2l6ZSBvdXIgbWFwIGNsb3NlIHRvIHRoZSB0YXJnZXQuCkBAIC02NDksMTEgKzY4Niw3IEBACiAJCQl9CiAKIAkJCWlmIChidWZbcHRyXSA9PSAnXDAnKSB7Ci0JCQkJLy8gYmluYXJ5IGRhdGEuCi0JCQkJbWFwID0gbmV3IEludExpc3QoMyk7Ci0JCQkJbWFwLmFkZChJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0JCQkJbWFwLmFkZChzdGFydCk7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAKIAkJCWZvdW5kTEYgPSAoYnVmW3B0cl0gPT0gJ1xuJyk7CkBAIC02NzUsNyArNzA4LDcgQEAKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgYXV0aG9yJ3MgbmFtZS4gSWYgbm8gYXV0aG9yIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0aG9yKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0aG9yKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDY7IC8vIHNraXAgdGhlICJ0cmVlIC4uLiIgbGluZS4KQEAgLTY5Nyw3ICs3MzAsNyBAQAogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBjb21taXR0ZXIncyBuYW1lLiBJZiBubyBjb21taXR0ZXIgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXR0ZXIoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXR0ZXIoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0NjsgLy8gc2tpcCB0aGUgInRyZWUgLi4uIiBsaW5lLgpAQCAtNzIxLDcgKzc1NCw3IEBACiAJICogICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIHRhZ2dlcidzIG5hbWUuIElmIG5vIHRhZ2dlciBoZWFkZXIgY2FuIGJlCiAJICogICAgICAgICBsb2NhdGVkIC0xIGlzIHJldHVybmVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ2dlcihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ2dlcihieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJaWYgKHB0ciA9PSAwKQogCQkJcHRyICs9IDQ4OyAvLyBza2lwIHRoZSAib2JqZWN0IC4uLiIgbGluZS4KQEAgLTc0OSw3ICs3ODIsNyBAQAogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBlbmNvZGluZydzIG5hbWUuIElmIG5vIGVuY29kaW5nIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQgKGFuZCBVVEYtOCBzaG91bGQgYmUgYXNzdW1lZCkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5jb2RpbmcoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZyhieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6KSB7CiAJCQlpZiAoYltwdHJdID09ICdcbicpCkBAIC03NzMsNyArODA2LDcgQEAKIAkgKiBAc2luY2UgNC4yCiAJICovCiAJQE51bGxhYmxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VFbmNvZGluZ05hbWUoZmluYWwgYnl0ZVtdIGIpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVuY29kaW5nTmFtZShieXRlW10gYikgewogCQlpbnQgZW5jID0gZW5jb2RpbmcoYiwgMCk7CiAJCWlmIChlbmMgPCAwKSB7CiAJCQlyZXR1cm4gbnVsbDsKQEAgLTgwMSw3ICs4MzQsNyBAQAogCSAqICAgICAgICAgICAgIGlmIHRoZSBKUkUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2hhcmFjdGVyIHNldCByZXF1ZXN0ZWQgYnkKIAkgKiAgICAgICAgICAgICB0aGUgZW5jb2RpbmcgaGVhZGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2hhcnNldCBwYXJzZUVuY29kaW5nKGZpbmFsIGJ5dGVbXSBiKSB7CisJcHVibGljIHN0YXRpYyBDaGFyc2V0IHBhcnNlRW5jb2RpbmcoYnl0ZVtdIGIpIHsKIAkJU3RyaW5nIGVuYyA9IHBhcnNlRW5jb2RpbmdOYW1lKGIpOwogCQlpZiAoZW5jID09IG51bGwpIHsKIAkJCXJldHVybiBVVEZfODsKQEAgLTgzMSw3ICs4NjQsNyBAQAogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBpZGVudGl0eSBvciBudWxsIGluIGNhc2UgdGhlIGlkZW50aXR5IGNvdWxkIG5vdCBiZQogCSAqICAgICAgICAgcGFyc2VkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgaW4pIHsKKwlwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoU3RyaW5nIGluKSB7CiAJCXJldHVybiBwYXJzZVBlcnNvbklkZW50KENvbnN0YW50cy5lbmNvZGUoaW4pLCAwKTsKIAl9CiAKQEAgLTg1Myw3ICs4ODYsNyBAQAogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBpZGVudGl0eSBvciBudWxsIGluIGNhc2UgdGhlIGlkZW50aXR5IGNvdWxkIG5vdCBiZQogCSAqICAgICAgICAgcGFyc2VkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChmaW5hbCBieXRlW10gcmF3LCBmaW5hbCBpbnQgbmFtZUIpIHsKKwlwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoYnl0ZVtdIHJhdywgaW50IG5hbWVCKSB7CiAJCUNoYXJzZXQgY3M7CiAJCXRyeSB7CiAJCQljcyA9IHBhcnNlRW5jb2RpbmcocmF3KTsKQEAgLTk2MSw3ICs5OTQsNyBAQAogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlICc6JyB3aGljaCB0ZXJtaW5hdGVzIHRoZSBmb290ZXIgbGluZSBrZXkgaWYgdGhpcwogCSAqICAgICAgICAgaXMgb3RoZXJ3aXNlIGEgdmFsaWQgZm9vdGVyIGxpbmUga2V5OyBvdGhlcndpc2UgLTEuCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgZW5kT2ZGb290ZXJMaW5lS2V5KGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGludCBlbmRPZkZvb3RlckxpbmVLZXkoYnl0ZVtdIHJhdywgaW50IHB0cikgewogCQl0cnkgewogCQkJZm9yICg7OykgewogCQkJCWZpbmFsIGJ5dGUgYyA9IHJhd1twdHJdOwpAQCAtOTg4LDcgKzEwMjEsNyBAQAogCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIDxjb2RlPltzdGFydCxlbmQpPC9jb2RlPiwKIAkgKiAgICAgICAgIGFmdGVyIGRlY29kaW5nIHRoZSByZWdpb24gdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoYnl0ZVtdIGJ1ZmZlcikgewogCQlyZXR1cm4gZGVjb2RlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAJfQogCkBAIC0xMDI2LDcgKzEwNTksNyBAQAogCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIDxjb2RlPltzdGFydCxlbmQpPC9jb2RlPiwKIAkgKiAgICAgICAgIGFmdGVyIGRlY29kaW5nIHRoZSByZWdpb24gdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIENoYXJzZXQgY3MsIGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoQ2hhcnNldCBjcywgYnl0ZVtdIGJ1ZmZlcikgewogCQlyZXR1cm4gZGVjb2RlKGNzLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogCX0KIApAQCAtMTE0Myw3ICsxMTc2LDcgQEAKIAkJcmV0dXJuIHIudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIEJ5dGVCdWZmZXIgYiwgZmluYWwgQ2hhcnNldCBjaGFyc2V0KQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGUoQnl0ZUJ1ZmZlciBiLCBDaGFyc2V0IGNoYXJzZXQpCiAJCQl0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2hhcnNldERlY29kZXIgZCA9IGNoYXJzZXQubmV3RGVjb2RlcigpOwogCQlkLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKQEAgLTExNjIsNyArMTE5NSw3IEBACiAJICogICAgICAgICAgICBjb21taXQgYnVmZmVyLgogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtZXNzYWdlIGJ1ZmZlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXRNZXNzYWdlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0TWVzc2FnZShieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJaWYgKHB0ciA9PSAwKQogCQkJcHRyICs9IDQ2OyAvLyBza2lwIHRoZSAidHJlZSAuLi4iIGxpbmUuCkBAIC0xMTg2LDcgKzEyMTksNyBAQAogCSAqICAgICAgICAgICAgYnVmZmVyLgogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtZXNzYWdlIGJ1ZmZlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdNZXNzYWdlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnTWVzc2FnZShieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJaWYgKHB0ciA9PSAwKQogCQkJcHRyICs9IDQ4OyAvLyBza2lwIHRoZSAib2JqZWN0IC4uLiIgbGluZS4KQEAgLTEyMTEsNyArMTI0NCw3IEBACiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgTEYgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoOwogCSAqICAgICAgICAgPGNvZGU+Yi5sZW5ndGg8L2NvZGU+IGlmIG5vIHBhcmFncmFwaCBlbmQgY291bGQgYmUgbG9jYXRlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmRPZlBhcmFncmFwaChmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IHN0YXJ0KSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kT2ZQYXJhZ3JhcGgoYnl0ZVtdIGIsIGludCBzdGFydCkgewogCQlpbnQgcHRyID0gc3RhcnQ7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3ogJiYgKGJbcHRyXSAhPSAnXG4nICYmIGJbcHRyXSAhPSAnXHInKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhCmluZGV4IGE4ZjliYzcuLjA0MGI1Y2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm4uamF2YQpAQCAtNjYsNyArNjYsNyBAQAogCSAqICAgICAgICAgICAgbWV0YS1jaGFyYWN0ZXJzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4gVGhlCiAJICogICAgICAgICAgICBzdHJpbmcgbWF5IG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nLgogCSAqLwotCXB1YmxpYyBSYXdTdWJTdHJpbmdQYXR0ZXJuKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCXB1YmxpYyBSYXdTdWJTdHJpbmdQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQlpZiAocGF0dGVyblRleHQubGVuZ3RoKCkgPT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2Fubm90TWF0Y2hPbkVtcHR5U3RyaW5nKTsKIAkJbmVlZGxlU3RyaW5nID0gcGF0dGVyblRleHQ7CkBAIC04Nyw3ICs4Nyw3IEBACiAJICogICAgICAgICBwYXR0ZXJuOyAtMSBpZiB0aGlzIHBhdHRlcm4gZG9lcyBub3QgYXBwZWFyIGF0IGFueSBwb3NpdGlvbiBvZgogCSAqICAgICAgICAgPGNvZGU+cmNzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgaW50IG1hdGNoKGZpbmFsIFJhd0NoYXJTZXF1ZW5jZSByY3MpIHsKKwlwdWJsaWMgaW50IG1hdGNoKFJhd0NoYXJTZXF1ZW5jZSByY3MpIHsKIAkJZmluYWwgaW50IG5lZWRsZUxlbiA9IG5lZWRsZS5sZW5ndGg7CiAJCWZpbmFsIGJ5dGUgZmlyc3QgPSBuZWVkbGVbMF07CiAKQEAgLTExNCwxMSArMTE0LDExIEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIG5lcShmaW5hbCBieXRlIGEsIGZpbmFsIGJ5dGUgYikgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbmVxKGJ5dGUgYSwgYnl0ZSBiKSB7CiAJCXJldHVybiBhICE9IGIgJiYgYSAhPSBsYyhiKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGxjKGZpbmFsIGJ5dGUgcSkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgbGMoYnl0ZSBxKSB7CiAJCXJldHVybiAoYnl0ZSkgU3RyaW5nVXRpbHMudG9Mb3dlckNhc2UoKGNoYXIpIChxICYgMHhmZikpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZk1hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZk1hcC5qYXZhCmluZGV4IGMxYWFlY2YuLmEzZjk3MzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmIHB1dChmaW5hbCBTdHJpbmcga2V5TmFtZSwgUmVmIHZhbHVlKSB7CisJcHVibGljIFJlZiBwdXQoU3RyaW5nIGtleU5hbWUsIFJlZiB2YWx1ZSkgewogCQlTdHJpbmcgbmFtZSA9IHRvUmVmTmFtZShrZXlOYW1lKTsKIAogCQlpZiAoIW5hbWUuZXF1YWxzKHZhbHVlLmdldE5hbWUoKSkpCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJCXJldHVybiBudWxsOwogCQl9CiAKLQkJcHJpdmF0ZSBSZWYgcmVzb2x2ZUxvb3NlKGZpbmFsIFJlZiBsKSB7CisJCXByaXZhdGUgUmVmIHJlc29sdmVMb29zZShSZWYgbCkgewogCQkJaWYgKHJlc29sdmVkSWR4IDwgcmVzb2x2ZWQuc2l6ZSgpKSB7CiAJCQkJUmVmIHIgPSByZXNvbHZlZC5nZXQocmVzb2x2ZWRJZHgpOwogCQkJCWludCBjbXAgPSBSZWZDb21wYXJhdG9yLmNvbXBhcmVUbyhsLCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Tc2hTdXBwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3NoU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2FhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3NoU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LCBNYXJrdXMgRHVmdCA8bWFya3VzLmR1ZnRAc3NpLXNjaGFlZmVyLmNvbT4KKyAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCisgKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCisgKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db21tYW5kRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVTZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaFNlc3Npb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTWVzc2FnZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU3RyZWFtQ29weVRocmVhZDsKKworLyoqCisgKiBFeHRyYSB1dGlsaXRpZXMgdG8gc3VwcG9ydCB1c2FnZSBvZiBTU0guCisgKgorICogQHNpbmNlIDUuMAorICovCitwdWJsaWMgY2xhc3MgU3NoU3VwcG9ydCB7CisKKwkvKioKKwkgKiBVdGlsaXR5IHRvIGV4ZWN1dGUgYSByZW1vdGUgU1NIIGNvbW1hbmQgYW5kIHJlYWQgdGhlIGZpcnN0IGxpbmUgb2YKKwkgKiBvdXRwdXQuCisJICoKKwkgKiBAcGFyYW0gc3NoVXJpCisJICogICAgICAgICAgICB0aGUgU1NIIHJlbW90ZSBVUkkKKwkgKiBAcGFyYW0gcHJvdmlkZXIKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQ3JlZGVudGlhbHNQcm92aWRlcn0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGZzCisJICogICAgICAgICAgICB0aGUge0BsaW5rIEZTfSBpbXBsZW1lbnRhdGlvbiBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgIHtAbGluayBTc2hTZXNzaW9uRmFjdG9yeX0KKwkgKiBAcGFyYW0gY29tbWFuZAorCSAqICAgICAgICAgICAgdGhlIHJlbW90ZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisJICogQHBhcmFtIHRpbWVvdXQKKwkgKiAgICAgICAgICAgIGEgdGltZW91dCBpbiBzZWNvbmRzLiBUaGUgdGltZW91dCBtYXkgYmUgZXhjZWVkZWQgaW4gY29ybmVyCisJICogICAgICAgICAgICBjYXNlcy4KKwkgKiBAcmV0dXJuIFRoZSBlbnRpcmUgb3V0cHV0IHJlYWQgZnJvbSBzdGRvdXQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqIEB0aHJvd3MgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBzc2ggY29tbWFuZCBleGVjdXRpb24gZmFpbGVkLCBlcnJvciBtZXNzYWdlIGNvbnRhaW5zCisJICogICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2Ygc3RkZXJyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1blNzaENvbW1hbmQoVVJJaXNoIHNzaFVyaSwKKwkJCUBOdWxsYWJsZSBDcmVkZW50aWFsc1Byb3ZpZGVyIHByb3ZpZGVyLCBGUyBmcywgU3RyaW5nIGNvbW1hbmQsCisJCQlpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKKwkJUmVtb3RlU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKwkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKKwkJU3RyZWFtQ29weVRocmVhZCBlcnJvclRocmVhZCA9IG51bGw7CisJCVN0cmVhbUNvcHlUaHJlYWQgb3V0VGhyZWFkID0gbnVsbDsKKwkJQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiBmYWlsdXJlID0gbnVsbDsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKwkJTWVzc2FnZVdyaXRlciBzdGRlcnIgPSBuZXcgTWVzc2FnZVdyaXRlcigpOworCQl0cnkgKE1lc3NhZ2VXcml0ZXIgc3Rkb3V0ID0gbmV3IE1lc3NhZ2VXcml0ZXIoKSkgeworCQkJc2Vzc2lvbiA9IFNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U2Vzc2lvbihzc2hVcmksCisJCQkJCXByb3ZpZGVyLCBmcywgMTAwMCAqIHRpbWVvdXQpOworCQkJcHJvY2VzcyA9IHNlc3Npb24uZXhlYyhjb21tYW5kLCAwKTsKKwkJCWVycm9yVGhyZWFkID0gbmV3IFN0cmVhbUNvcHlUaHJlYWQocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpLAorCQkJCQlzdGRlcnIuZ2V0UmF3U3RyZWFtKCkpOworCQkJZXJyb3JUaHJlYWQuc3RhcnQoKTsKKwkJCW91dFRocmVhZCA9IG5ldyBTdHJlYW1Db3B5VGhyZWFkKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwKKwkJCQkJc3Rkb3V0LmdldFJhd1N0cmVhbSgpKTsKKwkJCW91dFRocmVhZC5zdGFydCgpOworCQkJdHJ5IHsKKwkJCQkvLyB3YWl0Rm9yIHdpdGggdGltZW91dCBoYXMgYSBidWcgLSBKU2NoJyBleGl0VmFsdWUoKSB0aHJvd3MgdGhlCisJCQkJLy8gd3JvbmcgZXhjZXB0aW9uIHR5cGUgOigKKwkJCQlpZiAocHJvY2Vzcy53YWl0Rm9yKCkgPT0gMCkgeworCQkJCQlyZXR1cm4gc3Rkb3V0LnRvU3RyaW5nKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG51bGw7IC8vIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGltZW91dAorCQkJCX0KKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gU3RvcCB3YWl0aW5nIGFuZCByZXR1cm4gYW55d2F5LgorCQkJCX0gZmluYWxseSB7CisJCQkJCWVycm9yVGhyZWFkID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlpZiAob3V0VGhyZWFkICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlvdXRUaHJlYWQuaGFsdCgpOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gU3RvcCB3YWl0aW5nIGFuZCByZXR1cm4gYW55d2F5LgorCQkJCX0gZmluYWxseSB7CisJCQkJCW91dFRocmVhZCA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgeworCQkJCWlmIChwcm9jZXNzLmV4aXRWYWx1ZSgpICE9IDApIHsKKwkJCQkJZmFpbHVyZSA9IG5ldyBDb21tYW5kRmFpbGVkRXhjZXB0aW9uKHByb2Nlc3MuZXhpdFZhbHVlKCksCisJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuc3NoQ29tbWFuZEZhaWxlZCwgY29tbWFuZCwKKwkJCQkJCQlzdGRlcnIudG9TdHJpbmcoKSkpOworCQkJCX0KKwkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKKwkJCX0KKwkJCXN0ZGVyci5jbG9zZSgpOworCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCQkJCVNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkucmVsZWFzZVNlc3Npb24oc2Vzc2lvbik7CisJCQl9CisJCQlpZiAoZmFpbHVyZSAhPSBudWxsKSB7CisJCQkJdGhyb3cgZmFpbHVyZTsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQppbmRleCBiNDczNmQzLi4zODY4ZTU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogCSAqICAgICAgICAgICAgdGhlIGlucHV0IGNoYXJhY3Rlci4KIAkgKiBAcmV0dXJuIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoZSBpbnB1dC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgdG9Mb3dlckNhc2UoZmluYWwgY2hhciBjKSB7CisJcHVibGljIHN0YXRpYyBjaGFyIHRvTG93ZXJDYXNlKGNoYXIgYykgewogCQlyZXR1cm4gYyA8PSAnWicgPyBMQ1tjXSA6IGM7CiAJfQogCkBAIC05MSw3ICs5MSw3IEBACiAJICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGlucHV0IHN0cmluZywgYWZ0ZXIgY29udmVydGluZyBjaGFyYWN0ZXJzIGluIHRoZQogCSAqICAgICAgICAgcmFuZ2UgJ0EnLi4nWicgdG8gJ2EnLi4neicuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Mb3dlckNhc2UoZmluYWwgU3RyaW5nIGluKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Mb3dlckNhc2UoU3RyaW5nIGluKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKGluLmxlbmd0aCgpKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbi5sZW5ndGgoKTsgaSsrKQogCQkJci5hcHBlbmQodG9Mb3dlckNhc2UoaW4uY2hhckF0KGkpKSk7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkgKiAgICAgICAgICAgIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgYSBlcXVhbHMgYgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBiKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhLmxlbmd0aCgpICE9IGIubGVuZ3RoKCkpCkBAIC0yMDUsNyArMjA1LDcgQEAKIAkgKiAgICAgICAgICAgICBpZiB7QGNvZGUgdmFsdWV9IGlzIG5vdCByZWNvZ25pemVkIGFzIG9uZSBvZiB0aGUgc3RhbmRhcmQKIAkgKiAgICAgICAgICAgICBib29sZWFuIG5hbWVzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0b0Jvb2xlYW4oZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihTdHJpbmcgc3RyaW5nVmFsdWUpIHsKIAkJaWYgKHN0cmluZ1ZhbHVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRCb29sZWFuU3RyaW5nVmFsdWUpOwogCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBib29sZWFuIGludGVycHJldGF0aW9uIG9mIHtAY29kZSB2YWx1ZX0gb3IgbnVsbCBpbiBjYXNlIHRoZQogCSAqICAgICAgICAgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhIGJvb2xlYW4gdmFsdWUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gdG9Cb29sZWFuT3JOdWxsKGZpbmFsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB0b0Jvb2xlYW5Pck51bGwoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CiAJCWlmIChzdHJpbmdWYWx1ZSA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YQppbmRleCA5NmE3OTZjLi45NTNjOTc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhCkBAIC0yMzcsNyArMjM3LDcgQEAKIAlwdWJsaWMgYWJzdHJhY3QgRmlsZUJhc2VkQ29uZmlnIG9wZW5Vc2VyQ29uZmlnKENvbmZpZyBwYXJlbnQsIEZTIGZzKTsKIAogCS8qKgotCSAqIE9wZW4gdGhlIGdpdG9uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiIGRpcmVjdG9yeQorCSAqIE9wZW4gdGhlIGdpdGNvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIiBkaXJlY3RvcnkKIAkgKgogCSAqIEBwYXJhbSBwYXJlbnQKIAkgKiAgICAgICAgICAgIGEgY29uZmlnIHdpdGggdmFsdWVzIG5vdCBmb3VuZCBkaXJlY3RseSBpbiB0aGUgcmV0dXJuZWQKQEAgLTI0NSw3ICsyNDUsNyBAQAogCSAqIEBwYXJhbSBmcwogCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KIAkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuIHRoZSBnaXRvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIgorCSAqIEByZXR1cm4gdGhlIGdpdGNvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIgogCSAqICAgICAgICAgZGlyZWN0b3J5CiAJICovCiAJcHVibGljIGFic3RyYWN0IEZpbGVCYXNlZENvbmZpZyBvcGVuU3lzdGVtQ29uZmlnKENvbmZpZyBwYXJlbnQsIEZTIGZzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQppbmRleCBkZDkzM2EwLi4zZWQ3YWViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiBtZW1vcnkgYmVmb3JlIGVudGVyaW5nIHRoZQogCSAqICAgICAgICAgICAgb3ZlcmZsb3cgb3V0cHV0IHBhdGg7IGFsc28gdXNlZCBhcyB0aGUgZXN0aW1hdGVkIHNpemUuCiAJICovCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihmaW5hbCBpbnQgbGltaXQpIHsKKwlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGludCBsaW1pdCkgewogCQl0aGlzKGxpbWl0LCBsaW1pdCk7CiAJfQogCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiAgICAgICAgICAgIG92ZXJmbG93IG91dHB1dCBwYXRoLgogCSAqIEBzaW5jZSA0LjAKIAkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGZpbmFsIGludCBlc3RpbWF0ZWRTaXplLCBmaW5hbCBpbnQgbGltaXQpIHsKKwlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGludCBlc3RpbWF0ZWRTaXplLCBpbnQgbGltaXQpIHsKIAkJaWYgKGVzdGltYXRlZFNpemUgPiBsaW1pdCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJdGhpcy5pbkNvcmVMaW1pdCA9IGxpbWl0OwpAQCAtMTE2LDcgKzExNiw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAob3ZlcmZsb3cgIT0gbnVsbCkgewogCQkJb3ZlcmZsb3cud3JpdGUoYik7CiAJCQlyZXR1cm47CkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChvdmVyZmxvdyA9PSBudWxsKSB7CiAJCQl3aGlsZSAobGVuID4gMCkgewogCQkJCUJsb2NrIHMgPSBsYXN0KCk7CkBAIC0xODMsNyArMTgzLDcgQEAKIAkgKiAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3Igd2hpbGUKIAkgKiAgICAgICAgICAgICB3cml0aW5nIHRvIGEgbG9jYWwgdGVtcG9yYXJ5IGZpbGUuCiAJICovCi0JcHVibGljIHZvaWQgY29weShmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoYmxvY2tzICE9IG51bGwpIHsKIAkJCWZvciAoOzspIHsKIAkJCQlCbG9jayBzID0gbGFzdCgpOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJCQl0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihKR2l0VGV4dC5nZXQoKS5sZW5ndGhFeGNlZWRzTWF4aW11bUFycmF5U2l6ZSk7CiAJCWZpbmFsIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVsoaW50KSBsZW5dOwogCQlpbnQgb3V0UHRyID0gMDsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKSB7CisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykgewogCQkJU3lzdGVtLmFycmF5Y29weShiLmJ1ZmZlciwgMCwgb3V0LCBvdXRQdHIsIGIuY291bnQpOwogCQkJb3V0UHRyICs9IGIuY291bnQ7CiAJCX0KQEAgLTI2NSw3ICsyNjUsNyBAQAogCQkJCQlKR2l0VGV4dC5nZXQoKS5sZW5ndGhFeGNlZWRzTWF4aW11bUFycmF5U2l6ZSk7CiAJCWZpbmFsIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVsoaW50KSBsZW5dOwogCQlpbnQgb3V0UHRyID0gMDsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKSB7CisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykgewogCQkJU3lzdGVtLmFycmF5Y29weShiLmJ1ZmZlciwgMCwgb3V0LCBvdXRQdHIsIGIuY291bnQpOwogCQkJb3V0UHRyICs9IGIuY291bnQ7CiAJCX0KQEAgLTI4OCwxMSArMjg4LDExIEBACiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyBmcm9tIGEgdGVtcG9yYXJ5IGZpbGUgb24gdGhlIGxvY2FsCiAJICogICAgICAgICAgICAgc3lzdGVtLCBvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCisJcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChwbSA9PSBudWxsKQogCQkJcG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwotCQlmb3IgKGZpbmFsIEJsb2NrIGIgOiBibG9ja3MpIHsKKwkJZm9yIChCbG9jayBiIDogYmxvY2tzKSB7CiAJCQlvcy53cml0ZShiLmJ1ZmZlciwgMCwgYi5jb3VudCk7CiAJCQlwbS51cGRhdGUoYi5jb3VudCAvIDEwMjQpOwogCQl9CkBAIC0zNzMsNyArMzczLDcgQEAKIAkJb3ZlcmZsb3cgPSBvdmVyZmxvdygpOwogCiAJCWZpbmFsIEJsb2NrIGxhc3QgPSBibG9ja3MucmVtb3ZlKGJsb2Nrcy5zaXplKCkgLSAxKTsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKQorCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpCiAJCQlvdmVyZmxvdy53cml0ZShiLmJ1ZmZlciwgMCwgYi5jb3VudCk7CiAJCWJsb2NrcyA9IG51bGw7CiAKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQkgKiAgICAgICAgICAgIHN5c3RlbSBkZWZhdWx0IHRlbXBvcmFyeSBkaXJlY3RvcnkgKGZvciBleGFtcGxlIC90bXApIHdpbGwKIAkJICogICAgICAgICAgICBiZSB1c2VkIGluc3RlYWQuCiAJCSAqLwotCQlwdWJsaWMgTG9jYWxGaWxlKGZpbmFsIEZpbGUgZGlyZWN0b3J5KSB7CisJCXB1YmxpYyBMb2NhbEZpbGUoRmlsZSBkaXJlY3RvcnkpIHsKIAkJCXRoaXMoZGlyZWN0b3J5LCBERUZBVUxUX0lOX0NPUkVfTElNSVQpOwogCQl9CiAKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCQkgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIG1lbW9yeS4gU3RvcmFnZSBiZXlvbmQKIAkJICogICAgICAgICAgICB0aGlzIGxpbWl0IHdpbGwgdXNlIHRoZSBsb2NhbCBmaWxlLgogCQkgKi8KLQkJcHVibGljIExvY2FsRmlsZShmaW5hbCBGaWxlIGRpcmVjdG9yeSwgZmluYWwgaW50IGluQ29yZUxpbWl0KSB7CisJCXB1YmxpYyBMb2NhbEZpbGUoRmlsZSBkaXJlY3RvcnksIGludCBpbkNvcmVMaW1pdCkgewogCQkJc3VwZXIoaW5Db3JlTGltaXQpOwogCQkJdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CiAJCX0KQEAgLTQ4NywxNyArNDg3LDE0IEBACiAJCQlpZiAoSW50ZWdlci5NQVhfVkFMVUUgPCBsZW4pCiAJCQkJdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoSkdpdFRleHQuZ2V0KCkubGVuZ3RoRXhjZWVkc01heGltdW1BcnJheVNpemUpOwogCQkJZmluYWwgYnl0ZVtdIG91dCA9IG5ldyBieXRlWyhpbnQpIGxlbl07Ci0JCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShvbkRpc2tGaWxlKSkgewogCQkJCUlPLnJlYWRGdWxseShpbiwgb3V0LCAwLCAoaW50KSBsZW4pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQkJcmV0dXJuIG91dDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQorCQlwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAob25EaXNrRmlsZSA9PSBudWxsKSB7CiAJCQkJc3VwZXIud3JpdGVUbyhvcywgcG0pOwpAQCAtNTA1LDE2ICs1MDIsMTMgQEAKIAkJCX0KIAkJCWlmIChwbSA9PSBudWxsKQogCQkJCXBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKLQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpKSB7CiAJCQkJaW50IGNudDsKIAkJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbQmxvY2suU1pdOwogCQkJCXdoaWxlICgoY250ID0gaW4ucmVhZChidWYpKSA+PSAwKSB7CiAJCQkJCW9zLndyaXRlKGJ1ZiwgMCwgY250KTsKIAkJCQkJcG0udXBkYXRlKGNudCAvIDEwMjQpOwogCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJfQogCkBAIC01NjksNyArNTYzLDcgQEAKIAkJICogICAgICAgICAgICBhbHNvIHVzZWQgYXMgdGhlIGVzdGltYXRlZCBzaXplLiBTdG9yaW5nIGJleW9uZCB0aGlzIG1hbnkKIAkJICogICAgICAgICAgICB3aWxsIGNhdXNlIGFuIElPRXhjZXB0aW9uIHRvIGJlIHRocm93biBkdXJpbmcgd3JpdGUuCiAJCSAqLwotCQlwdWJsaWMgSGVhcChmaW5hbCBpbnQgbGltaXQpIHsKKwkJcHVibGljIEhlYXAoaW50IGxpbWl0KSB7CiAJCQlzdXBlcihsaW1pdCk7CiAJCX0KIApAQCAtNTg1LDcgKzU3OSw3IEBACiAJCSAqICAgICAgICAgICAgdGhyb3duIGR1cmluZyB3cml0ZS4KIAkJICogQHNpbmNlIDQuMAogCQkgKi8KLQkJcHVibGljIEhlYXAoZmluYWwgaW50IGVzdGltYXRlZFNpemUsIGZpbmFsIGludCBsaW1pdCkgeworCQlwdWJsaWMgSGVhcChpbnQgZXN0aW1hdGVkU2l6ZSwgaW50IGxpbWl0KSB7CiAJCQlzdXBlcihlc3RpbWF0ZWRTaXplLCBsaW1pdCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEKaW5kZXggNDU2NjgyNS4uMDgzNzdlNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAobGVuID09IDApCiAJCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlNzY0Mzg5Li5kOGNmZWU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBmaW5hbCBpbnQgc3RhcnRPZmYsIGZpbmFsIGludCBzdGFydExlbikKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IHN0YXJ0T2ZmLCBpbnQgc3RhcnRMZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgb3ZlcmZsb3cgPSBidWZmZXIoYiwgc3RhcnRPZmYsIHN0YXJ0TGVuKTsKIAkJaWYgKG92ZXJmbG93IDwgMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtLmphdmEKaW5kZXggMDZmODNmMy4uZmYyODE2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtLmphdmEKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJzLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKQorCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnMsIGludCBvZmYsIGludCBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAobGVuID09IDApCiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZPdXRwdXRTdHJlYW0uamF2YQppbmRleCAzMjIyNmM0Li45MDhkMGEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGZpbmFsIGludCBzdGFydE9mZiwgZmluYWwgaW50IHN0YXJ0TGVuKQorCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgc3RhcnRPZmYsIGludCBzdGFydExlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBvdmVyZmxvdyA9IGJ1ZmZlcihiLCBzdGFydE9mZiwgc3RhcnRMZW4pOwogCQlpZiAob3ZlcmZsb3cgPCAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0VvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5YTk1My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTMgTWFyYyBTdHJhcGV0eiA8bWFyYy5zdHJhcGV0ekBzeW50ZXZvLmNvbT4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnB1dCBzdHJlYW0gd2hpY2ggY2Fub25pY2FsaXplcyBFT0xzIGJ5dGVzIG9uIHRoZSBmbHkgdG8gJ1xuJy4KLSAqCi0gKiBPcHRpb25hbGx5LCBhIGJpbmFyeSBjaGVjayBvbiB0aGUgZmlyc3QgODAwMCBieXRlcyBpcyBwZXJmb3JtZWQgYW5kIGluIGNhc2UKLSAqIG9mIGJpbmFyeSBmaWxlcywgY2Fub25pY2FsaXphdGlvbiBpcyB0dXJuZWQgb2ZmIChmb3IgdGhlIGNvbXBsZXRlIGZpbGUpLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLkF1dG9MRklucHV0U3RyZWFtfSBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbSBleHRlbmRzIEF1dG9MRklucHV0U3RyZWFtIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSW5wdXRTdHJlYW0sIHdyYXBwaW5nIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICoKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHJhdyBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gZGV0ZWN0QmluYXJ5Ci0JICogICAgICAgICAgICB3aGV0aGVyIGJpbmFyaWVzIHNob3VsZCBiZSBkZXRlY3RlZAotCSAqLwotCXB1YmxpYyBFb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBib29sZWFuIGRldGVjdEJpbmFyeSkgewotCQlzdXBlcihpbiwgZGV0ZWN0QmluYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IElucHV0U3RyZWFtLCB3cmFwcGluZyB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICByYXcgaW5wdXQgc3RyZWFtCi0JICogQHBhcmFtIGRldGVjdEJpbmFyeQotCSAqICAgICAgICAgICAgd2hldGhlciBiaW5hcmllcyBzaG91bGQgYmUgZGV0ZWN0ZWQKLQkgKiBAcGFyYW0gYWJvcnRJZkJpbmFyeQotCSAqICAgICAgICAgICAgdGhyb3cgYW4gSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgaXMgYmluYXJ5Ci0JICovCi0JcHVibGljIEVvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gZGV0ZWN0QmluYXJ5LAotCQkJYm9vbGVhbiBhYm9ydElmQmluYXJ5KSB7Ci0JCXN1cGVyKGluLCBkZXRlY3RCaW5hcnksIGFib3J0SWZCaW5hcnkpOwotCX0KLQotCS8qKgotCSAqIEEgc3BlY2lhbCBleGNlcHRpb24gdGhyb3duIHdoZW4ge0BsaW5rIEF1dG9MRklucHV0U3RyZWFtfSBpcyB0b2xkIHRvCi0JICogdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byByZWFkIGEgYmluYXJ5IGZpbGUuIFRoZSBleGNlcHRpb24KLQkgKiBtYXkgYmUgdGhyb3duIGF0IGFueSBzdGFnZSBkdXJpbmcgcmVhZGluZy4KLQkgKgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIElzQmluYXJ5RXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlJc0JpbmFyeUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9JbnRlcnJ1cHRUaW1lci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEKaW5kZXggZjQwMGU1MC4uYjdmZWRkZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSAqIEBwYXJhbSB0aHJlYWROYW1lCiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSB0aW1lciB0aHJlYWQuCiAJICovCi0JcHVibGljIEludGVycnVwdFRpbWVyKGZpbmFsIFN0cmluZyB0aHJlYWROYW1lKSB7CisJcHVibGljIEludGVycnVwdFRpbWVyKFN0cmluZyB0aHJlYWROYW1lKSB7CiAJCXN0YXRlID0gbmV3IEFsYXJtU3RhdGUoKTsKIAkJYXV0b0tpbGxlciA9IG5ldyBBdXRvS2lsbGVyKHN0YXRlKTsKIAkJdGhyZWFkID0gbmV3IEFsYXJtVGhyZWFkKHRocmVhZE5hbWUsIHN0YXRlKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGludGVycnVwdCBzaG91bGQgdHJpZ2dlci4KIAkgKiAgICAgICAgICAgIE11c3QgYmUgJmd0OyAwLgogCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luKGZpbmFsIGludCB0aW1lb3V0KSB7CisJcHVibGljIHZvaWQgYmVnaW4oaW50IHRpbWVvdXQpIHsKIAkJaWYgKHRpbWVvdXQgPD0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lb3V0LCBJbnRlZ2VyLnZhbHVlT2YodGltZW91dCkpKTsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCX0KIAogCXN0YXRpYyBmaW5hbCBjbGFzcyBBbGFybVRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCUFsYXJtVGhyZWFkKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBBbGFybVN0YXRlIHEpIHsKKwkJQWxhcm1UaHJlYWQoU3RyaW5nIG5hbWUsIEFsYXJtU3RhdGUgcSkgewogCQkJc3VwZXIocSk7CiAJCQlzZXROYW1lKG5hbWUpOwogCQkJc2V0RGFlbW9uKHRydWUpOwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQXV0b0tpbGxlciB7CiAJCXByaXZhdGUgZmluYWwgQWxhcm1TdGF0ZSBzdGF0ZTsKIAotCQlBdXRvS2lsbGVyKGZpbmFsIEFsYXJtU3RhdGUgcykgeworCQlBdXRvS2lsbGVyKEFsYXJtU3RhdGUgcykgewogCQkJc3RhdGUgPSBzOwogCQl9CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQkJfQogCQl9CiAKLQkJc3luY2hyb25pemVkIHZvaWQgYmVnaW4oZmluYWwgaW50IHRpbWVvdXQpIHsKKwkJc3luY2hyb25pemVkIHZvaWQgYmVnaW4oaW50IHRpbWVvdXQpIHsKIAkJCWlmICh0ZXJtaW5hdGVkKQogCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudGltZXJBbHJlYWR5VGVybWluYXRlZCk7CiAJCQljYWxsaW5nVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0lzb2xhdGVkT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNWU1MDk5NS4uNjU0NzBkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0lzb2xhdGVkT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0lzb2xhdGVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTk5LDcgKzk5LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHBvcywgZmluYWwgaW50IGNudCkKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgcG9zLCBpbnQgY250KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY2hlY2tDbG9zZWQoKTsKIAkJZXhlY3V0ZShuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2lsZW50RmlsZUlucHV0U3RyZWFtLmphdmEKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2lsZW50RmlsZUlucHV0U3RyZWFtLmphdmEKaW5kZXggNjhiNDE3ZS4uZTU4ODAzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TaWxlbnRGaWxlSW5wdXRTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIFJvYmluIFJvc2VuYmVyZworICogQ29weXJpZ2h0IChDKSAyMDE4LCBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4KICAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKQEAgLTQwLDM5ICs0MCwzNiBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKICAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiA8cD5TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0gY2xhc3MuPC9wPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgRmlsZUlucHV0U3RyZWFtIHRoYXQgaWdub3JlcyBhbnkgZXhjZXB0aW9ucyBvbiBjbG9zZSgpLgogICoKLSAqIEBkZXByZWNhdGVkIHVzZSBCdWZmZXJlZE91dHB1dFN0cmVhbSBpbiBKYXZhIDggYW5kIGxhdGVyLgorICogQHNpbmNlIDUuMAogICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHsKK3B1YmxpYyBjbGFzcyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0gewogCS8qKgotCSAqIDxwPkNvbnN0cnVjdG9yIGZvciBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uPC9wPgotCSAqCi0JICogQHNlZSBCdWZmZXJlZE91dHB1dFN0cmVhbSNCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0pCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCisJICogQHBhcmFtIGZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBmaWxlCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgZmlsZSB3YXMgbm90IGZvdW5kCiAJICovCi0JcHVibGljIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCXN1cGVyKG91dCk7CisJcHVibGljIFNpbGVudEZpbGVJbnB1dFN0cmVhbShGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlzdXBlcihmaWxlKTsKIAl9CiAKLQkvKioKLQkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLjwvcD4KLQkgKgotCSAqIEBzZWUgQnVmZmVyZWRPdXRwdXRTdHJlYW0jQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtLCBpbnQpCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIGJ1ZmZlciBzaXplCi0JICovCi0JcHVibGljIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBpbnQgc2l6ZSkgewotCQlzdXBlcihvdXQsIHNpemUpOworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQl0cnkgeworCQkJc3VwZXIuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU3RyZWFtQ29weVRocmVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YQppbmRleCA1YzFhZjllZi4uYTk5ODlhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU3RyZWFtQ29weVRocmVhZC5qYXZhCkBAIC03Myw3ICs3Myw3IEBACiAJICogICAgICAgICAgICBzdHJlYW0gdG8gY29weSBpbnRvLiBUaGUgZGVzdGluYXRpb24gc3RyZWFtIGlzIGF1dG9tYXRpY2FsbHkKIAkgKiAgICAgICAgICAgIGNsb3NlZCB3aGVuIHRoZSB0aHJlYWQgdGVybWluYXRlcy4KIAkgKi8KLQlwdWJsaWMgU3RyZWFtQ29weVRocmVhZChmaW5hbCBJbnB1dFN0cmVhbSBpLCBmaW5hbCBPdXRwdXRTdHJlYW0gbykgeworCXB1YmxpYyBTdHJlYW1Db3B5VGhyZWFkKElucHV0U3RyZWFtIGksIE91dHB1dFN0cmVhbSBvKSB7CiAJCXNldE5hbWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiLVN0cmVhbUNvcHkiKTsgLy8kTk9OLU5MUy0xJAogCQlzcmMgPSBpOwogCQlkc3QgPSBvOwpAQCAtODEsMjAgKzgxLDYgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHRvIHRoZSB0aHJlYWQuIFRoZSBhY3R1YWwgZmx1c2ggd2lsbAotCSAqIGhhcHBlbiBhdCBzb21lIGZ1dHVyZSBwb2ludCBpbiB0aW1lLCB3aGVuIHRoZSB0aHJlYWQgd2FrZXMgdXAgdG8gcHJvY2VzcwotCSAqIHRoZSByZXF1ZXN0LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCXN5bmNocm9uaXplZCAod3JpdGVMb2NrKSB7Ci0JCQlpbnRlcnJ1cHQoKTsKLQkJfQotCX0KLQotCS8qKgogCSAqIFJlcXVlc3QgdGhhdCB0aGUgdGhyZWFkIHRlcm1pbmF0ZSwgYW5kIHdhaXQgZm9yIGl0LgogCSAqIDxwPgogCSAqIFRoaXMgbWV0aG9kIHNpZ25hbHMgdG8gdGhlIGNvcHkgdGhyZWFkIHRoYXQgaXQgc2hvdWxkIHN0b3AgYXMgc29vbiBhcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RlZUlucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YQppbmRleCBkZWU0ZmU5Li5lNDBhNWE0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YQpAQCAtODksNyArODksNyBAQAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBza2lwKGZpbmFsIGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb25nIHNraXBwZWQgPSAwOwogCQlsb25nIGNudCA9IGNvdW50OwogCQlmaW5hbCBieXRlW10gYiA9IHNraXBCdWZmZXIoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YQppbmRleCAwMWIyNTE5Li4yMzkyYjhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dElucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhCkBAIC04OSw3ICs4OSw3IEBACiAJICogQHBhcmFtIG1pbGxpcwogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYWJvcnRpbmcgYSByZWFkLiBNdXN0IGJlICZndDsgMC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBtaWxsaXMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBtaWxsaXMpIHsKIAkJaWYgKG1pbGxpcyA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkVGltZW91dCwgSW50ZWdlci52YWx1ZU9mKG1pbGxpcykpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGVhNDAxMzMuLjI3ZjE4NzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0T3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YQpAQCAtOTEsNyArOTEsNyBAQAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYWJvcnRpbmcgYSB3cml0ZS4gTXVzdCBiZSAmZ3Q7CiAJICogICAgICAgICAgICAwLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IG1pbGxpcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IG1pbGxpcykgewogCQlpZiAobWlsbGlzIDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lb3V0LCBJbnRlZ2VyLnZhbHVlT2YobWlsbGlzKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEKaW5kZXggNTFkMzEwNi4uZTE0ZWIyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbS5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiBAcGFyYW0gaW4KIAkgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gYWRkOyBtdXN0IG5vdCBiZSBudWxsLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBJbnB1dFN0cmVhbSBpbikgeworCXB1YmxpYyB2b2lkIGFkZChJbnB1dFN0cmVhbSBpbikgewogCQlzdHJlYW1zLmFkZChpbik7CiAJfQogCkBAIC0xNjQsNyArMTY0LDcgQEAKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbG9uZyBza2lwcGVkID0gMDsKIAkJbG9uZyBjbnQgPSBjb3VudDsKIAkJd2hpbGUgKDAgPCBjbnQpIHsKZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IDE2MmI2ZDguLjMzNDc4NDcgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtNTEsNyArNTEsNyBAQAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KIAogICA8bmFtZT5KR2l0IC0gUGFyZW50PC9uYW1lPgogICA8dXJsPiR7amdpdC11cmx9PC91cmw+CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICA8aHR0cGNvcmUtdmVyc2lvbj40LjQuNjwvaHR0cGNvcmUtdmVyc2lvbj4KICAgICA8c2xmNGotdmVyc2lvbj4xLjcuMjwvc2xmNGotdmVyc2lvbj4KICAgICA8bG9nNGotdmVyc2lvbj4xLjIuMTU8L2xvZzRqLXZlcnNpb24+Ci0gICAgPG1hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+My4wLjA8L21hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+CisgICAgPG1hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+My4wLjE8L21hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+CiAgICAgPHR5Y2hvLWV4dHJhcy12ZXJzaW9uPjEuMS4wPC90eWNoby1leHRyYXMtdmVyc2lvbj4KICAgICA8Z3Nvbi12ZXJzaW9uPjIuOC4yPC9nc29uLXZlcnNpb24+CiAgICAgPHNwb3RidWdzLW1hdmVuLXBsdWdpbi12ZXJzaW9uPjMuMS4yPC9zcG90YnVncy1tYXZlbi1wbHVnaW4tdmVyc2lvbj4KQEAgLTI2Nyw2MyArMjY3LDYgQEAKICAgICAgICAgPC9wbHVnaW4+CiAKICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+My43LjA8L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgotICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KLSAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGlkPmRlZmF1bHQtY29tcGlsZTwvaWQ+Ci0gICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KLSAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+Ci0gICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGlkPmNvbXBpbGUtd2l0aC1lcnJvcnByb25lPC9pZD4KLSAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KLSAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGNvbXBpbGVySWQ+amF2YWMtd2l0aC1lcnJvcnByb25lPC9jb21waWxlcklkPgotICAgICAgICAgICAgICAgIDxmb3JjZUphdmFjQ29tcGlsZXJVc2U+dHJ1ZTwvZm9yY2VKYXZhY0NvbXBpbGVyVXNlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPCEtLSBvdmVycmlkZSBwbGV4dXMtY29tcGlsZXItamF2YWMtZXJyb3Jwcm9uZSdzIGRlcGVuZGVuY3kgb24KLSAgICAgICAgICAgICAgICAgRXJyb3IgUHJvbmUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gLS0+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5lcnJvcnByb25lPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lcnJvcl9wcm9uZV9jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8dmVyc2lvbj4yLjIuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgpAQCAtMzQzLDcgKzI4Niw3IEBACiAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjMuMC4yPC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjMuMS4xPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KIAogICAgICAgICA8cGx1Z2luPgpAQCAtNTQxLDcgKzQ4NCw2IEBACiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgogICAgICAgICAgICAgPGdvYWxzPgogICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CiAgICAgICAgICAgICA8L2dvYWxzPgpAQCAtNTk2LDYgKzUzOCwyMyBAQAogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4ke21hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8cmVwb3J0U2V0cz4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgIDxyZXBvcnQ+amF2YWRvYzwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICA8aWQ+YWdncmVnYXRlPC9pZD4KKyAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmFnZ3JlZ2F0ZTwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhZGRpdGlvbmFsSk9wdGlvbj4tWGRvY2xpbnQ6LW1pc3Npbmc8L2FkZGl0aW9uYWxKT3B0aW9uPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+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==